之前浅谈过了视频数据流,谈过了HLS,也谈过了HTTP-FLV,这章就浅谈一下RTMP,RTMP的数据封装和HTTP-FLV比较接近,只是多了不同的控制指令,但它不是基于HTTP协议的,而是基于TCP协议的。
RTMP和HTTP-FLV比较接近,也是单帧数据封装并进行推送的流程,但RTMP除了能拉流,同步也支持推流,对于一个完整的直播流程,能覆盖它的视频流上传到服务器,同时分发给用户端播放的两个流程。当然,推和拉可以采用不一样的方式。
我们先来了解RTMP的指令:
1. 握手
C0(1B)、S0(1B)、S1(1536B)、C1(1536B)、C2(1536B)、S2(1536B)
S2=C1
C2=S1
如果涉及到加密流程,密钥的交换在这一步完成。
具体数据封装见“RTMP协议详解”
2. 连接
在完成rtmp握手协议之后,通过0x14或者0x11消息,解析内置type为2的,代表具体操作指令,常用的有connect、createStream、play、publish,其中connect代表建立流连接,不是TCP连接。主要交换一个chunkSize,约定分块的大小。
3. 创建流
创建一个流对象Session,用于后续进行推流和拉流的动作。约定一个数据流ID的标识。使用0x11或0x14中的createStream。
4. 推流
使用x11或0x14中的publish指令,创建了推流消息,通过其中的app信息,进行目标视频的关联勾记,达到了推送视频数据和真实目标的匹配。
5. 拉流
使用x11或0x14中的play指令,创建了拉流消息,通过其中的app信息,进行了目标视频的关联勾记,达到了请求视频数据和真实目标的匹配。
6. 接收或推送音频
使用0x08消息进行音频数据的接收和发布,内置数据采用flv进行封装,再外部封装rtmp的chunk的封装。
7. 接收或推送视频
使用0x09消息进行视频数据的接收和发布,内置数据采用flv进行封装,再外部封装rtmp的chunk的封装。