ffmpeg에서 nvenc와 함께 CRF 인코딩을 사용하려면 어떻게해야합니까? do ffmpeg

이것은 2GB에서 300MB로 비디오 크기 조정 (1080p)에 대한 현재 명령이지만 시간이 오래 걸립니다.

mkdir newfiles
for %%a in ("*.mp4") do ffmpeg -i "%%a" -c:v  libx264 -preset slow -crf 21 -c:a aac -b:a 128k -vf scale=678:-2 "newfiles\%%~na.mp4"
pause

NVIDIA GTX1070으로 nvenc를 사용해 보았습니다.

mkdir newfiles
for %%a in ("*.mp4") do ffmpeg -i "%%a" -c:v h264_nvenc -preset slow -c:a aac -b:a 128k -vf scale=678:-2 "newfiles\%%~na.mp4"
pause

출력 크기는 항상 원래 크기의 3⨉ 또는 5⨉입니다 – nvenc는 사용하지 않습니다 -crf.

그렇다면 고품질 및 작은 크기의 비디오를 변환 / 크기 조정하기 위해 ffmpeg와 함께 nvenc를 어떻게 사용합니까? 인코딩에 GPU를 사용해야합니까?



답변

CRF 기반 인코딩의 경우 아래 스 니펫에서 다음 인수를 FFmpeg로 전달하십시오.

-c:v h264_nvenc -rc:v vbr_hq -cq:v 19 -b:v 2500k -maxrate:v 5000k -profile:v high

물론 대상 비트 전송률과 고정 cq값 을 조정해야 합니다. 19는 시각적으로 0과 동일하지만 파일 크기와의 압축 균형을 유지하기 때문에 권장되는 설정입니다. CRF의 기능에 대한 자세한 내용은 글을 참조하십시오 .

점을 유의 -cq스케일이 0 즉, 대수 인 무손실 본질적 51는 최악의 절대 것이다.

