VP9编码限制为4个线程?

kel*_*ndt 6 encoding ffmpeg libvpx handbrake vp9

我正在考虑将来使用VP9对我的BluRays进行编码,因为它是一个开源编解码器.但我无法让Handbrake或ffmpeg使用超过50%(4)的我的(8)核心.因此,编码时间比使用所有内核的x264/5差得多.

在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

Ron*_*tje 16

Libvpx使用tile线程,这意味着你最多可以拥有与tile数量一样多的线程.该-tile-columns选项采用log2格式(因此-tile-columns 6意味着64个图块),但也受到框架大小的限制.确切的细节在这里,它基本上意味着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
Run Code Online (Sandbox Code Playgroud)

因此,即使对于1080p(1920水平像素),您最多只能获得4个图块,因此最多4个线程,即比特流限制.要获得8个图块,您至少需要1985像素的宽度(2048-64 + 1,这使得sb_cols = 32).获得比最大值更多的线程.在给定分辨率下,您需要帧级多线程,这是libvpx未实现的.其他编码器,如x265/x264,确实实现了这一点.

  • 显然,从ffmpeg 3.3 / libvpx 1.6.2开始,现在支持`-row-mt = 1`选项,该选项可提供更好的编码并行化,并为1080p内容提供4个以上的线程。Threadripper的家伙疯了!-https://groups.google.com/a/webmproject.org/forum/#!topic/codec-devel/oiHjgEdii2U (2认同)

Suh*_*ayb 9

根据webmproject.org,libvpx VP9 编码器从 1.7.0 标签开始支持单列图块内的多线程。

您所要做的就是设置-row-mt 1

IE ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 1000K -threads 8 -speed 4 -row-mt 1 -f webm /tmp/test