FLV 是众多封装格式中比较简单的一种,所以本书先讲它。实际上了解这些二进制格式,只要找到一个好用的工具,然后看下相关文档或者网络上的文章,就能理解各个字段的含义。这里介绍一些 分析 FLV 文件的工具。
1,FlvAnalyzer,下载地址:百度网盘, 提取码:yld0
2,flvparse ,百度网盘 ,提取码:od94
然后 FLV 是 adobe 公司出的。 标准文档 video_file_format_spec_v10 下载地址:百度网盘,提取码:4j92
下面提供一个 FLV 文件 juren.flv ,方便读者对照,下载地址:百度网盘,提取码:ptk8 ,
用 FlvAnalyzer 打开这个 juren.flv 文件,截图如下:
从上图可以看出,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 分别是哪个字段。如下截图:
上图中这个 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