初次接触,花了近两周进行调研,将个人理解与总结整理如下。如有谬误,烦请指正。
直播(Live)架构:
(视频流) --> (视频服务器)[拉流+视频处理+推流] --> (传输方案协议) --> (客户端播放器)
点播(VOD)架构:
(视频文件) --> (视频服务器) --> (传输方案协议) --> (客户端播放器)
模块 | 方案 |
---|---|
视频源 | 视频文件、OBS推流、监控摄像头推流 |
视频服务器 | nginx-rtmp-module、nginx-http-flv-module、SRS、Red5 |
拉流+视频处理+推流 | FFmpeg,属于视频服务器的一部分 |
传输方案 | RTMP、HTTP-FLV(HTTP)、HLS(HTTP)、WebSocket、WebRTC |
客户端播放器 | 浏览器Flash插件、浏览器HTML5、播放器应用(VLC、potplayer) |
注意:
个人理解,HTTP-FLV、HLS不能称为协议,只是传输的方案;
直播才需要FFmpeg,点播直接让浏览器请求服务器中视频文件即可,如果浏览器支持播放则播放,不支持则会下载文件。
直播和点播有什么不同?
直播: 本地文件可以直接用做FFmpeg的输入;视频主播主流采用OBS;监控摄像头可自动向服务器推送(是摄像头推来说服务器拉?)RTSP视频流。以海康威视摄像头为例:RTSP传输协议、H264+AAC编码。
点播: 本地文件;也可以是网络上的文件,这样服务器会先下载完文件再进行点播。总之点播必须要求服务器上有完整文件。
本任务视频源为海康威视摄像头。
Nginx: Nginx用作视频服务器需要第三方nginx-rtmp-module模块、nginx-http-flv-module模块。其中,nginx-rtmp-module只支持RTMP方案、HLS方案,且长时间未更新。nginx-http-flv-module包含nginx-rtmp-module的所有功能,支持HTTP-FLV,还在更新。
SRS: 据说是经历了开源、闭源、再开源,性能上似乎还优于nginx-rtmp。
Red5: 采用Java开发的,据说性能远低于nginx-rtmp。
总的来说,Nginx方案网上资源更多,最终选择了nginx-http-flv。
传输方案与浏览器播放方式相关。当客户端使用播放器应用,上述方案一般均可行。当客户端使用浏览器在网页中播放视频,情况比较复杂。
RTMP方案:由Adobe提出,使用RTMP协议传输FLV文件视频流,浏览器接收后用Flash插件播放。问题在于:HTML5出现、Flash播放器很快会被抛弃。
RTMP方案除了浏览器不支持Flash播放器以外还有其他短板,如:RTMP使用的是TCP非公共端口,有可能被防火墙拦截。
RTMP协议本就是为Flash播发器设计的,要用RTMP必须要用Flash播放器。
HTTP-FLV方案:由Adobe提出,是对RTMP方案的改进,改用HTTP协议传输FLV文件视频流,那还是没有解决播放FLV文件的问题。但是,现在的浏览器中扩展了新的API:MSE(Media Source Extensions) 。JS利用MSE的API可以处理视频流转为MP4,再用HTML5播放,因此不需要Flash播放器了。现有基于MSE的js库有:flv.js。【由B站开发】
RTMP、HTTP-FLV都是传FLV,那可以RTMP+flvjs吗?没看见有人用 RTMP+flv.js
应该是是不支持,见:直播与点播之三_反思、进阶、理解、改进
HLS方案:由Apple提出,是将视频封装为MPEG2-TS格式并切成许多小片段再封装为M3U8格式,使用HTTP协议传输这些小片段。HTML5支持MPEG2-TS格式播放,不需要Flash播放器、不需要MSE。
H5只说了支持MP4,为啥支持MPEG2-TS封装格式呢?
WebSocket对标HTTP,HTTP-FLV中HTTP可以换做WebSocket,网络上有一些实现。
WebRTC是对浏览器扩展的新API,可以直接在双方浏览器间建立端到端联系并进行音视频传输。
RTMP、HTTP-FLV、HLS三种为主流方案,对比如下:
RTMP即将被淘汰;HTTP-FLV在桌面浏览器形式大好、移动端兼容性存在问题;HLS通用性最好,但延时太大。
传输方案 | 浏览器方案 |
---|---|
RTMP方案 | Flash播放器(video.js、aliplayer.js) |
HTTP-FLV方案 | flv.js |
HLS方案 | 直接使用 |
Websocket方案 | flv.js |
RTMP方案中,需要开启Chrome允许Flash播放器,但是并没有真的下载Flash播发器,而是使用了video.js、aliplayer.js。这两个应该算是Flash播放器吧。
具体实现见 直播与点播之二_方案实现
直播延迟3s
模块 | 方案 |
---|---|
视频服务器 | Nginx(nginx-http-flv-module) |
传输方案 | HTTP-FLV |
浏览器播放 | flvjs |
处理过程:
模块 | 方案 |
---|---|
视频服务器 | Nginx(nginx-rtmp-module) |
传输方案 | RTMP |
浏览器播放 | videojs、aliplayer (需要"允许Flash播放器") |
处理过程:
直播延迟500ms
模块 | 方案 |
---|---|
视频服务器 | – |
传输方案 | websocket |
浏览器播放 | jsmpeg |
websocket-relay只是用于建立websocket连接,单纯是转发了FFmpeg转换的视频流,算不上视频服务器。就类似于,FFmpeg直接推流到浏览器。
处理过程:
基于Nodejs的视频服务器:Node-Media-Server
直播整个技术面介绍:
https://zhuanlan.zhihu.com/p/100519553
flvjs(MSE)、jsmpeg、插件有什么区别?
RTMP、HTTP-FLV、HLS方案介绍:
https://www.jianshu.com/p/32417d8ee5b6
https://www.jianshu.com/p/a9c2db7b1fb9
https://www.cnblogs.com/upyun/p/9881865.html
直播流程介绍:
https://www.cnblogs.com/baitongtong/p/11248966.html
RTMP、HTTP-FLV、HLS延迟实测:
https://blog.csdn.net/wcghhk/article/details/86555086
RTMP与HTTP-FLV中FLV的区别:缓存、seek(快进)、带宽
https://blog.csdn.net/linshutao/article/details/6147074
https://my.oschina.net/u/2326611/blog/3072777
视频服务器对比:
SRS与Nginx对比:
https://blog.csdn.net/caoshangpa/article/details/79972297
https://www.cnblogs.com/meetrice/p/5428958.html
Red5与Nginx对比:
https://blog.csdn.net/u011734326/article/details/97936152
主流直播网站采用方案:
https://blog.csdn.net/ahoustep/article/details/52175732
移动端情况、flvjs测试:
https://www.cnblogs.com/saysmy/p/7851911.html
结论是:HLS支持原生HTML5播放,因此,可在所有情境下使用。Apple所有系统对RTMP、HTTP-FLV均不支持;安卓部分支持HTTP-FLV,不支持RTMP。
推流与拉流:
https://www.jianshu.com/p/7d0d452063d9
流媒体协议:
https://blog.csdn.net/tttyd/article/details/12032357/
nginx-http-flv-module作者博客:
https://blog.csdn.net/winshining/article/details/93606585