이 프리셋은 x264보다 디테일이 떨어진다(특히 낮은 해상도, HD, FHD 등)는 오명(?)을 쓰고 있는 x265가 (http://gskool.tistory.com/422 참고) 어떻게 하면 디테일을 보다 더 살리게 할 수 있을까 하는 고민에서 출발해서 나름대로의 실험을 거쳐 얻은 결과물입니다.
우선 H264, 그리고 그것의 실현물(implementation)인 x264에 비해 HEVC의 실현물들인 HEVC(NVENC), HEVC(QSV), x265 들을 비교해 보면, 확실히 HEVC 계열이 디테일이 떨어집니다. 특히 하드웨어 코덱들은 비트레이트를 H264와 같게 주어도 뭉개짐(blurring)과 떡짐(color banding, 계조가 무너지는 현상)이 눈에 띄게 드러나고 깍두기 현상(blocking)까지 나타나는 경우가 있습니다. (이런 이유로 하드웨어 인코딩을 기피하시는 분들이 많습니다.) 소프트웨어 코덱인 x265는 훨씬 낫긴 하지만 이것도 비트레이트를 H264보다 낮게 주면 (대략 50~70% 정도로 나름 판단됩니다. 즉 H264보다 HEVC의 인코딩 효율이 우월한 한계점.) 뭉개짐, 떡짐, 깍두기 현상이 조금씩 나타나기 시작합니다. 그래서 디테일을 보존하기 위해서는 HEVC 계열 인코더를 쓰지 말라는 말이 어느 정도 일리가 있게 됩니다.
특히나 노이즈를 살려야 하는 상황, 예를 들면, 떡짐 현상을 개선하기 위해 디더링(dithering)을 적용해 노이즈를 주었는데 이를 살려야 한다든지, 옛날 필름을 스캔했거나 그런 효과를 주기 위해 film grain(노이즈의 일종) 필터를 적용해 오래된 느낌과 회상신을 구현했는데 이를 살려야 한다든지 하는 상황에서는 HEVC은 상당한 취약점을 보였습니다.
개인적인 추측으로는, 인코딩 효율(압축률)을 위해 여러 가지 방법의 새로운 기법이 HEVC에 도입되었는데, 그 와중에 디테일과 노이즈에 대한 용인 수준(tolerance)이 H264에 비해 취약해진 게 아닌가 싶습니다. 이는 큰 해상도(UHD 이상), 높은 표현력(high dynamic range)의 영상을 염두에 두고 만들어진 것인 만큼 그런 환경에서 비교적 무시해도 괜찮은 디테일에 대해 무뎌졌다고나 할까요?
하지만 하드웨어 인코더들은 custom 설정으로 개선의 여지가 없어 보이니 포기하더라도, x265는 장점인 인코딩 효율을 살리면서 이를 개선할 방법이 있지는 않을까 고민하게 되었고, 하드웨어 인코더에는 없는 고급 옵션을 건드려 개선을 해보자 하는 생각에서 테스트를 하고 소소하긴 하지만 나름 용인할 만한 결과를 얻어 이를 프리셋으로 정리한 것입니다.
목표 비트레이트는 원본의 70% 수준입니다. 그리고 뭉개짐/떡짐으로 인한 디테일, 특히 노이즈의 감소는 눈으로 파악하기에 원본의 취지(?)를 훼손하지 않는 범위여야 합니다. 즉, 노이즈가 정확히 같은 수준일 것까지는 없지만 노이즈로 인한 효과는 제대로 나타내면서 노이즈 자체에 어떤 특정 성향(뭉개짐과 떡짐, 더 나아가 패턴이라든지 손가락으로 문지른 것 같은 현상(smudging))이 없어야 합니다.
디테일 개선을 위해 고려한 부분은 RD(rate distortion)와 AQ(adaptive quantization)입니다. RD 부분에서는 심리시각적인 면을 좀더 반영해 디테일을 살릴 수 있는 방향으로 설정을 했고 AQ에서는 화면상에서 비교적 평평한 부분과 어두움이 강한 부분(암부)에 비트레이트를 좀더 할당하도록 설정 방향을 정했습니다.
화질 개선을 위한 부분은 당연히 고려했고, 기타 추가적으로 고려했다가 폐기한 사항은 grain 원본 영상을 고려한 'grain' tune 옵션과 CTU(최대 coding unit) 값과 최대 TU 사이즈입니다. (CTU와 최대 TU에 관한 부분은 http://gskool.tistory.com/422 이 포스팅에 누군가 댓글로 제안한 내용입니다.)
프리셋의 매개변수 설정들에 대한 자세한 설명은 아래와 같습니다.
====================================================================================================
<<프리셋에 사용하기로 한 매개변수 설정들과 이유>>
-preset:v medium
// 아래 서술한 고급 옵션 없이 preset medium으로만 bitrate을 맞춰서 돌리면 grain/noise가 들어간 영상의 경우 blocking과 dithering(특히 chorma 부분)을 충분히 보존하지 못한 푸른색 계열 색 번짐, 그리고 color banding이 존재. 2패스로 돌리면 blocking은 완화되나 푸른색 계열 색 번짐과 color banding은 미세하게나마 여전히 존재.
// 고급 옵션 없이 preset medium으로만 퀄리티 모드로 돌리면 artifact들이 완화되기는 하나 여전히 색 번짐과 blurring/color banding이 존재.
=> 화질 대비 효율을 고려하여, 고급 옵션과 함께 사용하기로 함.
<HEVC(x265) 고급 옵션 부분(-x265-params 에 들어가는 부분)>
[화질 개선을 위한 부분]
ref=4:me=umh:rc-lookahead=30:bframes=2
// ref=4 => motion compensation을 위한 참조 프레임수(L0 타입)를 최대 4개로. 기본값은 3.
// me=umh => motion estimation(=motion search algorithm)을 umh로. 기본값인 hex보다 시간은 더 걸리지만 움직임이 많은 부분에서 품질은 더 나음.
// rc-lookahead=30 => 프레임 자르기를 하고 rate control을 하기 위해 미리 참고하는 앞부분의 프레임 수. 값이 클수록 좀더 정확한 자르기와 rate control이 가능하지만 인코딩 및 디코딩 시 latency를 늘림. 즉 플레이어에서는 buffer가 더 많이 필요. 기본값은 20이지만 화질을 위해 조금 높은 값을 선택.
// bframes=2 => 연속적인 B-frame들의 최대값. 값이 낮을수록 화질은 개선되지만 인코딩 효율(압축률)은 떨어짐. 기본값은 4.
[디테일 개선을 위한 부분]
{RD 부분}
:psy-rd=3
// 심리시각적(psychovisual)으로, 인간은 구조적 유사성(SSIM)이 높은 영상보다는 복잡도(디테일, energy)가 비슷한 영상이 화질이 더 낫다고 판단하는 경향이 있음. 인코더는 구조적 유사성을 높이기 위해 RDO(rate distortion optimization, 코딩 단위별 비트레이트 할당을 최적화하는 것) 과정에서 flat area에 낮은 비트레이트를 주어 blur(구조적 유사성을 위해 디테일을 희생하는 것)하는 성향이 있는데 심리시각적 영향을 고려하여 이를 보정하는 옵션.
// 값이 높을수록 비슷한 복잡도(디테일)를 blur보다 선호하게 되어 x265의 기본적인 RD(rate distortion)를 적극적으로 수정하게 됨.
// rd=3 이상일 때만 적용되는데 rd 기본값은 3이므로 psy-rd 설정은 유효.
// psy-rd 범위는 0~5.0, 기본값은 2.0. x264는 이 값의 기본이 1이며 기본에서 +/-1 이상/이하는 권장하지 않는다.
=> 복잡도와 디테일을 좀더 적극적으로 보존하기 위해 사용
{AQ 부분}
:aq-mode=3:aq-strength=2.0:qg-size=8
// AQ(adaptive quantization) 부분. 'tune:v grain'을 선택하면 무효화됨.
// 비트레이트 할당에서 flat area와 어두운 부분에 좀더 가중치를 둠.
// aq-mode 3은 auto-variance를 적용하고 어두운 부분에 좀더 능동적인 AQ. x265에서는 8-bit 인코딩이나, 비트레이트가 낮은 10-bit 인코딩에서 color banding과 blocking을 줄이기 위해 선택을 권장.
// qg-size 8은 qp(quantization parameter)가 조정되는 minimum cu(coding unit)를 인코딩 전체 minimum cu 값인 8로 맞춤. 기본값은 maximum cu 값인 ctu(coding tree unit) 값. ctu의 기본값은 64.
=> Flat area와 어두운 부분의 디테일 보존을 위해 사용
====================================================================================================
참고로, 아래의 설정들도 고려해서 시도해 보았으나 만족스럽지 못해 폐기했습니다. 설정들과 그 이유를 설명합니다.
====================================================================================================
<<고려해본 설정들과 비사용 이유>>
-preset:v slow, slower, veryslow
// 노이즈가 들어간 영상에서는 낮은 비트레이트에서 일그러짐 개선이 거의 없고 깍두기(blocking)만 두드러짐.
=> 화질은 물론 화질 대비 효율도 떨어지므로 사용하지 않기로 함.
-tune:v grain
// 전반적으로 grain 보존 수준이 위의 고급 설정을 적용한 프리셋보다는 나으나, 특정 부분(명암 차이가 큰 장면 전환 부분)에서 일그러짐(blurring, distortion, smudging)이 눈에 띄게 두드러지는 이상 현상이 있음. 비트레이트를 높여도 같은 현상이 지속. 중대한 버그로 보임.
// 일부 암조가 강한 부분에서 푸른색 번짐이 약간 보임.
// 이 옵션은 grain이 있거나 없거나 상관 없이 aq를 적용하지 않기 때문에 낮은 비트레이트로 인코딩할 때 grain이 없는 부분에서 복잡도가 떨어지는 flat area의 디테일 보존에 불리할 가능성이 큼.
=> 사용하지 않기로 함.
<HEVC(x265) 고급 옵션 부분(-x265-params 에 들어가는 부분)>
:ctu=16
// x265의 기본값인 64보다 낮은 32나 16을 적용하면 encoding에 고려하는 최대 크기 블럭 사이즈가 감소하므로 고려할 게 줄어들어 encoding 시간은 감소하지만 그만큼 효율(압축률)이 떨어지므로 bitrate은 늘림. 또한 decoding time은 오히려 늘어남.
// grain 영상에 적용하니 낮은 비트레이트에서도 깍두기 현상은 감소하나 노란색과 푸른색 얼룩이 짐. 중대한 결함.
// https://shana.pe.kr/index.php?mid=shanaencoder_qa&page=3&document_srl=50991 에서 덧붙인 댓글 참고
=> 사용하지 않기로 함.
:max-tu-size=8
// 역시 encoding 시간은 줄이고 압축률이 떨어지므로 bitrate은 늘림.
// grain 영상에 적용하니 노란색과 푸른색 얼룩이 ctu=16보다 오히려 심해짐.
=> 사용하지 않기로 함.
====================================================================================================
이 프리셋을 적용하여 그레인 필터가 집중적으로 사용된 부분을 영상에서 잘라 실험해 보았는데, 그에 대해서는 추후 팁 게시판에 포스팅할 예정입니다.
단지 한 개의 샘플만으로 뽑아낸 프리셋이라 원본에 따라 결과 차이가 있을 것으로 생각됩니다. 본인 입맛에 맞게 매개변수 설정값을 바꾸어서 적용해 보시기 바랍니다.
프리셋 자체는 퀄리티 모드로 crf를 31.5까지 주었는데, 이는 원본에 맞추어 비트레이트가 70% 수준까지 나오도록 조절한 것입니다. crf 값을 본인의 상황에 맞게 바꾸시든지, 비트레이트 모드로 2패스 인코딩을 하시든지 알아서 변경하시기 바랍니다.
오디오는 관심 사항이 아니기 때문에 제외했습니다. 실제 적용시 오디오는 적절하게 설정해서 적용하시기 바랍니다.