标准定义

video_file_format_spec_v10_1.pdf

FLV基本结构

[FLV文件头] -> [前一个TAG长度] -> [TAG Header] -> [TAG Data]

H264 FLV封装基本结构

[FLV文件头] -> [前一个TAG长度] -> [TAG Header] -> [Metadata] -> [前一个TAG长度] -> [TAG Header] -> [AVC Sequence Header] -> [前一个TAG长度] ->[TAG Header] -> [TAG Data]

FLV文件头

文件头固定为 9 字节,用于标识文件类型、版本和包含的流类型。

字段长度 (字节)含义与说明
Signature3文件签名,固定为 ASCII 码 'F', 'L', 'V' (0x46 0x4C 0x56)。
Version1FLV 版本号,通常为 0x01,表示版本 1。
TypeFlags1类型标志位,用于标识文件中是否包含音频或视频流。
• Bit 2: 1 表示有音频,0 表示无音频。
• Bit 0: 1 表示有视频,0 表示无视频。
DataOffset4数据偏移量,表示 FLV Header 的总长度,固定为 9

TAG Header

Tag 是 FLV 文件体的核心,用于承载实际的音视频数据或元数据。每个 Tag 都由一个 11 字节的 Tag Header 和变长的 Tag Data 组成。

字段长度 (字节)含义与说明
TagType1标签类型,定义了 Tag Data 的内容。
8: 音频数据 (Audio)
9: 视频数据 (Video)
18: 脚本数据 (Script)
DataSize3Tag Data 的长度,不包含这 11 字节的 Header。
Timestamp3时间戳的低 24 位,单位为毫秒 (ms)。
TimestampExtended1时间戳的高 8 位,与前面的 3 字节共同组成一个 32 位的时间戳。
StreamID3流 ID,固定为 0

FLV Metadata

TAG type值为0x12

字段名 (Key)长度结构 (字节)含义与详细格式说明
onMetaData1 + 2 + 10onMetaData标识, 1字节表示 0x02,2字节的字符串长度,10字节的字符串onMetaData
Array Header1 + 4ECMA Array 起始标记。
格式:0x08 (AMF 类型标记) + 0x00 00 00 00 (4字节,关联数组元素个数,通常填0)。
duration2 + 8 + 1 + 8视频时长。
格式:0x00 0x08 (2字节键名长度) + duration (8字节字符串) + 0x00 (1字节类型标记 Number) + 8字节 double (值)。
width2 + 5 + 1 + 8视频宽度。
格式:0x00 0x05 (2字节键名长度) + width (5字节字符串) + 0x00 (1字节类型标记 Number) + 8字节 double (值)。
height2 + 6 + 1 + 8视频高度。
格式:0x00 0x06 (2字节键名长度) + height (6字节字符串) + 0x00 (1字节类型标记 Number) + 8字节 double (值)。
videodatarate2 + 13 + 1 + 8视频码率。
格式:0x00 0x0D (2字节键名长度) + videodatarate (13字节字符串) + 0x00 (1字节类型标记 Number) + 8字节 double (值)。
framerate2 + 9 + 1 + 8帧率。
格式:0x00 0x09 (2字节键名长度) + framerate (9字节字符串) + 0x00 (1字节类型标记 Number) + 8字节 double (值)。
videocodecid2 + 12 + 1 + 8视频编码ID。
格式:0x00 0x0C (2字节键名长度) + videocodecid (12字节字符串) + 0x00 (1字节类型标记 Number) + 8字节 double (值,H.264为7.0)。
audiodatarate2 + 13 + 1 + 8音频码率。
格式:0x00 0x0D (2字节键名长度) + audiodatarate (13字节字符串) + 0x00 (1字节类型标记 Number) + 8字节 double (值)。
audiosamplerate2 + 15 + 1 + 8音频采样率。
格式:0x00 0x0F (2字节键名长度) + audiosamplerate (15字节字符串) + 0x00 (1字节类型标记 Number) + 8字节 double (值)。
audiosamplesize2 + 15 + 1 + 8音频位深。
格式:0x00 0x0F (2字节键名长度) + audiosamplesize (15字节字符串) + 0x00 (1字节类型标记 Number) + 8字节 double (值)。
stereo2 + 6 + 1 + 1立体声标志 (Boolean)。
1. 键名长度:0x00 0x06 (2字节,表示 "stereo" 长度为6)
2. 键名:stereo (6字节字符串)
3. 类型标记:0x01 (1字节,代表 AMF Boolean)
4. 值:0x01 (立体声/true) 或 0x00 (单声道/false)
audiocodecid2 + 12 + 1 + 8音频编码ID。
格式:0x00 0x0C (2字节键名长度) + audiocodecid (12字节字符串) + 0x00 (1字节类型标记 Number) + 8字节 double (值,AAC为10.0)。
Encoder2 + 7 + 1 + 2 + 字符串编码器信息 (可选)。
格式:0x00 0x07 (2字节键名长度) + Encoder (7字节字符串) + 0x02 (1字节类型标记 String) + 2字节长度 + 字符串内容
End Marker3数组结束标记。
格式:0x00 0x00 (2字节键名长度0) + 0x09 (1字节类型标记 Object End)。

AVC Sequence Header

字段名称长度 (字节)值/示例 (十六进制)说明
IsExHeader10版本号,固定为 1。
Frame Type 和 Codec ID1Frame Type,高四位。1:关键帧,2:非关键帧。Codec ID 低四位。1:JPEG,2:H263:,7:AVC
AVCPacketType100固定值。0 表示这是 AVC Sequence Header。 1 AVC NALU, 2 AVC endof sequence
CompositionTime300 00 00固定值。对于 Sequence Header,此值必须为 0。
ConfigurationVersion101版本号,固定为 1。
AVCProfileIndication164 / 4D / 58配置文件指示,通常直接复制 SPS 的第 2 个字节(如 64 代表 High Profile)。
ProfileCompatibility100配置文件兼容性,通常直接复制 SPS 的第 3 个字节。
AVCLevelIndication128 / 1F / 32级别指示,通常直接复制 SPS 的第 4 个字节(如 28 代表 Level 4.0)。
LengthSizeMinusOne1FF非常重要。高 6 位保留为 1,低 2 位表示 NALU 长度字段的大小减 1。
0xFF 表示 NALU 长度用 4 字节表示。
NumOfSPS101SPS 的个数,通常为 1(低 5 位有效,高 3 位保留为 1)。
SPS Length200 1ESPS 数据的长度(大端)。例如 0x001E 表示后面有 30 字节。
SPS Data变长67 64 ...SPS 的原始数据(不含 NALU 起始码)。长度由上一字段决定。
NumOfPPS101PPS 的个数,通常为 1。
PPS Length200 05PPS 数据的长度(大端)。例如 0x0005 表示后面有 5 字节。
PPS Data变长68 EB ...PPS 的原始数据(不含 NALU 起始码)。长度由上一字段决定。