STTS님의 댓글에 달린 글들을 보고 H264(NVENC)에서 화질을 향상 시킬수 있는 방법을 찾아보다가 만들게 되었습니다
혹시라도 더 좋은 화질향상을 할수 있는 방법이 있으시면 가르쳐 주시기 바랍니다
부탁드립니다
STTS님의 댓글에 달린 글들을 보고 H264(NVENC)에서 화질을 향상 시킬수 있는 방법을 찾아보다가 만들게 되었습니다
혹시라도 더 좋은 화질향상을 할수 있는 방법이 있으시면 가르쳐 주시기 바랍니다
부탁드립니다
상당히 모호하고 어려운 질문을 하시네요. 어떤 인코더를 쓰느냐, 어떤 프리셋을 쓰느냐, 원본이 움직임이 많으냐, 해상도가 어떻냐에 따라 달라져야 해서 딱히 값이나 범위를 지정하기 곤란합니다. 게다가 결과를 놓고 좋냐 나쁘냐 판단하는 것도 순전히 주관적인 것이라서...
여기서 답변해도 좋을지 모르겠습니다만, 다만 한 가지 말씀드릴 수 있는 것은, 소프트웨어 인코더보다 하드웨어 인코더가 대략 30~50% 정도 높은 비트레이트를 주어야 화질이 대충 비슷해진다는 것, 프리셋은 slower에서 medium 정도가 속도 대비 화질이 가장 나은 것 같다는 것 (물론 하드웨어 인코더의 경우엔 vbrhq), 뭐 이 정도 되겠네요.
그리고 원본이 좋다면 비트레이트 모드보다는 퀄리티 모드로 인코딩하는 게 더 만족스러운 결과를 주더군요. 물론 2패스로 하면 얘기가 달라지겠지만 그건 너무 시간이 걸려서...
정석으로 하는 방법은, 영상에서 화질 열화가 염려스러운 부분을 구간 설정해서 퀄리티 모드든 비트레이트 모드든 실험 삼아 적용해 보고 crf 값이나 비트레이트 값을 조금씩 조정해 보는 겁니다. 그렇게 여러 번 하다 보면 대충 어떤 원본에 어떤 값을 주면 좋을지 자신만의 값들이 얻어지게 되죠. 감을 잡기 위해서는 초기에는 그런 방식으로 하실 것을 권하고 싶습니다.
참고로, 1.85:1이나 2.35:1 비율의 1080p 영화일 경우 용량 줄여서 소장하기 위해 저는 x265로 비트레이트 1.5~2Mbps까지 퀄리티 모드로 적절한 crf 값을 찾아서 적용하곤 하는데, 이 방법은 솔직히 시간을 너무 많이 잡아 먹어서 별로 추천하고 싶진 않습니다. 쩝...
네, 아직은 Aegisub의 도움이 필요합니다.
폰트와 shadow 조절은 NVEnc에서 옵션으로 직접 조절하는 건 힘들고 smi라면,
1) srt로 변경해서
2) Aegisub에서 연 후에 ass 형식으로 변환하면서 편집
하셔야 합니다.
그래서 '제한적인' 자막 입히기라고 한 것입니다.
<smi to srt>
ffmpeg -f sami -i INPUT.smi -c srt OUTPUT.srt
Aegisub은 자막 편집이 처음이시라면 약간 시간을 들여서 공부하셔야 할 겁니다.
좀 번거롭죠.
샤나인코더의 FFmpeg 업데이트 문제는 아닌 것 같습니다. 프리셋도 문제가 없구요.
자게에 댓글로 남겼는데, 본인 시스템의 nvcuda.dll 파일이 어떤 이유로 삭제가 돼서 발생한 문제 같으니 엔비디아 그래픽 드라이버를 다시 설치하시면 해결될 것 같습니다.
이 프리셋의 인코딩 옵션 부분에
-refs 4
이 옵션을 없애야 오류가 나지 않습니다.
FFmpeg에서 다중 참조 프레임 관련 옵션인 -refs를 NVENC에 보다 엄격하게 적용하면서 이 기능을 지원하지 못하는 엔비디아 그래픽 카드(파스칼 계열 이하 대부분 해당되는 것 같습니다.)에서는 아래와 같이 인코딩 오류를 발생시킵니다.
Multiple reference frames are not supported by the device
No capable devices found
프리셋 사용자분들은 반드시 참고하시기 바랍니다.
그 부분은 저도 좀 의심스럽긴 합니다. FFmpeg에서 해당 인코더 옵션 설명 부분에 보면,
-no-scenecut <boolean> E..V...... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false)
이렇게 나와 있는데요, 이게 lookahead가 설정돼 있으면 반드시 그렇게 하라는 건지, adaptive I-frame 기능을 끄고 싶을 때만 그렇게 하라는 건지 설명이 명확하지 않아서 헷갈립니다. 다른 추가 매뉴얼도 전혀 없어서 설명이 영 부족합니다.
인코딩 에러만 나지 않는다면 -no-scenecut 부분도 일부러 넣을 필요는 없을 것 같긴 합니다. 문제가 되지 않는데 굳이 제약을 가할 필요는 없을 테니깐...
수고하셨습니다. 제대로 만드신 거 같네요.
쓸 때는 현재 1800k 로 돼있는 비디오 비트레이트와 64k 로 돼있는 오디오 비트레이트만 조정하면 될 것 같습니다.
여담으로, FFmpeg에 내장된 h264_nvenc, hevc_nvenc 인코더로는 뽑아낼 수 있는 화질의 한계가 분명한 것 같습니다. 아마 이 프리셋이나 아래 제가 올려놓은 정도가 한계인 듯합니다.
좀 더 나은 '무료' NVENC 인코더를 원하신다면 엔비디아의 CUDA SDK를 이용해 일본인이 개발하고 있는 아래 툴을 이용해 스크립트 인코딩 프로그램(StaxRip, Hybrid, MeGUI 등)으로 진행하는 방법밖에 없는 것 같습니다.
NVenc: https://github.com/rigaya/NVEnc/releases
꾸준히 활발하게 업데이트되고 있고, FFmpeg에는 없는 'VPP 하드웨어 필터'들이 내장돼 있습니다. (리사이즈, 디인터레이스(nnedi), crop, deband, edgelevel, unsharp, denoise 등. 최근에는 제한적 기능의 '자막 입히기'까지 추가) 이 말의 의미는, 하드웨어 디코딩 -> 하드웨어 필터 -> 하드웨어 인코딩의 workflow 적용으로 진정한 의미의 '하드웨어 가속'을 경험할 수 있다는 거죠.
결과도 나쁘지 않습니다. 경험상 HEVC은 x265보다 약 30~40배 빠른 속도에 30% 정도 높은 비트레이트로 x265와 비슷한 화질을 뽑아내더군요. (GTX 1060 6GB) 물론 순전히 주관적인 판단입니다. :)