KEY : Message / Chunk / Stream
Rtmp中,一個(gè)Message通常是分割成多個(gè)Chunk進(jìn)行傳輸?shù)?每個(gè)Chunk通常包含有1~12個(gè)字節(jié)的頭部(該部分與完整的協(xié)議不是十分符合).
因?yàn)?/span>Rtmp是基于TCP協(xié)議的,所以在Rtmp傳輸過程中, Chunk頭部會(huì)根據(jù)實(shí)際情況使用簡化的頭部(12字節(jié)的頭部是完整的頭部,8/4/1字節(jié)的頭部是根據(jù)實(shí)際情況簡化的).
一. Chunk頭部的簡化規(guī)則
說明:以上的"------"為6bit的ChunkId
1 . 00------頭部
在傳輸開始,的第一個(gè)Chunk頭部通常使用(00------)格式,包含完整的頭部信息,依次包含:時(shí)間戳,Message長度,Message類型1B,StreamId1B. 這些信息在程序中是需要保留的.以便后面簡化的頭部,可根據(jù)該頭部完善信息.
2 . 01------頭部
當(dāng)發(fā)送多個(gè)相關(guān)的Message時(shí),Chunk的頭部通常使用(01------)開始, 后面追加StreamId,Message類型和Message長度三個(gè)字段,這些字段與前一個(gè)Chunk的信息保持一致.例如,當(dāng)交錯(cuò)的發(fā)送Video/Audio Message,它們屬于同一個(gè)StreamId,但其他字段都發(fā)生了變化.
3 . 10------頭部
當(dāng)由一個(gè)Message拆分成的連續(xù)的兩個(gè)Chunk的時(shí)間戳發(fā)生了變化時(shí)(尤其是Video/Audio Message),例如,一個(gè)Video Message中前一個(gè)Chunk和下一個(gè)Chunk的時(shí)間戳或時(shí)間戳增量不一致,后面的Chunk頭部會(huì)以(10------)開始, 再追加一個(gè)3字節(jié)的時(shí)間戳字段即可.
4 . 11------頭部
當(dāng)一個(gè)Message過長,需要由多個(gè)連續(xù)的Chunk進(jìn)行發(fā)送時(shí),Chunk的頭部通常會(huì)以(11------)開始, 沒有其他附加字段,所有相關(guān)字段與前一個(gè)Chunk保持一致.
二. 關(guān)于ChunkId和StreamId
1 . StreamId的使命
一個(gè)StreamId通常用以完成某些特定的工作. 如使用Id為0的Stream來完成客戶端和服務(wù)器的連接和控制,用Id為1的Stream來完成Stream的控制和播放等工作.
2 . ChunkId的使命
一個(gè)ChunkId通常會(huì)完成某個(gè)特定的工作. 比如說系統(tǒng)保留的ChunkId為2的就只是用于完成對(duì)Stream的控制. 在該通道上,服務(wù)器和客戶端可以對(duì)Stream的具體屬性進(jìn)行設(shè)置和交互.如創(chuàng)建一個(gè)Stream,告知Stream結(jié)束,設(shè)定Stream的帶寬,設(shè)定Chunk大小,終止Message等.這里對(duì)Stream的控制不是針對(duì)某個(gè)Stream的,而是全局的.
再比如,使用ChunkId8對(duì)播放進(jìn)行控制.客戶端發(fā)送"play"命令,服務(wù)器也會(huì)通過ChunkId8這個(gè)通道告知客戶端播放的狀態(tài),如告知客戶端播放開始,播放完成等信息.服務(wù)器使用ChunkId5進(jìn)行媒體數(shù)據(jù)的傳送,如果客戶端需要針對(duì)這些數(shù)據(jù)對(duì)服務(wù)器應(yīng)答,也要使用該通道.
3 . ChunkId和StreamId的關(guān)系
ChunkId和StreamId的關(guān)系目前并不明了,但通常情況下某一個(gè)ChunkId會(huì)在固定的StreamId中完成相應(yīng)的工作. 比如ChunkId2對(duì)Stream的相關(guān)屬性進(jìn)行控制,這些控制的消息必須在StreamId0中完成.也就是說ChunkId2和StreamId0指定了服務(wù)器和客戶端對(duì)Stream控制的以個(gè)對(duì)話通道.