FLV封装格式

FLV 是众多封装格式中比较简单的一种,所以本书先讲它。实际上了解这些二进制格式,只要找到一个好用的工具,然后看下相关文档或者网络上的文章,就能理解各个字段的含义。这里介绍一些 分析 FLV 文件的工具。

1,FlvAnalyzer,下载地址:百度网盘, 提取码:yld0

2,flvparse ,百度网盘 ,提取码:od94

然后 FLV 是 adobe 公司出的。 标准文档 video_file_format_spec_v10 下载地址:百度网盘,提取码:4j92



下面提供一个 FLV 文件 juren.flv ,方便读者对照,下载地址:百度网盘,提取码:ptk8 ,

用 FlvAnalyzer 打开这个 juren.flv 文件,截图如下:

ffmpeg-principle-0-1-1-1

从上图可以看出,FLV 总体分为 两个部分,FLV Header + FLV Body。然后 FLV Header 一共占 9 个字节,FLV Header 的字段如下:

1,前面 3 个字节是 FLV 的 ASII 码对应的数字。

2,TypeFlagsAudio 跟 TypeFlagsVideo 分别代表这个 FLV 文件是否有音频 跟 视频。

3,DataOffset 字段是头部的大小。


然后 FLV body 由 很多个 Tag 组成。

FLV file body = PreviousTagSize0 + Tag1 + PreviousTagSize1 + Tag2 + ... + PreviousTagSizeN-1 + TagN

从上图可以看到,juren.flv 主要有 3种 Tag。

1,Script Tag,这种 Tag 通常只有一个,而且在开头的位置,主要是存储文件的基本信息,帧率,采样率,持续时间之类的。

2,Video Tag,存放 一帧视频的数据,通常是 一帧。

3,Audio Tag,存放一帧音频的数据,通常是一帧。


FLV body 的字段比较多,我挑两个重点的字段来讲,视频流的 PTS 与 DTS 分别是哪个字段。如下截图:

ffmpeg-principle-0-1-1-2

上图中这个 TimeStamp 就是 DTS,视频帧的解码时间,下面那个 TimeStampExtended 是扩展字段,如果 3 字节不够存储时间,就加多一个字节存储。

大家可能会有点疑问,DTS 在这里,那 PTS 在哪里?因为 只有 视频 Tag 才有两个时间,音频没有,所以 FLV 标准为了不破坏公用结构,PTS 是存放在 Tag Data 里面的,就是上图 圈出来的 CompositionTime Offset,这个是偏移时间,TimeStamp + CompositionTime Offset 才是真正的 PTS。


FLV 格式中其他字段的含义可以在以下资料看到。

1,《FFmpeg从入门到精通》3.2章节 "音视频文件转FLV格式"

2,标准文档 video_file_format_spec_v10

3,《FLV封装格式介绍及解析》


版权所属 xianwanzhiyin.net 罗上文 2022 all right reserved,powered by Gitbook该文件修订时间: 2022-06-03 15:45:23

results matching ""

    No results matching ""