首页 > 代码库 > 使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器笔记(二)

使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器笔记(二)

第二部分

1、昨天已经把网络摄像机的rtsp视频流成功利用FFmpeg和Nginx转换成rtmp流推送到了nginx视频服务器上面,并且通过vlc可以观看到直播视频。

今天继续昨天的工作,将rtsp的视频流推送到Nginx上面,客户端根据hls协议使用http在网页进行观看(推送的仍然是rtmp视频流),关于hls,先给一小段简单介绍:

HTTP Live Streaming(HLS)是苹果公司(Apple Inc.)实现的基于HTTP的流媒体传输协议,可实现流媒体的直播和点播,相对于常见的流媒体直播协议,例如RTMP协议、RTSP协议、MMS协议等,HLS直播最大的不同在于,直播客户端获取到的,并不是一个完整的数据流。HLS协议在服务器端将直播数据流存储为连续的、很短时长的媒体文件(MPEG-TS格式),而客户端则不断的下载并播放这些小文件,因为服务器端总是会将最新的直播数据生成新的小文件,这样客户端只要不停的按顺序播放从服务器获取到的文件,就实现了直播。由此可见,基本上可以认为,HLS是以点播的技术方式来实现直播。由于数据通过HTTP协议传输,所以完全不用考虑防火墙或者代理的问题,而且分段文件的时长很短,客户端可以很快的选择和切换码率,以适应不同带宽条件下的播放。不过HLS的这种技术特点,决定了它的延迟一般总是会高于普通的流媒体直播协议。

2、昨天将rtsp视频流转换成rtmp视频流时,使用到的命令是:

ffmpeg -i rtsp://admin:12345@172.27.35.56 -acodec aac -strict experimental -ar 44100 -ac 2 -b:a 96k -r 25 -b:v 500k -s 640*480 -f flv rtmp://172.27.35.2:1935/myapp/test1  
可以看出,在对视频流的格式转换时,没有任何参数,对于音频使用了
-acodec aac
当将视频流推送到hls上时,使用这种缺省的参数时,出现了意外情况(我使用的是下面命令):

<span style="color:#000000;">ffmpeg -i rtsp://admin:12345@172.27.35.56  -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 -f flv rtmp://172.27.35.2:1935/hls/test2</span>
使用这个命令进行转换推送时,不论是在vlc还是网页上面都不会出现视频画面。使用wireshark抓包,可以看出是有数据包发出的,但是就是显示不出来,屏幕一片黑。

当使用ffplay播放时,出现了提示:

[mpegts @ 0xb0e07500] Could not find codec parameters for stream 0 (Video: h264 ([27][0][0][0] / 0x001B), none): unspecified size
没有为视频指定编码格式,所以为它添加参数,则执行的命令为:

<span style="color:#000000;">ffmpeg -i rtsp://admin:12345@172.27.35.56 -vcodec copy -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 -f flv rtmp://172.27.35.2:1935/hls/test2
</span>
<span style="color:#000000;">-vcodec copy</span>
表示所要使用的视频的编码格式,这里指定为copy表示原样拷贝。
3、为了能够成功将视频流推送到hls上,还需要对nginx.conf配置文件进行修改,在http中添加下面内容:

<span style="color:#000000;">location /hls {  
                types {  
                    application/vnd.apple.mpegurl m3u8;  
                    video/mp2t ts;  
                }  
                root /tmp;  
                add_header Cache-Control no-cache;  
        }  </span>
保存之后,重新启动nginx。

4、执行命令

ffmpeg -i rtsp://admin:12345@172.27.35.56 -vcodec copy -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 -f flv rtmp://172.27.35.2:1935/hls/test2
5、待ffmpeg运行以后,可以在vlc、电脑浏览器、手机浏览器中输入

http://172.27.35.2:80/hls/test2.m3u8
进行播放。

6、下面是一些视频播放截图,分别在vlc、电脑firefox浏览器、iphone safari浏览器和android UC浏览器的测试图

PC_firefox

技术分享

PC_VLC

技术分享

IPHONE_Safari

技术分享

Android_UC

技术分享

注:现在视频服务器只是初期简单的搭建起来,其中用到的一些命令参数是来源于广大网友的分享,这些参数可能不会具有通用性,对于特定的项目并不一定会达到预想的那么理想,比如延时可能会比较大,我测试时,延时还是比较大的,以后会根据自己的项目重新设定参数进行优化。

关于移动流媒体协议的介绍(包括hls)可以参考文章:移动流媒体协议综述

使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器笔记(二)