FLV格式分析

Overview

Flash Video(簡稱FLV),是一種流行的網絡格式。目前國內外大部分視頻分享網站都是採用的這種格式.

FLV(Flash Video)是Adobe公司設計開發的一種流行的流媒體格式,由於其視頻文件體積輕巧、封裝簡單等特點,使其很適合在互聯網上進行應用。此外,FLV可以使用Flash Player進行播放,而Flash Player插件已經安裝在全世界絕大部分瀏覽器上,這使得通過網頁播放FLV視頻十分容易。目前主流的視頻網站如優酷網,土豆網,樂視網等網站無一例外地使用了FLV格式。FLV封裝格式的文件後綴通常爲“.flv”。



File Structure

從整個文件上開看,FLV是由文件頭(File Header)和文件體(File Body)兩部分,其中文件體由一系列的Tag組成。因此一個FLV文件是如圖1結構。


圖1.文件結構(簡圖)

其中,每個Tag前面還包含了Previous Tag Size字段,表示前面一個Tag的大小。Tag的類型可以是視頻、音頻和Script,每個Tag只能包含以上三種類型的數據中的一種。圖2展示了FLV文件的詳細結構。


圖2.FLV文件結構(詳圖)

下面詳細介紹一下三種Tag的Tag Data部分的結構。


1.The FLV header

Field Type Comment
Signature UI8 Signature byte always 'F' (0x46)
Signature UI8 Signature byte always 'L' (0x4C)
Signature UI8 Signature byte always 'V' (0x56)
Version UI8 File version (for example, 0x01 for FLV version 1)
TypeFlagsReserved UB [5] Shall be 0
TypeFlagsAudio UB [1] 1 = Audio tags are present
TypeFlagsReserved UB [1] Shall be 0
TypeFlagsVideo UB [1] 1 = Video tags are present
DataOffset UI32 The length of this header in bytes

 

Signature: FLV 文件的前3個字節爲固定的‘F’‘L’‘V’,用來標識這個文件是flv格式的.在做格式探測的時候,

如果發現前3個字節爲“FLV”,就認爲它是flv文件.

Version: 第4個字節表示flv版本號.

Flags: 第5個字節中的第0位和第2位,分別表示 video 與 audio 存在的情況.(1表示存在,0表示不存在)

DataOffset : 最後4個字節表示FLV header 長度.


下面詳細介紹一下三種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

 文件大小

 


根據上面的提示,分析如之前的類型,這邊暫時不提供了。可以與下面MediaInfo工具比較發現,是一樣的。

previousTagSize爲前一個Tag的長度。也就是Tag Header+Tag date=previousTagSize



這次主要分析一下flv格式,方便以後使用。在此也非常感謝摘錄這二位博主的幫助文檔,在次由衷的標識敬佩。

參考文檔地址1:http://blog.csdn.net/leixiaohua1020/article/details/17934487

參考文檔地址2:http://blog.csdn.net/tx3344/article/details/7349019


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章