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