조회 수 19275 추천 수 3 댓글 14
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부

이 프리셋은 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패스 인코딩을 하시든지 알아서 변경하시기 바랍니다.

 

오디오는 관심 사항이 아니기 때문에 제외했습니다. 실제 적용시 오디오는 적절하게 설정해서 적용하시기 바랍니다.

이 글을 추천한 사람
빨래해야돼 Windows10 Titu
Facebook Twitter Pinterest Kakao
  • ?
    핥아버지 2018.09.15 19:11
    umh 말고 esa나 tesa를 사용하는건 효율이 안좋은가요?
  • ?
    JKyle 2018.09.15 20:39
    네. 개선되는 화질에 비해 시간이 너무 오래 걸려요.
  • ?
    윤서야 2018.09.20 16:14

    첨부해주신 파일을 받은후에 기존에 제가 사용중인 빠른설정 옵션으로 바꿔주고 사용해도 문제없나요? 비트레이트 모드사용중이며 설정은 이렇습니다

    mp4 / HEVC / 비트레이트 모드 1500/  프레임 레이트 60 / 프로파일 main / 레벨 auto / 프리셋 veryfast / 튜닝 none
    사이즈 1280 x 720 (HD) / 리사이즈 필터 bicubic(기본값)
    오디오 코덱 AAC, LC / 오디오 비트레이트 192 / 스테레오 채널 / 샘플 레이트 48000

     

    그리고 이 프리셋 사용시 기존의 기본설정보다 소요시간이 더 오래 걸리나요?

  • ?
    JKyle 2018.09.20 16:41

    네, 문제는 없을 것 같습니다. 샤나에서는 [빠른 설정]으로 수정을 해도 x265 고급 옵션 부분은 안 바뀝니다.
    보다 확실히 하시려면 F8을 눌러 매개변수 창에서 설정값들이 제대로 들어갔는지 확인하시는 게 좋습니다.

     

    질문하신 대로, 이 프리셋을 적용하면 아쉽게도 인코딩 시간이 더 걸리는 경향이 있더라구요. 권해 드리고 싶은 방법은 일단은 이 프리셋의 고급 옵션 설정을 빼고 시도해 보시라는 겁니다. 만일 화질이 만족스럽다면 원본이 굳이 이 프리셋을 적용할 필요가 없는 거고, 그렇지 않다면 이 프리셋을 시도해 보는 것도 좋을 것 같습니다.


    그리고 조언을 하나 드리자면, 비트레이트 모드에서 프리셋 veryfast를 사용하면서 그냥 1패스로만 끝난다면 화질이 만족스럽지 못할 수도 있습니다. 시간이 조금 더 걸리더라도 같은 설정으로 2패스 인코딩 하시는 걸 권하고 싶네요. 팁 게에서 x265 2패스 인코딩에 관한 부분을 참조하셔서 적용해 보십시오.
    https://shana.pe.kr/shanaencoder_tip/53398
    프리셋이 medium이라면 모르겠지만 veryfast라면 2패스 인코딩이 효과가 있을 것 같다는 생각이 드는군요.

  • ?
    윤서야 2018.09.20 16:52

    읽어보았는데, 본문 중반에 최대 두배걸릴수있다는 문장을 보아하니 아무래도 힘들지 않나 싶습니다...ㅜㅜ 화질이 중요한 영상의 경우에는 프리셋을 medium 이상 사용할 생각이긴 합니다. 그 때가 온다면 저 게시글을 다시 한번 참고 해보겠습니다.
    그건그렇고 이 게시글의 프리셋자료를 적용해도 속도부분에서 느려지거나 하는 차이가 없다고 봐도 무방할까요? 이따 다운 후 설정 만져보고 테스트 해볼 예정이지만 미리 알아두고 싶습니다.

  • ?
    JKyle 2018.09.20 16:56
    위에 말씀드린 대로, 어느 정도 느려질 겁니다. 얼마나 느려질지는 원본과 다른 설정들에 따라 달라지겠지만요.
  • ?
    윤서야 2018.09.20 19:46

    감사합니다. 자세한 테스트는 아직 안해보았지만 시간자체는 대충 20%정도 느려지네요.
    그건그렇고, 본문 초반에 나와있는 블로그를 정독해보았는데 저 글의 내용은 대부분 사실에 근거하여 작성된것이 맞는거죠? 저도 솔직히 최신코덱, '최신'이라는 말에 끌려 시간은 오래걸리지만 HEVC로 인코딩 작업을 하였고(비록 프리셋은 veryfast 이지만요) 그당시에는 264 느리게 하는것보다 HEVC 빠르게 하는 인코딩이 퀄리티 더 좋게 나온다는 결론에 도달했었는데 저 블로그 글을 보고 다시 고민에 빠졌네요. 부드럽다고 생각한 HEVC의 특징이 사실은 뭉개지는것이였단걸 생각하면 테스트 결과도 색안경을 끼고 내려버린 꼴이고.. 우선 나중에 다시 테스트를
    해서 저만의 결론을 내릴 생각인데, sST님의 저 블로그 게시글의 내용에 대한 의견은 어떠한가요?

  • ?
    JKyle 2018.09.20 23:30
    어느 분이 그 글과 관련하여 질문을 하시길래 제가 아주 자세히 답변해 놓은 포스팅이 있습니다.
    https://shana.pe.kr/index.php?mid=shanaencoder_qa&page=5&document_srl=50991

    결론적으로 말씀드리자면, x265로 제대로 세팅해서 인코딩하면 대개의 경우 x264와 디테일에서 거의 차이가 없어 눈으로 식별이 거의 불가능하게 인코딩할 수 있습니다. 게다가 x265는 아직도 발전하고 있어서 요즘 나오는 버전들은 오히려 x264보다 뛰어난 디테일을 보이기도 합니다. 제가 가장 최근 버전을 컴파일해서 쓰고 있는데 무척이나 만족스러운 결과가 나오더라구요. 그래서 위의 고급 옵션 설정이 이제는 필요 없는 건 아닌가 하는 생각을 하기도 합니다.

    x265로 적절하게 crf를 찾아서 인코딩하면 최고의 결과가 나옵니다. 문제는 crf 값을 찾는 과정과 인코딩 과정에서 아직도 시간이 많이 걸린다는 거지만요.

    정작 문제가 되는 것은 x265 같은 소프트웨어 인코더가 아닌 HEVC(NVENC)나 HEVC(QSV) 같은 하드웨어 인코더들입니다. 실제로 경험해 보시면 화질을 원하는 분들이 왜 하드웨어 인코더를 기피하는지 이유를 아실 수 있습니다.
  • ?
    윤서야 2018.09.21 08:57

    감사합니다 읽어보고 왔는데 개인에
    따라 달라서 객관적인 판단은 힘들지만 어느정도는 맞는 말이라는 거군요..
    CRF값을 찾는다 말씀하셧는데 이는 퀄리티 모드 였던걸로 기억하고 있고 퀄리티 모드는 한번도 사용해본적이 없는데요, 퀄리티모드를 통해서 특정 비트레이트가 나오는 값을 찾아서 인코딩하는거랑, 그 특정비트레이트값을 그냥 비트레이트모드에 바로 입력해서 인코딩하는거랑 화질차이는 거의없다 봐도 무방한가요?

    비트레이트 모드로는 화질을(+뭉개지는 현상 회피) 챙길수 없는것인지요?


    한가지 더 궁금한게 있다면, 최신버전 사용해보니 매우 만족스럽다 하셧는데(본문의 프리셋처럼 고급설정 따로  안만져도 매우 준수한, 뭉개지지않고 좋은 화질이 뽑힌다는 말씀으로 들렸습니다) 이는 별도로 구해서 샤나인코더에서 사용해야 하는것인가요? 잘 모르겠네요..

  • ?
    JKyle 2018.09.21 10:30

    특정 비트레이트가 나오게 crf 값을 찾는 건 매우 힘든 일입니다. 그냥 대충 어느 정도 비트레이트 목표 범위를 정하고 crf 값을 정한 뒤 샘플을 뽑아서 한번 돌려보고 대충 맞겠다 싶으면 전체 영상을 인코딩하는 식으로 진행하는 게 최적의 방법입니다. 이게 경험도 일단 필요하고, 시행착오의 시간도 필요해요.

     

    암튼, 그래서 나오는 영상의 화질은, 실제 그 비트레이트 값으로 설정해서 비트레이트 모드로 인코딩한 영상과 비교해도 더 낫습니다.

     

    화질 기준으로는 crf = (동일 비트레이트의) 2패스 비트레이트 > 1패스 비트레이트(abr, average bitrate) >>>> 하드웨어 인코더들(NVENC, QSV) 이렇습니다.

     

    제 경험으로는 비트레이트 모드로 직접 비트레이트 2000을 준 1패스 FHD 영상보다, 퀄리티 모드로 crf 값을 적절하게 줘서 비트레이트가 1500 정도가 된 FHD 영상이 화질이 더 나을 때가 많았습니다.

     

    그래서 비트레이트 모드로는 블러링을 억제하고 디테일을 살리려면 어느 정도 높은 비트레이트를 줘야 한다는 결론을 얻었습니다.

     

    샤나에 내장된 FFmpeg는 '프로그램 정보' 메뉴에 보면 나와 있듯이 4.0.1.142죠. 아마 금년 6월에 나온 버전일 겁니다. 거기에 포장돼서 들어간 x265도 비슷한 시간의 버전일 겁니다. 충분히 최신의 버전이니 샤나에서도 퀄리티 모드로 crf 값 정해서 인코딩하면 비트레이트 모드보다 훨씬 나은 화질을 얻을 수 있고 블러링이나 디노이징 효과도 최소화할 수 있습니다. 제가 최신 버전이 만족스럽다고 말씀드린 것은 그만큼 계속 발전하고 있다는 걸 강조해서 말씀드리기 위함이고, 원 블로그의 포스팅은 1년이 넘은 글이라는 걸 강조하기 위해서입니다.

     

    따로 x265나 FFmpeg를 구해서 샤나에 포함시킬 방법은 없습니다. 샤나인코더 자체가 샤나님이 직접 FFmpeg 소스를 customize하여 컴파일한 뒤  껍데기인 GUI를 붙인 겁니다. 샤나인코더 프로그램이 있는 폴더에 보시면 tools 폴더 안에 x64 폴더, 그 안에 ShanaEncoder.sha 파일과  ShanaEncoder10.sha 파일이 있는데 얘네들이 FFmpeg를 빌드한 64비트용 바이너리 라이브러리들이고 (그 안에 x265 등도 포함), 샤나인코더 프로그램 폴더 안에 있는 ShanaEncoder.exe 파일이 겉껍데기인 GUI입니다. 샤나님이 아니고서는 ShanaEncoder.sha 파일과 ShanaEncoder10.sha 파일을 빌드할 수 없습니다.

     

    최신 버전의 FFmpeg와 다른 인코더들이 궁금하시다면 본인의 시스템에서 직접 FFmpeg를 빌드하는 수밖에 없습니다. 프로그래밍의 기본적인 얼개 정도라도 이해하고 계셔야 가능한 일입니다. 그리고 아직 인코딩에 대해 깊이 이해하고 계시지 않은 상태에서는 만들어진 걸 사용하기도 힘드실 겁니다. 일단은 샤나인코더 사용법과 작업 흐름에 대해 공부하셔서 95% 이상 이해하셔야만 가능한 일이라고 말씀드리고 싶습니다.

  • ?
    Titu 2019.09.16 14:38
    i will tey
  • ?
    DAVY 2021.12.13 14:19
    안녕하세요, 이 프리셋 최근 버전에서 사용해도 괜찮을까요?
  • ?
    Windows10 2022.01.03 18:09

    지금도 유효한 프리셋인지는 모르겠지만 기본 프리셋보다 오히려 움직이는 사물 주변에 생기는 잔상 잔여물이 더 추가되네요 동일한 3000k 미디움에서 색번짐도 오히려 더 커지는 것 같은데...

  • ?
    Windows10 2022.01.03 22:36
    비트레이트를 최소 1000 이상 더 높게 잡아야 커버가되는군요 결국 용량이 관건이네요 ㅎㅎ

List of Articles
번호 제목 글쓴이 날짜 조회 수 추천 수
공지 샤나인코더 기본 프리셋(v6.0 이후 버전) file Rina 2023.08.17 8027 1
» HEVC(x265) 디테일 개선을 위한 프리셋 14 file JKyle 2018.08.30 19275 3
Board Pagination Prev 1 Next
/ 1