Chunk Msg Header:
Chunk Msg Header的長(zhǎng)度是可變的,Chunk
Msg Header可變的原因是為了壓縮傳輸?shù)淖止?jié)數(shù),把一些相同類型的chunk的head去掉一些字節(jié),換句話說(shuō)就是四種類型的包頭都可以通過(guò)一定的規(guī)則還原成11個(gè)字節(jié),這個(gè)壓縮和還原在RTMP協(xié)議中稱之為復(fù)用/解復(fù)用。
那我們以11個(gè)字節(jié)的完整包頭來(lái)解釋Chunk
Msg Header,如圖所示
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ timestamp
+ message length + message type id + message
stream id +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Timestamp:3bytes
對(duì)于type 0的chunk,絕對(duì)時(shí)間戳在這里表示,如果時(shí)間戳值大于等于0xffffff(16777215),該值必須是0xffffff,且時(shí)間戳擴(kuò)展字段必須發(fā)送,其他情況沒(méi)有要求。
message length:3bytes
Message的長(zhǎng)度,注意這里的長(zhǎng)度并不是跟隨chunk head其后的chunk data(Payload)的長(zhǎng)度,而是前文提到的一條信令或者一幀視頻數(shù)據(jù)或音頻數(shù)據(jù)的長(zhǎng)度。前文提到過(guò)信令或者媒體數(shù)據(jù)都稱之為Message,一條Message可以分為一條或者多條chunk。
message type id:1byte
Message的類型ID,具體的值將在后文專門(mén)來(lái)討論。
message
stream id:4bytes
message
stream id的字節(jié)序是小端序,這個(gè)字段是為了解復(fù)用而設(shè)計(jì)的,RTMP文檔上說(shuō)的相當(dāng)?shù)哪:?/span>
message stream ID可以使任意值,不同的消息流復(fù)用成相同的chunk stream,基于它們的ID能夠解復(fù)用。于chunk stream 是相關(guān)的,這個(gè)字段是一個(gè)不透明的值沒(méi)有整明白什么意思,我的理解就是用來(lái)標(biāo)識(shí)和服務(wù)器連接的flash端的序號(hào)。
長(zhǎng)度是7 bytes 的chunk head,該類型不包含stream ID,該chunk的streamID和前一個(gè)chunk的stream ID是相同的,變長(zhǎng)的消息,例如視頻流格式,在第一個(gè)新的chunk以后使用這種類型,注意其中時(shí)間戳部分是相對(duì)時(shí)間,為何上一個(gè)絕對(duì)時(shí)間之間的差值 如圖所示:
++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ timestamp
delta + message length + message type id +
++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 bytes的chunk head,該類型既不包含stream ID 也不包含消息長(zhǎng)度,這種類型用于stream ID和前一個(gè)chunk相同,且有固定長(zhǎng)度的信息,例如音頻流格式,在第一個(gè)新的chunk以后使用該類型。如圖所示:
++++++++++++++++++++
+ timestamp
delta +
++++++++++++++++++++
0 bytes的chunk head,這種類型的chunk從前一個(gè)chunk得到值信息,當(dāng)一個(gè)單個(gè)消息拆成多個(gè)chunk時(shí),這些chunk除了第一個(gè)以外,其他的都應(yīng)該使用這種類型,
chunk的長(zhǎng)度:
chunk的長(zhǎng)度初始長(zhǎng)度固定為128個(gè)字節(jié),但是這個(gè)值并不是不可變的,在客戶端和服務(wù)端建立連接以后,客戶端和服務(wù)端都可以通過(guò)發(fā)送信令的方式來(lái)通知對(duì)端修改chunk的長(zhǎng)度,理論上來(lái)說(shuō)可以修改chunk的最長(zhǎng)長(zhǎng)度為65536。這里chunk的長(zhǎng)度是指chunk的數(shù)據(jù)部分的長(zhǎng)度,即chunk data(payload)的長(zhǎng)度,如果一條Message的數(shù)據(jù)長(zhǎng)度超過(guò)了chunk的長(zhǎng)度,就必須把Message分割成多條chunk,即如果一條視頻類型Message長(zhǎng)度為2000個(gè)byte,chunk長(zhǎng)度為1500,則該Message將會(huì)分割成兩條chunk,第一條的chunk data長(zhǎng)度為1500,第二條的chunk data長(zhǎng)度為500。當(dāng)然這兩條chunk的chunk head肯定是不同的,其中第二條chunk的chunk head就是0字節(jié)的。