|
Rtmp包默認的最大長度為128字節(jié),(或通過chunksize改變rtmp包最大長度),
當AMF數據超過128Byte的時候就可能有多個rtmp包組成,如果需要解碼的rtmp包太長則被TCP協議分割成多個TCP包.那么解碼的時候需要
先將包含rtmp包的tcp封包合并, 再把合并的數據解碼,解碼后可得到amf格式的數據,將這些AMF數據取出來就可以對AMF數據解碼了. RTMP封包包括包頭和AMF數據2部分,AMF數據里面可以是命令也可以是音視頻數據。組成服務器和Flash客戶端之間的所有數據都是用AMF格式的數據在傳送,例如connect() publish()等命令. AMF數據由2部分組成: ObjType 加上 ObjValue。ObjType的大小為一個字節(jié)。ObjValue的大小不固定,和ObjType相關。 常用的ObjType類型和對應的ObjValue大小整理如下,詳細的ObjType的數據在本文的最下面列出:
ObjValue不一定是一個固定的大小,他可以包含另外一個AMF數據,這另外一個AMF數據里面又有ObjType 加上 ObjValue,也就是AMF數據的嵌套關系 AMF0數據的嵌套關系如下: Object={ObjType + ObjValue} CORE_BOOLEAN={Value(1 Byte)} CORE_NUMBER={Value(8 Byte)} CORE_String={StringLen(2 Byte) + StringValue(StringLen Byte)} CORE_DATE={value(10 Byte)} CORE_Array={ArrayLen(4 Byte) + Object} CORE_Map={MapNum(4 Byte) + CORE_Object} CORE_Object={CORE_String + Object} 看起來有些復雜,所以我這里圖文并茂來詳解,例如完成握手后,Flash向FMS發(fā)送的第一個RTMP數據,內容如下: 藍色的表示包頭,紅色的表示ObjType,綠色的表示數據。上面一段數據由2個RTMP包組成,2個RTMP包頭分別用藍色表示,第一個藍色的是12字節(jié)的包頭,后面一個藍色的C3是一個字節(jié)的包頭,綠色部分是數據,紅色的是AMF數據類型,整個RTMP解碼過程如下 [2008-06-18 16:59:20] DecodeInvoke: [2008-06-18 16:59:20] InvokeName:String:connect [2008-06-18 16:59:20] InvokeID:Double:0 [2008-06-18 16:59:20] Map:MapNum:0 [2008-06-18 16:59:20] Params:{ [2008-06-18 16:59:20] Key:String:objectEncoding [2008-06-18 16:59:20] Value:Double:0 [2008-06-18 16:59:20] Key:String:app [2008-06-18 16:59:20] Value:String:mediaserver [2008-06-18 16:59:20] Key:String:fpda [2008-06-18 16:59:20] Value:Bool:0 [2008-06-18 16:59:20] Key:String:tcUrl [2008-06-18 16:59:20] Value:String:rtmp://127.0.0.1/mediaserver [2008-06-18 16:59:20] Key:String:audioCodecs [2008-06-18 16:59:20] Value:Double:615 [2008-06-18 16:59:20] Key:String:videoCodecs [2008-06-18 16:59:20] Value:Double:76 [2008-06-18 16:59:20] }End Params [2008-06-18 16:59:20] InvokeParams:String:PUBLISHER [2008-06-18 16:59:20] InvokeParams:String:streamRecode FMS3中為了實現H.264數據的直播而增加了一個數據類型,這個類型的值為0x16,這個類型不在下表中,如果需要請參看http://www./fly2700/archive/2009/02/06/297957.html 詳細的ObjType數據類型如下:,參考Red5 enum AMF { /** * Boolean value marker constant */ TYPE_BOOLEAN = 0x01, /** /** /** /** /** /** /** /** /** /** /** /** /** /** /** /** /** 程序下載http://www./fly2700/archive/2008/04/02/280641.html |
|
|