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
- 출력 파일: 2pass_HDR_strobe_scientist_6Mbps-static.webm
- 인코딩 시간: 142분 30초
- 디스크의 파일 크기: 51.2MB
예 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
- 출력 파일: 2pass_HDR_strobe_scientist_18Mbps-static.webm
- 인코딩 시간: 213분 32초
- 디스크의 파일 크기: 161MB
예 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
- 출력 파일: 1080_2pass_HDR_strobe_scientist_18Mbps-static.webm
- 인코딩 시간: 113분 9초
- 디스크의 파일 크기: 160MB
조회표 (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
- 출력 파일: SDR_strobe_scientist_18Mbps-static.webm
- 인코딩 시간: 124분 23초
- 디스크의 파일 크기: 165MB
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
- 출력 파일: HLG_HDR_strobe_scientist_18Mbps-static.webm
- 인코딩 시간: 186분 10초
- 디스크의 파일 크기: 165MB
요약
출력 파일의 크기가 다양합니다. 입력은 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 파일을 생성합니다.