久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

FLV 封裝格式解析

 昵稱(chēng)60563631 2023-05-12 發(fā)布于安徽

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

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

1. FLV Header

所有 FLV 格式文件都以 FLV Header 開(kāi)頭,。FLV Header 類(lèi)型是 FLVHEADER,F(xiàn)LVHEADER 定義如下:

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

2. FLV Body

一個(gè) FLV 文件,,除開(kāi)頭的 FLV Header 外,,剩余部分就是 FLV Body。FLV Body 由一系列 back-pointer 和 tag 交織構(gòu)成,。back-pointer 表示前一 tag 大小。FLV Body 類(lèi)型是 FLVBODY,,F(xiàn)LVBODY 定義如下:

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

3. FLV Tag

FLV Tag 包含音頻,、視頻或腳本元數(shù)據(jù)、可選的加密元數(shù)據(jù)和 payload,。FLV Tag 類(lèi)型是 FLVTAG,,F(xiàn)LVTAG 定義如下:

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;

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

上面 Timestamp 和 TimestampExtended 兩個(gè)字段拼成一個(gè) 32 位的時(shí)間戳,,是當(dāng)前 Tag 的解碼時(shí)間戳 (DTS)。對(duì)于音頻幀來(lái)說(shuō),,PTS 和 DTS 相同,。對(duì)于視頻幀來(lái)說(shuō),若含 B 幀,,則 PTS 和 DTS 不同,,H264 視頻幀 PTS = DTS + CTS,CTS 就是 CompositionTime 字段,,參考 3.2.1 節(jié) CompositionTime 字段的定義,。

免費(fèi)分享】資料內(nèi)容包括《Andoird音視頻開(kāi)發(fā)必備手冊(cè)+音視頻最新學(xué)習(xí)視頻+大廠面試真題+2022最新學(xué)習(xí)路線圖》

點(diǎn)擊鏈接加衛(wèi)星領(lǐng)取

3.1 Audio Tag

Audio Tag 包括 AudioTagHeader 和 AudioTagBody 兩部分。

3.1.1 AudioTagHeader

AudioTagHeader 定義如下:

格式 3,,linear PCM,,存儲(chǔ)原始 PCM 采樣點(diǎn)。如果采樣位深為 8,,采樣點(diǎn)數(shù)據(jù)為無(wú)符號(hào)型,。如果采樣位深為 16,采樣點(diǎn)數(shù)據(jù)為小端存儲(chǔ)的帶符號(hào)型,。如果是立體聲,,左右聲道采樣點(diǎn)交織存放:左-右-左-右-...

格式 0 與格式 3 的不同之處只有一點(diǎn):格式 0 存儲(chǔ) 16 位采樣數(shù)據(jù),采用的大小端順序是創(chuàng)建 FLV 文件的平臺(tái)所使用的大小端順序,。因此,,不應(yīng)使用格式 0,而應(yīng)使用格式 3,。

格式 4 (Nellymoser 16-kHz mono) 和格式 5 (Nellymoser 8 kHz mono),,是兩種特殊情況, 因?yàn)椴蓸勇首侄螣o(wú)法表示 8 kHz 和 16 kHz。當(dāng)采樣格式是格式 4 或格式 5 時(shí),,F(xiàn)lash 播放器會(huì)忽略采樣率和聲音類(lèi)型兩個(gè)字段,。對(duì)于其他采樣率的 Nellymoser 格式, 即格式 6,則正常使用采樣率和聲音類(lèi)型兩個(gè)字段,。

格式 10,,AAC,聲音類(lèi)型應(yīng)為 1 (立體聲) 且采樣率應(yīng)為 3 (44 kHz),。這并不表示 FLV 中的 AAC 音頻總是立體聲,、44 kHz的數(shù)據(jù)。實(shí)際上,,F(xiàn)lash 播放器會(huì)忽略這兩個(gè)值,,而從已編碼的 AAC 位流中提取出聲道數(shù)和采樣率信息,。

格式 11,Speex,,音頻以 16 kHz采樣率壓縮為單聲道,,采樣率字段值應(yīng)為 0,采樣位深字段值應(yīng)為 1,,聲音類(lèi)型字段值應(yīng)為 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 視頻編碼標(biāo)準(zhǔn) H.26x 線中的一員;MPEG-4 AVC 的命名來(lái)自 ISO/IEC MPEG 的命名約定,,它是 ISO/IEC 14496 的第 10 部分,,該協(xié)議族被稱(chēng)為 MPEG-4。

3.2.2 VideoTagBody/VIDEODATA

VIDEODATA 定義如下:

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

VideoTagBody 包含視頻幀凈荷數(shù)據(jù)。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) 視頻凈荷數(shù)據(jù),。AVCVIDEOPACKET 定義如下:

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

3.3 Data Tag

數(shù)據(jù) Tag 封裝了單一方法,,此方法通常在 Flash 播放器中的網(wǎng)絡(luò)流對(duì)象上被調(diào)用。數(shù)據(jù) Tag 包含方法名和一組參數(shù),。

3.3.1 ScriptTagBody/SCRIPTDATA

SCRIPTDATA 定義如下:

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

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

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

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

3.3.2 SCRIPTDATAVALUE

一個(gè) SCRIPTDATAVALUE 記錄包含一個(gè)特定類(lèi)型的 ActionScript 值,。

SCRIPTDATAVALUE 定義如下:

