flv頭文件比較簡單,由9個字節組成.
0-3:前3個字節是文件格式標識(FLV 464C56).
4-4:第4個字節是版本(0x01)
5-5:第5個字節的前5個bit是保留的必須是0.
??? ???? 第5個字節的第6個bit音頻類型標志(TypeFlagsAudio)
??? ???? 第5個字節的第7個bit也是保留的必須是0
??? ???? 第5個字節的第8個bit視頻類型標志(TypeFlagsVideo)
6-9:第6-9的四個字節還是保留的.其數據為 00000009 .
文件內容是由4字節的0 開始,它標志著前一個tag的size(因為前一個tag為空,所以size為0).然后就是flv文件內容的第1個tag。tag類型為1個字節,有:8音頻;9視頻;18(0x12) 腳本數據;其它保留。每種tag有其特定類型。
1:如下圖為data tag
data tags被flash player中的NetStream調用.一個meta包的內容由兩個amf包組成.第一個(amf類型0x02)是基本上總是由2個字節帶字符串長度+ 字符串組成,第二個(amf類型0x08)是由一個數組組成,數組中的各個元素是由不同類型組成。(The SWF file format uses 8-bit, 16-bit, 32-bit, 64-bit, signed, and unsigned integer types. All integer values are stored in the SWF file by using?little-endian byte order.FLV files, unlike SWF files, store multibyte integers in big-endian byte order.)
data tags基本格式:
data tag數據組成(名字+數據):
上圖中的數據分析如下:
0x12 data tag的類型標志.
000152 data tag的長度
000000 時間戳
00 時間戳擴展
000000 流id
0x02 data object的類型標志
000A object name的長度
6F6E4D65746144617461 object name(onMetaData)
08 第二個amf. data array的類型標志
0000000E 數組的長度
000D object name的長度
617564696F6461746172617465 object name(audiodatarate)
00 double類型數據標志
404C354DDA204355 double類型的數據值
2:如下圖為?視頻tag
視頻 tags基本格式:
視頻tags的數據:
/*----------------------------
幀類型 4bit
1: 關鍵幀keyframe(視頻中的關鍵幀,數據存儲的是整個畫面完整的數據,可以提取它來生成圖片)
2: 中間幀inter frame(關鍵幀之間的狀態,不完整的畫面數據,需要依靠前面幀的數據生成)
3: 可任意使用的中間幀disposable inter frame(H.263 only)
視頻編碼id 4bit
2: Sorenson H.263(mencoder轉換所使用的視頻編碼)
3: Screen video
4: On2 VP6
5: On2 VP6 with alpha channel
6: Screen video version 2
視頻數據?
If CodecID = 2
H263VIDEOPACKET
If CodecID = 3
SCREENVIDEOPACKET
If CodecID = 4
VP6FLVVIDEOPACKET
If CodecID = 5
VP6FLVALPHAVIDEOPAC
KET
If CodecID = 6
SCREENV2VIDEOPACKET
3:如下圖為音頻tag
音頻tags基本格式:
/*---------------------------
tag數據大小 3個字節的音頻數據大小?
tag時間戳 3個字節tag數據應用的時間(毫秒)
tag時間戳擴展 1個字節的時間戳擴展,讓時間戳變成4字節,本字節作為時間戳的高位.
streamID 3個字節的類id,總是0
//-----------------------------------------------------------------------------------------------------------
音頻tags的數據:
音頻格式的數據的組成如下:
音頻格式 4bit 0是未壓縮的,1是ADPCM,2是mp3,5是Nellymoser 8kHz,6是Nellymoser.
音頻率 2bit 0 = 5.5 kHz
?? 1 = 11 kHz
?? 2 = 22 kHz
?? 3 = 44 kHz
音頻大小 1bit 0 = snd8Bit
?? 1 = snd16Bit
音頻類型 1bit 0 = sndMono
?? 1 = sndStereo
音頻數據 1個字節的音頻數據大小,不同的音頻數據格式
Nellymoser 8kHz 是一個特殊的類型—8kHz取樣率在其它格式中不被支持.當音頻的格式是Nellymoser 8kHz mono的時候,聲音率和聲音類型被忽略了. 對于其它的 Nellymoser取樣率,音頻格式和音頻率照常.
參考資料:
flv文件格式解讀:www.roading.net/blog/post_102.html
flv相關資源:blog.csdn.net/everlastinging/archive/2007/12/15/1939117.aspx
SWF and FLV File Format Specification License Agreement(flv格式文檔下載):www.adobe.com/licensing/developer/fileformat/license/