이 내용을 여기 올려야 하나 잠시 고민했습니다만, 그래도 샤나와 연관이 있는 것이어서 올립니다.
프리셋 자료실에 올라온 HDR->SDR 변환 프리셋은 샤나의 한계 때문에 tonemap과 zscale 필터를 이용하지 못한 반쪽자리입니다. 원본의 색 정보를 제대로 살리지 못해 인코딩 결과물이 형편없죠.
HDR의 기본 색공간인 BT.2020은 SDR HDTV의 기본 색공간 BT.709(=sRGB)을 포함하는 데다 BT.709가 표현하지 못하는 많은 색상을 더 표현할 수 있기 때문에 HDR을 SDR로 변환할 때는 바로 그 BT.709의 범위 밖(out-of-range) 색상들을 어떻게 처리하냐가 최대 관건입니다.
이에 대해 가장 무난한 해법은 바로 tonemap 필터를 이용해 범위 밖 색상들을 범위 안으로 적절하게 mapping하는 것이고, zscale 필터는 tonemap 필터의 결과물을 사용가능한 형식으로 변환하는 동시에 자체적으로 색공간 변환을 수행하기 때문에 필요한 것입니다.
자세한 사항은 아래 문서를 참고하시면 됩니다.
https://stevens.li/guides/video/converting-hdr-to-sdr-with-ffmpeg/
위의 권고안을 바탕으로 다음의 FFmpeg 명령어를 구성해서 DOS 환경에서 실행했습니다.
ffmpeg.exe -analyzeduration 100M -probesize 50M -i LG_New_York_HDR_UHD_4K_Demo.OriginalHDR.ts -vf zscale=t=linear:npl=100,format=gbrpf32le,zscale=p=bt709,tonemap=tonemap=hable:desat=0,zscale=1920:-1:f=spline36:t=bt709:m=bt709,format=yuv420p -c:v libx264 -profile:v high -crf 18.0 -preset veryslow -x264opts deblock=1,1:cabac:keyint=150:min-keyint=15:bframes=3:b-adapt=2:weightb:weightp=2:ref=4:scenecut=50:ipratio=1.4:pbratio=1.3:qcomp=0.50:rc-lookahead=30:mbtree:aq-mode=2:aq-strength=0.8:chroma-me:merange=24:me=umh:subme=10:direct=auto:trellis=2:psy-rd=0.30,0:psy:no-dct-decimate:no-fast-pskip:mixed-refs:partitions=all -pix_fmt yuv420p -color_primaries bt709 -color_trc bt709 -colorspace bt709 -c:a aac -b:a 128k -ac 2 -map_metadata -1 -metadata creation_time=now -metadata:s:v:0 language=kor -metadata:s:a:0 language=kor -y LG_New_York_HDR_UHD_4K_Demo.TranscodedSDR.tonemapped.1080p.mp4
LG_New_York_HDR_UHD_4K_Demo.OriginalHDR.ts가 input file이고 LG_New_York_HDR_UHD_4K_Demo.TranscodedSDR.tonemapped.1080p.mp4가 output file입니다.
대강 설명하자면,
-analyzeduration 100M -probesize 50M
// 전역 헤더가 없는 ts 파일에서 스트림 정보를 파악하기 위해 미리 앞부분을 읽도록 하는 옵션
-vf zscale=t=linear:npl=100,format=gbrpf32le,zscale=p=bt709,tonemap=tonemap=hable:desat=0,zscale=1920:-1:f=spline36:t=bt709:m=bt709,format=yuv420p
// 색공간 변환과 감마 변환(transfer characteristics), 해상도 변환을 수행하는 옵션 설정
-c:v libx264 -profile:v high -crf 18.0 -preset veryslow -x264opts deblock=1,1:cabac:keyint=150:min-keyint=15:bframes=3:b-adapt=2:weightb:weightp=2:ref=4:scenecut=50:ipratio=1.4:pbratio=1.3:qcomp=0.50:rc-lookahead=30:mbtree:aq-mode=2:aq-strength=0.8:chroma-me:merange=24:me=umh:subme=10:direct=auto:trellis=2:psy-rd=0.30,0:psy:no-dct-decimate:no-fast-pskip:mixed-refs:partitions=all
// 비디오 코덱(x264) 관련 설정
-pix_fmt yuv420p -color_primaries bt709 -color_trc bt709 -colorspace bt709
// 픽셀 형식 및 색공간 관련 정보 -> 전역 metadata로 기록됨
-c:a aac -b:a 128k -ac 2
// 실행되는 FFmpeg 바이너리 파일이 libfdk-aac를 포함시키지 않고 컴파일되어
// libfdk_aac 인코더가 없기 때문에 aac 인코더로 대체
나머지 부분은 metadata 관련이므로 설명을 생략하겠습니다.
이 명령어를 실행한 결과로 나온 동영상의 MediaInfo는 아래와 같습니다.
<MediaInfo>
Metadata에서 보듯이 인코딩 결과 BT.709를 색공간으로 하고 YUV420p의 bit depth 8비트를 가진 SDR 동영상으로 변환되었음을 알 수 있습니다.
변환된 동영상이 원본인 HDR 영상과 색감에서 얼마나 차이를 보이는지 보기 위해 스크린샷 비교를 하면 다음과 같습니다.
<HDR 동영상의 스크린샷>
<SDR 동영상의 스크린샷>
비록 푸른색과 초록색, 특히 푸른색 계열 색들이 좀 flatten됐지만 사실상 둘 간의 색감 차이가 거의 없는 것을 확인할 수 있습니다.
이는 샤나에서 scale 필터만을 이용해 SDR 인코딩한 다음 영상의 스크린샷과 비교해 보면 더욱 확연하게 드러납니다.
<샤나로 인코딩한 SDR 동영상의 스크린샷>
따라서 HDR -> SDR 변환에 tonemap, zscale 필터가 절대적인 역할을 함을 알 수 있습니다.
원본과 FFmpeg로 인코딩한 동영상 파일은 아래 링크에서 다운받으실 수 있습니다.
<원본 HDR 동영상>
https://drive.google.com/open?id=14W5lqskWkn6aFUmSLrZRljPd4VuVbQlS (448MB)
<인코딩한 SDR 동영상>
https://drive.google.com/open?id=1t0K7Yq4KOdouopWDwxyELvFpIvVPuwud (124MB)
샤나인코더가 FFmpeg을 빨리 업그레이드하길 바라며 이상 마칩니다.
샤나인코더 5.0부터 shanatonemap 이라는 커스텀 필터를 추가하여 톤매핑을 적용한 HDR ⇒ SDR 인코딩이 가능해졌습니다.
자세한 사항은 HDR -> SDR 변환 (H264(x264), FHD, 톤매핑) (4.9.0.6 이상만 해당) 프리셋 게시물을 참고하시기 바랍니다.
장마진다니 더위좀 가시면 좋을텐데
야구는 취소되고 ㅠㅠ