音视频传输协议

2021-01-08  本文已影响0人  _喝喝酒吹吹风_

传输协议

RTMP

该协议是应用层协议,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问题。

三种分支类型:
  1. RTMP: 工作在TCP协议(传输层协议)上的明文传输,它使用的端口是1935;
  2. RTMPT:用HTTP包装后的协议,可以穿越防火墙进行传输;
  3. RTMPS:用HTTP包装后的协议,不过与RTMPT不同的是,它使用HTTPS安全连接,可以保证传输的安全。
概念定义
握手流程
+---------------+                             +---------------+
|    Client     |        TCP/IP Network       |    Server     |   
+---------------+              |              +---------------+
        |                      |                      |
  Uninitialized                |                 Uninitialized
        |          C0          |                      |
        | -------------------> |          C0          |
        |                      | -------------------> |
        |          C1          |                      | 
        | -------------------> |          S0          |
        |                      | <------------------- |
        |                      |          S1          |
   Version sent                | <------------------- |
        |          S0          |                      |
        | <------------------- |                      |
        |          S1          |                      |
        | <------------------- |                 Version sent
        |                      |          C1          |
        |                      | -------------------> |
        |          C2          |                      |
        | -------------------> |          S2          |
        |                      | <------------------- |
     Ack sent                  |                    Ack sent
        |          S2          |                      |
        | <------------------- |                      |
        |                      |          C2          |
        |                      | -------------------> |
  Handshake Done               |                Handshake Done
        |                      |                      |
  1. 未初始化阶段(Uninitialized):协议版本在这个阶段发送,客户端和服务端都是未初始化的。客户端在C0包中发送协议版本,如果服务端支持这个协议版本,其将会对应发送S0和S1;如果服务端不支持,服务端会采取合适的动作。在RTMP中,这个动作是中止连接。
  2. 版本发送阶段(Version Sent):在未初始化阶段之后客户端和服务端都处于版本发送阶段。客户端处于等待S1包,服务端处于等待C1包。在收到相应的等待的包后,客户端发送C2而服务端会发送S2,然后进入确认发送阶段。
  3. 确认发送阶段(Ack Sent):客户端和服务端响应的等待S2和C2
  4. 握手结束阶段(Handshake Done):客户端和服务端交换消息
DASH(Dynamic Adaptive Streaming over HTTP)

简单概括来说,就是在服务器端提前存好同一内容的不同码率、不同分辨率的多个分片以及相应的描述文件MPD,客户端在播放时即可以根据自身性能以及网络环境选择最适宜的版本。更多详细的内容可以参见MPEG组织出台的标准,标准号ISO/IEC 23009-1。

HLS(HTTP Live Streaming)

HTTP Live Streaming(简称 HLS)是一个基于 HTTP 的视频流协议,由 Apple 公司实现,Mac OS 上的 QuickTime、Safari 以及 iOS 上的 Safari 都能很好的支持 HLS,高版本 Android 也增加了对 HLS 的支持。一些常见的客户端如:MPlayerX、VLC 也都支持 HLS 协议。

HLS 协议基于 HTTP,非常简单。一个提供 HLS 的服务器需要做两件事:

RTSP

rtsp的能量在UDP传输这块,实际上公网环境下大量的UDP包,容易被防火墙block住,相对靠谱的模式,是rtsp over http tunnel,如果需要web端播放rtsp流的话,需要写插件,而且对浏览器也很挑剔。

rtmp兴起的原因是flash。以前网页要想直播只能flash而不是html5。比如国内网页直播始祖douyutv前身acfun生放送,那时候要想网页直播只能flash,所以rtmp是最好选择。但,rtsp其实比rtmp更复杂,rtsp需要两个连接,一个信令一个rtp数据,更多操心的地方,代码量其实更大。rtmp看似复杂,其实在流媒体直播里面更科学,比如分chunk,可以让音频包不会被大包视频发送所阻塞,但是大部分代码都是一个视频包一次发完,所以这个功能没用上。虽然rtmp有一些冗余设计,但是总规来说rtmp是目前直播协议的最广泛选择。rtsp的udp不适合外网传输,所以在外网下,不存在理论的rtsp比rtmp更快。rtmp如何更低延迟?推送端编码低延迟:h264编码是需要设置为低延迟编码的,如若默认,h264从编码到解码本来的延迟就非常非常大。比如x264,ultrafast zerolatency这些都是实时音视频会议用的。服务器低延迟:等待gop,如果一个服务器在一个新连接上来后,不发送缓存gop而是直接等待,等待下一个gop开始,这样就能到达超低延迟。客户端处理:客户端也需要优化低延迟播放。未来可能有协议替代rtmp,但还需要时间,毕竟obs只支持rtmp。可能未来出现的是udp之上的可靠协议,比如现在已经出现的srt。

RTP and RTCP

RTP协议是一种基于UDP的传输协议,RTP本身并不能为按顺序传送数据包提供可靠的传送机制,也不提供流量控制或拥塞控制,它依靠RTCP提供这些服务。
这样,对于那些丢失的数据包,不存在由于超时检测而带来的延时,同时,对于那些丢弃的包,也可以由上层根据其重要性来选择性的重传。比如,对于I帧、P帧、B帧数据,由于其重要性依次降低,故在网络状况不好的情况下,可以考虑在B帧丢失甚至P帧丢失的情况下不进行重传,这样,在客户端方面,虽然可能会有短暂的不清晰画面,但却保证了实时性的体验和要求。

RTP通常使用UDP协议来实现多媒体的传输
-实时传输协议RTP/RTCP

WebRTC
refrence

自适应流媒体传输(一)——DASH媒体内容的生成
我们为什么使用DASH
为什么现在的视频直播不使用RTSP协议而是使用RTMP?
前端应该了解的RTMP知识
带你吃透RTMP
为何一直推荐WebRTC?

上一篇 下一篇

猜你喜欢

热点阅读