Chunk Msg Header:
Chunk Msg Header的長度是可變的,Chunk
Msg Header可變的原因是為了壓縮傳輸的字節數,把一些相同類型的chunk的head去掉一些字節,換句話說就是四種類型的包頭都可以通過一定的規則還原成11個字節,這個壓縮和還原在RTMP協議中稱之為復用/解復用。
那我們以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字節的。