[我做了什么]
我正在尝试通过以下方式测量不同 ffmpeg 解码器的性能
- 在 ffmpeg.c 中计算函数
avcodec_decode_video2(..)
的调用时间并按以下方式运行 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
似乎不是很有帮助。 (不确定其他数字是什么意思)。
最佳答案
空混合器
如果您想要一种简单的基准解码方法,请使用 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
有关详细信息,请参阅人工时间
。
-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 -
关于c - 如何通过 ffmpeg 对帧的解码进行基准测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37287533/