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 |
文件大小 |