2016-12-29 1 views
1

오픈 소스 코덱이므로 앞으로 내 BluRays를 인코딩하는 데 VP9를 사용하려고합니다. 하지만 핸드 브레이크를 얻을 수 없거나 ffmpeg에서 내 코어 (8 개) 중 50 % (4 개)를 사용합니다. 따라서 인코딩 시간은 모든 코어를 사용하는 x264/5보다 훨씬 나쁩니다.VP9 인코딩은 4 개의 스레드로 제한됩니까?

Handbrake에서는 인코더를 VP9 및 CQ19로 설정했습니다. 매개 변수 필드에 "threads 8", "threads 16"또는 "threads 64"를 추가해도 차이는 없습니다.

명령 줄 ("-c : v libvpx-vp9 -crf 19- 스레드 16 - 타일 - 열 6 - 프레임 - 병렬 1 - 속도 0")에서 ffmpeg를 테스트해도 더 이상 cpu 스레드를 사용하지 않습니다.

현재 엔코더가 4 개 이상의 스레드에서 인코딩 할 수 없나요? 아니면 제가 잘못하고 있습니까?

  • 리눅스 민트 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를 제공)이 필요합니다. max보다 많은 쓰레드를 얻으려면. 주어진 해상도에서 타일의 수를 늘리려면 libvpx가 구현하지 않는 프레임 레벨 멀티 쓰레딩이 필요합니다. x265/x264와 같은 다른 인코더가 이것을 구현합니다.

+0

설명 주셔서 감사합니다. 합리적인 성능으로 인코딩 된 VP9를 얻는 다른 방법을 알고 계십니까? – kellerkindt

+1

가장 좋은 방법은'-speed' 매개 변수에 더 높은 값을 사용하는 것입니다. 그게 충분하지 않거나 품질이 의도 한 유스 케이스에 너무 많이 고생한다면, 나는 운이 좋지 않을까 걱정된다. –

+0

ffmpeg 3.3/libvpx 1.6.2 이후 명백하게'-row-mt = 1 '옵션을 사용하면 더 나은 인코딩 병렬 처리를 제공하고 1080p 내용의 경우 4 개 이상의 스레드를 사용할 수 있습니다. 끈적 끈적한 녀석들은 열매 맺는다! - https://groups.google.com/a/webmproject.org/forum/#!topic/codec-devel/oiHjgEdii2U – Programster