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个以上的线程上进行编码,或者我做错了什么?
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,确实实现了这一点.
根据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