SCRIPTDATAVALUE 的兩個(gè)字段,,Type 是類(lèi)型,ScriptDataValue 是值,。Type 的值確定 ScriptDataValue 的類(lèi)型,。因?yàn)?ScriptDataValue 的類(lèi)型是動(dòng)態(tài)的,由運(yùn)行時(shí)解析得到的 Type 的值確定,,所以這里類(lèi)型和值用了兩個(gè)字段,。如果是靜態(tài)類(lèi)型,顯然只用一個(gè)字段就可以了,。

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 節(jié)中 Name 字段和 Value 字段的類(lèi)型都是SCRIPTDATAVALUE,。Name 表示方法名,實(shí)際類(lèi)型通常是SCRIPTDATASTRING,。Value 字段表示方法的一組參數(shù),,實(shí)際類(lèi)型通常是SCRIPTDATAECMAARRAY。后文將介紹 SCRIPTDATASTRING 和 SCRIPTDATAECMAARRAY 兩種類(lèi)型,。其他類(lèi)型略,,詳情可參考 FLV 規(guī)范文檔。

3.3.3 SCRIPTDATASTRING

SCRIPTDATASTRING 和 SCRIPTDATALONGSTRING 兩種類(lèi)型用于存儲(chǔ)字符串,,二者可存儲(chǔ)字符串長(zhǎng)度不同,,SCRIPTDATASTRING 用于存儲(chǔ)不超過(guò) 65535 個(gè)字符的字符串。

SCRIPTDATASTRING 定義如下:

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

3.3.4 SCRIPTDATAECMAARRAY

SCRIPTDATAECMAARRAY 記錄存儲(chǔ) ECMA 數(shù)組(下表中的 Variables 字段),。ECMA 數(shù)組是一個(gè)關(guān)聯(lián)數(shù)組,,應(yīng)在 ActionScript 數(shù)組包含無(wú)序索引時(shí)使用。所有索引(無(wú)序或有序)都是字符串而不是整數(shù),。出于序列化的目的,,SCRIPTDATAECMAARRAY 類(lèi)型與匿名 ActionScript 對(duì)象非常相似。

SCRIPTDATAECMAARRAY 定義如下:

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

其中,,SCRIPTDATAOBJECTPROPERTY 類(lèi)型定義了 ActionScript 對(duì)象或關(guān)聯(lián)數(shù)組變量的對(duì)象屬性,。

SCRIPTDATAOBJECTPROPERTY 定義如下:

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

3.3.5 實(shí)例:onMetaData 對(duì)象

FLV 元數(shù)據(jù)對(duì)象應(yīng)在名為 onMetadata 的 SCRIPTDATA 標(biāo)簽中攜帶。各種屬性對(duì)通過(guò) NetStream.onMetaData 屬性運(yùn)行的 ActionScript 程序有效,??捎玫膶傩愿鶕?jù)創(chuàng)建 FLV 文件的軟件而有所不同。典型屬性包括:

onMetaData 標(biāo)簽通常會(huì)成為 FLV Body 中的第一個(gè)標(biāo)簽,,緊跟在 FLV Header 之后,。onMetaData 標(biāo)簽中存儲(chǔ)的是一些視頻、音頻及文件相關(guān)的元數(shù)據(jù)信息:如視頻幀率,,音頻采樣率,、文件長(zhǎng)度等,。

結(jié)合 3.3.1 節(jié),onMetaData 標(biāo)簽的 Name 字段主要就是存儲(chǔ) “onMetaData” 字符串,。具體為:第 1 個(gè)字節(jié)值是 0x02,,表示 Name 字段是字符串類(lèi)型。第 2-3 個(gè)字節(jié)為 UI16 類(lèi)型值,,標(biāo)識(shí)字符串的長(zhǎng)度,,值為 0x000A (“onMetaData” 這個(gè)字符串的長(zhǎng)度)。后面跟著的數(shù)據(jù)為具體的字符串,,值為 “onMetaData”,。

onMetaData 標(biāo)簽的 Value 字段存儲(chǔ)上表所示的各屬性鍵值對(duì)。具體為:第 1 個(gè)字節(jié)值是 0x08,,表示 Value 字段是數(shù)組類(lèi)型,。第 2-5 個(gè)字節(jié)為UI32類(lèi)型值,表示數(shù)組元素個(gè)數(shù),。后面緊跟著數(shù)組,,數(shù)組元素為屬性名稱(chēng)和值組成的對(duì)(鍵值對(duì))。最后是數(shù)組的結(jié)束符,。

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 類(lèi)型
onMetaData.Value.ScriptDataValue.Variables[0].PropertyData == {0x00, 1280.0}      // SCRIPTDATAVALUE 類(lèi)型
onMetaData.Value.ScriptDataValue.Variables[1].PropertyName == {0x0005, "height"}  // SCRIPTDATASTRING 類(lèi)型
onMetaData.Value.ScriptDataValue.Variables[1].PropertyData == {0x00, 720.0}       // SCRIPTDATAVALUE 類(lèi)型
...

4. 總結(jié)

FLV 結(jié)構(gòu)如下圖所示:

在 C 語(yǔ)言中定義 FLV 文件結(jié)構(gòu),,一目了然:

/*
 * @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;

分享一個(gè)非常實(shí)用的免費(fèi)學(xué)習(xí)音視頻的地址,里面很多學(xué)習(xí)視頻

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多