作者:vivo互联网服务器团队-Xiong Langyu
一、背景
二、RTMP协议特点
三、RTMP协议解析
8: Audio 音频数据 9: Video 视频数据 18: Metadata 包括音视频编码、视频宽高等音视频元数据。
未初始化:客户端和服务端无任何交流阶段;
已发送版本号:发送了 C0 或者 S0;
已发送 ACK:发送了 C2 或者 S2;
握手完成:接收到了 S2 或者 C2。
客户端必须收到服务端发来的 S1 后才能发送 C2;
客户端必须收到服务端发来的 S2 后才能发送其他数据;
服务端必须收到客户端发来的 C0 后才能发送 S0 和 S1;
服务端必须收到客户端发来的 C1 后才能发送 S2;
服务端必须收到客户端发来的 C2 后才能发送其他数据。
C0 和 S0:1个字节长度,该消息指定了 RTMP 版本号。取值范围 0~255,我们只需要知道 3 才是我们需要的就行。其他取值含义感兴趣的话可以阅读协议原文。
C1 和 S1:1536个字节长度,由 时间戳+零值+随机数据 组成,握手过程的中间包。
C2 和 S2:1536个字节长度,由 时间戳+时间戳2+随机数据回传 组成,基本上是 C1 和 S1 的 echo 数据。一般在实现上,会令 S2 = C1,C2 = S1。
22 号包:客户端告诉服务端,我想要设置 chunk size 为 4096;
24 号包:客户端告诉服务端,我想要连接叫 “live” 的应用;
26 号包:服务端响应客户端的连接请求,确定窗口大小,带宽大小和 chunk size,以及返回 “_result” 表示响应成功。这些都是通过一个 TCP 包来完成的。
curl http://localhost:8090/control/get?room=movie
StatusCode : 200
StatusDescription : OK
Content : {"status":200,"data":"rfBd56ti2SMtYvSgD5xAV0YU99zampta7Z7S575K
LkIZ9PYk"}
RawContent : HTTP/1.1 200 OK
72 :
application/json :
Date: Tue, 09 Feb 2021 09:19:34 GMT
200,"data":"rfBd56ti2SMtYvSgD5xAV0YU99zampta7Z7S575K :
LkIZ9PYk"}
Forms : {}
Headers : {[Content-Length, 72], [Content-Type, application/json], [Date
Tue, 09 Feb 2021 09:19:34 GMT]}
Images : {}
InputFields : {}
Links : {}
ParsedHtml : mshtml.HTMLDocumentClass
RawContentLength : 72
四、展望
在线教育,学生提问,老师都讲到下一个知识点了,才看到学生上一个提问。 电商直播,询问宝贝信息,主播“视而不理”。 打赏后迟迟听不到主播的口播感谢。 在别人的呐喊声知道球进了,你看的还是直播吗?
CDN链路延迟, 这分为两部分,一部分是网络传输延迟。CDN内部有四段网络传输,假设每段网络传输带来的延迟是20ms,那这四段延迟便是100ms;此外,使用RTMP帧为传输单位,意味着每个节点都要收满一帧之后才能启动向下游转发的流程;CDN为了提升并发性能,会有一定的优化发包策略,会增加部分延迟。在网络抖动的场景下,延迟就更加无法控制了,可靠传输协议下,一旦有网络抖动,后续的发送流程都将阻塞,需要等待前序包的重传。
播放端buffer,这个是延迟的主要来源。公网环境千差万别,推流、CDN传输、播放接收这几个环节任何一个环节发生网络抖动,都会影响到播放端。为了对抗前边链路的抖动,播放器的常规策略是保留6s 左右的媒体buffer。
五、参考资料
END
猜你喜欢