之前做的一个WEB监控项目,这里做个整理。
RTSP(Real Time Streaming Protocol):实时流传输协议,应用层协议,传输层可为UDP(默认),RDP,TCP,一般用于直播。浏览器不支持,目前仅 IE 的ActiveXObject 支持,且有插件依赖,但监控行业普遍使用,比如海康的摄像头。
RTMP(Real Time Messaging Protocol):实时消息传输协议,应用层协议,传输层为TCP,Adobe公司专为Flash开发的,一般用于直播。浏览器不支持,可通过flash插件支持(.swf)。
HTTP:超文本传输协议,应用层协议,基于TCP/IP,普遍应用于web开发等。http-flv就是通过http传输flv流,兼容性好。
摄像头流数据一般用H264编码,浏览器原生video标签对h264解码支持较好,主要是容器格式,目前兼容最好的格式方案就是 H264 + AAC ,即mp4。
综上,我选择了 ffmpeg 拉取裸流流封装为 .flv,推到 livego 流媒体服务器 ,浏览器用B站的 flvjs 转码为mp4 并播放。
1. ffmpeg命令如下 ffmpeg -re -rtsp_transport tcp -i demo.flv -c copy -f flv rtmp://localhost:1935/live/movie
-re 按原始帧率取
-rtsp_transport 由于rtsp默认的udp连接不可靠,传输过程会有大量丢包,导致画面灰屏或绿屏或花屏,这里利用 tcp连接的可靠性和丢包重发机制可有效解决
-i input 文件或流输入
-c codec 编解码器 copy则不解码
-f formats 输出格式 这里用的flv容器格式
以及输出路径,其他命令参考ffmpeg常用参数一览。ffmpeg下载地址
2. livego 是go语言编写的流媒体服务器,小巧但性能较强,github上有已编译好的可执行文件。不建议重新编译,项目很久未更新,项目里很多开源依赖包却不断更新,编译后会有各种问题(不能二次开发有点头疼)。而且在网络环境不理想情况下,服务器缓存过大会导致程序崩溃。
所以我强烈建议使用SRS(Simple-RTMP-Server),另一个流媒体服务器,功能强大,稳得一笔。譬如转发、封装、录制、无中断重载,http-flv集群等。支持HLS转封。具体介绍参看SRS。
3.flvjs 通过MSE(Media Source Extensions)将流转成mp4,并通过blob播放.。具体使用可参照教程。由于IOS全线不支持MSE,但均内置了HLS支持,所以按理说可以不使用flvjs,直接用video播放,还没测过。由于HLS延迟过高,对于监控云台的操作无法及时反馈,这里直接PASS。IOS支持还要探讨其他方案。
以上就是具体方案,好处是支持所有主流浏览器,包括移动端(Android),IOS相关除外。
经测试,PC在理想网络状态下延迟约300ms(页面云台操作,到视频变化),表现良好。手机4G 800ms左右。
其实这里有个坑,当摄像头网络和客户端网络处在同网络运营商下,表现良好,跨运营商延迟很高,PC(电信到移动)3-5s、
(移动到联通)500ms。手机4G(电信到移动)5s......。数据可以参考,但跨运营商是个难点,暂未找到好的办法。有办法的可以留言,参考一下。