分享一个可以在Linux和macOS上运行的FLV封装格式分析工具

FLV是Flash Video的缩写,是由Adobe公司开发的一种视频文件封装格式,其实这个格式最初是Macromedia公司在2003年开发的,后来在2005年被Adobe给收购了。由于FLV格式的一些局限性,在2007年Adobe又开发了被称为Flash MP4的F4V格式。

分享一个可以在Linux和macOS上运行的FLV封装格式分析工具

上图中Sorenson Spark是在Flash Video里的H.263视频编码标准的一种实现,FFmpeg里面它的FourCC是FLV1

本文要讨论的是FLV,不涉及F4V。截止2023年11月,FLV的最新版本是2010年8月发布的Version 10。对视频编码标准的时间点敏锐的读者可能已经发现了,官方的FLV标准目前还不支持H.265,就更别说AV1和H.266了,但这并不影响大家在业务中使用这些编码格式。

整体看,FLV文件包括文件头(Header)和文件体(Body)两部分。Body由一个个的Tag组成,Tag的类型有三种,分别是视频,音频和Script。每个Tag是由Tag Header和Tag Data组成,不同Tag类型的Tag Data结构不同。以视频Tag的Tag Data为例,如下图所示:

分享一个可以在Linux和macOS上运行的FLV封装格式分析工具

首先是4bit的Frame Type,然后是4bit的CodecID,再后面是不同CodecID所对应的视频PACKET。以AVC即H.264为例,如下图所示:

分享一个可以在Linux和macOS上运行的FLV封装格式分析工具

关键是PacketType,它的值为0时表示这是序列头数据,也就是我们编解码里说的参数集SPS和PPS,它的值为1时表示这是NALU数据。根据AVC视频编码标准spec,NALU个数和Slice个数对应,即有些视频帧的Tag Data里可能会有多个NALUs。

如果问H.264码流里面的SEI NALU是怎么在FLV的Tag中保存的,其实SEI数据是和它后面那个视频帧的NALU数据打在同一个视频Tag里面的,当然这个仅限于H.264编码。

那如果想要分析一段本地的FLV视频,该怎么办呢?

如果你是用的Windows系统,可以直接使用网上开源的FlvAnalyzer工具,虽然看不到源码,但可以直接使用。但如果你用的Linux或者macOS系统,想找一个简单的FLV分析工具还真是有些不容易。

虽然Elecard Stream Anayzer软件也可以分析FLV封装格式,但毕竟这是一个收费的软件,它的试用版本有最大帧数的限制,而且不支持H.263和VP6等编码格式FLV文件。

分享一个可以在Linux和macOS上运行的FLV封装格式分析工具

于是我在github上找了一下,发现有个开源项目simple-flv-parser,它的代码足够简单,使用足够方便。在它的基础上,我支持了一下H.265编码格式的FLV的解析,并做了一些小的修改。

最新的项目代码路径在:

https://github.com/codec2021/simple-flv-parser/tree/master

整个代码的目录和文件结构如下图所示:

分享一个可以在Linux和macOS上运行的FLV封装格式分析工具

这个代码的使用很简单,只要git clone下载代码后,直接在linux或者macOS环境命令行运行代码里的start_build.sh脚本,便可在build目录下得到一个名为flv_parser的可执行文件。

同时在res目录我上传了一些测试用的FLV视频。比如我们运行:

./flv_parser ../res/h264.flv命令,可以得到FLV Tag的解析信息。

分享一个可以在Linux和macOS上运行的FLV封装格式分析工具

如上图所示,开始是9个字节的FLV文件头,紧接着的第一个FLV Tag通常是Script data类型,是FLV封装视频的一些metedata信息,比如视频流的平均码率,帧率等。这里需要强调一下,一个FLV文件里可以有多个Script data,而不是有些帖子说的只有一个。

这里的第二个Tag是Video data,编码类型是AVC,它的时间戳Timestamp值是0。这里在打印时特别加了一个(DTS),即这个值是表示的是解码时间戳,而下面composition time则是PTS减DTS的差值。

音频流FLV Tag这里就不做解释了。如果你对FLV封装格式想要有更多的了解,可以参考官方资料:

https://rtmp.veriskope.com/pdf/video_file_format_spec_v10.pdf

此外,如果对x264的源代码比较熟悉的话,应该知道它的output目录下是有一个FLV封装代码flv.c的。比如FLV文件头的9个字节的输出:

分享一个可以在Linux和macOS上运行的FLV封装格式分析工具

再比如写入H.264视频帧Tag的write_frame函数:

分享一个可以在Linux和macOS上运行的FLV封装格式分析工具

这篇文章主要是给大家分享一个可以在Linux和macOS上运行的FLV格式解析工具。总体而言,FLV视频封装格式的解析没有难度,按照标准文档依次读取相应比特位获取数值就行了,相比于视频解码器的码流语法解析过程,属于入门级别。

 

作者:codec2021
来源:手撕编解码
原文:https://mp.weixin.qq.com/s/RG6-dZ7sTF5V7O3_EgfFrA

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论