FLV檔案格式基礎
阿新 • • 發佈:2018-11-11
技術在於交流、溝通,轉載請註明出處並保持作品的完整性。
原文:https://blog.csdn.net/hiwubihe/article/details/82346691
[本系列相關文章]
- H264和音訊流打包成PS流 (MPEG2-PS)
- PS流解複用成H264和音訊流(ES提取)
- H264和音訊流打包成TS流 (MPEG2-TS)
- TS流解複用成H264和音訊流(ES提取)
- FLV檔案格式基礎
- 解複用FLV檔案(基於FFMPEG解析FLV(h264+aac))
- 解複用FLV檔案(不用FFMPEG,C++實現)
FLV,F4V,MP4廣泛應用於各主流直播和點播平臺,能夠非常方便的流媒體和儲存處理。本篇記錄一下FLV檔案的格式學習,FLV相對MP4格式比較簡單。主要由檔案頭+三種類型的TAG組成。FLV支援的音視訊編解碼方式如下圖
FLV總體結構如下圖
檔案頭
Field | Data Type | Default | Details |
---|---|---|---|
Signature | byte[3] | “FLV” | Always “FLV” |
Version | uint8 | 1 | Only 0x01 is valid |
Flags | uint8 bitmask | 0x05 | Bitmask: 0x04 is audio, 0x01 is video (so 0x05 is audio+video) |
Header Size | uint32_be | 9 | Used to skip a newer expanded header |
檔案主體
交替有前面tag長度和tag體組成,
TAG頭
AUDIODATA格式
如果是MP3等其他資料,直接拷貝音訊資料,AAC格式如下
VIDEODATA資料如下
H264/AVC編碼時 AVCVIDEOPACKET
注意一下:
- flv檔案中Timestamp和TimestampExtended拼出來的是dts,相對於第一個TAG來說的毫秒數。
- CompositionTime 表示當前幀PTS對DTS的偏移值,單位毫秒即CTS=PTS-DTS。CTS永遠>0,因為一幀顯示時間總是在解碼時間之後。如
幀型別 I B B P 顯示序號 1 2 3 4 解碼序號 1 3 4 2 PTS 0 40ms 80ms 120ms DTS 0 20ms 50ms 10ms 第一個B幀40ms需要顯示,所以40ms以前必須解碼好,而第一個B幀要解碼需要依賴P幀,所以在40ms以前P幀和第一個B幀都要解碼好。
-
如果H264編碼中沒有B真,則PTS==DTS,所以CompositionTime CTS==0。
-
AudioSpecificConfig參考ISO 14496-3,AVCDecoderConfigurationRecord參考ISO 14496-15。
-
Data tags在本篇沒解析,基本由AMF1和AMF2組成,包括視訊解析度,位元率,幀率,時長,大小,取樣率,通道數常用資訊。