+-------------+----------------+-------------------+--------------+
| 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 bytes 的chunk head,该类型不包含stream ID,该chunk的streamID和前一个chunk的stream 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 packets |
0×02 | Unknown | anyone know this one? |
0×03 | Bytes Read | send every x bytes read by both sides |
0×04 | Ping | ping is a stream control message, has subtypes |
0×05 | Server BW | the servers downstream bw |
0×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 data |
0x0A - 0×11 | Unknown | anyone know? |
0×12 | Notify | an invoke which does not expect a reply |
0×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