天行健,君子以自强不息!
分类: 云计算
2017-08-28 21:47:23
RTMP是由Adobe开发的基于TCP的应用层协议,
应用于音/视频流数据在Flash Player和Media Server 之间的传输。
直播 : RTMP+FLV(H.264 & AAC)
点播 : RTMP+MP4(H.264 & AAC)
RTMP协议中基本的数据单元称为消息(Message)。
当RTMP协议在互联网中传输数据的时候,消息会被拆分成更小的单元,称为消息块(Chunk)。
1 消息 (Message)
消息是RTMP协议中基本的数据单元。
不同种类的消息包含不同的Message Type ID,代表不同的功能。
RTMP协议中一共规定了十多种消息类型,分别发挥着不同的作用。
例如,
Message Type ID在1-7的消息用于协议控制,这些消息一般是RTMP协议自身管理要使用的消息,用户一般情况下无需操作其中的数据。
Message Type ID为8,9的消息分别用于传输音频和视频数据。
Message Type ID为15-20的消息用于发送AMF编码的命令,负责用户与服务器之间的交互,比如播放,暂停等等。
消息首部(Message Header)有四部分组成:
标志消息类型的Message Type ID,
标志消息长度的Payload Length,
标识时间戳的Timestamp,
标识消息所属媒体流的Stream ID。
消息的报文结构如图3所示。
2 消息块 (chunk)
在网络上传输数据时,消息需要被拆分成较小的数据块,才适合在相应的网络环境上传输。
RTMP协议中规定,消息在网络上传输时被拆分成消息块(Chunk)。
消息块首部(Chunk Header)有三部分组成:
用于标识本块的Chunk Basic Header,
用于标识本块负载所属消息的Chunk Message Header,
以及当时间戳溢出时才出现的Extended Timestamp。
消息块的报文结构如图4所示。
消息块
3 消息分块
在消息被分割成几个消息块的过程中,消息负载部分(Message Body)被分割成大小固定的数据块(默认是128字节,最后一个数据块可以小于该固定长度),并在其首部加上消息块首部(Chunk Header),就组成了相应的消息块。
消息分块过程如图5所示,
一个大小为307字节的消息被分割成128字节的消息块(除了最后一个)。
即两个128字节的消息块 和 一个51字节的消息块
RTMP分块
RTMP传输媒体数据的过程中,
发送端:
首先把媒体数据封装成消息(Message),
然后把消息分割成消息块(Chunk),
最后将分割后的消息块通过TCP协议发送出去。
接收端:
在通过TCP协议收到数据后,首先把消息块重新组合成消息,
然后通过对消息进行解封装处理就可以恢复出媒体数据。
媒体数据>消息>消息块-------------------------TCP-------------à消息块>消息>媒体数据
主要分成四步:
Step1: 握手 , 即基于TCP三次握手;
一个RTMP连接以握手开始,双方分别发送大小固定的三个数据块
a)握手开始于客户端发送C0、C1块。服务器收到C0或C1后发送S0和S1。
b)当客户端收齐S0和S1后,开始发送C2。当服务器收齐C0和C1后,开始发送S2。
c)当客户端和服务器分别收到S2和C2后,握手完成。
Step2: 建立网络连接(NetConnection)
a)客户端发送命令消息中的“连接”(connect)到服务器,请求与一个服务应用实例建立连接。
b)服务器接收到连接命令消息后,发送确认窗口大小(Window Acknowledgement Size)协议消息到客户端,同时连接到连接命令中提到的应用程序。
c)服务器发送设置带宽()协议消息到客户端。
d)客户端处理设置带宽协议消息后,发送确认窗口大小(Window Acknowledgement Size)协议消息到服务器端。
e)服务器发送用户控制消息中的“流开始”(Stream Begin)消息到客户端。
f) 服务器发送命令消息中的“结果”(_result),通知客户端连接的状态。
Step3: 建立网络流(NetStream)
a) 客户端发送命令消息中的“创建流”(createStream)命令到服务器端。
b)服务器端接收到“创建流”命令后,发送命令消息中的“结果”(_result),通知客户端流的状态。
Step4: 播放,即音视频数据传输
a) 客户端发送命令消息中的“播放”(play)命令到服务器。
b) 接收到播放命令后,服务器发送设置块大小(ChunkSize)协议消息。
c) 服务器发送用户控制消息中的“streambegin”,告知客户端流ID。
d) 播放命令成功的话,服务器发送命令消息中的“响应状态” NetStream.Play.Start & NetStream.Play.reset,告知客户端“播放”命令执行成功。
e) 在此之后服务器发送客户端要播放的音频和视频数据。