直播与点播之一_架构、模块、方案

初次接触,花了近两周进行调研,将个人理解与总结整理如下。如有谬误,烦请指正。

一 基本架构

直播(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)

注意:

  1. 个人理解,HTTP-FLV、HLS不能称为协议,只是传输的方案;

  2. 直播才需要FFmpeg,点播直接让浏览器请求服务器中视频文件即可,如果浏览器支持播放则播放,不支持则会下载文件。

直播和点播有什么不同?

  1. 服务器、浏览器数据交互上没有区别:
    都是一个发数据一个接收数据,使用的传输方案都一样,传输协议都是RTMP、HTTP、Websocket。
  2. 视频源、服务器处理有区别:
    点播时, 视频源是服务器上一个完整的文件,服务器把文件发给浏览器即可。
    直播时, 视频源是来自外部设备的视频流,服务器要先接收和处理视频流然后才能发给浏览器。FFmpeg正是用于接收和处理,FFmpeg接收外部设备的视频流,处理后传给Nginx,Nginx接收后再转发给浏览器。
    【Nginx还是起反向代理的作用,那不使用Nginx,FFmpeg能够直接通过RTMP向浏览器发送视频流吗?感觉似乎可以,但是这样服务器端并没有接收到浏览器的请求,真的可以吗,存疑;另外,FFmpeg的输入也可以是本地文件,也就是可用本地文件进行直播】
  3. 浏览器播放上有区别:
    点播时, 数据源是一个完整的文件,已经包含了起始、结束、关键帧等信息,浏览器接收后可据此执行快进、后退等操作。
    直播时, 本来就是一个正在进行的过程,视频流中缺少这些信息,浏览器无法进行操作。【不知道能不能后退】

二 模块介绍

2.1 视频源

直播: 本地文件可以直接用做FFmpeg的输入;视频主播主流采用OBS;监控摄像头可自动向服务器推送(是摄像头推来说服务器拉?)RTSP视频流。以海康威视摄像头为例:RTSP传输协议、H264+AAC编码。
点播: 本地文件;也可以是网络上的文件,这样服务器会先下载完文件再进行点播。总之点播必须要求服务器上有完整文件。

本任务视频源为海康威视摄像头。

2.2 视频服务器

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。

2.3 传输方案

传输方案与浏览器播放方式相关。当客户端使用播放器应用,上述方案一般均可行。当客户端使用浏览器在网页中播放视频,情况比较复杂。

2.3.1 RTMP 方案

RTMP方案:由Adobe提出,使用RTMP协议传输FLV文件视频流,浏览器接收后用Flash插件播放。问题在于:HTML5出现、Flash播放器很快会被抛弃。
RTMP方案除了浏览器不支持Flash播放器以外还有其他短板,如:RTMP使用的是TCP非公共端口,有可能被防火墙拦截。

RTMP协议本就是为Flash播发器设计的,要用RTMP必须要用Flash播放器。

2.3.2 HTTP-FLV 方案

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
应该是是不支持,见:直播与点播之三_反思、进阶、理解、改进

2.3.3 HLS方案

HLS方案:由Apple提出,是将视频封装为MPEG2-TS格式并切成许多小片段再封装为M3U8格式,使用HTTP协议传输这些小片段。HTML5支持MPEG2-TS格式播放,不需要Flash播放器、不需要MSE。

H5只说了支持MP4,为啥支持MPEG2-TS封装格式呢?

2.3.4 WebSocket、WebRTC

WebSocket对标HTTP,HTTP-FLV中HTTP可以换做WebSocket,网络上有一些实现。
WebRTC是对浏览器扩展的新API,可以直接在双方浏览器间建立端到端联系并进行音视频传输。

2.3.5 主流方案对比

RTMP、HTTP-FLV、HLS三种为主流方案,对比如下:
直播与点播之一_架构、模块、方案_第1张图片
RTMP即将被淘汰;HTTP-FLV在桌面浏览器形式大好、移动端兼容性存在问题;HLS通用性最好,但延时太大。

2.4 客户端播放器

传输方案 浏览器方案
RTMP方案 Flash播放器(video.js、aliplayer.js)
HTTP-FLV方案 flv.js
HLS方案 直接使用
Websocket方案 flv.js

RTMP方案中,需要开启Chrome允许Flash播放器,但是并没有真的下载Flash播发器,而是使用了video.js、aliplayer.js。这两个应该算是Flash播放器吧。

三 实现方案

具体实现见 直播与点播之二_方案实现

3.1 nginx-http-flv-module + HTTP-FLV + flv.js

直播延迟3s

模块 方案
视频服务器 Nginx(nginx-http-flv-module)
传输方案 HTTP-FLV
浏览器播放 flvjs

处理过程:

  1. 服务器端FFmpeg接收RTSP视频流封装为FLV、采用H264+AAC编码、转为RTMP直播;
  2. 服务器端Nginx-http-flv-module监听到RTMP直播,流转为HTTP直播流,并发送给浏览器;
  3. 浏览器利用flv.js,解码FLV转为MP4,直接使用浏览器播放。

3.2 nginx-rtmp-module + RTMP + aliplayer

模块 方案
视频服务器 Nginx(nginx-rtmp-module)
传输方案 RTMP
浏览器播放 videojs、aliplayer (需要"允许Flash播放器")

处理过程:

  1. 服务器端FFmpeg接收RTSP视频流封装为FLV、采用H264+AAC编码、转为RTMP直播;
  2. 服务器端Nginx-rtmp-module监听到RTMP直播,发送给浏览器;
  3. 浏览器利用videojs或aliplayer,解码FLV播放。

3.3 websocket-relay + websocket + jsmpeg

直播延迟500ms

模块 方案
视频服务器
传输方案 websocket
浏览器播放 jsmpeg

websocket-relay只是用于建立websocket连接,单纯是转发了FFmpeg转换的视频流,算不上视频服务器。就类似于,FFmpeg直接推流到浏览器。

处理过程:

  1. 服务器端FFmpeg接收RTSP视频流封装为MPEGTS、采用mpeg1video编码、转为HTTP直播;
  2. 服务器端websocket-relay监听HTTP直播流转为Websocket直播流、并与浏览器建立websocket连接;
  3. 浏览器利用jsmpeg(相当于flv.js),解码mpeg1video转为MP4,直接使用浏览器播放。

四 补充

基于Nodejs的视频服务器:Node-Media-Server

五 参考

5.1 大力推荐

直播整个技术面介绍:

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

5.2 一般推荐

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。

5.3 背景知识

推流与拉流:

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

你可能感兴趣的:(直播与点播,视频处理)