0%

RTMP

RTMP,Real Time Messaging Protocol,使用TCP,默认在1935端口上传输一般的FLV格式流。

优点:

  • 支持加密
  • 隐私性好
  • 实时性好
  • 延迟相对较低

缺点:

  • 使用非公共端口,可能被防火墙拦截;
  • 跨平台差

常用应用领域:

  • 娱乐直播
  • 点播

应用会比HLS更为广泛,主要还是因为传输效率较高、基建比较成熟。

发展方向:使用UDP逐渐替代TCP方案,把传输做薄。

RTMP是在TCP建立连接的基础之上传输,即底层使用使用TCP的。经过RTMP握手后,建立RTMP Connetction,然后stream传输。

创建流的基本流程:

  1. 通过socket建立TCP连接;
  2. RTMP握手;
  3. 建立RTMP连接;
  4. 创建RTMP流。

握手过程:

握手

建立连接的过程:

建立连接

创建流的过程:

创建流

推流过程:

推流

拉流过程:

拉流

消息格式

当连接建立好后,就可以发送消息了,RTMP消息有固定的格式,如上图,这是RTMP协议中最复杂的部分。

如一般网络协议,整个RTMP的消息由Header和Body组成。

Header分为三个部分:

  • Basic Header,必有
  • Message Header,可选
  • Extended Timestamp,可选

后两者是否存在是根据Basic Header的值决定的。

Basic Header的大小也是动态变化的,其大小由第一个字节决定。Basic Header第一个字节组成:

  • 前2位:fmt。
  • 后6位:取值为0、1、2~63。约束当前或后续字节是否为chunk string id(CSID)。
    • 0,则表示整个Basic Header占2个字节,即使用第2个字节表达CSID。
    • 1,则表示整个Basic Header占4个字节,即使用后续3个字节表达CSID。
    • 2~63,则表示整个Basic Header占1个字节,即fmt后面的6位是CSID。自己使用的话基本够用。

Message Header是可选的,也是动态大小的。这两者都是由Basic Header的fmt决定的,fmt是2位,可表示以下状态:

  • 00,Message Header最长,占11字节,即包含:TimeStamp(3) + MegLength(3) + TypeID(1) + StreamID(4)。
  • 01,Message Header占7字节,即包含:TimeStamp(3) + MegLength(3) + TypeID(1)。
  • 10,Message Header占3字节,即包含:TimeStamp(3)。
  • 11,没有Message Header。

之所以是可变的,是因为同一个流、同一个包分为多个消息/chunk/块传输,有很多信息只需要传一次就可以,后续客户端收到的信息复用前面的信息即可。

当用Message Header还表达信息的时候,就需要Extended Timestamp。当Message Header中的TimeStamp值为0xFFFFFF时,就存在Extended Timestamp。

消息类型/TypeID

TypeID 作用 SID CSID 分类
1 Set Chunk Size 0 2 控制消息
2 Abort Message 0 2 控制消息
3 Acknowledgement 0 2 控制消息
5 Window Acknowlegement Size 0 2 控制消息
6 Set Peer Bandwidth 0 2 控制消息
8 音频数据
9 视频数据
15(AMF3),18(AFM0) Data Message 命令消息
16(AFM3),19(AFM0) Shared Object Message 命令消息
17(AFM3),20(AFM0) Command Message 命令消息
22 Aggregate Message

AMF是Flash的编码数据格式,其形式像KLV(Key+Length+Value)。

欢迎关注我的其它发布渠道