标准定义
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 字节,用于标识文件类型、版本和包含的流类型。
| 字段 | 长度 (字节) | 含义与说明 |
|---|---|---|
| Signature | 3 | 文件签名,固定为 ASCII 码 'F', 'L', 'V' (0x46 0x4C 0x56)。 |
| Version | 1 | FLV 版本号,通常为 0x01,表示版本 1。 |
| TypeFlags | 1 | 类型标志位,用于标识文件中是否包含音频或视频流。 • Bit 2: 1 表示有音频,0 表示无音频。 • Bit 0: 1 表示有视频,0 表示无视频。 |
| DataOffset | 4 | 数据偏移量,表示 FLV Header 的总长度,固定为 9。 |
TAG Header
Tag 是 FLV 文件体的核心,用于承载实际的音视频数据或元数据。每个 Tag 都由一个 11 字节的 Tag Header 和变长的 Tag Data 组成。
| 字段 | 长度 (字节) | 含义与说明 |
|---|---|---|
| TagType | 1 | 标签类型,定义了 Tag Data 的内容。 • 8: 音频数据 (Audio)• 9: 视频数据 (Video)• 18: 脚本数据 (Script) |
| DataSize | 3 | Tag Data 的长度,不包含这 11 字节的 Header。 |
| Timestamp | 3 | 时间戳的低 24 位,单位为毫秒 (ms)。 |
| TimestampExtended | 1 | 时间戳的高 8 位,与前面的 3 字节共同组成一个 32 位的时间戳。 |
| StreamID | 3 | 流 ID,固定为 0。 |
FLV Metadata
TAG type值为0x12
| 字段名 (Key) | 长度结构 (字节) | 含义与详细格式说明 |
|---|---|---|
| onMetaData | 1 + 2 + 10 | onMetaData标识, 1字节表示 0x02,2字节的字符串长度,10字节的字符串onMetaData |
| Array Header | 1 + 4 | ECMA Array 起始标记。 格式: 0x08 (AMF 类型标记) + 0x00 00 00 00 (4字节,关联数组元素个数,通常填0)。 |
| duration | 2 + 8 + 1 + 8 | 视频时长。 格式: 0x00 0x08 (2字节键名长度) + duration (8字节字符串) + 0x00 (1字节类型标记 Number) + 8字节 double (值)。 |
| width | 2 + 5 + 1 + 8 | 视频宽度。 格式: 0x00 0x05 (2字节键名长度) + width (5字节字符串) + 0x00 (1字节类型标记 Number) + 8字节 double (值)。 |
| height | 2 + 6 + 1 + 8 | 视频高度。 格式: 0x00 0x06 (2字节键名长度) + height (6字节字符串) + 0x00 (1字节类型标记 Number) + 8字节 double (值)。 |
| videodatarate | 2 + 13 + 1 + 8 | 视频码率。 格式: 0x00 0x0D (2字节键名长度) + videodatarate (13字节字符串) + 0x00 (1字节类型标记 Number) + 8字节 double (值)。 |
| framerate | 2 + 9 + 1 + 8 | 帧率。 格式: 0x00 0x09 (2字节键名长度) + framerate (9字节字符串) + 0x00 (1字节类型标记 Number) + 8字节 double (值)。 |
| videocodecid | 2 + 12 + 1 + 8 | 视频编码ID。 格式: 0x00 0x0C (2字节键名长度) + videocodecid (12字节字符串) + 0x00 (1字节类型标记 Number) + 8字节 double (值,H.264为7.0)。 |
| audiodatarate | 2 + 13 + 1 + 8 | 音频码率。 格式: 0x00 0x0D (2字节键名长度) + audiodatarate (13字节字符串) + 0x00 (1字节类型标记 Number) + 8字节 double (值)。 |
| audiosamplerate | 2 + 15 + 1 + 8 | 音频采样率。 格式: 0x00 0x0F (2字节键名长度) + audiosamplerate (15字节字符串) + 0x00 (1字节类型标记 Number) + 8字节 double (值)。 |
| audiosamplesize | 2 + 15 + 1 + 8 | 音频位深。 格式: 0x00 0x0F (2字节键名长度) + audiosamplesize (15字节字符串) + 0x00 (1字节类型标记 Number) + 8字节 double (值)。 |
| stereo | 2 + 6 + 1 + 1 | 立体声标志 (Boolean)。 1. 键名长度: 0x00 0x06 (2字节,表示 "stereo" 长度为6)2. 键名: stereo (6字节字符串)3. 类型标记: 0x01 (1字节,代表 AMF Boolean)4. 值: 0x01 (立体声/true) 或 0x00 (单声道/false) |
| audiocodecid | 2 + 12 + 1 + 8 | 音频编码ID。 格式: 0x00 0x0C (2字节键名长度) + audiocodecid (12字节字符串) + 0x00 (1字节类型标记 Number) + 8字节 double (值,AAC为10.0)。 |
| Encoder | 2 + 7 + 1 + 2 + 字符串 | 编码器信息 (可选)。 格式: 0x00 0x07 (2字节键名长度) + Encoder (7字节字符串) + 0x02 (1字节类型标记 String) + 2字节长度 + 字符串内容。 |
| End Marker | 3 | 数组结束标记。 格式: 0x00 0x00 (2字节键名长度0) + 0x09 (1字节类型标记 Object End)。 |
AVC Sequence Header
| 字段名称 | 长度 (字节) | 值/示例 (十六进制) | 说明 |
|---|---|---|---|
| IsExHeader | 1 | 0 | 版本号,固定为 1。 |
| Frame Type 和 Codec ID | 1 | Frame Type,高四位。1:关键帧,2:非关键帧。Codec ID 低四位。1:JPEG,2:H263:,7:AVC | |
| AVCPacketType | 1 | 00 | 固定值。0 表示这是 AVC Sequence Header。 1 AVC NALU, 2 AVC endof sequence |
| CompositionTime | 3 | 00 00 00 | 固定值。对于 Sequence Header,此值必须为 0。 |
| ConfigurationVersion | 1 | 01 | 版本号,固定为 1。 |
| AVCProfileIndication | 1 | 64 / 4D / 58 | 配置文件指示,通常直接复制 SPS 的第 2 个字节(如 64 代表 High Profile)。 |
| ProfileCompatibility | 1 | 00 | 配置文件兼容性,通常直接复制 SPS 的第 3 个字节。 |
| AVCLevelIndication | 1 | 28 / 1F / 32 | 级别指示,通常直接复制 SPS 的第 4 个字节(如 28 代表 Level 4.0)。 |
| LengthSizeMinusOne | 1 | FF | 非常重要。高 6 位保留为 1,低 2 位表示 NALU 长度字段的大小减 1。0xFF 表示 NALU 长度用 4 字节表示。 |
| NumOfSPS | 1 | 01 | SPS 的个数,通常为 1(低 5 位有效,高 3 位保留为 1)。 |
| SPS Length | 2 | 00 1E | SPS 数据的长度(大端)。例如 0x001E 表示后面有 30 字节。 |
| SPS Data | 变长 | 67 64 ... | SPS 的原始数据(不含 NALU 起始码)。长度由上一字段决定。 |
| NumOfPPS | 1 | 01 | PPS 的个数,通常为 1。 |
| PPS Length | 2 | 00 05 | PPS 数据的长度(大端)。例如 0x0005 表示后面有 5 字节。 |
| PPS Data | 变长 | 68 EB ... | PPS 的原始数据(不含 NALU 起始码)。长度由上一字段决定。 |
评论已关闭