原創 RTMP協議 封包 參考Red5 RTMP協議封包 由一個包頭和一個包體組成,包頭可以是4種長度的任意一種:12, 8, 4, 1 byte(s).完整的RTMP包頭應該是12bytes,包含了時間戳,Head_Type,AMFSize,AMFType,StreamID信 息, 8字節的包頭只紀錄了時間戳,Head_Type,AMFSize,AMFType, 4個字節的包頭記錄了時間戳,Head_Type。1個字節的包頭只記錄了Head_Type 。包體最大長度默認為128字節,通過chunkSize 可改變包體最大長度,通常當一段AFM數據超過128字節后,超過128的部分就放到了其他的RTMP封包中,包頭為一個字節. 完整的RTMP包頭有12字節,由下面5個部分組成:
一、Head_Type - 包頭類型 Head_Type占用RTMP包的第一個字節,這個字節里面記錄了包的類型和包的ChannelID。Head_Type字節的前兩個Bit決定了包頭的長度.它可以用掩碼0xC0進行"與"計算: Head_Type的前兩個Bit和長度對應關系:
Head_Type的后面6個Bit和StreamID決定了ChannelID。 StreamID和ChannelID對應關系:StreamID=(ChannelID-4)/5+1 參考red5
例如在rtmp包的數據中里面,發現被插入了一個0xC2,這個就是一字節的包頭,并且channelID=2. 二、TiMMER - 時間戳 時
間戳占用RTMP包頭的第2、3、4
三個字節。RTMP時間戳可分為絕對時間戳和相對時間戳,紀錄的是音視頻的時間信息。相對時間戳指的是二個RTMP包之間的時間間隔,單位毫秒。而絕對時
間戳指的是當前封包發送的時刻,單位也是毫秒。對于音視頻的播放,時間戳非常關鍵,因為音視頻的播放同步是由時間戳來控制的,如果你的視頻出現卡頓,音視
頻不同步,延時越來越大,很可能就是你的時間戳不準導致的。
五、StreamID - 流ID 占 用RTMP包頭的最后4個字節,是一個big-endian的int型數據。我們x86 計算機內存中數據存放都是小尾數模式:little-endian,而網絡數據流一般都是大尾數模式:big-endian。 StreamID是音視頻 流的唯一ID, 一路流如果既有音頻包又有視頻包,那么這路流音頻包的StreamID和他視頻包的StreamID相同,但ChannelID不同。 ChannelID 和StreamID之間的計算公式:StreamID=(ChannelID-4)/5+1 參考red5。如果這個封包既不是音頻包,也不是視頻包,那么他的StreamID=0. 例如當音視頻包ChannelID為2、3、4時StreamID都為1 當音視頻包ChannelID為9的時候StreamID為2 六、封包分析 例如有一個RTMP封包的數據0300 00 00 00 01 02 1400 00 00 00 0200 07 63 6F 6E 6E 65 63 74 003F F0 00 00 00 00 00 00 08 ,,, 數據依次解析的含義 03表示12字節頭,channelid=3 000000表示時間戳 Timer=0 000102表示AMFSize=18 14表示AMFType=Invoke 方法調用 00 00 00 00 表示StreamID = 0 //到此,12字節RTMP頭結束下面的是AMF數據分析,具體的AMF0數據格式請參考 RTMP協議 二、AMF數據 02表示String 0007表示String長度7 63 6F 6E 6E 65 63 74 是String的Ascall值"connect" 00表示Double 3F F0 00 00 00 00 00 00 表示double的0.0 08表示Map數據開始 下面是我用c++實現的完整的rtmp客戶端程序下載 RTMP協議分析 二、AMF數據:http://www./fly2700/archive/2008/04/09/281432.html 程序下載:http://www./fly2700/archive/2008/04/02/280641.html |
|