当前位置:首页 > 云服务器 > 正文

flv音视频存储规范是什么?,有哪些注意事项?

文件结构

文件头(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,其后为视频数据,第一字节结构:

flv音视频存储规范是什么?,有哪些注意事项? 第1张

含义
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),视频数据格式如下:

flv音视频存储规范是什么?,有哪些注意事项? 第2张

  • 第 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 天,对于长时间的视频流,时间戳的扩展字段必须正确设置,否则会导致时间戳回绕或播放异常。

flv音视频存储规范是什么?,有哪些注意事项? 第3张

0