【AVD】用 notepad++ 和 Excel 协助分析媒体文件包

最近业务上遇到一个比较奇葩的问题。服务器制作的视频在移动端应用页面无法正常播放,尤其是无法拖拽进度条,否则会非常卡顿导致无法播放。然而在小程序、Web不会有问题,下载后播放也不会有问题,在桌面端播放更不会有问题。如果用 FFmpeg 命令行制作,则不会有问题。初步分析,应该是时间戳的问题。因此,需要对比用 FFmpeg 命令行 和 用 FFmpeg api 库制作的两个视频有什么区别。
ffprobe 可以查看媒体文件里每个 packet 的信息,但是一般来说音视频文件有很多 packet,终端显示的结果很难进行对比,因此,用 Excel 及其绘图会非常有助于分析对比。

ffprobe

对音视频开发新人来说,ffprobe 命令行是非常容易快速上手的一个音视频开发工具。比如可以用
ffprobe -v quiet -print_format json -show_streams -show_format -i input.mp4
来分析一个视频的音视频流信息,它打印了 input.mp4 这个视频文件的封装格式及其包含的各种流,和流信息。
同样的,使用
ffprobe -v quiet -show_packets -i input.mp4
可以打印 input.mp4 这个文件中所包含的所有包信息,虽然加上 -print_format json 能让程序以 json 格式打印,但是对于使用 notepad++ 来处理的话,不如不加这个,直接打印。那么,它打印出来的样子,大约是这样的:
【AVD】用 notepad++ 和 Excel 协助分析媒体文件包
非常长,根本没法对比。
对,使用 > packetinfo.txt 可以将这些内容打印到一个文本文档里,但是仍然无法直观对比。因此,我们将借助 Excel 来分析,然而,如何把这些参数分别填入 Excel 的表格里呢?虽然我最开始想到用 Python 写个字符串处理程序,加几个循环,这也是的确能做到的。但是毕竟不太熟悉Python,边学边写有点慢,而上峰催得急。因此,还是用 notepad 替换大法吧~~

notepad 和 Excel

如何把文本文档类型的数据填入 Excel,对于 Excel 高手来说并不陌生,Excel 中以 制表符tab 为每个单元格内容的分界,比如,如果复制 a(\t)b 这里的 (\t) 表示有个制表符,也就是经常用的 tab 键缩进。如果在 notepad 里把显示所有字符那个按钮点亮的话,上面这个 a b 在 notepad 里是这么显示的
【AVD】用 notepad++ 和 Excel 协助分析媒体文件包
再看看刚刚那个 ffprobe 命令行的输出结果文件内容是怎样的?
【AVD】用 notepad++ 和 Excel 协助分析媒体文件包
在Windows上,其结果如上图所示。
可以看到,每行后面都有两个黑底白字的 CR LF,这两个分别对应于正则表达式中的 \r \n,也就是刚好换了一行。
因此,我们第一步,就是要把这些多余的换行去掉,然而,不可避免地,不想换行的行,比如[/PACKET]所在的行,也会被误杀。幸好,每个包都由[PACKET][/PACKET]包裹,我们可以等会儿再把被误杀的换行找回来。
按下 Ctrl+F 打开查找替换,进入替换选项卡,查找目标为 \r\n,替换为TT,这里的替换为后面,只需要添加容易被区分的字符即可,由于全文中没有其他 TT,所以,我就选用了 TT 来替换,当然,你也可以用 AA BB ABDE 任意你喜欢,而且文中不曾出现的字符。
然后点全部替换,这需要花一点儿时间。可能甚至会有一些卡机。所以即使能这么分析,还是尽量不要用太大的视频文件来分析。
【AVD】用 notepad++ 和 Excel 协助分析媒体文件包
OK,等 notepad 替换完成后,将如上图所示,成为了一行的文件,当然,有可能你用了自动换行,但是这不会对结果有什么影响。
接下来,我们先把被误杀的换行找回来,查找目标 [/PACKET]TT 替换为 \r\n,全部替换。
【AVD】用 notepad++ 和 Excel 协助分析媒体文件包
如此一来,我们成功地把每个包用一行来表示了。接下来,再通过把 [PACKET]TT 替换为 空,啥也不写,把前面的头去掉。然后再通过把刚刚的标记 TT 替换为 \t,把 = 替换为 t,就可以得到如下图所示的最终结果了。【AVD】用 notepad++ 和 Excel 协助分析媒体文件包
然后就 Ctrl A Ctrl C,然后打开一页 Excel Ctrl V,就可以非常明朗地查看每个包的信息了。
甚至可以画些散点图来辅助分析。
【AVD】用 notepad++ 和 Excel 协助分析媒体文件包
当然,还可以在第一行之前插入一行空行,然后把第A列清除内容,A1 写 frame_idx,A2~A4 分别写 0 1 2,然后选中,A2:A4,然后双击 A4 右下角的深色小正方形快速填充每一个包的索引,给 B D F H J … 列的首行起个名字,然后把 C E G I … 列及内容不变的列删除。会更好看,最终整理如下图所示:
【AVD】用 notepad++ 和 Excel 协助分析媒体文件包

上一篇:UDP消息发送


下一篇:解决 mysql>com.mysql.jdbc.PacketTooBigException: Packet for query is too large (12073681 > 4194304)