목적

이 섹션에서는 파일 기반 인코딩 (라이브가 아님)을 실행할 때 VP9 인코딩 설정에 관한 권장사항을 제공합니다.

이러한 권장사항은 다음 목표를 위해 설계되었습니다.

  • 품질과 인코딩 속도 간의 균형
  • 적절한 품질을 달성하기 위한 최소 비트 전송률
  • 다양한 콘텐츠 유형을 수용하는 설정

이러한 추천은 다음을 충족하지 않습니다.

  • 실시간 인코딩 주소
  • 특정 콘텐츠 유형 (예: 움직임이 많은 스포츠 영상)에 맞게 최적화
  • 특정 기기 또는 네트워크 요구사항에 맞게 설정 구성

단일 해상도 인코딩

VP9는 작은 해상도부터 4K까지 다양한 프레임 크기를 지원합니다. 프레임 크기가 클수록 품질은 높아지지만 전송하는 데 더 많은 대역폭이 필요하고 디코딩하는 데 더 많은 처리 능력이 필요합니다.

단일 해상도를 만드는 경우 640x480은 다양한 웹 및 모바일 기기에 적합합니다. 다음 FFmpeg 명령줄 매개변수를 사용하면 750kbps로 단일 해상도 파일을 만들 수 있습니다.

-vf scale=640x480 -b:v 750k -quality good -speed 0 -crf 33 \
  -c:v libvpx-vp9 -c:a libopus output.webm

다중 해상도 인코딩

여러 해상도를 타겟팅하거나 전송 네트워크의 대역폭이 다양한 경우 여러 해상도를 만드는 것이 좋습니다. 그러면 플레이어가 시청자에게 전송되는 해상도를 제어할 수 있습니다.

다중 해상도 동영상 인코딩은 적응형 비트 전송률 스트리밍에서 자주 사용됩니다. 적응형 비트 전송률 스트리밍에서는 동영상 플레이어가 사용자의 대역폭에 따라 실시간으로 해상도를 전환합니다. 예를 들어 Shaka Player를 사용하면 다중 해상도 인코딩을 재생할 수 있습니다. 각 VP9 인코딩은 별도의 파일에 있고 DASH 매니페스트는 각 인코딩에 관한 정보를 제공합니다.

적응형 스트리밍 형식으로 동영상을 패키징하는 방법에 관한 자세한 내용은 Shaka Packager를 참고하세요. 이 가이드에서는 여러 해상도에서 VP9의 인코딩 설정에 중점을 둡니다.

아래의 모든 설정은 다양한 해상도의 개별 파일에 사용할 수 있으며, 이러한 설정을 결합하면 적응형 스트리밍에 적합한 포괄적인 세트를 제공할 수 있습니다. 640x480 버전에는 두 가지 버전이 있습니다. 하나는 저화질 (LQ)이고 다른 하나는 중간 화질 (MQ)입니다.

비트 전송률

주문형 시청을 위해 VP9 파일을 인코딩할 때는 제한된 품질 (CQ) 모드를 사용하는 것이 좋습니다. 이 인코딩 모드를 사용하면 타겟 평균 비트 전송률을 지정하는 동시에 동영상의 최대 품질과 최소 및 최대 비트 전송률을 모두 제어할 수 있습니다.

다음 비트 전송률은 웹 및 모바일 배포의 기준으로 제안됩니다. 이러한 제안은 소비자 웹 및 모바일 배포에 적합한 동영상 품질을 달성하면서 비트 전송률을 최소화합니다. 적절한 품질을 달성할 수 있는 '낮은' 비트 전송률 권장사항으로 생각하면 됩니다.

위의 예에서는 최소 비트 전송률을 타겟 비트 전송률의 50%로, 최대 비트 전송률을 타겟의 145% 로 설정하는 것이 좋습니다.

프레임 크기/프레임 속도 타겟 비트 전송률 (VOD, kbps) 최소 비트 전송률 (50%) 최대 비트 전송률 (145%)
320x240p @ 24,25,30 150 75 218
640x360p @ 24,25,30 276 138 400
640x480p @ 24,25,30 512 (LQ), 750 (MQ) 256 (LQ) 375 (MQ) 742 (LQ) 1088 (MQ)
1280x720p @ 24,25,30 1024 512 1485
1280x720p @ 50,60 1800 900 2610
1920x1080p @ 24,25,30 1800 900 2610
1920x1080p @ 50,60 3000 1500 4350
2560x1440p @ 24,25,30 6000 3000 8700
2560x1440p @ 50,60 9,000 4500 13050
3840x2160p @ 24,25,30 12000 6000 17400
3840x2160p @ 50,60 18000 9,000 26100

그림 2a: 권장 VOD 비트 전송률

FFmpeg에서 비트 전송률은 다음 명령어로 제어됩니다.

