·您当前的位置:首页 > 技术教程 > AS2与AS3技术 >

[AS3]RTMP协议(实时消息传送协议)详解(2)

时间:2012-03-31 09:09cppblog.com
RTMP的字节序: RTMP的字节序和大多数网络协议一样是大端序,也有一些字段是小端序的,不过都有特殊的说明。 RTMP的head组成 RTMP的head在协议中的表现形式是chunk head,前面已经说到一个Message + head可以分成一

  RTMP的字节序:
  RTMP的字节序和大多数网络协议一样是大端序,也有一些字段是小端序的,不过都有特殊的说明。
  RTMP的head组成

  RTMP的head在协议中的表现形式是chunk head,前面已经说到一个Message + head可以分成一个和多个chunk,为了区分这些chunk,肯定是需要一个chunk head的,具体的实现就把Message head的信息和chunk head的信息合并在一起以chunk head的形式表现。

  一个完整的chunk的组成如下图所示



  Chunk basic header:

  该字段包含chunk的stream ID和 type 。chunk的Type决定了消息头的编码方式。该字段的长度完全依赖于stream ID,该字段是一个可变长的字段。

  Chunk Msg Header:0, 3 ,7, 11

  该字段包含了将要发送的消息的信息(或者是一部分,一个消息拆成多个chunk的情况下是一部分)该字段的长度由chunk basic header中的type决定。

  Extend Timestamp: 0 ,4 bytes

  该字段发送的时候必须是正常的时间戳设置成0xffffff时,当正常时间戳不为0xffffff时,该字段不发送。当时间戳比0xffffff小该字段不发送,当时间戳比0xffffff大时该字段必须发送,且正常时间戳设置成0xffffff。

  Chunk Data
  实际数据(Payload),可以是信令,也可以是媒体数据。

  Chunk basic header:
  chunk basic head的长度为1~3个字节,具体长度主要是依赖chunk stream ID的长度,所谓chunk stream ID是flash server用来管理连接的客户端的信令交互的标识,在red5的文档中称之为channel ID,协议最大支持65597个streamID 从3~65599。ID 0,1,2为协议保留,0代表ID是64~319(第二个byte + 64);1代表chunk stream ID为64~65599((第三个byte)* 256 + 第二个byte + 64)(小端表示);2代表该消息为低层的协议(在RTMP协议中控制信令的chunk stream ID都是2)。3~63的chunk stream ID就是该byte的值。没有附加的字段来标识chunk stream streamID。在这里要指出的是虽然RTMP的chunk stream ID理论是可以达到65599,但是目前使用的chunk stream ID很少,2~7都是约定的,8是用来传输publish play等命令,其他的chunk stream ID目前好像没有使用,至少我不知道用来干嘛的。
  所以目前chunk basic head的长度一般为1个字节。这一个字节由两部分组成
+++++++++++++++++++
+fmt + cs id +
+++++++++++++++++++
  fmt占两个bit用来标识紧跟其后的chunk Msg Header的长度,cs id占六个bit。
  两位的fmt取值为 0~3,分别代表的意义如下:
case 0:chunk Msg Header长度为11;
case 1:chunk Msg Header长度为7;
case 2:chunk Msg Header长度为3;
case 3:chunk Msg Header长度为0;
  所以 只有一个字节的chunk basic header取值为 chunk basic header = (fmt << 6) | (cs id).

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器