亲宝软件园·资讯

展开

RTMP协议推流交互流程

艾露米婭娜 人气:0
# RTMP协议推流交互流程 [toc] --- 想了解下直播常见协议RTMP,可是看着网文,头疼,这里记录下RTMP协议推流播放的交互流程,细节可以再看规范,感觉会舒服一些。 RTMP(Real Time Messaging Protocol 实时消息传输协议) RTMP是由Adobe公司提出的,在互联网TCP/IP五层体系结构中应用层,RTMP协议是基于TCP协议的······ , 吧啦吧啦的就不看了,先只了解它是基于tcp且可以用来推流的一个应用层协议就行了。 ## RTMP协议推流流程 然后看看它的一个推流过程 在TCP三次握手后(补个图) ![](https://img2020.cnblogs.com/blog/1384555/202003/1384555-20200305174706720-1353055898.png) 用RTMP协议的流媒体推流还需要经过以下几个步骤: >**握手**(RTMP连接都是以握手作为开始) **建立连接** (建立客户端与服务器之间的“网络连接”) **建立流** (建立客户端与服务器之间的“网络流”) **推流&播放** ### RTMP握手 首先服务端与客户端需要通过3次交换报文完成握手,RTMP是由三个静态大小的块,而不是可变大小的块组成的,客户端与服务器发送相同的三个chunk,客户端发送c0,c1,c2,服务端发送s0,s1,s2。 ![](https://img2020.cnblogs.com/blog/1384555/202003/1384555-20200305174729553-1120713483.png) >●客户端发送 C0,C1 块,握手开始。 ●客户端在发送 C2 之前客户端必须等待接收 S1 。 ●客户端在发送任何数据之前客户端必须等待接收 S2。 ●服务端在发送 S0 和 S1 之前必须等待接收 C0,也可以等待接收 C1。 ●服务端在发送 S2 之前必须等待接收 C1。 ●服务端在发送任何数据之前必须等待接收 C2。 ### RTMP建立连接 >●客户端发送命令消息中的“连接”(connect)到服务器,请求与一个服务应用实例建立连接。 ●服务器接收到连接命令消息后,发送确认窗口大小(Window Acknowledgement Size)协议消息到客户端,同时连接到连接命令中提到的应用程序。 ●服务器发送设置带宽协议(Set Peer Bandwidth)消息到客户端。 ●客户端处理设置带宽协议消息后,发送确认窗口大小(Window Acknowledgement Size)协议消息到服务器端。 ●服务器发送用户控制消息中的“流开始”(Stream Begin)消息到客户端。 ●服务器发送命令消息中的“结果”(_result),通知客户端连接的状态。 ![](https://img2020.cnblogs.com/blog/1384555/202003/1384555-20200305174746702-702764465.png) ### RTMP建流&Play >●客户端在收到来自服务器的建流命令(createstream)的成功结果(_result)后发送(play)命令。 ●服务器在接收到play命令后,发送一个来设置块大小(SetChunkSize)消息。 ●服务器发送另一个用户控制消息,指定事件“流记录”(StreamIsRecorded)和流ID。这个消息的头2字节携带事件类型,最后4字节携带流ID。 ●服务器发送另一个用户控制消息,指定事件“流开始”(StreamBegin)。向客户端指示流的开始。 ●如果客户端发送的播放(play)命令成功,服务器发送命令消息(onStatus),NeStream.Play.Start & NeStream.Play.Reset。 只有当客户端发送的play命令设置了reset标志时,服务器才会发送NeStream.Play.Reset。 ●如果没有找到要播放的流,服务器将发送onStatus消息NeStream.Play.StreamNotFound。 ●之后,客户端播放服务器发送的音频和视频数据 ![](https://img2020.cnblogs.com/blog/1384555/202003/1384555-20200305174804667-2010908395.png) ## Wireshark抓个RTMP流 湖南卫视的RTMP流 ffplay rtmp://58.200.131.2:1935/livetv/hunantv ![](https://img2020.cnblogs.com/blog/1384555/202003/1384555-20200305174817666-1006501929.png) 抛开握手不看流程如下: **Client** : >connect('livetv') **Server** : >Window Acknowledgement Size 5000000 Set Peer Bandwidth 5000000,Dynamic Set Chunk Size 4096 _result('NetConnection.Connect.Success') **Client** : >Window Acknowledgement Size 5000000 createStream() **Server** : >_result() **Client** : >getStreamLength() play('hunantv') Set Buffer Length 1,3000ms **Server** : >Stream Begin 1 onStatus('NetStream.Play.Start') RtmpSampleAccess() onMetaData() **Server** : >Video Data Audio Data ... 其他关于协议细节再看看协议规范 `rtmp_specification_1.0.pdf` 参考 :`rtmp_specification_1.0.pdf`

加载全部内容

相关教程
猜你喜欢
用户评论