RTMP header解析

来源:互联网 发布:快速凸包算法 编辑:程序博客网 时间:2024/06/06 10:59

+-------------+----------------+-------------------+--------------+
| Basic header|Chunk Msg Header|Extended Time Stamp|   Chunk Data |
+-------------+----------------+-------------------+--------------+

                   (图1.包头header 构成)

0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+      
|fmt|   cs id   |
+-+-+-+-+-+-+-+-+
Figure 6  Chunk basic header 1

                 (图2. Basic header构成)

 

Baisc header 是1-3个字节,第一个字节的高2位表示包头的格式,低6位表示chunk stream ID

1)chunk stream ID决定了Basic header的字节数,首先查看低六位的取值:

  • 3及以上的则Basic header为一个字节
  • 0为两个字节,chunk stream id = 64 + 第二个字节值 (64-319)
  • 1为三个字节,chunk stream id = 第三字节*256 + 第二字节 + 64(64–65599)
  • 2为一个字节,Value 2 indicates its low-level protocol message

chunk stream id 含义
2: low level
3: high level like connect,createStream
4: control stream
5: video
6: audio
8: control stream

 

2)fmt取值决定了整个包头header的长度(以下表现的长度均不包含Basic header的长度)

      两位的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;

 

我们以11个字节的完整包头来解释Chunk Msg Header,如图所示

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

+        timestamp    +    message length + message type id +    message stream id +

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

Timestamp:3bytes

对于type 0的chunk,绝对时间戳在这里表示,如果时间戳值大于等于0xffffff(16777215),该值必须是0xffffff,且时间戳扩展字段必须发送,其他情况没有要求。

message length:3bytes

Message的长度,注意这里的长度并不是跟随chunk head其后的chunk data(Payload)的长度,而是前文提到的一条信令或者一帧视频数据或音频数据的长度。前文提到过信令或者媒体数据都称之为Message,一条Message可以分为一条或者多条chunk。

message type id:1byte

Message的类型ID,具体的值将在后文专门来讨论。

message stream id:4bytes

message stream id的字节序是小端序,这个字段是为了解复用而设计的,RTMP文档上说的相当的模糊,

 

message stream ID可以使任意值,不同的消息流复用成相同的chunk stream,基于它们的ID能够解复用。于chunk stream 是相关的,这个字段是一个不透明的值没有整明白什么意思,我的理解就是用来标识和服务器连接的flash端的序号。

长度是7 byteschunk head,该类型不包含stream ID,该chunkstreamID和前一个chunkstream ID是相同的,变长的消息,例如视频流格式,在第一个新的chunk以后使用这种类型,注意其中时间戳部分是相对时间,为何上一个绝对时间之间的差值 如图所示:

++++++++++++++++++++++++++++++++++++++++++++++++++++++

+     timestamp    delta    +    message length + message type id +   

++++++++++++++++++++++++++++++++++++++++++++++++++++++

        3 bytes的chunk head,该类型既不包含stream ID也不包含消息长度,这种类型用于stream ID和前一个chunk相同,且有固定长度的信息,例如音频流格式,在第一个新的chunk以后使用该类型。如图所示:

                           ++++++++++++++++++++

                           +     timestamp    delta    +

                           ++++++++++++++++++++

 

        0 bytes的chunk head,这种类型的chunk从前一个chunk得到值信息,当一个单个消息拆成多个chunk时,这些chunk除了第一个以外,其他的都应该使用这种类型,

chunk的长度:

chunk的长度初始长度固定为128个字节,但是这个值并不是不可变的,在客户端和服务端建立连接以后,客户端和服务端都可以通过发送信令的方式来通知对端修改chunk的长度,理论上来说可以修改chunk的最长长度为65536。这里chunk的长度是指chunk的数据部分的长度,即chunk data(payload)的长度,如果一条Message的数据长度超过了chunk的长度,就必须把Message分割成多条chunk,即如果一条视频类型Message长度为2000个byte,chunk长度为1500,则该Message将会分割成两条chunk,第一条的chunk data长度为1500,第二条的chunk data长度为500。当然这两条chunk的chunk head肯定是不同的,其中第二条chunk的chunk head就是0字节的

 

  • Message Type ID:

0×01 Chunk Size changes the chunk size for packets0×02 Unknown anyone know this one? 0×03 Bytes Read send every x bytes read by both sides0×04 Ping ping is a stream control message, has subtypes0×05 Server BW the servers downstream bw0×06 Client BW the clients upstream bw 0×07 Unknown anyone know this one? 0×08 Audio Data packet containing audio 0×09 Video Data packet containing video data0x0A - 0×11 Unknown anyone know? 0×12 Notify an invoke which does not expect a reply0×13 Shared Object has subtypes 0×14 Invoke like remoting call, used for stream actions too.


转载地址 http://www.cnblogs.com/MonkChen/archive/2011/08/17/2141709.html

0 0