一、FLV格式構造
FLV文件由FLV Header和FLV Body構成。
FLV Header
FLV Body
總體格式:
類型
字節數
描述
FLV Header
文件標志
3
固定 F(0x46) L(0x4C) V(0x56)
FLV版本號
1
一般為0x01
內容標示
1
第0位和第2位,分別標識video和audio存在的情況。比如0x05, 00000101,代表既有視頻,也有音頻
FLV消息頭長度
4
從File Header開始到File Body開始的字節數,版本1中總為9
FLV Body
Previous Tag size0 (4字節) 表示前一個Tag的長度
Tag1
Tag Header
Tyep(1字節)表示Tag類型,包括音頻(0x08),視頻(0x09)和script data(0x12),其他類型值被保留
DataSize(3字節)表示該Tag Data部分的大小
Timestamp(3字節)表示該Tag的時間戳
Timestamp_ex(1字節)表示是時間戳的擴展字節,當24位數值不夠時,該字節最高位將時間戳擴展為32位數值
StreamID(3字節)表示stream id總數0
Tag Data
不同類型Tag的data部分結構各不相同,但header的結構是相同
Previous Tag size1 (4字節) 即Tag1的大小
Tag2
Previous Tag size2 (4字節) 即Tag2的大小
... ...
Tagn
Previous Tag sizen (4字節) 即Tagn的大小
二、FLV Header頭部信息
頭部分由以下幾部分組成:
Signature(3 byte) + Version(1 byte) + Flags(1 byte) + DataOfft(4 byte)
字段名
字節數
描述
signature
3
固定FLV三個字符作為表示,0x46 0x4C 0x56
Version
1
表示FLV的版本號,一般都是1
Flags
1
內容標識,第0位和第2位,分別標識video和audio存在的情況。比如0x05, 00000101,代表既有視頻,也有音頻
DataOfft
4
表示FLV的header長度,這里可以看到固定是9
圖示:
三、FLV BODY 文件內容部分
Body是由一個個Tag組成的,每個Tag下面有一塊4個字節的空間,用于記錄這個Tag的長度。這個后置的PreviousTagSize用于逆向讀取處理,表示的是前面的Tag的大小。
FlV的組成由一系列的back-pointers + tag構成
back-pointers 固定4個字節,表示前一個tag的sizetag分三種類型,video、audio、scriptstag組成:
字段名
字節數
描述
tag type
1
8為Audio,9為Video,18為Scripts
tag data size
3
表示tag data的長度,從stream id后算起
Timestreamp
3
時間戳
TimestampExtended
1
時間戳擴展字段
streamId
3
總是0
tagData
n
數據部分
四、Script的TagData內容
1、腳本Tag一般只有一個,是flv的第一個Tag,用于存放flv的信息,比如duration、audiodatarate、creator、width等;
2、所有數據都是以 數據類型 + (數據長度) + 數據的格式出現的,數據類型占1byte,數據長度看數據類型是否存在。
比如如下圖:
type = 0x02 對應Stringsize = 0x0A = 10 長度value = 0x6F 0x6E....0x61 = onMetaData 正好是10個字節。
3、Tag Data結構包含兩個AMF包。第一個AMF包裝“onMetaData”標志,第二個AMF包封裝一個數組類型,這個數組中包含了音視頻信息項的名稱和值。
上圖為第二個AMF
type = 0x08 對應ECMA array type。類似Map, 后面4個字節為數組的個數(00000004,表示有4個鍵值對),然后是鍵值對,第一個2個字節的鍵名長度(0005,長度為5),接下來就是鍵名(0x7769647468 = "width")。
之后就是數據類型,然后根據類型來判斷長度,鍵名過后是0x00,表示之后跟著8個字節的double類型,0x408600000000 = 704.000,這之間的相互轉換可以自行百度“IEEE 754”
說明:
java中double通過IEEE754轉long的方法
double b = 23.45;long value = Double.doubleToRawLongBits(b);
五、Video的TagData內容
type=0x09size=0x00001E=30。長度為30timestreamp=0x000000TimestampExtended = 0x00streamId = 0x000000
之后的數據就是 :視頻信息+數據
0x17 前四位是幀類型Frame Type,后四位為編碼ID(CodeId)
FrameType = 1 ; CodeId = 7
幀類型
編碼ID
當CodeID = 7 (AVC(H.264))的情況,VideoTagHeader會多出4個字節的信息,AVCPacketType和CompositionTime。
AVCPacketType占1個字節
值
類型
0
AVCDecoderConfigurationRecord(AVC quence header)
1
AVC NALU
2
AVC end of quence (lower level NALU quence ender is not required or supported)
AVCDecoderConfigurationRecord:包含著是H.264解碼相關畢竟重要的SPS(序列參數集)和PPS(圖像參數集)信息。在給AVC解碼器推送數據流之前一定要把sps和pps信息送出,否則的話解碼器不能正常解碼。AVCDecoderConfigurationRecord在flv文件中一般出現一次,也就是第一個video Tag。
CompositionTime占3個字節
條件
值
AVCPacketType == 1
Composition time offt
AVCPacketType != 1
0
AVCDecoderConfigurationRecord格式:
0x01 + sps[1] + sps[2] + sps[3] + 0xFF + 0xE1 + sps size(2個字節) + sps + 01 + pps size(2個字節) + pps
如圖所示:
sps[1] = 0x64sps[2] = 0x00sps[3] = 0x20sps size = 0x0019 = 25跳過25個字節后,是0x01pps size = 0x0005 跳過5個字節,就到了back-pointers。解析出sps和pps tag后,后面的video tag就是真正的視頻數據內容。
六、Audio的TagData內容
與視頻格式類似,前四位為音頻格式,
接著2位為采樣率
接著1位為采樣的長度
七、FLV文件分析工具
工欲善其事必先利其器,所以有款強大的分析工具,對于提高效率是有多么重要,FlvAnalyzer就是一款強大的flv分析工具。圖形界面如下,大家可以自行去網上下載。
本文發布于:2023-02-28 20:14:00,感謝您對本站的認可!
本文鏈接:http://www.newhan.cn/zhishi/a/167766423679348.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:.flv(.flv是什么文件).doc
本文 PDF 下載地址:.flv(.flv是什么文件).pdf
| 留言與評論(共有 0 條評論) |