FFmpeg
-b:v <arg> 비트 전송률을 설정합니다 (예: 500k).
-minrate <arg>
-maxrate <arg>
최소 및 최대 비트 전송률을 설정합니다.

예를 들어 640x480 콘텐츠를 인코딩할 때 -b:v 750k -minrate 375 -maxrate 1088 명령줄을 사용할 수 있습니다.

품질

CQ 모드에서는 최대 품질 수준도 설정합니다. 파일 기반 VP9 인코딩에는 다음 품질 수준이 권장됩니다.

프레임 높이 타겟 품질 (CQ)
240 37
360 36
480 34 (LQ) 또는 33 (MQ)
720 32
1080 31
1440 24
2160 15

FFmpeg에서 품질은 -crf 명령어로 설정됩니다. 예를 들어 품질을 33으로 설정하려면 -crf 33 명령어를 사용합니다.

멀티 패스 인코딩 및 인코딩 속도

파일 기반 인코딩을 사용하면 속도를 유연하게 조정할 수 있습니다. 동일한 소재에 여러 패스를 적용하여 품질을 높이고 각 패스의 속도를 선택할 수도 있습니다.

FFmpeg에서 VP9 파일을 인코딩할 때는 -quality 매개변수를 good로 설정한 다음 -speed 매개변수를 사용하여 아래 표에 따라 첫 번째 및 두 번째 패스의 속도를 설정하는 것이 좋습니다. 이렇게 하면 인코딩 시간과 출력 품질 간의 균형을 잘 맞출 수 있습니다.

프레임 높이 속도 (첫 번째 패스) 속도 (두 번째 패스)
240 4 1
360 4 1
480 4 1
720 4 2
1080 4 2
1440 4 2
2160 4 2

예를 들어 FFmpeg의 첫 번째 패스 인코딩 문자열에는 -quality good -speed 4이 포함될 수 있습니다.

키프레임 간격

키프레임 사이에 최대 240프레임의 동영상을 허용하는 것이 좋습니다 (30fps 콘텐츠의 경우 8초). 키프레임은 자체적으로 충분한 동영상 프레임입니다. 렌더링을 위해 다른 프레임에 의존하지 않지만 다른 프레임 유형보다 큰 경향이 있습니다. 웹 및 모바일 재생의 경우 키프레임 간 간격을 충분히 두면 인코더가 품질을 극대화하기 위해 키프레임의 최적 위치를 선택할 수 있습니다.

FFmpeg에서 키프레임 간격은 프레임 수를 나타내는 -g 명령어로 제어됩니다. 240프레임의 경우 -g 240입니다.

타일링 및 스레딩 권장사항

타일링은 동영상 프레임을 여러 열로 분할하여 품질을 약간 낮추지만 인코딩 성능을 높입니다. 타일은 너비가 256픽셀 이상이어야 하므로 사용할 수 있는 타일 수에 제한이 있습니다.

타일 수와 출력 프레임의 해상도에 따라 CPU 스레드가 더 유용할 수 있습니다. 일반적으로 출력 프레임 크기가 매우 작은 경우 여러 스레드의 가치는 제한적입니다.

다음 설정은 다양한 해상도에서 타일링 및 스레딩에 권장됩니다.

프레임 크기 타일 열 수 스레드 수
320x240 1 (-tile-columns 0) 1
640x360 2 (-tile-columns 1) 2
640x480 2 (-tile-columns 1) 2
1280x720 4 (-tile-columns 2) 4
1920x1080 4 (-tile-columns 2) 4
2560x1440 8 (-tile-columns 3) 8
3840x2160 8 (-tile-columns 3) 8

FFmpeg에서 타일 수는 -tile-columns 매개변수로 제어되고 스레드 수는 -threads로 제어됩니다. 예를 들어 640x480 인코딩은 명령줄 -tile-columns 1 -threads 2를 사용합니다.

FFmpeg 명령줄

위의 권장사항을 종합하면 다음 FFmpeg 명령어를 사용하여 VP9 콘텐츠를 인코딩할 수 있습니다.

첫 번째 패스와 두 번째 패스 명령은 함께 연결됩니다. 2차 패스 명령의 -y 인수는 FFmpeg가 출력 동영상으로 1차 패스 통계 파일을 덮어쓸지 묻는 경우 '예'라고 대답합니다.

최대 1280x720 출력을 타겟팅하는 인코딩에는 1080p 소스가 사용됩니다. 더 큰 출력에는 4K 소스가 사용됩니다.

320x240 (초당 24, 25 또는 30프레임)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=320x240 -b:v 150k \
  -minrate 75k -maxrate 218k -tile-columns 0 -g 240 -threads 1 \
  -quality good -crf 37 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-320x240.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=320x240 -b:v 150k \
  -minrate 75k -maxrate 218k -tile-columns 0 -g 240 -threads 1 \
  -quality good -crf 37 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 1 -y tos-320x240.webm

