FFmpeg Fate(FFmpeg automated test environment)自动化测试

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FFmpeg Fate(FFmpeg automated test environment)自动化测试相关的知识,希望对你有一定的参考价值。

参考技术A

官网对FATE的介绍
FATE(FFmpeg Automated Testing Environment): ffmpeg回归测试的套件以及提供了一种在服务器上对测试结果进行聚合和展示的方式。
包含3部分内容:

FFmpeg公开服务器的测试结果: http://fate.ffmpeg.org/

执行下面的命令

会打印下面这些信息:

在FATE中有很多测试,有些测试是自包含的,有些测试还需要额外的资料,在FFmpeg中称之为SAMPLES,可以用下面的方法获取SAMPLES。

执行完整的Fate测试

执行指定的一些Fate测试case,例如

fate-filter-scale500的测试用例的定义

为了看fate-run.sh中每条指令的执行过程,我们用bash -x来跑这个脚本,如下所示。

根据上述命令行输出,最终会找到下面的关键脚本:

还是从上述命令行输出可以看到,eval这行脚本展开后为:

用eval启用的命令,被shell直接当做一条命令处理,无法看到内部的展开情况。作为一个快速方法,我们直接修改脚本中的eval行如下所示。

上述命令行输出很长,大部分篇幅是用来设置最终的ffmpeg的命令行参数,最后得到的命令行参数如上所示(两行省略号之间的那一行)。回顾一下,其实,我们前面在执行 make V=2 fate-filter-scale500 看到的最后一行输出,和这里看到的是相同的。而倒数第二行的e7d6...这一串字符则是ffmpeg的输出结果。我们也可以直接在命令行执行ffmpeg程序,得到相同的结果。

上述ffmpeg命令行参数的最后是-f nut md5:,表示将结果做md5的输出,输出一个字符串。会与/tests/ref/fate中的值进行对比。

在filter-video.mak 中,变量CMD

测试结果判断

回到fate-run.sh,再看一下eval行。

不管是md5输出、crc输出还是rawvideo输出,都会被重定向到outfile文件内容和参考文件内容比较,得出测试是pass还是fail的结论。一般来说,参考文件被保存在目录ffmpeg/tests/ref/fate/下。而对于rawvideo输出,情况略有不同。

有了crc和md5后,为什么还要rawvideo?有些处理过程中涉及到了float运算,或者frame的格式就是float相关的,那么,由于不同架构CPU的输出结果在浮点数操作上会略有不同,而FFmpeg是跨平台支持诸如X86、ARM、PowerPC等多种CPU的,我们就无法用crc或者md5这种bit-exact的方法进行比较了,只能采用基于rawvideo的方式进行比较,并且允许存在一定的偏差。在FATE中,可以用oneoff的方法进行rawvideo的比较,在filter-video.mak文件中差不多可以这样写:

在fate-run.sh中,oneoff最终会调用tiny_psnr,如下所示。大致意思就是根据filter-video.mak文件中的参数设置,对当前测试得到的rawvideo文件和参考文件做个比较,判断两者是否相同。

理解FFmpeg Fate脚本需要一些基础:

以上是关于FFmpeg Fate(FFmpeg automated test environment)自动化测试的主要内容,如果未能解决你的问题,请参考以下文章

Laravel FFmpeg 错误调用未定义的方法 FFMpeg\FFMpeg::fromDisk()

Android FFMPEG 开发Android 中执行 FFMPEG 指令 ( mobile-ffmpeg 开源项目介绍 | 集成 mobile-ffmpeg 框架 )

FFmpeg使用 FFmpeg 处理音视频格式转换流程 ( 解复用 | 解码 | 帧处理 | 编码 | 复用 )

ios下 怎么在代码中调用ffmpeg的命令

C语言下,ffmpeg怎么用?

FFmpeg工具