VP9 HDR 인코딩

HDR (High Dynamic Range) 동영상은 성숙한 기술입니다. 오늘날에는 점진적으로 조화되는 표준이 많이 있습니다.

HDR 동영상 발전의 유지된 그림은 Wikipedia 문서 High-dynamic-range video를 참고하세요.

FFmpeg는 VP9와 함께 사용하여 (1) HDR 소스를 표준 다이내믹 레인지 (SDR) 출력으로 압축하거나 (2) HDR 소스를 HDR 웹 친화적 형식으로 다시 패키징할 수 있습니다.

입력 소스

현재 VP9로 HDR을 인코딩할 때 FFmpeg에서 지원하는 모든 높은 비트 심도 (10비트) 코덱을 입력으로 사용할 수 있습니다 (예: VP9 프로필 2 및 3, H.264 (10비트), DNxHR, HEVC, ProRes 등). YouTube 지원 도움말 HDR (High Dynamic Range) 동영상 업로드도 참고하세요.

인코딩된 출력 도달범위:

현재 일반적으로 지원되는 타겟 기기에는 VP9 프로필 2를 디코딩하고 HDR 디스플레이로 출력할 수 있는 기기가 포함됩니다.

  • Chromecast Ultra + HDR 지원 TV
  • HDR 플래그가 사용 설정된 Windows 10 Fall Creators Update에서 실행되는 Chrome 64 Canary (이 도구는 디버깅에 유용합니다.)
  • VP9 프로필 2가 적용된 HDR TV는
    • 모든 삼성 2017 HDR 모델(flatpanelshd.com 목록) 및 'KS'로 시작하는 2016 모델
    • 모든 LG 2017 HDR 모델 (일부 2016 LG G6 모델도 포함)
    • 모바일에서 하드웨어 가속 VP9 프로필 2 10비트 HDR 디코드를 지원하는 기기(Meizu Pro 7)
    • 2017년 UHD 블루레이

VP9 프로필 2 및 HDR EOTF를 사용 설정하는 FFmpeg 명령줄 설정

FFmpeg는 10비트 (또는 12비트) 지원으로 빌드되어야 합니다.

아래 예에서는 10비트 지원을 사용하여 정적으로 빌드된 ffmpeg를 사용합니다. Google의 빌드 스크립트를 사용하여 직접 만들거나 FFmpeg 사이트의 안내를 따르세요.

다음은 VP9를 사용하여 SMPTE 2084 (PQ EOTF) 표준으로 HDR 인코딩하는 데 사용할 수 있는 FFmpeg 명령줄입니다.

ffmpeg -i strobe_scientist_18Mbps.webm -b:v 18000000 -pass 1 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate 26800000 -minrate 8040000 -profile:v 2 -vcodec libvpx-vp9 /dev/null && \
   ffmpeg -i strobe_scientist_18Mbps.webm -b:v 18000000 -pass 2 \
   -pix_fmt yuv420p10le \
   -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
   -maxrate 26800000 -minrate 8040000 -profile:v 2 -vcodec libvpx-vp9 \
   strobe_scientist_18Mbps.webm

여기에서 소개된 주요 매개변수는 다음과 같습니다.

ffmpeg 10비트 지원이 포함된 정적 빌드
-pass 1 HDR에는 2패스 인코딩이 필요합니다. 이 예에서는 첫 번째 패스가 /dev/null에 출력되고 두 번째 패스 중에 메모리에서 처리됩니다.
-pix_fmt yuv420p10le YUV 4:2:0 10비트 픽셀 형식을 설정합니다.
-color_primaries 9 BT2020를 설정합니다. 자세한 내용은 이 문서의 5페이지와 6페이지를 참고하세요.
-color_trc 16 16는 전송 특성을 SMPTE 2084로 설정합니다. PQ 18는 변환 특성 SMPTE 2086 HLG를 설정합니다.
-colorspace 9 colorspace은 'matrix_coefficients'입니다. 콘텐츠가 마스터링된 방식과 일치하도록 설정해야 합니다. (예: bt709, bt2020_ncl) 이 예시에서는 bt2020_ncl의 경우 9여야 합니다. 자세한 내용은 이 문서의 12페이지를 참고하세요.
-color_range 1 색상 범위 (0 = 지정되지 않음, 1 = mpeg/studio/tv, 2 = jpeg/full/pc)
-profile:v 2 HDR의 경우 프로필 또는 2 또는 3이 필요합니다.
-vcodec libvpx-vp9 VP9 인코더를 사용합니다.

