标准定义
video_file_format_spec_v10_1.pdf
FLV基本结构
[FLV文件头] -> [前一个TAG长度] -> [TAG Header] -> [TAG Data]
H264 FLV封装基本结构
[FLV文件头] -> [前一个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。 |
AVC Sequence Header
| 字段名称 | 长度 (字节) | 值/示例 (十六进制) | 说明 |
|---|---|---|---|
| AVCPacketType | 1 | 00 | 固定值。0 表示这是 AVC Sequence Header。 |
| 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 起始码)。长度由上一字段决定。 |
评论已关闭