flv格式解析

FLV封裝原理

FLV格式的封裝原理,貼上來輔助學習之用。ios

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

整體上看,FLV包括文件頭(File Header)和文件體(File Body)兩部分,其中文件體由一系列的Tag組成。所以一個FLV文件是如圖1結構。瀏覽器

圖1.文件結構(簡圖)ide

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

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

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

(a)Audio Tag Data結構(音頻Tag)spa

音頻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

 文件大小

相關文章
相關標籤/搜索