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