第二部分
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:[email protected] -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:[email protected] -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:[email protected] -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:[email protected] -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)可以参考文章:移动流媒体协议综述