인코딩 예

다음 예시에서는 모두 소스 파일 strobe_scientist.mkv를 사용합니다.

HDR 인코딩의 비트 전송률에 관한 일반적인 참고사항으로, 이에 상응하는 8비트 SDR 인코딩보다 25~30% 높은 비트 전송률을 사용하는 것이 좋습니다. 이 예에서는 일반적으로 18Mbps를 타겟팅합니다. 최적의 튜닝을 통해 12Mbps 비트 전송률로 우수한 HDR 결과를 얻을 수 있습니다.

인코딩은 다음 사양의 Ubuntu Linux 시스템에서 실행되었습니다.

  • 프로세서: 4x Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz
  • 메모리 (RAM): 8060MB (1492MB 사용됨)
  • 그래픽: Intel HD Graphics 530 (Skylake GT2)
  • OS: Ubuntu 16.04 LTS

YUV 4:2:0 10비트 PQ로 변환

예 A: 6Mbps 4k 2패스
ffmpeg -y -report -i strobe_scientist.mkv -b:v 6000000 -speed 4 -pass 1 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate 8000000 -minrate 4000000 \
  -profile:v 2 -vcodec libvpx-vp9 -f webm /dev/null && \
  ffmpeg -y -report -i strobe_scientist.mkv -b:v 6000000 -pass 2 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate 8000000 -minrate 4000000 \
  -profile:v 2 -vcodec libvpx-vp9 \
  2pass_HDR_strobe_scientist_6Mbps-static.webm
예 B1: 18Mbps 4k 2패스
ffmpeg -y -report -i strobe_scientist.mkv -b:v **18000000** -speed 4 -pass 1 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate **20800000** -minrate **15040000** \
  -profile:v 2 -vcodec libvpx-vp9 -f webm /dev/null && \
  ffmpeg -y -report -i strobe_scientist.mkv -b:v 18000000 -pass 2 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate **20800000** -minrate **15040000** \
  -profile:v 2 -vcodec libvpx-vp9 \
  2pass_HDR_strobe_scientist_18Mbps-static.webm
예 B2: 18Mbps 1080p 2패스
ffmpeg -y -report -i strobe_scientist.mkv -b:v 18000000 -speed 4 -pass 1 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate 20800000 -minrate 15040000 \
  -profile:v 2 **-vf ****scale=-1:1080**** **-vcodec libvpx-vp9 \
  -f webm /dev/null && \
  ffmpeg -y -report -i strobe_scientist.mkv -b:v 18000000 -pass 2 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate 20800000 -minrate 15040000 \
  -profile:v 2 **-vf ****scale=-1:1080**** **-vcodec libvpx-vp9 \
  1080_2pass_HDR_strobe_scientist_18Mbps-static.webm

조회표 (LUT)를 사용하여 HDR을 SDR로 변환

HDR을 SDR로 변환하려면 트랜스코더가 밝기 수준과 색상을 더 작은 BT.709 색상 공간과 비HDR 밝기 범위에 매핑하는 방법을 이해해야 합니다. 최상의 결과를 얻으려면 매핑을 실행하는 방법을 설명하는 LUT(일반적으로 콘텐츠에 따라 다름)를 사용할 수 있습니다. 예 C와 D는 LUT를 사용하는 방법을 보여줍니다. bt2020_to_bt709_example.cube를 사용했습니다.

