AMF(Action Message Format)是Flash與服務(wù)端通信的一種常見的二進(jìn)制編碼模式,其傳輸效率高,可以在HTTP層面上傳輸。現(xiàn)在很多Flash WebGame都采用這樣的消息格式。 該類型Tag又通常被稱為Metadata Tag,會放一些關(guān)于FLV視頻和音頻的參數(shù)信息,如duration、width、height等。通常該類型Tag會跟在File Header后面作為第一個(gè)Tag出現(xiàn),而且只有一個(gè)。(該tag信息一般需要跟播放器約定好名稱與數(shù)值關(guān)系,如果沒有約定好,播放器會直接丟棄) 其中與其相關(guān)的工具就是:yamdi yamdi為flv文件增加了很多metadata信息,比如創(chuàng)建者、是否有關(guān)鍵幀、是否有視頻、是否有音頻,視頻高度和寬度等等。而yamdi加入的meta數(shù)據(jù)中,最有效的要數(shù)關(guān)鍵幀。被注入了關(guān)鍵幀的flv可以實(shí)現(xiàn)像土豆網(wǎng)、優(yōu)酷網(wǎng)等大型視頻網(wǎng)站一樣的“拖進(jìn)度”,提前拖到緩沖還未加載到的位置開始播放。 一般來說,該Tag Data結(jié)構(gòu)包含兩個(gè)AMF包。AMF(Action Message Format)是Adobe設(shè)計(jì)的一種通用數(shù)據(jù)封裝格式,在Adobe的很多產(chǎn)品中應(yīng)用,簡單來說,AMF將不同類型的數(shù)據(jù)用統(tǒng)一的格式來描述。第一個(gè)AMF包封裝字符串類型數(shù)據(jù),用來裝入一個(gè)“onMetaData”標(biāo)志,這個(gè)標(biāo)志與Adobe的一些API調(diào)用有,在此不細(xì)述。第二個(gè)AMF包封裝一個(gè)數(shù)組類型,這個(gè)數(shù)組中包含了音視頻信息項(xiàng)的名稱和值。具體說明如下,大家可以參照圖片上的數(shù)據(jù)進(jìn)行理解。 第一個(gè)AMF包: 循環(huán)解析ScriptTagBody 1. 解析 SCRIPTDATAVALUE 1.1 解析 數(shù)據(jù)類型 type 占8位 表示后面的數(shù)據(jù)類型 (0,Number ;1,Boolean;2,String........8,ECMA array........) 1.2 解析 具體數(shù)據(jù) 不同數(shù)據(jù)類型 根據(jù)下表進(jìn)行解析 Number,double (解析一個(gè)double數(shù)據(jù)) Boolean,UI8(解析一個(gè)字節(jié)數(shù)據(jù)) String,按照表SCRIPTDATASTRING解析 ......... ECMA array 按照表SCRIPTDATAECMAARRAY解析 1.2.1以SCRIPTDATASTRING為例解析: StringLength 數(shù)據(jù)長度 占16位 表示該數(shù)據(jù)的長度 StringData 16位數(shù)據(jù)的ascii碼 1.2.2以SCRIPTDATAECMAARRAY為例解析: ECMAArrayLength 占32位 數(shù)組長度 Variables 每個(gè)數(shù)據(jù) 解析見表SCRIPTDATAOBJECTPROPERTY 1.2.2.1 表SCRIPTDATAOBJECTPROPERTY PropertyName 數(shù)據(jù)名稱 解析見表 SCRIPTDATASTRING 見上面1.2.1 PropertyData 數(shù)據(jù)值 解析見表 SCRIPTDATAVALUE 見 1. List Terminator 解析見表SCRIPTDATAOBJECTEND (數(shù)組結(jié)束位,占3個(gè)字節(jié) 一定為 0x 00 00 09)
以下圖選定區(qū)域的一個(gè)tag為例: tag頭信息:占11字節(jié) 12 00 01 74 00 00 00 00 00 00 00 腳本數(shù)據(jù)(0x 12 size = 0x00 01 74 ) 數(shù)據(jù)類型:0x 02 表示String類型 StringLength 數(shù)據(jù)長度 占16位 值:0x 00 0A 長度10 StringData 值:0x 6F 6E 4D 65 74 61 44 61 74 61 : onMetaData 數(shù)據(jù)類型:0x 08 表示ECMA array數(shù)組類型 ECMAArrayLength 占32位 數(shù)組長度 當(dāng)前值:0x 00 00 00 10 數(shù)組長度:16 1) PropertyName 數(shù)據(jù)名稱 StringLength 數(shù)據(jù)長度 占16位 值:0x 00 08 長度8 StringData 值:0x 64 75 72 61 74 69 6F 6E : duration PropertyData 數(shù)據(jù) 數(shù)據(jù)類型 type 占8位 值:0x 00 double類型 數(shù)據(jù):double 占8字節(jié) 值:0x:40 60 A8 F5 C2 8F 5C 29值:133.28 轉(zhuǎn)換代碼:
2) PropertyName 數(shù)據(jù)名稱 StringLength 數(shù)據(jù)長度 占16位 值:0x 00 05 長度5 StringData 值:0x 77 69 64 74 68: width PropertyData 數(shù)據(jù) 數(shù)據(jù)類型 type 占8位 值:0x 00 double類型 數(shù)據(jù):double 占8字節(jié) 值:0x 40 84 00 00 00 00 00 00值:640.00 3) PropertyName 數(shù)據(jù)名稱 StringLength 數(shù)據(jù)長度 占16位 值:0x 00 06 長度6 StringData 值:0x 68 65 69 67 68 74: height PropertyData 數(shù)據(jù) 數(shù)據(jù)類型 type 占8位 值:0x 00 double類型 數(shù)據(jù):double 占8字節(jié) 值:0x 40 76 80 00 00 00 00 00 值:360.00
4) PropertyName 數(shù)據(jù)名稱 StringLength 數(shù)據(jù)長度 占16位 值:0x 00 0D 長度13 StringData 值:0x 76 69 64 65 6F 64 61 74 61 72 61 74 65 : videodaterate PropertyData 數(shù)據(jù) 數(shù)據(jù)類型 type 占8位 值:0x 00 double類型 數(shù)據(jù):double 占8字節(jié) 值:0x 40 71 A4 B4 00 00 00 00 值:282.29
5) PropertyName 數(shù)據(jù)名稱 StringLength 數(shù)據(jù)長度 占16位 值:0x 00 09 長度9 StringData 值:0x 66 72 61 6D 65 72 61 74 65 : framerate PropertyData 數(shù)據(jù) 數(shù)據(jù)類型 type 占8位 值:0x 00 double類型 數(shù)據(jù):double 占8字節(jié) 值:0x 40 39 00 00 00 00 00 00 值:25.00
6) PropertyName 數(shù)據(jù)名稱 StringLength 數(shù)據(jù)長度 占16位 值:0x 00 0C 長度12 StringData 值:0x 76 69 64 65 6F 63 6F 64 65 63 69 64 :videocodecid PropertyData 數(shù)據(jù) 數(shù)據(jù)類型 type 占8位 值:0x 00 double類型 數(shù)據(jù):double 占8字節(jié) 值:0x 40 1C 00 00 00 00 00 00 值:7.00
7) PropertyName 數(shù)據(jù)名稱 StringLength 數(shù)據(jù)長度 占16位 值:0x 00 0D 長度13 StringData 值:0x 61 75 64 69 6F 64 61 74 61 72 61 74 65 :audiodaterate PropertyData 數(shù)據(jù) 數(shù)據(jù)類型 type 占8位 值:0x 00 double類型 數(shù)據(jù):double 占8字節(jié) 值:0x 40 5F 74 50 00 00 00 00 值:125.82
8) PropertyName 數(shù)據(jù)名稱 StringLength 數(shù)據(jù)長度 占16位 值:0x 00 0F 長度15 StringData 值:0x 61 75 64 69 6F 73 61 6D 70 6C 65 72 61 74 65 :audiosamplerate PropertyData 數(shù)據(jù) 數(shù)據(jù)類型 type 占8位 值:0x 00 double類型 數(shù)據(jù):double 占8字節(jié) 值:0x 40 E5 88 80 00 00 00 00 值:44100.00
9) PropertyName 數(shù)據(jù)名稱 StringLength 數(shù)據(jù)長度 占16位 值:0x 00 0F 長度15 StringData 值:0x 61 75 64 69 6F 73 61 6D 70 6C 65 73 69 7A 65 :audiosamplesize PropertyData 數(shù)據(jù) 數(shù)據(jù)類型 type 占8位 值:0x 00 double類型 數(shù)據(jù):double 占8字節(jié) 值:0x 40 30 00 00 00 00 00 00 值:16.00
10) PropertyName 數(shù)據(jù)名稱 StringLength 數(shù)據(jù)長度 占16位 值:0x 00 06 長度6 StringData 值:0x 73 74 65 72 65 6F :stereo PropertyData 數(shù)據(jù) 數(shù)據(jù)類型 type 占8位 值:0x 01 Boolean類型 數(shù)據(jù):double 占8字節(jié) 值:0x 40 30 00 00 00 00 00 00 值:16.00
11) PropertyName 數(shù)據(jù)名稱 StringLength 數(shù)據(jù)長度 占16位 值:0x 00 0C 長度12 StringData 值:0x 61 75 64 69 6F 63 6F 64 65 63 69 64 :audiocodecid PropertyData 數(shù)據(jù) 數(shù)據(jù)類型 type 占8位 值:0x 00 double類型 數(shù)據(jù):double 占8字節(jié) 值:0x 40 24 00 00 00 00 00 00 值:10.00
12) PropertyName 數(shù)據(jù)名稱 StringLength 數(shù)據(jù)長度 占16位 值:0x 00 0B 長度11 StringData 值:0x 6D 61 6A 6F 72 5F 62 72 61 6E 64 :major_brand PropertyData 數(shù)據(jù) 數(shù)據(jù)類型 type 占8位 值:0x 02 表示String類型
StringLength 數(shù)據(jù)長度 占16位 值:0x 00 04 長度4 StringData 值:0x 69 73 6F 6D : isom
13) PropertyName 數(shù)據(jù)名稱 StringLength 數(shù)據(jù)長度 占16位 值:0x 00 0D 長度13 StringData 值:0x 6D 69 6E 6F 72 5F 76 65 72 73 69 6F 6E :minor_version PropertyData 數(shù)據(jù) 數(shù)據(jù)類型 type 占8位 值:0x 02 表示String類型
StringLength 數(shù)據(jù)長度 占16位 值:0x 00 03 長度3 StringData 值:0x 35 31 32 : 512
14) PropertyName 數(shù)據(jù)名稱 StringLength 數(shù)據(jù)長度 占16位 值:0x 00 11 長度17 StringData 值:0x 63 6F 6D 70 61 74 69 62 6C 65 5F 62 72 61 6E 64 73 :compatible_brands PropertyData 數(shù)據(jù) 數(shù)據(jù)類型 type 占8位 值:0x 02 表示String類型
StringLength 數(shù)據(jù)長度 占16位 值:0x 00 10 長度16 StringData 值:0x 69 73 6F 6D 69 73 6F 32 61 76 63 31 6D 70 34 31 : isomiso2avc1mp41
15) PropertyName 數(shù)據(jù)名稱 StringLength 數(shù)據(jù)長度 占16位 值:0x 00 07 長度7 StringData 值:0x 65 6E 63 6F 64 65 72 :encoder PropertyData 數(shù)據(jù) 數(shù)據(jù)類型 type 占8位 值:0x 02 表示String類型
StringLength 數(shù)據(jù)長度 占16位 值:0x 00 0D 長度13 StringData 值:0x 4C 61 76 66 35 36 2E 31 35 2E 31 30 32: Lavf56.15.102 15) PropertyName 數(shù)據(jù)名稱 StringLength 數(shù)據(jù)長度 占16位 值:0x 00 08 長度8 StringData 值:0x 66 69 6C 65 73 69 7A 65 :filesize
PropertyData 數(shù)據(jù) 數(shù)據(jù)類型 type 占8位 值:0x 00 double類型 數(shù)據(jù):double 占8字節(jié) 值:0x41 5B 2B 4B 80 00 00 00 值:7122222.0 List Terminator 解析見表SCRIPTDATAOBJECTEND (數(shù)組結(jié)束位,占3個(gè)字節(jié) 一定為 0x 00 00 09)
|
|