VP9编码限制为4个线程?

时间:2016-12-29 01:34:31

标签: encoding ffmpeg libvpx handbrake vp9

我正在考虑将来使用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个线程上进行编码,或者我做错了什么?

  • Linux Mint 18
  • 手刹0.10.2 + ds1-2build1
  • ffmpeg 2.8.10-0ubuntu0.16.04.1
  • libvpx3 1.5.0-2ubuntu1

2 个答案:

答案 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