안녕하세요. 저는 인코딩 디코딩에 대한 지식이 전무한 사람입니다.
어쩌다가 PLEX라는 것을 알게 되었고, PLEX의 라이브러리를 구성하고...
트랜스코딩과 다이렉트 플레이라는 것을 알게 되었습니다.
재생해본 결과 다이렉트 플레이가 훨씬 원활하고, 원본 화질 그대로 즐길 수 있다는 이점이 있어서 다이렉트 플레이를 고집하고 있습니다.
그런데 자막의 폰트를 변경하고 싶었습니다. 알아본 결과 ass 형식의 자막을 쓰면 된다는 것을 알았습니다.
여기서 문제가 생겼는데, PLEX 클라이언트가 자막이 srt이면 다이렉트 플레이가 가능하지만,
ass나 smi면 강제 트랜스코딩이 진행되어버려서 버퍼링이 엄청나게 걸리는 문제가 있었습니다.
그럼 srt 자막을 쓰고, 클라이언트에서 자막 폰트를 바꾸면 될 문제이지 않느냐고 생각하실 수 있는데, 클라이언트는 LG 스마트 TV이고, srt 형식의 자막의 경우 LG 스마트 TV가 정한 폰트(고딕체)로만 나와서 변경할 수 없었습니다. 바꾸고 싶다면 LG스마트TV를 루팅해야겠지만 저는 그런 능력이 없습니다. ㅠㅠ
그래서 이 영상에 자막을 입혀서(Hardburn) 다이렉트 플레이를 시켜야겠다고 결론을 내렸습니다.
검색을 하다가 하다가 여기까지 오게되었고, 이틀에 걸쳐서 많은 분들의 질문과 팁, 프리셋 등을 읽어보았습니다.
그리고 어느정도 해답을 찾았는데... 제가 생각한 바가 맞는지 확인하고 싶어서 이렇게 질문을 올립니다.
다시 말씀드리지만, 저는 영상 인코딩 디코딩에 대한 지식이 전무합니다. 그래도 이틀동안 몇번을 반복해 읽으면서 아주 조금 이해했습니다.
독서백편의자현(讀書百遍義自見) - 책을 백번 읽으면 그 뜻은 저절로 알게 된다.
어릴 때부터 이 마음을 가지고 살아왔던지라... 이해가 안되어도 몇 번을 반복해 읽으면 어느 순간 정말 이해가 되기 시작하더군요.
물론 또 설명을 매우 잘해주신 많은 분들 덕분입니다.
(여담이지만 PLEX 라이브러리 구성하고 ass 자막에 대해서 알게되고 트랜스코딩과 다이렉트 플레이에 대해서 알게되는데에 두달 걸렸네요 ㅠㅠ)
그리고 제가 이해한 부분에 대해서 점검을 받을려고 합니다.
본론을 말씀드리겠습니다.
제가 변환시키고 싶은 영상의 정보는 이렇습니다.
먼저 샤나인코더 밑에 나오는 요약된 비디오, 오디오 정보를 보여드리고, 오른쪽 마우스 클릭해서 파일정보를 눌렀을 때의 정보를 올리겠습니다.
요약
비디오 hevc, 3840x1596, 23.98fps, HDR, yuv420p10le(tv, bt2020nc/bt2020/smpte2084)
오디오 dts, 48000Hz, 8ch
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
General
Unique ID : 330454167508358052994626647783965339941 (0xF89B285B6F686DE699C9BDEF53523125)
Complete name : D:\PLEX\미국영화\해리포터 시리즈\해리 포터와 마법사의 돌 2160p.mkv
Format : Matroska
Format version : Version 4
File size : 21.5 GiB
Duration : 2 h 32 min
Overall bit rate mode : Variable
Overall bit rate : 20.2 Mb/s
Encoded date : UTC 2018-01-19 17:47:15
Writing application : mkvmerge v20.0.0 ('I Am The Sun') 64-bit
Writing library : libebml v1.3.5 + libmatroska v1.4.8
Video
ID : 1
Format : HEVC
Format/Info : High Efficiency Video Coding
Format profile : Main 10@L5.1@High
HDR format : SMPTE ST 2086, HDR10 compatible
Codec ID : V_MPEGH/ISO/HEVC
Duration : 2 h 32 min
Width : 3 840 pixels
Height : 1 596 pixels
Display aspect ratio : 2.40:1
Frame rate mode : Constant
Frame rate : 23.976 (24000/1001) FPS
Color space : YUV
Chroma subsampling : 4:2:0 (Type 2)
Bit depth : 10 bits
Writing library : x265 2.6+22-ff02513b92c0:[Windows][GCC 6.3.0][64 bit] 10bit
Encoding settings : cpuid=1173503 / frame-threads=4 / numa-pools=16 / wpp / no-pmode / no-pme / no-psnr / no-ssim / log-level=2 / input-csp=1 / input-res=3840x1596 / interlace=0 / total-frames=219173 / level-idc=51 / high-tier=1 / uhd-bd=0 / ref=4 / no-allow-non-conformance / repeat-headers / annexb / aud / hrd / info / hash=0 / no-temporal-layers / no-open-gop / min-keyint=1 / keyint=24 / gop-lookahead=0 / bframes=4 / b-adapt=2 / b-pyramid / bframe-bias=0 / rc-lookahead=25 / lookahead-slices=4 / scenecut=40 / radl=0 / no-intra-refresh / ctu=64 / min-cu-size=8 / rect / no-amp / max-tu-size=32 / tu-inter-depth=1 / tu-intra-depth=1 / limit-tu=0 / rdoq-level=2 / dynamic-rd=0.00 / no-ssim-rd / signhide / no-tskip / nr-intra=0 / nr-inter=0 / no-constrained-intra / no-strong-intra-smoothing / max-merge=3 / limit-refs=3 / limit-modes / me=3 / subme=3 / merange=57 / temporal-mvp / weightp / no-weightb / no-analyze-src-pics / deblock=-3:-3 / no-sao / no-sao-non-deblock / rd=4 / no-early-skip / rskip / no-fast-intra / no-tskip-fast / no-cu-lossless / no-b-intra / no-splitrd-skip / rdpenalty=0 / psy-rd=2.00 / psy-rdoq=1.00 / no-rd-refine / no-lossless / cbqpoffs=0 / crqpoffs=0 / rc=crf / crf=17.0 / qcomp=0.60 / qpstep=4 / stats-write=0 / stats-read=0 / vbv-maxrate=160000 / vbv-bufsize=160000 / vbv-init=0.9 / crf-max=0.0 / crf-min=0.0 / ipratio=1.40 / pbratio=1.30 / aq-mode=1 / aq-strength=1.00 / cutree / zone-count=0 / no-strict-cbr / qg-size=32 / no-rc-grain / qpmax=69 / qpmin=0 / no-const-vbv / sar=1 / overscan=0 / videoformat=5 / range=0 / colorprim=9 / transfer=16 / colormatrix=9 / chromaloc=1 / chromaloc-top=2 / chromaloc-bottom=2 / display-window=0 / master-display=G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(40000000,50) / max-cll=552,190 / min-luma=0 / max-luma=1023 / log2-max-poc-lsb=8 / vui-timing-info / vui-hrd-info / slices=1 / no-opt-qp-pps / no-opt-ref-list-length-pps / no-multi-pass-opt-rps / scenecut-bias=0.05 / no-opt-cu-delta-qp / no-aq-motion / hdr / hdr-opt / no-dhdr10-opt / analysis-save=(null) / analysis-load=(null) / analysis-reuse-level=5 / scale-factor=0 / refine-intra=0 / refine-inter=0 / refine-mv=0 / no-limit-sao / ctu-info=0 / no-lowpass-dct / refine-mv-type=0 / copy-pic=1
Default : Yes
Forced : No
Color range : Limited
Color primaries : BT.2020
Transfer characteristics : PQ
Matrix coefficients : BT.2020 non-constant
Mastering display color primaries : Display P3
Mastering display luminance : min: 0.0050 cd/m2, max: 4000 cd/m2
Maximum Content Light Level : 552 cd/m2
Maximum Frame-Average Light Level : 190 cd/m2
Audio
ID : 2
Format : DTS XLL X
Format/Info : Digital Theater Systems
Commercial name : DTS-HD Master Audio
Codec ID : A_DTS
Duration : 2 h 32 min
Bit rate mode : Variable
Channel(s) : 8 channels
Channel(s)_Original : Object Based
ChannelLayout_Original : Object Based
Sampling rate : 48.0 kHz
Frame rate : 93.750 FPS (512 SPF)
Bit depth : 24 bits
Language : English
Default : Yes
Forced : No
Text
ID : 3
Format : PGS
Muxing mode : zlib
Codec ID : S_HDMV/PGS
Codec ID/Info : Picture based subtitle format used on BDs/HD-DVDs
Language : English
Default : No
Forced : No
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
이렇습니다.
저는 용량 줄일 생각도 없고, 화질 조정을 할 생각도 없습니다. 자막만 입히고 싶습니다.
빠른 설정을 들어가보니 스트림 복사가 있더군요.
오디오는 스트림 복사를 하면 될 것 같았습니다만, 비디오는 스트림 복사를 하면 자막을 입힐 수 없었습니다.(Hardburn)
자막을 영상에 새기는 것이니 재인코딩이 당연히 필요하겠지요.
저는 그럼 비디오를 똑같은 코덱과 똑같은 방식으로 설정해놓고, 자막 입히기를 체크하고 인코딩하면 되지 않을까 생각했습니다.
그래서 제가 가지고 있는 파일에 대해 공부를 좀 해보았습니다.
HDR 영상과 10비트 영상
https://shana.pe.kr/shanaencoder_tip/80753
이 글을 읽고 10비트와 HDR에 대해서 공부를 하였습니다만 아직 20%밖에 이해못했습니다.
그러다가 몇 번의 검색을 하다가 제가 원하는 프리셋을 발견했습니다.
HDR -> HDR(HDR10) 인코딩 (HEVC(x265), 1080p)
https://shana.pe.kr/shanaencoder_presets/49641
이 글이었습니다. 그러나 문제가 있는 것이 이 프리셋은 1080p HDR로 변환시키는 세팅이었습니다.
jKyle님께서 쓰신 글을 천천히 읽어보았고 이 부분을 발견했습니다.
--------------------------------------------------------------------------------------------------
필터 매개변수에 대한 설명은 아래와 같습니다. (오디오 부분은 생략)
=============================================================================
scale=1920:-1:flags=spline:out_color_matrix=bt2020_ncl
// 1080p로 해상도 변경, 알고리듬을 spline으로
// 해상도 변경시 color matrix를 HDR 용인 bt2020_ncl로
// 해상도 변경을 하지 않을 경우 지워도 무방
setsar=1/1
// 레터박스 사용 안 함
shanasubtitle=0
=============================================================================
---------------------------------------------------------------------------------------------------
여기에 따르면 해상도 변경을 하지 않을 경우 지워도 된다고 되어있는데,
필터 매개변수에서
scale=1920:-1:flags=spline:out_color_matrix=bt2020_ncl
이 한 줄을 지우면 된다는 뜻인건지요?
프리셋을 살펴봤을 때, 이 한 줄만 지우고, 자막입히기 체크를 하고 진행을 하면
제가 원하는 4k HDR(비디오 hevc, 3840x1596, 23.98fps, HDR, yuv420p10le(tv, bt2020nc/bt2020/smpte2084)의 화질을 보존하면서 자막을 입혀서 인코딩하는 것이 가능할까요?
혹시나 싶어서 다시 한번 더 언급드리는데, 저는 oepn Subtitle을 해야합니다. closed subtitle로 먹싱해버리면, 결국 클라이언트에서 제공하는 폰트로 재생될 것이기 때문입니다.
답변주시면 정말 감사하겠습니다.
4K HDR 재인코딩은 인코딩 지식이 없는 분이 도전하기엔 무척이나 까다롭고 어려운 주제입니다. 교육 과정에 비유하자면 대학원 초기 과정에 해당한다고나 할까요.
'자막 입히기 = 재인코딩 = 화질 변화 불가피'임을 생각하면 화질 '보존'은 불가능하고, 가능한 원본에 가깝게 해볼 수는 있겠죠. 그걸 위한 설정이 무척이나 까다롭다는 겁니다.
'원본과 똑같은 설정'을 하려면 보여주신 미디어인포 정보 중 비디오 쪽의 'Encoding settings' 값들을 분석해서 이걸 x265 고유 옵션 설정에 적용해야 합니다. 그런데 이건 일종의 리버스 엔지니어링 비슷한 거라 x265에 웬만큼 지식이 있지 않고서는 불가능합니다. 일단 기본적으로 미디어인포 정보들을 전부 다 해독하실 수 있을 정도는 돼야 하고, 거기에 더해 팁게에 올려놓은 모든 게시물들을 100% 이해를 하고 있어야 합니다. 거기에 더해 x265만의 옵션들에 대해 더 공부해야 하구요. 이건 일이 개월 공부해서는 어림도 없습니다.
그래서 대안으로 하는 방법이 최소한의 기본적인 옵션들을 선택하는 겁니다. 이렇게 하면 '원본과 똑같은 설정'보다 화질 저하는 더 있겠지만, '원본과 똑같은 설정' 방법보다 필요한 지식이 훨씬 줄어듭니다.
그런데 HDR 영상이 어려운 이유는, 그 '최소한의 기본적인 옵션들'이 HDR이 아닌 일반 SDR 영상보다 훨씬 많다는 겁니다. 그리고 설정을 위해서는 원본의 미디어인포 정보에서 HDR 관련 항목들을 반드시 이용해야 합니다.
본문에 올려주신 것을 예로 들면,
얘네들이 색공간 정보와 비디오 스트림에 삽입되는 SMPTE ST 2086 메타정보(HDR10 표준)로 들어가야 합니다.
즉, 매개변수 설정 부분(매개변수 창(F8))에 아래와 같이 들어가게 되죠.
x265 부분은 여기에 더해 원본의 미디어인포 정보[Encoding settings]에서 파악한 재생기 버퍼 관련 설정(vbv-maxrate=160000:vbv-bufsize=160000)과 HDR 추가 정보인 최소/최대 휘도 정보(min-luma=0:max-luma=1023)를 추가해서 다음과 같이 확장하면 됩니다.
그리고 필터 쪽은, 해상도 변경을 하지 않으므로 원래의 프리셋에 있던
이 줄은 싹 다 지우시고, 자막 입히기 작업은 빠른 설정(F6)에서 따로 직접 하시면 나중에
이 자동으로 생성될 겁니다.
이상 위에서 말씀드린 것들과 원래의 프리셋에서 더 설명된 것들(픽셀 포맷, 'Main 10' 프로파일 등등), 그리고 올려주신 미디어인포에서 파악한 crf 값을 추가로 반영하여 프리셋을 만들면 아래와 같습니다.
HDR10 HEVC(x265) main10 crf audio copy (LG 스마트TV 기본).xml
이 프리셋은 위에서 설명드린 대로 원본에 맞춘 가장 기본적인 프리셋입니다. 여기에 추가적으로 Encoding settings 정보를 해독해서 반영할 수도 있겠습니다만, 말씀드린 대로 그 과정은 상당히 지난합니다.
여기까지는 원하시는 '설정' 관련된 설명인데, 문제는 4K HDR 재인코딩이 스트레스를 주는 원인이 설정에서 끝나는 게 아니라는 겁니다. 어찌어찌 설정해서 인코딩을 시도해 본다고 해도 4K 해상도와 HDR10을 유지하면서 x265로 인코딩하려면 경우에 따라 엄청난 시간이 걸린다는 걸 알게 되실 겁니다. 그건 x265가 CPU만 죽어라 파는 인코더라서 그런 건데, 요즘 나오는 코어/스레드 많은 고사양 CPU를 쓰신다고 해도 x265 자체가 갖고 있는 한계 때문에 CPU를 완전히 다 사용하지 못하는 경우도 있습니다.
x265가 아닌 NVENC 같은 하드웨어 인코더(그래픽 카드 이용)를 사용하면 인코딩 속도가 개선이 되긴 합니다만, 이 경우엔 x265보다 화질 저하 폭이 크고, 결정적으로 HDR10 표준을 위한 (TV에서 HDR10으로 인식하기 위한) SMPTE ST 2086 메타정보를 비디오 스트림에 삽입할 수 없다는 문제가 있습니다. (이 프리셋 게시물 참고)
(※ 참고로, (샤나인코더의 기반인) FFmpeg가 아닌 NVEnc에서는 SMPTE ST 2086 삽입이 가능한 매개변수 옵션을 제공합니다. 그래서 StaxRip이나 Hybrid 같은 스크립트 기반 툴에서는 NVEnc를 이용해 HDR10뿐만 아니라 HDR10+ 인코딩도 가능합니다. (비공개 포맷인 Dolby Vision만 불가능))
게다가 자막 입히기는 CPU를 이용하는 소프트웨어 필터이므로 그래픽 카드와의 자료 교환에서 발생하는 병목현상으로 인코딩 속도가 꽤 저하될 수도 있으니 - 이 게시물과 이 게시물, 이 게시물 참고 - 하드웨어 인코더를 사용하는 잇점이 줄어드는 문제도 있습니다.
이상 장문의 설명을 드렸는데, 설명드린 부분 중에 잘 이해가 안 되는 부분이 있다면 검색해서 찾아보시면 좋겠네요.