FLV封装格式分析器
=====================================================
視音頻編解碼學習工程系列文章列表:
視音頻編解碼學習工程:H.264分析器
視音頻編解碼學習工程:AAC格式分析器
視音頻編解碼學習工程:FLV封裝格式分析器
視音頻編解碼學習工程:TS封裝格式分析器
視音頻編解碼學習工程:JPEG分析器
=====================================================
本文介紹一個自己的開源小項目:FLV封裝格式分析器。FLV全稱是Flash Video,是互聯網上使用極為廣泛的視頻封裝格式。像Youtube,優酷這類視頻網站,都使用FLV封裝視頻。我這個項目規模不大,主要可以用來學習FLV封裝格式結構。此外它還支持分離FLV中的視頻流和音頻流。使用VC 2010的MFC開發完成。在對FLV進行視音頻分離的過程中,用到了一個Github開源小工程:flvparse。在此插一句:我發現Github上優秀的東西真的還是挺多的,許多零散的小工程,效果都很不錯。這個flvparse做的就不錯。
軟件的exe以及源代碼已經上傳到了SourceForge上。和之前的H.264碼流分析器一樣,增加了一個英文界面,緊跟國際潮流~
項目地址:https://sourceforge.net/projects/flvformatanalysis/
CSDN下載地址(程序+源代碼):http://download.csdn.net/detail/leixiaohua1020/6838805
?
更新記錄==============================
1.1版(2014.7.8)
?* 更換了界面
?* 原工程支持Unicode編碼
?* 支持中英文切換
CSDN源代碼:http://download.csdn.net/detail/leixiaohua1020/7767613
PUDN源代碼:http://www.pudn.com/downloads644/sourcecode/multimedia/detail2605189.html
?
軟件使用介紹
軟件的使用相當簡單。
軟件運行后,首先打開一個FLV文件。單擊“開始”,可以解析出一系列Tag,列表顯示在軟件右側,不同種類的Tag被標記成了不同的顏色。軟件的左側,顯示了FLV文件頭信息,以及Tag頭信息。
英文界面
注:如果勾選上“輸出視頻”,“輸出音頻”的話,可以輸出分離后的視頻流和音頻流。在這里要注意的是音頻支持MP3格式,AAC格式貌似有點問題。
?
軟件源代碼簡析
源代碼方面和普通的MFC程序差不太多,懂得MFC的人應該很快就能看懂。唯一比較特殊的地方,就在于對開源項目flvparse進行了一些改動,在此就不細說了。注釋方面還是很充分的。
?
如果有什么使用問題,可以反饋給我,以后有時間進行修改升級。
?
更新(2014.8.12)================================
FLV封裝原理
FLV格式的封裝原理,貼上來輔助學習之用。
?
?
FLV(Flash Video)是Adobe公司設計開發的一種流行的流媒體格式,由于其視頻文件體積輕巧、封裝簡單等特點,使其很適合在互聯網上進行應用。此外,FLV可以使用Flash Player進行播放,而Flash Player插件已經安裝在全世界絕大部分瀏覽器上,這使得通過網頁播放FLV視頻十分容易。目前主流的視頻網站如優酷網,土豆網,樂視網等網站無一例外地使用了FLV格式。FLV封裝格式的文件后綴通常為“.flv”。
總體上看,FLV包括文件頭(File Header)和文件體(File Body)兩部分,其中文件體由一系列的Tag組成。因此一個FLV文件是如圖1結構。
圖1.文件結構(簡圖)
其中,每個Tag前面還包含了Previous Tag Size字段,表示前面一個Tag的大小。Tag的類型可以是視頻、音頻和Script,每個Tag只能包含以上三種類型的數據中的一種。圖2展示了FLV文件的詳細結構。
圖2.FLV文件結構(詳圖)
下面詳細介紹一下三種Tag的Tag Data部分的結構。
(a)Audio Tag Data結構(音頻Tag)
音頻Tag開始的第1個字節包含了音頻數據的參數信息,從第2個字節開始為音頻流數據。結構如圖3所示。
圖3.Audio Tag Data結構
第1個字節的前4位的數值表示了音頻編碼類型。如表1所示。
表1.音頻編碼類型
| 值 | 含義 |
| 0 | ?Linear PCM,platform endian |
| 1 | ?ADPCM |
| 2 | ?MP3 |
| 3 | ?Linear PCM,little endian |
| 4 | ?Nellymoser 16-kHz mono |
| 5 | ?Nellymoser 8-kHz mono |
| 6 | ?Nellymoser |
| 7 | ?G.711 A-law logarithmic PCM |
| 8 | ?G.711 mu-law logarithmic PCM |
| 9 | ?reserved |
| 10 | ?AAC |
| 14 | ?MP3 8-Khz |
| 15 | ?Device-specific sound |
第1個字節的第5-6位的數值表示音頻采樣率。如表2所示。
表2.音頻采樣率
| 值 | 含義 |
| 0 | ?5.5kHz |
| 1 | ?11KHz |
| 2 | ?22 kHz |
| 3 | ?44 kHz |
PS:從上表可以發現,FLV封裝格式并不支持48KHz的采樣率。
第1個字節的第7位表示音頻采樣精度。如表3所示。
表3.音頻采樣精度
| 值 | 含義 |
| 0 | ?8bits |
| 1 | ?16bits |
第1個字節的第8位表示音頻類型。
表4.?音頻類型
| 值 | 含義 |
| 0 | ?sndMono |
| 1 | ?sndStereo |
(b)Video Tag Data結構(視頻Tag)
視頻Tag也用開始的第1個字節包含視頻數據的參數信息,從第2個字節為視頻流數據。結構如圖4所示。
圖4.Video Tag Data結構
第1個字節的前4位的數值表示幀類型。如表5所示。
表5.幀類型
| 值 | 含義 |
| 1 | ?keyframe (for AVC,a seekable frame) |
| 2 | ?inter frame (for AVC,a nonseekable frame) |
| 3 | ?disposable inter frame (H.263 only) |
| 4 | ?generated keyframe (reserved for server use) |
| 5 | ?video info/command frame |
第1個字節的后4位的數值表示視頻編碼類型。如表6所示。
表6.視頻編碼類型
| 值 | 含義 |
| 1 | ?JPEG (currently unused) |
| 2 | ?Sorenson H.263 |
| 3 | ?Screen video |
| 4 | ?On2 VP6 |
| 5 | ?On2 VP6 with alpha channel |
| 6 | ?Screen video version 2 |
| 7 | ?AVC |
(c)Script Tag Data結構(控制幀)
該類型Tag又通常被稱為Metadata Tag,會放一些關于FLV視頻和音頻的元數據信息如:duration、width、height等。通常該類型Tag會跟在File Header后面作為第一個Tag出現,而且只有一個。結構如圖5所示。
圖5.Script Tag Data結構
第一個AMF包:
第1個字節表示AMF包類型,一般總是0x02,表示字符串。第2-3個字節為UI16類型值,標識字符串的長度,一般總是0x000A(“onMetaData”長度)。后面字節為具體的字符串,一般總為“onMetaData”(6F,6E,4D,65,74,61,44,61,74,61)。
第二個AMF包:
第1個字節表示AMF包類型,一般總是0x08,表示數組。第2-5個字節為UI32類型值,表示數組元素的個數。后面即為各數組元素的封裝,數組元素為元素名稱和值組成的對。常見的數組元素如表7所示。
表7.常見MetaData
| 值 | 含義 |
| duration | ?時長 |
| width | ?視頻寬度 |
| height | ?視頻高度 |
| videodatarate | ?視頻碼率 |
| framerate | ?視頻幀率 |
| videocodecid | ?視頻編碼方式 |
| audiosamplerate | ?音頻采樣率 |
| audiosamplesize | ?音頻采樣精度 |
| stereo | ?是否為立體聲 |
| audiocodecid | ?音頻編碼方式 |
| filesize | ?文件大小 |
總結
以上是生活随笔為你收集整理的FLV封装格式分析器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nginx coredump 不产生co
- 下一篇: nginx基本数据结构ngx_modul