2016-12-29 103 views
1

我正考慮在將來使用VP9編碼我的BluRays,因爲它是一個開源的編解碼器。但我無法獲得Handbrake或ffmpeg超過我的(8)核心的50%(4)。因此編碼時間比使用所有內核的x264/5差得多。VP9編碼限於4線程?

在Handbrake我只是將編碼器設置爲VP9和CQ19。如果在參數字段中添加「線程8」,「線程16」或「線程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

回答

6

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,確實可以實現這一點。

+0

感謝您的解釋,你知道任何其他方法來獲得合理的性能VP9編碼? – kellerkindt

+1

最好的辦法是對'-speed'參數使用較高的值。如果這還不夠,或者您的預期用例質量太差,恐怕您的運氣不好...... –

+0

顯然,自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 – Programster