我正在考虑将来使用VP9对我的BluRays进行编码,因为它是一个开源编解码器。但我无法让Handbrake或ffmpeg使用超过50%(4)的我的(8)内核。因此编码时间比使用所有核心的x264 / 5差得多。
In Handbrake我只是将编码器设置为VP9和CQ19。如果我在参数字段中添加“threads 8”,“threads 16”或“threads 64”,则没有区别。
在命令行中测试ffmpeg(“-c:v libvpx-vp9 -crf 19 -threads 16 -tile-columns 6 -frame-parallel 1 -speed 0”)也不再使用任何cpu线程。
当前编码器是否能够在超过4个线程上进行编码,或者我做错了什么?
答案 0 :(得分:12)
Libvpx使用平铺线程,这意味着您最多可以拥有与平铺数量一样多的线程。 -tile-columns
选项采用log2格式(因此-tile-columns 6
表示64个图块),但也受到框架大小的限制。确切的详细信息为here,它基本上代表max_tiles = max(1, exp2(floor(log2(sb_cols)) - 2))
,其中sb_cols = ceil(width / 64.0)
。您可以编写一个小脚本来计算给定水平分辨率的图块数量:
Width: 320 (sb_cols: 5), min tiles: 1, max tiles: 1
Width: 640 (sb_cols: 10), min tiles: 1, max tiles: 2
Width: 1280 (sb_cols: 20), min tiles: 1, max tiles: 4
Width: 1920 (sb_cols: 30), min tiles: 1, max tiles: 4
Width: 3840 (sb_cols: 60), min tiles: 1, max tiles: 8
因此,即使对于1080p(1920水平像素),最多只能获得4个图块,因此最多4个线程,即比特流限制。要获得8个图块,您至少需要1985像素的宽度(2048-64 + 1,这使得sb_cols = 32)。获得比最大值更多的线程。在给定分辨率下,你需要帧级多线程,这是libvpx没有实现的。其他编码器,如x265 / x264,确实实现了这一点。
答案 1 :(得分:1)
根据webmproject.org libvpx VP9编码器从1.7.0版本开始支持在单列磁贴内进行多线程处理。
您要做的就是设置-row-mt 1
即ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 1000K -threads 8 -speed 4 -row-mt 1 -an -f webm /tmp/test