直播与点播之三_测试、理解

以下理解均为猜测,未查看源码验证;待查看源码后核实【应该是不会看的】;

注意:下文中Nginx-RTMP、Nginx-HTTP-FLV-Module其实均指的是Nginx-HTTP-FLV-Module

一 所谓的推流和拉流到底是怎么回事?

  1. 是像SMTP和POP3那样,存在 主动推+被动 和 主动拉+被动 两种交互方式?还是只是为网络上了方便理解随口一说?网络上未找到明确讲解。
  2. 如果确实分主动推、主动拉两种模式,那么:直播/点播整个架构中的各个模块间,分别是以何种方式在交互?具体来说:
    (1) 摄像头是主动推,还是被动输出?
    (2) FFmpeg输入是主动拉,还是被动接收,输出是主动推,还是被动输出?
    (3) Nginx-RTMP输入是主动拉,还是被动接收?Nginx-RTMP输出是主动推,还是被动输出?
    (4) 浏览器、播放器输入是主动拉,还是被动接收?

个人理解,确实分主动推和主动拉两种模式。并据此对以下现象做出解释:

1.1 测试一:FFmpeg 推和拉

现象:

  1. 不启动Nginx-RTMP,FFmpeg将RTSP转为RTMP推流,直接报错,“无法建立连接”;
  2. 不启动Nginx-RTMP,FFmpeg将RTSP转为RTMP推流,PotPlayer拉流,不能播放;
  3. 启动Nginx-RTMP,FFmpeg将RTSP转为RTMP推流,PotPlayer拉流,能接收播放;

猜想:

  1. FFmpeg输出是主动推,输出协议可以是RTMP、HTTP等,且输出时必须要先有接收方监听端口,接收数据。接收方要是被动。【相当于用于写文件的进程】
  2. PotPlayer接收是主动拉,输入可以是RTMP、HTTP等,且输入时必须要先有输出方提供数据。输出方要是被动。【相当于用于读文件的进程】
  3. Nginx-RTMP起缓存数据的作用,可以被动接收和被动输出。【相当于文件,被读和被写】

解释: 根据猜想对现象进行解释

  1. 现象1中:不存在被动接收方(文件),推流无法主动输出(写文件);
  2. 现象2中:FFmpeg与Potplayer不存在被动方,因此无法连接;【相当于一个写进程、一个读进程,二者无法直接进行数据交换】
  3. 现象3中:Nginx-RTMP先是作为被动方接收FFmpeg的RTMP流(一个进程写入文件),然后作为被动方提供RTMP流,PotPlayer主动从Nginx-RTMP中拉取数据(一个进程读取文件)。

1.2 测试二:浏览器 拉流

对之前提到的websock直播进行分析
现象:

  1. 不启动websocket-relay,FFmpeg将RTSP转为HTTP推流,直接报错,“无法建立连接”;
  2. 不启动websocket-relay,FFmpeg将RTSP转为HTTP推流,浏览器请求,无法播放;
  3. 启动websocket-relay,FFmpeg将RTSP转为HTTP推流,浏览器请求,可以播放;
  4. 不启动websocket-relay、启动nginx,FFmpeg将RTSP转为HTTP推流,直接报错,“无法建立连接”。

猜想:

  1. 浏览器输入是主动拉;
  2. websocket-relay是起数据缓存的作用(相当于Nginx-HTTP-FLV,只不过由收RTMP/发HTTP换成了收HTTP/发WS);
  3. 原生nginx不能接收http请求并存为文件;

解释: 根据猜想对现象进行解释

  1. 现象1、2、3中:可以查看websocket-relay源码,HttpServer接收客户端(FFmpeg)的请求,WebsocketServer与浏览器建立连接;HttpServer读取请求中的数据,交由WebsocketServer发送;【HTTP协议,请求方是主动方】
  2. 虽然FFmpeg可以直接输出HTTP,但是原生Nginx中没有接收HTTP请求缓存数据的功能,因此不能接收FFmpeg推送的HTTP流。而nginx-http-flv-module不支持接收HTTP视频流,或者说只支持以RTMP接收视频流。

1.3 大胆猜测

  1. 摄像头被动提供视频流;
  2. 播放器主动拉流;
  3. FFmpeg主动拉流、主动推流;
  4. Nginx被动接收、被动输出;

这样FFmpeg可和摄像头直连,而FFmpeg和播放器之间必须要有一个缓存数据的部件,也就是视频服务器,视频服务器被动接收、被动提供,相当于一个文件。

二 jsmpeg方案为啥比http-flv方案延迟小那么多?

两种方案传输协议的差异:
HTTP方案中,FFmpeg将RTSP转为RTMP,Nginx-RTMP将RTMP转为HTTP。
Jsmpeg方案中,FFmpeg将RTSP转为HTTP,websocket-relay将HTTP转为Websocket。
这么看的话,Jsmpeg方案中不转Websocket,直接将HTTP视频流发到浏览器可以吗?感觉可以啊,不知道为啥不这么做啊。
【也就是自己写一个接收HTTP上传的视频流(来自FFmpeg),缓存后以HTTP转发】

两种方案FFmpeg处理的差异:
HTTP-FLV方案中,FFmpeg以RTSP协议接收,以RTMP协议转发,用FLV封装,用H264+AAC编码;
Jsmpeg方案中,FFmpeg用RTSP协议接收,用HTTP协议转发,用MPEG-TS封装,用mpeg1video编码。