예시 C: LUT를 사용한 18Mbps 4k HDR에서 SDR로
ffmpeg -i strobe_scientist.mkv -y -b:v 18000000 -speed 4 -pass 1 \
  -pix_fmt yuv420p \
  -color_primaries 1 -color_trc 1 -colorspace 1 -color_range 1 \
  -maxrate 26800000 -minrate 8040000 -profile:v 0 \
  -vf scale=-1:-1:in_color_matrix=bt2020,format=rgb48,lut3d=bt2020_to_bt709_example.cube,scale=-1:-1:out_color_matrix=bt709 \
  -vcodec libvpx-vp9 -f webm /dev/null && \
  ffmpeg -i strobe_scientist.mkv -y -b:v 18000000 -pass 2 \
  -pix_fmt yuv420p \
  -color_primaries 1 -color_trc 1 -colorspace 1 -color_range 1 \
  -maxrate 26800000 -minrate 8040000 -profile:v 0 \
  -vf scale=-1:-1:in_color_matrix=bt2020,format=rgb48,lut3d=bt2020_to_bt709_example.cube,scale=-1:-1:out_color_matrix=bt709 \
  -vcodec libvpx-vp9 -f webm SDR_strobe_scientist_18Mbps-static.webm

HLG를 VP9 HLG10 10비트 PQ로 변환

HLG 소스가 필요합니다. strobe_scientist_hlg.mkv 입력 파일을 사용했습니다.

예 D: 18Mbps 4k 2-Pass HLG
ffmpeg -y -i strobe_scientist_hlg.mkv -b:v 18000000 -pass 1 -speed 4 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 18 -colorspace 9 -color_range 1 \
  -maxrate 26800000 -minrate 8040000 \
  -profile:v 2 -vcodec libvpx-vp9 -f webm /dev/null && \
  ffmpeg -y -i strobe_scientist_hlg.mkv -b:v 18000000 -pass 2 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 18 -colorspace 9 -color_range 1 \
  -maxrate 26800000 -minrate 8040000 \
  -profile:v 2 -vcodec libvpx-vp9 \
  HLG_HDR_strobe_scientist_18Mbps-static.webm

요약

출력 파일의 크기가 다양합니다. 입력은 4.3GB였습니다.

타겟 출력 디스크에서 차지하는 용량 인코딩 시간
A 6Mbps 4k 스케일링되지 않은 HDR 51.2MB 142m
B1 18Mbps 4k 스케일링되지 않은 HDR 161MB 213m
B2 18Mbps 1080 스케일링 HDR 160MB 113분
C 18Mbps HDR에서 SDR로, 스케일링되지 않음 165MB 124m
D 18Mbps HLG 변환 165MB 168m

1패스는 특정 구성에서 달라질 수 있으므로 HDR에는 2패스 인코딩이 권장됩니다.

WebM 및 MP4 출력에서 HDR을 알리는 데 필요한 도구 (Matroska 명령줄 도구)

작성 시점에는 FFmpeg가 WebM/MKV에서 SMPTE 2086 정적 메타데이터를 지정하는 메커니즘을 제공하지 않지만 스트림에 포함된 경우 입력 스트림에서 전파합니다.

mkvtoolnix의 일부인 mkvmerge 도구를 사용하여 애플리케이션에 필요한 경우 이 메타데이터를 삽입하거나 수정할 수 있습니다.

다음은 위에서 생성된 파일 중 하나에 HDR 메타데이터를 삽입하는 예입니다. 특히 YouTube에 업로드할 HDR 콘텐츠를 준비하는 데 적합합니다.

mkvmerge \
  -o HDR_strobe_scientist_18Mbps.mkv\
  --colour-matrix 0:9 \
  --colour-range 0:1 \
  --colour-transfer-characteristics 0:16 \
  --colour-primaries 0:9 \
  --max-content-light 0:1000 \
  --max-frame-light 0:300 \
  --max-luminance 0:1000 \
  --min-luminance 0:0.01 \
  --chromaticity-coordinates 0:0.68,0.32,0.265,0.690,0.15,0.06 \
  --white-colour-coordinates 0:0.3127,0.3290 \
  HDR_strobe_scientist_18Mbps.webm

이 예시에서는 0.6초 만에 HDR_strobe_scientist_18Mbps.mkv 파일을 생성합니다.