품질은 상기와 같은 옵션을 추가함으로써 따라 개선 될 수 B 프레임을 많아야 3이 제한 (이는 상기 H.264 메인 프로파일을 요구하며.베이스 라인 프로파일이 아닌 지지체 B 프레임을한다.이를 위해, 전달 -bf {uint}-bf:v 44 개의 B- 프레임을 사용하는 인코더가 되는 비디오 인코더 .

여기서 핵심 부분은 -cq:v 19-rc:v vbr_hq인수이며, CRF 값 19를 준수하면서 미리 설정된 가변 비트 전송률과 최대 허용 비트 전송률 ( -b:v-maxrate:v)로 인코더를 조정할 수 있습니다 .

이제 NVENC에 대한 작은 메모와 고품질 인코딩을 위해 튜닝하십시오.

다른 하드웨어 기반 인코더와 마찬가지로 NVENC에는 몇 가지 제한 사항이 있으며 특히 HEVC의 경우 알려진 제한 사항이 있습니다.

  1. 파스칼에서 :

    HEVC 인코딩의 경우 다음 제한 사항이 적용됩니다.

    • 32보다 큰 CTU 크기는 지원되지 않습니다.
    • HEVC의 B- 프레임도 지원되지 않습니다.
    • NVENC 인코더가 지원하는 텍스처 형식은 인코더가 사용할 수있는 색 공간을 제한합니다. 현재 4 : 2 : 0 (8 비트) 및 4 : 4 : 4 (10 비트)를 지원합니다. 4 : 2 : 2 10 비트와 같은 외부 형식은 지원되지 않습니다. 이는 이러한 색 공간이 필요한 일부 워크 플로우에 영향을 미칩니다.
    • 사전 제어도 32 프레임으로 제한됩니다. 자세한 내용 은 사설을 참조하십시오.

Turing 은 HEVC에 대한 B- 프레임 지원과 B- 프레임을 참조로 사용할 수있는 기능을 추가하여 Pascal에서 사용할 수있는 모든 개선 사항을 제공합니다. 이 기능에 대한 예는 답변을 참조하십시오 .

  1. Maxwell Gen 2 (GM200x 시리즈 GPU)에서 :

    HEVC 인코딩에는 다음 기능이 없습니다.

Maxwell에 미치는 영향은 제한된 비트 전송률 하에서 HEVC를 사용하는 움직임이 많은 장면은 lookahead 기능이 누락되고 SAO (Adaptive Sample Offset) 루프 필터링 기능으로 인해 아티팩트 (블로킹)가 발생할 수 있다는 것입니다. Pascal은이 기능에서 다소 개선되었지만 비디오 인코더가 내장 된 SDK 버전에 따라 일부 기능을 사용하지 못할 수도 있습니다.

예를 들어, Pascal에서 H.264 인코딩을위한 가중치 예측 모드에는 NVENC SDK 8.0x 이상이 필요하며이 인코딩 모드는 B 프레임 지원도 비활성화합니다. 마찬가지로 NPP (Nvidia Performance Primitives)에서 실행되는 하드웨어 기반 스케일러와 NVENC를 함께 사용하면 스케일링 아티팩트 비용, 특히 업 스케일링 된 컨텐츠에서 비디오 스케일링 애플리케이션으로 성능이 향상 될 수 있습니다. NPP의 스케일링 기능이 GPU의 CUDA 코어에서 실행됨에 따라 비디오 인코딩 파이프 라인에도 영향을 미치며, 추가로드로 인한 성능 영향을 사례별로 분석하여 성능 품질을 결정해야합니다. 절충이 허용됩니다.

명심하십시오 : 하드웨어 기반 엔코더는 동등한 소프트웨어 기반 구현보다 항상 약간 덜 커스터마이징을 제공하므로 마일리지와 허용 가능한 출력 품질은 항상 다릅니다.

그리고 당신의 참고를 위해 :

FFmpeg를 사용하면 다음을 통해 항상 엔코더 설정을 사용자 정의 할 수 있습니다.

ffmpeg -h encoder {encoder-name}

따라서 NVENC 기반 인코더의 경우 다음을 실행할 수 있습니다.

ffmpeg -h encoder=hevc_nvenc

ffmpeg -h encoder=h264_nvenc

또한 다음을 실행하여 모든 NVENC 기반 인코더와 NPP 기반 스케일러를 볼 수 있습니다.

for i in encoders decoders filters; do
    echo $i:; ffmpeg -hide_banner -${i} | egrep -i "npp|cuvid|nvenc|cuda"
done

테스트 베드의 샘플 출력 :

encoders:
 V..... h264_nvenc           NVIDIA NVENC H.264 encoder (codec h264)
 V..... nvenc                NVIDIA NVENC H.264 encoder (codec h264)
 V..... nvenc_h264           NVIDIA NVENC H.264 encoder (codec h264)
 V..... nvenc_hevc           NVIDIA NVENC hevc encoder (codec hevc)
 V..... hevc_nvenc           NVIDIA NVENC hevc encoder (codec hevc)
decoders:
 V..... h263_cuvid           Nvidia CUVID H263 decoder (codec h263)
 V..... h264_cuvid           Nvidia CUVID H264 decoder (codec h264)
 V..... hevc_cuvid           Nvidia CUVID HEVC decoder (codec hevc)
 V..... mjpeg_cuvid          Nvidia CUVID MJPEG decoder (codec mjpeg)
 V..... mpeg1_cuvid          Nvidia CUVID MPEG1VIDEO decoder (codec mpeg1video)
 V..... mpeg2_cuvid          Nvidia CUVID MPEG2VIDEO decoder (codec mpeg2video)
 V..... mpeg4_cuvid          Nvidia CUVID MPEG4 decoder (codec mpeg4)
 V..... vc1_cuvid            Nvidia CUVID VC1 decoder (codec vc1)
 V..... vp8_cuvid            Nvidia CUVID VP8 decoder (codec vp8)
 V..... vp9_cuvid            Nvidia CUVID VP9 decoder (codec vp9)
filters:
 ... hwupload_cuda     V->V       Upload a system memory frame to a CUDA device.
 ... scale_npp         V->V       NVIDIA Performance Primitives video scaling and format conversion

답변

해결책을 찾았습니다.

ffmpeg -hwaccel auto -i in.mp4 -c:v h264_nvenc -preset llhq -rc constqp -qp 21 -c:a copy out.mp4

h264_nvenc -qp대신을 사용 하는 것 같습니다 -crf. 이 옵션 -rc은로 설정되어있는 동안에 만 작동 합니다 constqp.


답변

대한 -crflibx264 관련이있을 수 있습니다 -cq또는 -qph264_nvenc에서 :

-crf 일정한 품질 모드를위한 품질 선택

-cq VBR 속도 제어에서 일정한 품질 모드에 대한 목표 품질 수준 (0 ~ 51, 0은 자동을 의미)을 설정

-qp 일정한 양자화 파라미터 레이트 제어 방법 (-1 ~ 51) (디폴트 -1)

가장 빠른 하드웨어 가속 인코딩 방법 :

ffmpeg -hwaccel cuvid -c:v h264_cuvid -resize 640x480 -i input.mp4 -c:v h264_nvenc -cq 21 -c:a copy output.mp4

-resize입력 해상도 (하드웨어); 는 FFmpeg 필요가 컴파일되지하기 --enable-libnpp위한 scale_npp필터입니다.

더 많은 정보를 위해서:

ffmpeg -h encoder=h264_nvenc

ffmpeg -h denoder=h264_cuvid