小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

FLV科普12 FLV腳本數(shù)據(jù)解析

 gljin_cn 2016-06-30

AMF(Action Message Format)是Flash與服務(wù)端通信的一種常見的二進(jìn)制編碼模式,其傳輸效率高,可以在HTTP層面上傳輸。現(xiàn)在很多Flash WebGame都采用這樣的消息格式。
AMF協(xié)議是基于Http協(xié)議的.
它的內(nèi)容處理過程大致是這樣:
1.從客戶端獲取Http請求(Request)流.
2.對流進(jìn)行解串行化(Deserialize),得到服務(wù)器端程序能夠識別的數(shù)據(jù),并建立一個(gè)響應(yīng)(Response)消息
3.Debug開始
4. 對流進(jìn)行各種處理(記錄、許可、服務(wù))得到返回值
5.對響應(yīng)流進(jìn)行串行化
6.發(fā)送Http響應(yīng)給客戶端標(biāo)準(zhǔn)文檔:

該類型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包:
       第1個(gè)字節(jié)表示AMF包類型,一般總是0x02,表示字符串,其他值表示意義請查閱文檔。
       第2-3個(gè)字節(jié)為UI16類型值,表示字符串的長度,一般總是0x000A(“onMetaData”長度)。
       后面字節(jié)為字符串?dāng)?shù)據(jù),一般總為“onMetaData”。
 
第二個(gè)AMF包:
       第1個(gè)字節(jié)表示AMF包類型,一般總是0x08,表示數(shù)組。
       第2-5個(gè)字節(jié)為UI32類型值,表示數(shù)組元素的個(gè)數(shù)。
       后面即為各數(shù)組元素的封裝,數(shù)組元素為元素名稱和值組成的對。表示方法如下:
       第1-2個(gè)字節(jié)表示元素名稱的長度,假設(shè)為L。
       后面跟著為長度為L的字符串。
       第L+3個(gè)字節(jié)表示元素值的類型。
       后面跟著為對應(yīng)值,占用字節(jié)數(shù)取決于值的類型

循環(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)換代碼:            

  1. #include "stdio.h"  
  2. int main()  
  3. {  
  4.     union DOUBLE  
  5.     {  
  6.         double  number;  
  7.         __int64 data;  
  8.     };  
  9.     DOUBLE num;  
  10.     num.data = 0x4060A8F5C28F5C29;  
  11.     printf("%lf\n",num.number);  
  12.     getchar();  
  13.     return 0;  
  14. }  

     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)

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多