[我做了什么]
我试图通过
测量不同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
~/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
不是很有帮助。 (不确定其他数字的含义)。
答案 0 :(得分:12)
如果您想要一种简单的基准解码方法,请使用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 -