技术在于交流、沟通,转载请注明出处并保持作品的完整性。
原文: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组成,包括视频分辨率,比特率,帧率,时长,大小,采样率,通道数常用信息。