RTMP header解析

xiaoxiao2021-02-28  80

http://blog.csdn.net/wan706364166/article/details/40861629

+-------------+----------------+-------------------+--------------+  | 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,该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×01Chunk Sizechanges the chunk size for packets0×02Unknownanyone know this one?0×03Bytes Readsend every x bytes read by both sides0×04Pingping is a stream control message, has subtypes0×05Server BWthe servers downstream bw0×06Client BWthe clients upstream bw0×07Unknownanyone know this one?0×08Audio Datapacket containing audio0×09Video Datapacket containing video data0x0A - 0×11Unknownanyone know?0×12Notifyan invoke which does not expect a reply0×13Shared Objecthas subtypes0×14Invokelike remoting call, used for stream actions too.

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

转载请注明原文地址: https://www.6miu.com/read-52774.html

最新回复(0)