FLV (Flash Video) 是由 Adobe 公司推出的一種封裝格式,主要用于流媒體系統(tǒng)。FLV 封裝的媒體文件具有體積輕巧、封裝播放簡單等特點,很適合網(wǎng)絡(luò)應(yīng)用。目前各瀏覽器普遍使用 Flash Player 作為網(wǎng)頁播放器,使得安裝有瀏覽器的計算機(jī)終端不需要另外安裝播放器,這也是 FLV 格式廣為流行的原因之一。 FLV 封裝格式的文件擴(kuò)展名為 .flv。FLV 文件主要由一個 Header 加上由多個 Tag 組成的 Body 構(gòu)成。如下所述: 1. FLV Header所有 FLV 格式文件都以 FLV Header 開頭。FLV Header 類型是 FLVHEADER,F(xiàn)LVHEADER 定義如下:
2. FLV Body一個 FLV 文件,除開頭的 FLV Header 外,剩余部分就是 FLV Body。FLV Body 由一系列 back-pointer 和 tag 交織構(gòu)成。back-pointer 表示前一 tag 大小。FLV Body 類型是 FLVBODY,F(xiàn)LVBODY 定義如下:
3. FLV TagFLV Tag 包含音頻、視頻或腳本元數(shù)據(jù)、可選的加密元數(shù)據(jù)和 payload。FLV Tag 類型是 FLVTAG,F(xiàn)LVTAG 定義如下:
一個 FLVTAG 中,前 11 個字節(jié)是通用 TagHeader,后面緊跟跟著音頻 Tag、視頻 Tag 或腳本 Tag,其中音頻 Tag 和視頻 Tag 都包含 TagHeader 和 TagBody 兩部分,腳本 Tag 只有 TagBody 部分。 上面 Timestamp 和 TimestampExtended 兩個字段拼成一個 32 位的時間戳,是當(dāng)前 Tag 的解碼時間戳 (DTS)。對于音頻幀來說,PTS 和 DTS 相同。對于視頻幀來說,若含 B 幀,則 PTS 和 DTS 不同,H264 視頻幀 PTS = DTS + CTS,CTS 就是 CompositionTime 字段,參考 3.2.1 節(jié) CompositionTime 字段的定義。 【免費(fèi)分享】資料內(nèi)容包括《Andoird音視頻開發(fā)必備手冊+音視頻最新學(xué)習(xí)視頻+大廠面試真題+2022最新學(xué)習(xí)路線圖》
3.1 Audio TagAudio Tag 包括 AudioTagHeader 和 AudioTagBody 兩部分。 3.1.1 AudioTagHeaderAudioTagHeader 定義如下: 格式 3,linear PCM,存儲原始 PCM 采樣點。如果采樣位深為 8,采樣點數(shù)據(jù)為無符號型。如果采樣位深為 16,采樣點數(shù)據(jù)為小端存儲的帶符號型。如果是立體聲,左右聲道采樣點交織存放:左-右-左-右-... 格式 0 與格式 3 的不同之處只有一點:格式 0 存儲 16 位采樣數(shù)據(jù),采用的大小端順序是創(chuàng)建 FLV 文件的平臺所使用的大小端順序。因此,不應(yīng)使用格式 0,而應(yīng)使用格式 3。 格式 4 (Nellymoser 16-kHz mono) 和格式 5 (Nellymoser 8 kHz mono),是兩種特殊情況, 因為采樣率字段無法表示 8 kHz 和 16 kHz。當(dāng)采樣格式是格式 4 或格式 5 時,F(xiàn)lash 播放器會忽略采樣率和聲音類型兩個字段。對于其他采樣率的 Nellymoser 格式, 即格式 6,則正常使用采樣率和聲音類型兩個字段。 格式 10,AAC,聲音類型應(yīng)為 1 (立體聲) 且采樣率應(yīng)為 3 (44 kHz)。這并不表示 FLV 中的 AAC 音頻總是立體聲、44 kHz的數(shù)據(jù)。實際上,F(xiàn)lash 播放器會忽略這兩個值,而從已編碼的 AAC 位流中提取出聲道數(shù)和采樣率信息。 格式 11,Speex,音頻以 16 kHz采樣率壓縮為單聲道,采樣率字段值應(yīng)為 0,采樣位深字段值應(yīng)為 1,聲音類型字段值應(yīng)為 0。 格式 7,8,14 和 15 保留。
3.1.2 AudioTagBody/AUDIODATAAUDIODATA 定義如下:
3.1.3 AACAUDIODATAFlash 播放器 9.0.115.0 及以上版本支持 AAC 格式。AACAUDIODATA 定義如下: 3.2 Video TagVideo Tag 包含 VideoTagHeader 和 VideoTagBody 兩部分。 3.2.1 VideoTagHeaderH.264 的命名遵循了 ITU-T 的命名約定,它是 VCEG 視頻編碼標(biāo)準(zhǔn) H.26x 線中的一員;MPEG-4 AVC 的命名來自 ISO/IEC MPEG 的命名約定,它是 ISO/IEC 14496 的第 10 部分,該協(xié)議族被稱為 MPEG-4。 3.2.2 VideoTagBody/VIDEODATAVIDEODATA 定義如下: VIDEODATA 包含 Body 字段。如果采用了加密,Body 的類型是 EncryptedBody,可參考規(guī)范文檔“附件 F. FLV 加密”章節(jié)獲得詳細(xì)信息,此處略。如果未采用加密,則 Body 的類型是 VideoTagBody,下面詳述。 VideoTagBody 包含視頻幀凈荷數(shù)據(jù)。VideoTagBody 定義如下:
3.2.3 AVCVIDEOPACKETAVCVIDEOPACKET 包含 AVC(H264) 視頻凈荷數(shù)據(jù)。AVCVIDEOPACKET 定義如下:
3.3 Data Tag數(shù)據(jù) Tag 封裝了單一方法,此方法通常在 Flash 播放器中的網(wǎng)絡(luò)流對象上被調(diào)用。數(shù)據(jù) Tag 包含方法名和一組參數(shù)。 3.3.1 ScriptTagBody/SCRIPTDATASCRIPTDATA 定義如下:
SCRIPTDATA 包含 Body 字段。如果采用了加密,Body 的類型是 EncryptedBody,可參考規(guī)范文檔“附件 F. FLV 加密”章節(jié)獲得詳細(xì)信息,此處略。如果未采用加密,則 Body 的類型是 ScriptTagBody,下面詳述。 ScriptTagBody 包含以 AMF(Action Message Format) 編碼的 SCRIPTDATA。AMF 是一種緊湊二進(jìn)制格式,用于序列化 ActionScript 對象圖。ScriptTagBody 定義如下:
3.3.2 SCRIPTDATAVALUE一個 SCRIPTDATAVALUE 記錄包含一個特定類型的 ActionScript 值。 SCRIPTDATAVALUE 定義如下:
3.3.1 節(jié)中 Name 字段和 Value 字段的類型都是SCRIPTDATAVALUE。Name 表示方法名,實際類型通常是SCRIPTDATASTRING。Value 字段表示方法的一組參數(shù),實際類型通常是SCRIPTDATAECMAARRAY。后文將介紹 SCRIPTDATASTRING 和 SCRIPTDATAECMAARRAY 兩種類型。其他類型略,詳情可參考 FLV 規(guī)范文檔。 3.3.3 SCRIPTDATASTRINGSCRIPTDATASTRING 和 SCRIPTDATALONGSTRING 兩種類型用于存儲字符串,二者可存儲字符串長度不同,SCRIPTDATASTRING 用于存儲不超過 65535 個字符的字符串。 SCRIPTDATASTRING 定義如下:
3.3.4 SCRIPTDATAECMAARRAYSCRIPTDATAECMAARRAY 記錄存儲 ECMA 數(shù)組(下表中的 Variables 字段)。ECMA 數(shù)組是一個關(guān)聯(lián)數(shù)組,應(yīng)在 ActionScript 數(shù)組包含無序索引時使用。所有索引(無序或有序)都是字符串而不是整數(shù)。出于序列化的目的,SCRIPTDATAECMAARRAY 類型與匿名 ActionScript 對象非常相似。 SCRIPTDATAECMAARRAY 定義如下:
其中,SCRIPTDATAOBJECTPROPERTY 類型定義了 ActionScript 對象或關(guān)聯(lián)數(shù)組變量的對象屬性。 SCRIPTDATAOBJECTPROPERTY 定義如下:
3.3.5 實例:onMetaData 對象FLV 元數(shù)據(jù)對象應(yīng)在名為 onMetadata 的 SCRIPTDATA 標(biāo)簽中攜帶。各種屬性對通過 NetStream.onMetaData 屬性運(yùn)行的 ActionScript 程序有效??捎玫膶傩愿鶕?jù)創(chuàng)建 FLV 文件的軟件而有所不同。典型屬性包括: onMetaData 標(biāo)簽通常會成為 FLV Body 中的第一個標(biāo)簽,緊跟在 FLV Header 之后。onMetaData 標(biāo)簽中存儲的是一些視頻、音頻及文件相關(guān)的元數(shù)據(jù)信息:如視頻幀率,音頻采樣率、文件長度等。 結(jié)合 3.3.1 節(jié),onMetaData 標(biāo)簽的 Name 字段主要就是存儲 “onMetaData” 字符串。具體為:第 1 個字節(jié)值是 0x02,表示 Name 字段是字符串類型。第 2-3 個字節(jié)為 UI16 類型值,標(biāo)識字符串的長度,值為 0x000A (“onMetaData” 這個字符串的長度)。后面跟著的數(shù)據(jù)為具體的字符串,值為 “onMetaData”。 onMetaData 標(biāo)簽的 Value 字段存儲上表所示的各屬性鍵值對。具體為:第 1 個字節(jié)值是 0x08,表示 Value 字段是數(shù)組類型。第 2-5 個字節(jié)為UI32類型值,表示數(shù)組元素個數(shù)。后面緊跟著數(shù)組,數(shù)組元素為屬性名稱和值組成的對(鍵值對)。最后是數(shù)組的結(jié)束符。
4. 總結(jié)FLV 結(jié)構(gòu)如下圖所示: 在 C 語言中定義 FLV 文件結(jié)構(gòu),一目了然:
分享一個非常實用的免費(fèi)學(xué)習(xí)音視頻的地址,里面很多學(xué)習(xí)視頻 |
|
來自: 昵稱60563631 > 《視頻格式》