FFmpeg libx265 및 hevc_nvenc

FFmpeg libx265 및 hevc_nvenc

Nvidia 그래픽 카드가 있고 독점 드라이버를 사용하고 있습니다.

사용 가능한 ffmpeg H265 인코더를 살펴보고 hevc_nvenc를 찾았습니다. hevc_nvenc를 사용하면 실제로 GPU를 사용하여 비디오를 인코딩하므로 인코딩 시간이 크게 늘어나지만 출력 파일 크기가 훨씬 커집니다.

예: (input.mp4는 H264 및 aac입니다)

ffmpeg -hwaccel cuda -i input.mp4 -c:v libx265 -c:a libopus -crf 26 libx265_output.mkv

ffmpeg -hwaccel cuda -i input.mp4 -c:v hevc_nvenc -c:a libopus -crf 26 hevc_nvenc_output.mkv

파일 크기는 다음과 같습니다.

input.mp4             351M
libx265_output.mkv    134M
hevc_nvenc_output.mkv 360M

ffprobe는 출력을 hevc 인코딩으로 표시하고 입력을 h264로 표시합니다.

그렇다면 hevc_nvenc의 성능이 왜 그렇게 좋지 않은 것 같습니까? 내가 놓친 것이 있어야합니다.

답변1

고쳐 쓰다

하드웨어 가속 인코더는 -crf크기/질량 비율을 결정하는 데 일정한 비율 인자(CRF)를 지원하지 않습니다. 예를 들어 를 사용하여 인코더가 지원하는 것을 확인할 수 있습니다 ffmpeg -h encoder=hevc_nvenc -hide_banner.Dennis Mungai의 자세한 답변도착하다'ffmpeg에서 nvenc와 함께 CRF 인코딩을 사용하는 방법은 무엇입니까?' Superuser에서는 가변 비트 전송률로 일정한 품질을 얻기 위해 -cq:v 19및 매개 변수를 사용할 것을 제안합니다. -rc:v vbr귀하의 상황에 도움이 된다고 생각하시면 됩니다.

-cq상수 품질(에 의해 결정됨) 이 대신 상수 양자화 매개변수(CQP)에 의해 설정된다는 점에서 이것이 CRF와 여전히 다르다는 점은 주목할 가치가 있습니다 . 이것은에서 온 것입니다Werner Robitza의 CRF 가이드CRF가 일정한 QP 설정에 비해 비트를 절약할 수 있는 이유를 설명하십시오.

...양자화 매개변수는 주어진 픽셀 블록(매크로블록)에서 얼마나 많은 정보가 삭제되는지 정의합니다. 이로 인해 시퀀스 전반에 걸쳐 비트 전송률이 크게 변경되는 경우가 많습니다.

고정율 인자는 이것보다 조금 더 복잡합니다. 특정 수준의 인지된 품질을 유지하기 위해 필요에 따라 QP를 변경하여 다양한 프레임을 다양한 양으로 압축합니다. 이는 움직임을 고려하여 수행됩니다. …


원래 답변

ffmpeg위키는 주장한다이는 하드웨어 가속 인코딩의 일반적인 경우입니다.

하드웨어 인코더는 x264와 같은 우수한 소프트웨어 인코더보다 훨씬 낮은 품질의 출력을 생성하는 경우가 많지만 일반적으로 속도가 더 빠르고 CPU 리소스를 많이 사용하지 않습니다. (즉, 동일한 지각 품질로 출력을 생성하려면 더 높은 비트 전송률이 필요하거나 동일한 비트 전송률에서 더 낮은 지각 품질로 출력을 생성합니다.)

Peter Cordes는 다음과 같은 설명을 제안합니다.Video Production Stack Exchange에 대한 그의 답변도착하다'GPU보다 프로세서가 코딩에 더 좋은 이유는 무엇입니까?':

내 이해비디오 인코딩의 검색 공간은 너무 커서 검색 경로를 조기에 종료하는 CPU의 스마트 휴리스틱이 적어도 고품질 인코딩의 경우 강력한 GPU를 압도합니다. -preset ultrafast특히 x264 대신 HW 인코딩을 합리적으로 선택할 수 있는 경우와 비교했을 뿐입니다 . CPU 속도가 느린 경우(예: 듀얼 코어가 있고 하이퍼스레딩이 없는 노트북) 빠른 CPU(하이퍼스레딩이 포함된 i7 쿼드 코어)에서 x264는 superfast아마도 동일한 속도로 빠르고 보기에도 좋을 것입니다(동일한 비트 전송률에서).

비율 왜곡(파일 크기당 품질)이 중요한 인코딩을 수행하는 경우 x264 -preset medium이하를 사용해야 합니다. 무언가를 보관하는 경우 이제 파일을 보관하는 한 더 많은 CPU 시간을 사용하여 바이트를 절약할 수 있습니다.

답변2

ffmpeg -h encoder=hevc_nvenc

실제 사전 설정 목록 제공

  -preset            <int>        E..V....... Set the encoding preset (from 0 to 18) (default p4)
     default         0            E..V.......
     slow            1            E..V....... hq 2 passes
     medium          2            E..V....... hq 1 pass
     fast            3            E..V....... hp 1 pass
     hp              4            E..V.......
     hq              5            E..V.......
     bd              6            E..V.......
     ll              7            E..V....... low latency
     llhq            8            E..V....... low latency hq
     llhp            9            E..V....... low latency hp
     lossless        10           E..V....... lossless
     losslesshp      11           E..V....... lossless hp
     p1              12           E..V....... fastest (lowest quality)
     p2              13           E..V....... faster (lower quality)
     p3              14           E..V....... fast (low quality)
     p4              15           E..V....... medium (default)
     p5              16           E..V....... slow (good quality)
     p6              17           E..V....... slower (better quality)
     p7              18           E..V....... slowest (best quality)
  -tune              <int>        E..V....... Set the encoding tuning info (from 1 to 4) (default hq)

관련 정보