목적

이 섹션에서는 파일 기반 인코딩 (즉, 실시간 아님)을 실행할 때 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
24,25,30에서 640x360p 276 138 400
24,25,30에서 640x480p 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 3,000 1,500 4350
2560x1440p @ 24,25,30 6000 3,000 8700
2560x1440p @ 50,60 9000 4500 13050
3840x2160p @ 24,25,30 12000 6000 17400
3840x2160p @ 50,60 18000 9000 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) 2
640x360 2(-tile-columns 1) 4
640x480 2 (-tile-columns 1) 4
1280x720 4 (-tile-columns 2) 8
1920x1080 4 (-tile-columns 2) 8
2560x1440 8 (-tile-columns 3) 16
3840x2160 8 (-tile-columns 3) 16

FFmpeg에서 타일 수는 -tile-columns 매개변수와 -threads로 스레드 수를 조절합니다. 예를 들어 640x480 인코딩은 명령줄 -tile-columns 2 -threads 4을 사용합니다.

FFmpeg 명령줄

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

첫 번째 패스와 두 번째 패스 명령은 함께 체인됩니다. FFmpeg가 첫 번째 패스 통계 파일을 출력 동영상으로 덮어쓸 것을 요구하는 경우 두 번째 패스 명령어에서 -y 인수는 quot;Yes&quot에 답변합니다.

또한 최대 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 2 \
  -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 2 \
  -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 4 \
  -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 4 \
  -quality good -crf 36 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-640x360.webm

640x480 (저화질, 24, 25 또는 30fps

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

640x480 (중간 품질, 24, 25 또는 30fps

ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -b:v 750k \
  -minrate 375k -maxrate 1088k -tile-columns 1 -g 240 -threads 4 \
  -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 4 \
  -quality good -crf 33 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -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 8 \
  -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 8 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -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 8 \
  -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 8 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4-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 8 \
  -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 8 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -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 8 \
  -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 8 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -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 16 \
  -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 16 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -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 16 \
  -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 16 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -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 24 \
  -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 24 \
  -quality good -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -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 24 \
  -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 24 \
  -quality good -speed 4 -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -y tos-3840x2160-50-60fps.webm