久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    FLV 封裝格式解析

     昵稱60563631 2023-05-12 發布于安徽

    FLV (Flash Video) 是由 Adobe 公司推出的一種封裝格式,主要用于流媒體系統。FLV 封裝的媒體文件具有體積輕巧、封裝播放簡單等特點,很適合網絡應用。目前各瀏覽器普遍使用 Flash Player 作為網頁播放器,使得安裝有瀏覽器的計算機終端不需要另外安裝播放器,這也是 FLV 格式廣為流行的原因之一。

    FLV 封裝格式的文件擴展名為 .flv。FLV 文件主要由一個 Header 加上由多個 Tag 組成的 Body 構成。如下所述:

    1. FLV Header

    所有 FLV 格式文件都以 FLV Header 開頭。FLV Header 類型是 FLVHEADER,FLVHEADER 定義如下:

    typedef struct {
        UI8 Signature;
        UI8 Signature;
        UI8 Signature;
        UI8 Version;
        UI8 TypeFlags;
        UI32 DataOffset;
    }   FLVHEADER;

    2. FLV Body

    一個 FLV 文件,除開頭的 FLV Header 外,剩余部分就是 FLV Body。FLV Body 由一系列 back-pointer 和 tag 交織構成。back-pointer 表示前一 tag 大小。FLV Body 類型是 FLVBODY,FLVBODY 定義如下:

    typedef struct {
        UI32 PreviousTagSize0;
        FLVTAG Tag1;
        UI32 PreviousTagSize1;
        FLVTAG Tag2;
        ...
        UI32 PreviousTagSizeN-1;
        FLVTAG TagN;
        UI32 PreviousTagSizeN;
    }   FLVBODY;

    3. FLV Tag

    FLV Tag 包含音頻、視頻或腳本元數據、可選的加密元數據和 payload。FLV Tag 類型是 FLVTAG,FLVTAG 定義如下:

    typedef struct {
        UB[2] Reserved;
        UB[1] Filter;
        UB[5] TagType;
        UI24 DataSize;
        UI24 Timestamp;
        UI8 TimestampExtended;
        UI24 StreamID;
      IF TagType == 8
        AudioTagHeader Header;
      IF TagType == 9
        VideoTagHeader Header;
      IF TagType == 8
        AUDIODATA Data;
      IF TagType == 9
        VIDEODATA Data;
      IF TagType == 18
        SCRIPTDATA Data;
    }   FLVTAG;

    一個 FLVTAG 中,前 11 個字節是通用 TagHeader,后面緊跟跟著音頻 Tag、視頻 Tag 或腳本 Tag,其中音頻 Tag 和視頻 Tag 都包含 TagHeader 和 TagBody 兩部分,腳本 Tag 只有 TagBody 部分。

    上面 Timestamp 和 TimestampExtended 兩個字段拼成一個 32 位的時間戳,是當前 Tag 的解碼時間戳 (DTS)。對于音頻幀來說,PTS 和 DTS 相同。對于視頻幀來說,若含 B 幀,則 PTS 和 DTS 不同,H264 視頻幀 PTS = DTS + CTS,CTS 就是 CompositionTime 字段,參考 3.2.1 節 CompositionTime 字段的定義。

    免費分享】資料內容包括《Andoird音視頻開發必備手冊+音視頻最新學習視頻+大廠面試真題+2022最新學習路線圖》

    點擊鏈接加衛星領取

    3.1 Audio Tag

    Audio Tag 包括 AudioTagHeader 和 AudioTagBody 兩部分。

    3.1.1 AudioTagHeader

    AudioTagHeader 定義如下:

    格式 3,linear PCM,存儲原始 PCM 采樣點。如果采樣位深為 8,采樣點數據為無符號型。如果采樣位深為 16,采樣點數據為小端存儲的帶符號型。如果是立體聲,左右聲道采樣點交織存放:左-右-左-右-...

    格式 0 與格式 3 的不同之處只有一點:格式 0 存儲 16 位采樣數據,采用的大小端順序是創建 FLV 文件的平臺所使用的大小端順序。因此,不應使用格式 0,而應使用格式 3。

    格式 4 (Nellymoser 16-kHz mono) 和格式 5 (Nellymoser 8 kHz mono),是兩種特殊情況, 因為采樣率字段無法表示 8 kHz 和 16 kHz。當采樣格式是格式 4 或格式 5 時,Flash 播放器會忽略采樣率和聲音類型兩個字段。對于其他采樣率的 Nellymoser 格式, 即格式 6,則正常使用采樣率和聲音類型兩個字段。

    格式 10,AAC,聲音類型應為 1 (立體聲) 且采樣率應為 3 (44 kHz)。這并不表示 FLV 中的 AAC 音頻總是立體聲、44 kHz的數據。實際上,Flash 播放器會忽略這兩個值,而從已編碼的 AAC 位流中提取出聲道數和采樣率信息。

    格式 11,Speex,音頻以 16 kHz采樣率壓縮為單聲道,采樣率字段值應為 0,采樣位深字段值應為 1,聲音類型字段值應為 0。

    格式 7,8,14 和 15 保留。

    typedef struct {
        UB [4] SoundFormat;
        UB [2] SoundRate;
        UB [1] SoundSize;
        UB [1] SoundType;
      IF SoundFormat == 10
        UI8 AACPacketType;
    }

    3.1.2 AudioTagBody/AUDIODATA

    AUDIODATA 定義如下:

    typedef struct {
      IF SoundFormat == 10
        AACAUDIODATA SoundData;
      ELSE
        Varies by format
    }   AudioTagBody;

    3.1.3 AACAUDIODATA

    Flash 播放器 9.0.115.0 及以上版本支持 AAC 格式。AACAUDIODATA 定義如下:

    3.2 Video Tag

    Video Tag 包含 VideoTagHeader 和 VideoTagBody 兩部分。

    3.2.1 VideoTagHeader

    H.264 的命名遵循了 ITU-T 的命名約定,它是 VCEG 視頻編碼標準 H.26x 線中的一員;MPEG-4 AVC 的命名來自 ISO/IEC MPEG 的命名約定,它是 ISO/IEC 14496 的第 10 部分,該協議族被稱為 MPEG-4。

    3.2.2 VideoTagBody/VIDEODATA

    VIDEODATA 定義如下:

    VIDEODATA 包含 Body 字段。如果采用了加密,Body 的類型是 EncryptedBody,可參考規范文檔“附件 F. FLV 加密”章節獲得詳細信息,此處略。如果未采用加密,則 Body 的類型是 VideoTagBody,下面詳述。

    VideoTagBody 包含視頻幀凈荷數據。VideoTagBody 定義如下:

    typedef struct {
      IF FrameType == 5
        UI8 VideoData;
      ELSE (
      IF CodecID == 2
        H263VIDEOPACKET VideoData;
      IF CodecID == 3
        SCREENVIDEOPACKET VideoData;
      IF CodecID == 4
        VP6FLVVIDEOPACKET VideoData;
      IF CodecID == 5
        VP6FLVALPHAVIDEOPACKET VideoData;
      IF CodecID == 6
        SCREENV2VIDEOPACKET VideoData;
      IF CodecID == 7
        AVCVIDEOPACKET VideoData;
      )  
    }   VideoTagBody;

    3.2.3 AVCVIDEOPACKET

    AVCVIDEOPACKET 包含 AVC(H264) 視頻凈荷數據。AVCVIDEOPACKET 定義如下:

    typedef struct {
      IF AVCPacketType == 0
        AVCDecoderConfigurationRecord Data;
      IF AVCPacketType == 1
        One or more NALUs
    }   AVCVIDEOPACKET;

    3.3 Data Tag

    數據 Tag 封裝了單一方法,此方法通常在 Flash 播放器中的網絡流對象上被調用。數據 Tag 包含方法名和一組參數。

    3.3.1 ScriptTagBody/SCRIPTDATA

    SCRIPTDATA 定義如下:

    typedef struct {
      IF Encrypted
        EncryptedBody Body
      else
        ScriptTagBody Body;
    }   SCRIPTDATA;

    SCRIPTDATA 包含 Body 字段。如果采用了加密,Body 的類型是 EncryptedBody,可參考規范文檔“附件 F. FLV 加密”章節獲得詳細信息,此處略。如果未采用加密,則 Body 的類型是 ScriptTagBody,下面詳述。

    ScriptTagBody 包含以 AMF(Action Message Format) 編碼的 SCRIPTDATA。AMF 是一種緊湊二進制格式,用于序列化 ActionScript 對象圖。ScriptTagBody 定義如下:

    typedef struct {
        SCRIPTDATAVALUE Name;
        SCRIPTDATAVALUE Value;
    }   ScriptTagBody;

    3.3.2 SCRIPTDATAVALUE

    一個 SCRIPTDATAVALUE 記錄包含一個特定類型的 ActionScript 值。

    SCRIPTDATAVALUE 定義如下:

    SCRIPTDATAVALUE 的兩個字段,Type 是類型,ScriptDataValue 是值。Type 的值確定 ScriptDataValue 的類型。因為 ScriptDataValue 的類型是動態的,由運行時解析得到的 Type 的值確定,所以這里類型和值用了兩個字段。如果是靜態類型,顯然只用一個字段就可以了。

    typedef struct {
        UI8 Type;
      IF Type == 0
        DOUBLE ScriptDataValue;
      IF Type == 1
        UI8 ScriptDataValue;
      IF Type == 2
        SCRIPTDATASTRING ScriptDataValue;
      IF Type == 3
        SCRIPTDATAOBJECT ScriptDataValue;
      IF Type == 7
        UI16 ScriptDataValue;
      IF Type == 8
        SCRIPTDATAECMAARRAY ScriptDataValue;
      IF Type == 10
        SCRIPTDATASTRICTARRAY ScriptDataValue;
      IF Type == 11
        SCRIPTDATADATE ScriptDataValue;
      IF Type == 12
        SCRIPTDATALONGSTRING ScriptDataValue;
    }   SCRIPTDATAVALUE;

    3.3.1 節中 Name 字段和 Value 字段的類型都是SCRIPTDATAVALUE。Name 表示方法名,實際類型通常是SCRIPTDATASTRING。Value 字段表示方法的一組參數,實際類型通常是SCRIPTDATAECMAARRAY。后文將介紹 SCRIPTDATASTRING 和 SCRIPTDATAECMAARRAY 兩種類型。其他類型略,詳情可參考 FLV 規范文檔。

    3.3.3 SCRIPTDATASTRING

    SCRIPTDATASTRING 和 SCRIPTDATALONGSTRING 兩種類型用于存儲字符串,二者可存儲字符串長度不同,SCRIPTDATASTRING 用于存儲不超過 65535 個字符的字符串。

    SCRIPTDATASTRING 定義如下:

    typedef struct {
        UI16 StringLength;
        STRING StringData;
    }   SCRIPTDATASTRING;

    3.3.4 SCRIPTDATAECMAARRAY

    SCRIPTDATAECMAARRAY 記錄存儲 ECMA 數組(下表中的 Variables 字段)。ECMA 數組是一個關聯數組,應在 ActionScript 數組包含無序索引時使用。所有索引(無序或有序)都是字符串而不是整數。出于序列化的目的,SCRIPTDATAECMAARRAY 類型與匿名 ActionScript 對象非常相似。

    SCRIPTDATAECMAARRAY 定義如下:

    typedef struct {
        UI32 ECMAArrayLength;
        SCRIPTDATAOBJECTPROPERTY[] Variables;
        SCRIPTDATAOBJECTEND ListTerminator;
    }   SCRIPTDATAECMAARRAY;

    其中,SCRIPTDATAOBJECTPROPERTY 類型定義了 ActionScript 對象或關聯數組變量的對象屬性。

    SCRIPTDATAOBJECTPROPERTY 定義如下:

    typedef struct {
        SCRIPTDATASTRING PropertyName;
        SCRIPTDATAVALUE PropertyData;
    }   SCRIPTDATAOBJECTPROPERTY;

    3.3.5 實例:onMetaData 對象

    FLV 元數據對象應在名為 onMetadata 的 SCRIPTDATA 標簽中攜帶。各種屬性對通過 NetStream.onMetaData 屬性運行的 ActionScript 程序有效。可用的屬性根據創建 FLV 文件的軟件而有所不同。典型屬性包括:

    onMetaData 標簽通常會成為 FLV Body 中的第一個標簽,緊跟在 FLV Header 之后。onMetaData 標簽中存儲的是一些視頻、音頻及文件相關的元數據信息:如視頻幀率,音頻采樣率、文件長度等。

    結合 3.3.1 節,onMetaData 標簽的 Name 字段主要就是存儲 “onMetaData” 字符串。具體為:第 1 個字節值是 0x02,表示 Name 字段是字符串類型。第 2-3 個字節為 UI16 類型值,標識字符串的長度,值為 0x000A (“onMetaData” 這個字符串的長度)。后面跟著的數據為具體的字符串,值為 “onMetaData”。

    onMetaData 標簽的 Value 字段存儲上表所示的各屬性鍵值對。具體為:第 1 個字節值是 0x08,表示 Value 字段是數組類型。第 2-5 個字節為UI32類型值,表示數組元素個數。后面緊跟著數組,數組元素為屬性名稱和值組成的對(鍵值對)。最后是數組的結束符。

    ScriptTagBody onMetaData;
    
    onMetaData.Name.Type == 0x02
    onMetaData.Name.ScriptDataValue.StringLength == 0x000A
    onMetaData.Name.ScriptDataValue.StringData == "onMetaData"
    
    onMetaData.Value.Type == 0x08
    onMetaData.Value.ScriptDataValue.ECMAArrayLength == 
    onMetaData.Value.ScriptDataValue.Variables[0].PropertyName == {0x0005, "width"}   // SCRIPTDATASTRING 類型
    onMetaData.Value.ScriptDataValue.Variables[0].PropertyData == {0x00, 1280.0}      // SCRIPTDATAVALUE 類型
    onMetaData.Value.ScriptDataValue.Variables[1].PropertyName == {0x0005, "height"}  // SCRIPTDATASTRING 類型
    onMetaData.Value.ScriptDataValue.Variables[1].PropertyData == {0x00, 720.0}       // SCRIPTDATAVALUE 類型
    ...

    4. 總結

    FLV 結構如下圖所示:

    在 C 語言中定義 FLV 文件結構,一目了然:

    /*
     * @brief flv file header 9 bytes
     */
    typedef struct flv_header {
        uint8_t signature[3];
        uint8_t version;
        uint8_t type_flags;
        uint32_t data_offset; // header size, always 9
    } __attribute__((__packed__)) flv_header_t;
    
    /*
     * @brief flv tag general header 11 bytes
     */
    typedef struct flv_tag {
        uint8_t tag_type;
        uint32_t data_size;
        uint32_t timestamp;
        uint8_t timestamp_ext;
        uint32_t stream_id;
        void *data; // will point to an audio_tag or video_tag
    }   flv_tag_t;
    
    typedef struct audio_tag {
        uint8_t sound_format; // 0 - raw, 1 - ADPCM, 2 - MP3, 4 - Nellymoser 16 KHz mono, 5 - Nellymoser 8 KHz mono, 10 - AAC, 11 - Speex
        uint8_t sound_rate; // 0 - 5.5 KHz, 1 - 11 KHz, 2 - 22 KHz, 3 - 44 KHz
        uint8_t sound_size; // 0 - 8 bit, 1 - 16 bit
        uint8_t sound_type; // 0 - mono, 1 - stereo
        void *data;
    }   audio_tag_t;
    
    typedef struct video_tag {
        uint8_t frame_type;
        uint8_t codec_id;
        void *data;
    }   video_tag_t;
    
    typedef struct avc_video_tag {
        uint8_t avc_packet_type; // 0x00 - AVC sequence header, 0x01 - AVC NALU
        uint32_t composition_time;
        uint32_t nalu_len;
        void *data;
    }   avc_video_tag_t;

    分享一個非常實用的免費學習音視頻的地址,里面很多學習視頻

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 日本一区不卡高清更新二区| 久久被窝亚洲精品爽爽爽| 69堂人成无码免费视频果冻传媒| 国产激情无码一区二区APP| 再深点灬舒服灬太大了少妇| 亚洲日本精品一区二区| 国产精品美脚玉足脚交欧美| 久久免费精品国自产拍网站 | 人妻系列中文字幕精品| 无码人妻丝袜在线视频红杏| 精品国产乱码久久久久久郑州公司 | 一道本AV免费不卡播放| 国自产偷精品不卡在线| 又爽又黄又无遮掩的免费视频| 欧美性大战久久久久XXX| 人妻系列中文字幕精品| 边做饭边被躁欧美三级| 亚洲第一精品一二三区| 成年女人18级毛片毛片免费| 亚洲精品麻豆一二三区| 大学生被内谢粉嫩无套| 少妇和邻居做不戴套视频| 国产卡一卡二卡三无线乱码新区| 韩国午夜理伦三级在线观看仙踪林| 无码人妻一区二区免费AV| 亚洲一二区制服无码中字| 国产精品日韩中文字幕| 亚洲乱码日产精品一二三| 亚洲欧洲日产国无高清码图片| 亚洲国产精品无码AAA片| 加勒比中文字幕无码一区| 亚洲美免无码中文字幕在线| 亚洲AV成人无码精品电影在线| 韩国无码AV片午夜福利| 国产精品国产三级国产试看 | 午夜毛片不卡免费观看视频| 中文字幕无码不卡免费视频| 亚欧美日韩香蕉在线播放视频| 国产成人毛片无码视频软件| 久久6久久66热这里只是精品| AV老司机色爱区综合|