Websocket协议和HTTP协议传输效率有差异?RTSP转RTMP和转HTTP效率有差异?FLV和MPEG-TS封装效率有差异?H264和mpeg1video编码效率有差异?进行以下试验。

2.1 是Websocket协议比HTTP协议传输更快吗?

使用Node-Media-Server的方案,用Websocket-FLV。
处理流程:FFmpeg将RTSP流转为RTMP流【用RTSP协议接收,RTMP协议转发,用FLV封装,H264+AAC编码】,然后通过NMS服务器推送到前端。
结果:延迟与HTTP-FLV差不多。
可见,不是传输协议差异引起的。

2.2 是RTSP转RTMP引起的吗?

能够用FFmpeg将RTSP转HTTP,视频服务器接收后再用HTTP传送到浏览器吗?Nginx-RTMP不支持,没有现成的工具。
既然,FFmpeg能够直接将RTSP流转为HTTP流,为啥HTTP-FLV方案中还要先转为RTMP?这个是nginx-rtmp模块本身限制,nginx-rtmp模块输入视频流只能是RTMP的。

2.3 是封装或编解码效率问题吗?

能够让Nginx-http-flv用HTTP协议传MPEG2-TS封装、video1mpeg编码的视频流,浏览器用jsmpeg解码吗?不行,和上面原因一样,这个是nginx-rtmp模块本身限制,nginx-rtmp模块输入视频流只能是RTMP协议的,而RTMP只支持FLV封装。

三 浏览器直播、点播有什么限制?

从浏览器端来看,播放主要限制有三点:对协议的支持、对封装格式的支持、对解码格式的支持。

注意:协议本来就和封装格式存在关联,如:RTMP只支持FLV封装格式,HTTP、Websocket应是支持所有封装格式。

3.1 浏览器本身支持的协议有哪些?

HTTP、Websocket;所以要是用RTMP、RTSP传输,必然要在浏览器中加上插件,或者js库,如:Flash播放器插件。(Flash播放器也只是支持RTMP,还没看到浏览器直接接收RTSP的例子)

3.2 浏览器(H5)本身支持的封装格式有哪些?

MPEG4、WebM,OOG;所以要是用FLV封装必然要在浏览器中加上插件,或者js库,如:flvjs。
【咦,按照这个分析,flvjs只说能够处理FLV封装,似乎没说过支持RTMP流啊,之前没注意这个问题】

3.3 浏览器(H5)本身支持的编码格式有哪些?

https://www.w3school.com.cn/html5/html_5_video.asp

就MPEG4来说,H264+AAC编码,所以要是用mpeg1video编码,必然要在浏览器中加上插件,或者js库,如:jsmpeg。

四 音视频的编码格式、封装格式、扩展名

要学FFmpeg先得弄清楚音视频文件的编码格式、封装格式、扩展名概念。在这个场景下,文件格式的含义与日常语境下的不同。这里,文件格式!=文件扩展名。文件格式指的是文件的封装格式,文件格式也被叫做容器格式。

注意:音视频处理中视乎从来没有关注过文件的扩展名

编码格式、封装格式、文件扩展名

4.1 概念

编码指的是对采样得到的音频、图像数据进行压缩,得到音频、视频;
封装指的是对音频+视频进行封装打包;
文件扩展名是将打包后的文件与电脑上的播放器关联;

4.2 关系

编码方式有多种、封装方式有多种、扩展名有多种
同样的采集数据可用不同的方式进行编码,编码方式就是编码名
同样编码的数据可用不同的方式进行封装,封装方式就是封装名
同样封装的数据可用不同的方式进行命名,命名就是扩展名
但是相应地,封装格式只支持特定多种的编码方式,拓展名只支持特定多种 的封装格式。
是多对多,又不是任意的多对多。

4.3 疑问

由于编码、封装、扩展名都是由对应组织负责的,命名方式与组织名相关;加上日常对格式的称呼不严谨,如果不仔细甄别,乍一看可能觉得:一个名字既是视频编码名、又是音频编码名、还是封装名、还是扩展名。

如:
组织名:MPEG
视频编码格式:MPEG2
音频编码格式:MPEG-2 AAC
封装格式:MPEG-2
视频文件格式:MPEG

博客中常见的TS,指的是MPEG2-TS,是封装格式。

https://blog.csdn.net/leixiaohua1020/article/details/18893769
http://einverne.github.io/post/2018/10/webm.html
https://blog.csdn.net/wangzekun_wolf/article/details/89532912

五 jsmpeg方案录制问题

直播与点播之二中讲到了jsmpeg方案无法录制,而基于Nginx的方案能够录制,那将Nginx作为websocket-relay与浏览器之间的代理,可以实现录制吗?
实现:
一:Nginx实现Websocket代理:可以实现
二:依然无法录制,Nginx-RTMP方案实现录制是基与nginx-rtmp-module的,nginx本身无法边传输边拷贝到服务器上,那通过nginx调用ffmpeg可行吗?没找到nginx调用外部应用的方法,nginx-rtmp-module中倒是有。 录制是nginx-rtmp-module的功能,且只支持RTMP输入流。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值