640x360 (초당 24, 25 또는 30프레임)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x360 -b:v 276k \
  -minrate 138k -maxrate 400k -tile-columns 1 -g 240 -threads 2 \
  -quality good -crf 36 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-640x360.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x360 -b:v 276k \
  -minrate 138k -maxrate 400k -tile-columns 1 -g 240 -threads 2 \
  -quality good -crf 36 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 1 -y tos-640x360.webm

640x480 (낮은 품질, 초당 24, 25 또는 30프레임)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -b:v 512k \
  -minrate 256k -maxrate 742k -tile-columns 1 -g 240 -threads 2 \
  -quality good -crf 34 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-640x360-low.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -b:v 512k \
  -minrate 256k -maxrate 742k -tile-columns 1 -g 240 -threads 2 \
  -quality good -crf 34 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 1 -y tos-640x480-low.webm

640x480 (중간 품질, 초당 24, 25 또는 30프레임)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -b:v 750k \
  -minrate 375k -maxrate 1088k -tile-columns 1 -g 240 -threads 2 \
  -quality good -crf 33 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-640x360-medium.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -b:v 750k \
  -minrate 375k -maxrate 1088k -tile-columns 1 -g 240 -threads 2 \
  -quality good -crf 33 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 1 -y tos-640x480-medium.webm

1280x720 (초당 24, 25 또는 30프레임)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=1280x720 -b:v 1024k \
  -minrate 512k -maxrate 1485k -tile-columns 2 -g 240 -threads 4 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-1280x720-24-30fps.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=1280x720 -b:v 1024k \
  -minrate 512k -maxrate 1485k -tile-columns 2 -g 240 -threads 4 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -y tos-1280x720-24-30fps.webm

1280x720 (초당 50 또는 60프레임)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=1280x720 -b:v 1800k \
  -minrate 900k -maxrate 2610k -tile-columns 2 -g 240 -threads 4 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-1280x720-50-60fps.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=1280x720 -b:v 1800k \
  -minrate 900k -maxrate 2610k -tile-columns 2 -g 240 -threads 4 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2-y tos-1280x720-50-60fps.webm

1920x1080 (초당 24, 25 또는 30프레임)

ffmpeg -i tearsofsteel_4k.mov -vf scale=1920x1080 -b:v 1800k \
  -minrate 900k -maxrate 2610k -tile-columns 2 -g 240 -threads 4 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-1920x1080-24-30fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=1920x1080 -b:v 1800k \
  -minrate 900k -maxrate 2610k -tile-columns 3 -g 240 -threads 4 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -y tos-1920x1080-24-30fps.webm

1920x1080 (초당 50 또는 60프레임)

ffmpeg -i tearsofsteel_4k.mov -vf scale=1920x1080 -b:v 3000k \
  -minrate 1500k -maxrate 4350k -tile-columns 2 -g 240 -threads 4 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-1920x1080-50-60fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=1920x1080 -b:v 3000k \
  -minrate 1500k -maxrate 4350k -tile-columns 3 -g 240 -threads 4 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -y tos-1920x1080-50-60fps.webm

2560x1440 (초당 24, 25 또는 30프레임)

ffmpeg -i tearsofsteel_4k.mov -vf scale=2560x1440 -b:v 6000k \
  -minrate 3000k -maxrate 8700k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-2560x1440-24-30fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=2560x1440 -b:v 6000k \
  -minrate 3000k -maxrate 8700k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -y tos-2560x1440-24-30fps.webm

2560x1440 (초당 50 또는 60프레임)

ffmpeg -i tearsofsteel_4k.mov -vf scale=2560x1440 -b:v 9000k \
  -minrate 4500k -maxrate 13050k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-2560x1440-50-60fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=2560x1440 -b:v 9000k \
  -minrate 4500k -maxrate 13050k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -y tos-2560x1440-50-60fps.webm

3840x2160 (초당 24, 25 또는 30프레임)

ffmpeg -i tearsofsteel_4k.mov -vf scale=3840x2160 -b:v 12000k \
  -minrate 6000k -maxrate 17400k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-3840x2160-24-30fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=3840x2160 -b:v 12000k \
  -minrate 6000k -maxrate 17400k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -y tos-3840x2160-24-30fps.webm

3840x2160 (초당 50 또는 60프레임)

ffmpeg -i tearsofsteel_4k.mov -vf scale=3840x2160 -b:v 18000k \
  -minrate 9000k -maxrate 26100k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-3840x2160-50-60fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=3840x2160 -b:v 18000k \
  -minrate 9000k -maxrate 26100k -tile-columns 3 -g 240 -threads 8 \
  -quality good -speed 2 -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -y tos-3840x2160-50-60fps.webm