VP9 HDR 인코딩

HDR (High Dynamic Range) 동영상은 성숙한 기술입니다. 오늘날에는 서서히 조화를 이루는 표준이 많이 있습니다.

HDR 동영상 진화를 유지관리하는 그림은 WikiPedia 도움말 고명암비 범위 동영상을 참고하세요.

FFmpeg는 VP9과 함께 사용하여 (1) HDR 소스를 Standard Dynamic Range (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 목록) 및 2016년 모델("KS"
    • 모든 LG 2017 HDR 모델 (일부 2016년형 LG G6 모델)
    • 휴대기기에서 하드웨어 가속 VP9 프로필 2 10비트 HDR 디코딩을 지원하는 기기(Meizu Pro 7)
    • 2017년부터의 UHD 블루레이

VP9 프로필 명령줄 설정 및 VP9 Profile 2 및 HDR EOTF 사용 설정

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_coefficiencys." 콘텐츠의 마스터링 방식과 일관성이 있어야 합니다. (예: 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를 사용한 SDR에서 18Mbps 4k HDR
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 소스가 필요합니다. Google에서는 입력 파일 strobe_scientist_hlg.mkv를 사용했습니다.

예 D: 18Mbps 4k 2패스 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 142분
B1 18Mbps 4K 확장되지 않은 HDR 161MB 213m
B2 18Mbps 1080 배율 HDR 160MB 113분
C 18Mbps HDR에서 SDR로 확장되지 않음 165MB 124분
D 18Mbps HLG 변환 165MB 168분

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

WebM 및 MP4 출력으로 HDR에 신호를 보내는 데 필요한 도구 (Matroska 명령줄 도구)

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

애플리케이션에 필요한 경우 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 파일을 생성합니다.