如何通过ffmpeg对帧的解码进行基准测试?

时间:2016-05-17 22:58:23

标签: c video ffmpeg benchmarking

[我做了什么]

我试图通过

测量不同ffmpeg解码器的性能
  • 计算函数avcodec_decode_video2(..)调用ffmpeg.c并以下列方式运行ffmpeg二进制文件的时间

~/bin/ffmpeg -benchmark_all -loglevel debug -threads 0 -i ~/Documents/video-input.h264 -c:v libx265 -x265-params crf=25 video-output.hevc

  • 并计算ffplay.c中相同函数的使用时间以及以下方式运行ffplay二进制文件

~/bin/ffplay ~/Documents/video-input.h264

根据我的理解,无论是转换视频还是播放视频,调用该函数的平均时间都应相同,因为我只测量解码该视频帧所需的时间。这是错误的做法吗?如果我不对,请告诉我。我得到的结果对我来说很奇怪 - 与ffplay二进制相比,对ffmpeg二进制文件的调用需要两倍的上述函数。我试图用-threads 0运行ffmpeg二进制文件而没有它,但结果仍然相同(是ffplay的两倍)。可能是因为ffplay二进制文件只是使用更多的线程?当我使用-threads 1进行尝试时,ffmpeg大约需要ffplay的10倍(这对我来说是有道理的,因为它在使用多个线程之前现在它只使用了1个)

在我提出问题之前,我想让您知道我是视频处理和视频编码/解码过程的初学者。

[我的问题]

我想知道用什么方法来衡量解码帧所需的时间(使用1个线程)?我应该只测量使用ffmpeg二进制文件而不是ffplay二进制文件调用avcodec_decode_video2(..)函数所需的时间吗?结果会更准确吗? 我还尝试启用-benchmark_all -loglevel debug选项,但如果0.0应该表示时间,则似乎以下消息bench: 64537 decode_video 0.0不是很有帮助。 (不确定其他数字的含义)。

1 个答案:

答案 0 :(得分:12)

Null muxer

如果您想要一种简单的基准解码方法,请使用null muxer

ffmpeg -i input -f null -

定时解码

Linux和macOS用户可以添加time命令:

$ time ffmpeg -i input -f null -
[...]
real    0m5.343s
user    0m20.290s
sys     0m0.230s

有关详细信息,请参阅man time

-benchmark选项

可以将-benchmark选项添加到输出CPU时间和最大内存消耗中:

$ time ffmpeg -i input -benchmark -f null -
[...]
bench: utime=7.314s
bench: maxrss=72280kB

选择流

如果您只想解码特定的流,请使用map option

ffmpeg -i input -map 0:a:0 -f null -

线程

如果您愿意,可以使用一个线程进行解码:

ffmpeg -threads 1 -i input -f null -

并非所有解码器都具有线程功能,而且有些解码器有几个。您可以检查解码器详细信息,例如ffmpeg -h decoder=h264

选择解码器

可以为格式提供多种解码器。如果您不想依赖默认值,可以命名解码器:

ffmpeg -c:v vp8 -i input -f null -
ffmpeg -c:v libvpx -i input -f null -