flv音视频存储规范是什么?,有哪些注意事项?
- 云服务器
- 2026-07-24
- 11
文件结构
文件头(Header)
FLV 文件以 9 字节的固定头开始,结构如下:
| 字段 | 长度 | 描述 |
|---|---|---|
| Signature | 3 字节 | 固定为 FLV |
| Version | 1 字节 | 版本号,目前为 0x01 |
| Flags | 1 字节 | 流类型标记:第 0 位(音频)和第 2 位(视频) |
| DataOffset | 4 字节 | 文件头长度,固定为 0x00000009 |
Flags 中,若存在音频流则设置 0x04,存在视频流则设置 0x01,两者同时存在则为 0x05。
文件体(Body)
文件体由一系列 Tag 组成,每个 Tag 之前有一个 4 字节的 PreviousTagSize,表示前一个 Tag 的数据大小(对于第一个 Tag,该值为 0),每个 Tag 包含 11 字节的 Tag 头和可变长度的数据。
Tag 结构
Tag 头格式如下:
| 字段 | 长度 | 描述 |
|---|---|---|
| TagType | 1 字节 | 类型:8=音频,9=视频,18=脚本 |
| DataSize | 3 字节 | Tag 数据部分的大小(字节数) |
| Timestamp | 3 字节 | 时间戳(毫秒),低 24 位 |
| TimestampExtended |
1 字节 | 时间戳扩展(高 8 位),与上一字段组合为 32 位时间戳 |
| StreamID | 3 字节 | 流 ID,固定为 0x000000 |
| Data | 可变 | Tag 数据,根据类型不同格式各异 |
音频 Tag
音频 Tag 数据的第一字节为音频信息,后跟音频数据,第一字节结构:
| 位 | 含义 |
|---|---|
| 7-4 | 音频格式:0=Linear PCM,1=ADPCM,2=MP3,10=AAC,14=MP3 8kHz |
| 3-2 | 采样率:0=5.5kHz,1=11kHz,2=22kHz,3=44kHz |
| 1 | 采样精度:0=8bit,1=16bit |
| 0 | 声道类型:0=单声道,1=立体声 |
对于 AAC 格式,音频数据的前两个字节含义:
- 第 1 字节:AACPacketType,0 表示 AAC Sequence Header(包含 AudioSpecificConfig),1 表示 AAC Raw Data。
- 后续:AAC 原始数据或配置信息。
视频 Tag
视频 Tag 数据的第一字节包含帧类型和编码 ID,其后为视频数据,第一字节结构:

| 位 | 含义 |
|---|---|
| 7-4 | 帧类型:1
=关键帧,2=内部帧,3=丢弃帧,4=生成关键帧 |
| 3-0 | 编码 ID:2=Sorenson H.263,3=Screen Video,4=VP6,7=AVC(H.264),12=HEVC(H.265) |
对于 AVC(H.264),视频数据格式如下:

- 第 2 字节:AVCPacketType,0=AVC Sequence Header,1=AVC NALU,2=AVC End of Sequence。
- 第 3-5 字节:CompositionTimeOffset(CTS),有符号 24 位整数,表示解码时间到显示时间的偏移(毫秒)。
- 后续数据:
- 若 AVCPacketType 为 0,则为 AVC Sequence Header,包含配置版本、SPS、PPS 等信息。
- 若 AVCPacketType 为 1,则为 NALU 单元,每个 NALU 前有 4 字节长度前缀(大端序)。
脚本 Tag
脚本 Tag 数据使用 AMF 编码,通常包含元数据,常见格式:
- 第 1 部分:AMF 字符串(如 onMetaData)。
- 第 2 部分:AMF 混合数组,包含键值对,如 duration、width、height、videocodecid、audiocodecid 等。
编码规范
H.264 视频
在 FLV 中存储 H.264 视频时,必须使用 AVC Packet 结构,关键点:
- 首个视频 Tag 应为 AVC Sequence Header,包含 SPS 和 PPS,用于解码器初始化。
- 后续视频 Tag 为 AVC NALU,每个 Tag 可包含多个 NALU,每个 NALU 前有 4 字节长度前缀(不含起始码)。
- CompositionTimeOffset 用于 B 帧和 PTS/DTS 分离,对于 I 帧和 P 帧通常为 0。
AAC 音频
AAC 音频在 FLV 中存储时,需遵循以下规则:
- 首个音频 Tag 应为 AAC Sequence Header,包含 AudioSpecificConfig(用于解码器配置,如采样率、声道数)。
- 后续音频 Tag 为 AAC Raw Data,每个 Tag 包含一帧完整的 AAC 原始数据(不含 ADTS 头部)。
- 注意:AAC 数据需按帧打包,每个 Tag 的时间戳对应音频帧的播放时间。
相关问题与解答
问题 1:FLV 中 H.264 视频的 Sequence Header 缺失会导致什么后果?
解答:Sequence Header 包含了 SPS 和 PPS 等关键参数,解码器依赖这些参数初始化,如果缺失,解码器无法正确解码视频流,可能出现花屏、绿屏或解码失败,在 FLV 文件的开头必须包含一个 AVCPacketType 为 0 的视频 Tag 作为 Sequence Header。
问题 2:FLV 文件中的时间戳是否支持超过 24 位范围(约 4.66 小时)?
解答:支持,FLV 的 Tag 头中时间戳使用 24 位低 24 位和 1 字节扩展字段,组合成 32 位无符号整数,最大可表示约 49.7 天,对于长时间的视频流,时间戳的扩展字段必须正确设置,否则会导致时间戳回绕或播放异常。
