RTMP協議詳解(二)

2021-06-05 04:03:29 字數 1742 閱讀 5572

rtmp的位元組序:

rtmp的位元組序和大多數網路協議一樣是大端序,也有一些欄位是小端序的,不過都有特殊的說明。

rtmp的head組成

rtmp的head在協議中的表現形式是chunk head,前面已經說到乙個message + head可以分成乙個和多個chunk,為了區分這些chunk,肯定是需要乙個chunk head的,具體的實現就把message  head的資訊和chunk head的資訊合併在一起以chunk head的形式表現。

乙個完整的chunk的組成如下圖所示

chunk basic header:

該欄位包含chunk的stream id和 type 。chunk的type決定了訊息頭的編碼方式。該字段的長度完全依賴於stream id,該字段是乙個可變長的字段。

chunk msg header:0, 3 ,7, 11

該欄位包含了將要傳送的訊息的資訊(或者是一部分,乙個訊息拆成多個chunk的情況下是一部分)該字段的長度由chunk basic header中的type決定。

extend timestamp: 0 ,4 bytes

該欄位傳送的時候必須是正常的時間戳設定成0xffffff時,當正常時間戳不為0xffffff時,該字段不傳送。當時間戳比0xffffff小該字段不傳送,當時間戳比0xffffff大時該字段必須傳送,且正常時間戳設定成0xffffff。

chunk data

實際資料(payload),可以是信令,也可以是**資料。

chunk basic header:

chunk basic head的長度為1~3個位元組,具體長度主要是依賴chunk stream id的長度,所謂chunk stream id是flash server用來管理連線的客戶端的信令互動的標識,在red5的文件中稱之為channel id,協議最大支援65597個streamid 從3~65599。id 0,1,2為協議保留,0代表id是64~319(第二個byte + 64);1代表chunk stream id為64~65599((第三個byte)* 256 + 第二個byte + 64)(小端表示);2代表該訊息為低層的協議(在rtmp協議中控制信令的chunk stream id都是2)。3~63的chunk stream id就是該byte的值。沒有附加的字段來標識chunk stream streamid。在這裡要指出的是雖然rtmp的chunk stream id理論是可以達到65599,但是目前使用的chunk stream id很少,2~7都是約定的,8是用來傳輸publish play等命令,其他的chunk stream id目前好像沒有使用,至少我不知道用來幹嘛的。

所以目前chunk basic head的長度一般為1個位元組。這乙個位元組由兩部分組成

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

+fmt    +  cs id              +

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

fmt佔兩個bit用來標識緊跟其後的chunk msg header的長度,cs id佔六個bit。

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

所以 只有乙個位元組的chunk basic header取值為 chunk basic header = (fmt << 6) | (cs id).

rtmp 協議詳解

rtmp協議是乙個網際網路tcp ip五層體系結構中應用層的協議。rtmp協議中基本的資料單元稱為訊息 message 當rtmp協議在網際網路中傳輸資料的時候,訊息會被拆分成更小的單元,稱為訊息塊 chunk 1 訊息 2 訊息塊 在網路上傳輸資料時,訊息需要被拆分成較小的資料塊,才適合在相應的網...

RTMP協議詳解 (一) 握手

rtmp協議介紹 包結構 握手在rtmp連線建立後,服務端與客戶端需要通過3次交換報文完成握手.握手其他的協議不同,是由三個靜態大小的塊,而不是可變大小的塊組成的,客戶端與伺服器傳送相同的三個chunk,客戶端傳送c0,c1,c2 chunk,服務端傳送s0,s1,s2 chunk.傳送順序 握手開...

chunk rtmp 幀 RTMP協議詳解(三)

chunk msg header chunk msg header的長度是可變的,chunk msg header可變的原因是為了壓縮傳輸的位元組數,把一些相同型別的chunk的head去掉一些位元組,換句話說就是四種型別的包頭都可以通過一定的規則還原成11個位元組,這個壓縮和還原在rtmp協議中稱...