Làm cách nào để sử dụng mã hóa CRF với nvenc trong ffmpeg?


22

Đây là lệnh hiện tại của tôi để thay đổi kích thước video (1080p) từ 2GB thành 300MB, nhưng mất rất nhiều thời gian:

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

Tôi đã thử nvenc với NVIDIA GTX1070 của tôi:

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

Kích thước đầu ra luôn bằng 3⨉ hoặc 5⨉ kích thước ban đầu - nvenc không sử dụng -crf.

Vậy làm cách nào để sử dụng nvenc với ffmpeg để chuyển đổi / thay đổi kích thước video với chất lượng cao và kích thước nhỏ? Tôi có nên sử dụng GPU để mã hóa?


Bạn có thể thay đổi slowthành fasttrong lệnh đầu tiên của bạn. CRF không được thực hiện trong nvenc.
Gyan

Mục tiêu của NVENC là cho phép mã hóa video theo thời gian thực (đối với những thứ như cuộc gọi video); chất lượng là một sự xem xét cấp dưới.
CL.

Câu trả lời:


23

Đối với mã hóa dựa trên CRF, chuyển các đối số sau trong đoạn mã dưới đây cho FFmpeg:

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

Tất nhiên, bạn sẽ cần điều chỉnh tốc độ bit mục tiêu và cqgiá trị cố định . 19 là cài đặt được đề xuất vì nó giống hệt với 0, nhưng vẫn giữ được sự trao đổi nén tốt với kích thước tệp. Xem bài viết này để biết thêm về những gì CRF làm.

Lưu ý rằng -cqthang đo là logarit, có nghĩa là 0 về cơ bản là không mất mát và 51 sẽ là mức tồi tệ nhất tuyệt đối.

Chất lượng có thể được cải thiện hơn nữa trên bằng cách thêm tùy chọn như B-khung (hạn chế này đến 3, tại hầu hết, và điều này đòi hỏi phải có hồ sơ cá nhân H.264 Main trở lên. Hồ sơ cơ bản không hỗ trợ B-khung. Để làm điều này, vượt qua -bf {uint}để bộ mã hóa video, như vậy -bf:v 4sẽ dẫn đến bộ mã hóa sử dụng 4 khung B.

Các phần chính ở đây là -cq:v 19và các -rc:v vbr_hqđối số, cho phép bạn điều chỉnh bộ mã hóa với cả tốc độ bit được đặt trước và tốc độ bit cho phép tối đa ( -b:v-maxrate:v ) trong khi tuân thủ giá trị CRF là 19.

Và bây giờ, ghi chú nhỏ về NVENC và điều chỉnh nó để mã hóa chất lượng cao:

NVENC, giống như bất kỳ bộ mã hóa dựa trên phần cứng nào khác, có một số hạn chế và đặc biệt với HEVC, đây là những hạn chế đã biết:

  1. Trên Pascal:

    Đối với mã hóa HEVC, áp dụng các giới hạn sau:

    • Kích thước CTU trên 32 không được hỗ trợ.
    • Khung B trong HEVC cũng không được hỗ trợ.
    • Các định dạng kết cấu được hỗ trợ bởi bộ mã hóa NVENC giới hạn các không gian màu mà bộ mã hóa có thể làm việc. Hiện tại, chúng tôi có hỗ trợ cho 4: 2: 0 (8 bit) và 4: 4: 4 (cho 10 bit). Các định dạng không liên quan như 4: 2: 2 10 bit không được hỗ trợ. Điều này sẽ ảnh hưởng đến một số quy trình công việc trong đó các không gian màu như vậy được yêu cầu.
    • Nhìn về phía trước kiểm soát cũng được giới hạn trong 32 khung hình. Bạn có thể muốn xem bài xã luận này để biết thêm chi tiết.

Turing có tất cả các cải tiến có sẵn cho Pascal, với việc bổ sung hỗ trợ khung B cho HEVC và khả năng sử dụng khung B làm tham chiếu. Xem câu trả lời này cho một ví dụ về khả năng này.

  1. Và trên Maxwell Gen 2 (GPU dòng GM200x):

    Mã hóa HEVC thiếu các tính năng sau:

    • Các khả năng lọc vòng lặp thích ứng mẫu (SAO).
    • Lượng tử hóa thích ứng
    • Kiểm soát tỷ lệ nhìn về phía trước.

Tác động ở đây đối với Maxwell là các cảnh nặng chuyển động với HEVC dưới các bitrate bị ràng buộc có thể bị tạo ra (tính chặn) do các chức năng tìm kiếm bị thiếu và khả năng lọc vòng lặp thích nghi mẫu (SAO). Pascal đã phần nào cải thiện khả năng này, nhưng tùy thuộc vào phiên bản SDK mà bộ mã hóa video được xây dựng, không phải tất cả các tính năng đều có sẵn.

Chẳng hạn, chế độ dự đoán có trọng số cho mã hóa H.264 trên Pascal yêu cầu NVENC SDK 8.0x trở lên và chế độ mã hóa này cũng sẽ vô hiệu hóa hỗ trợ khung B. Tương tự, sự kết hợp của các bộ chia tỷ lệ dựa trên phần cứng chạy từ Nvidia Performance Primitive (NPP) với NVENC có thể giới thiệu các cải tiến hiệu suất với các ứng dụng chia tỷ lệ video với chi phí nhân rộng, đặc biệt là với nội dung được nâng cấp. Điều tương tự cũng tác động đến đường ống mã hóa video khi các chức năng mở rộng của NPP chạy khỏi lõi CUDA trên GPU và do đó, tác động hiệu suất được giới thiệu bởi tải thêm nên được phân tích theo từng trường hợp cụ thể để xác định xem chất lượng hiệu suất có phải không đánh đổi là chấp nhận được

Hãy ghi nhớ điều này: Bộ mã hóa dựa trên phần cứng sẽ luôn cung cấp tùy chỉnh ít hơn một chút so với triển khai dựa trên phần mềm tương đương và do đó, số dặm và chất lượng đầu ra chấp nhận được của bạn sẽ luôn khác nhau.

Và để bạn tham khảo:

Với FFmpeg, bạn luôn có thể tham khảo các cài đặt của bộ mã hóa để tùy chỉnh bằng cách:

ffmpeg -h encoder {encoder-name}

Vì vậy, đối với các bộ mã hóa dựa trên NVENC, bạn có thể chạy:

ffmpeg -h encoder=hevc_nvenc

ffmpeg -h encoder=h264_nvenc

Bạn cũng có thể thấy tất cả các bộ mã hóa dựa trên NVENC và bộ mở rộng dựa trên NPP (nếu được xây dựng như vậy) bằng cách chạy:

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

Sản lượng mẫu trên thử nghiệm của tôi:

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

1
Câu trả lời chính xác! Wiki ffmpeg trên nvenc hơi lỗi thời và thiếu tất cả thông tin đó nếu bạn có vài phút, thật tuyệt nếu bạn có thể đóng góp kiến ​​thức của mình ở đó: trac.ffmpeg.org/wiki/HWAccelIntro
slhck

1
cảm ơn vì đã trả lời :) wiki ffmpeg cần nhiều câu trả lời như thế này
hongducwb

Cảm ơn vì bạn đã phản hồi. Tôi sẽ xem xét thêm phần này vào wiki FFmpeg.
林正浩

Các tệp màu đầu ra có vẻ tối hơn, tôi nhớ một đối số có thể kiểm soát màu giống như tệp đầu vào
hongducwb

2
vbr_minqpbây giờ dường như bị phản đối Loại đồng ý rằng câu trả lời này có thể bị hiểu nhầm là không có chế độ CRF h264_nvenc.
slhck

4

Tôi tin rằng tôi đã tìm thấy một giải pháp:

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

Có vẻ như h264_nvenc sử dụng -qpthay vì -crf. Tùy chọn này chỉ hoạt động trong khi -rcđược đặt thành constqp.


1
Không, -qplà khác nhau từ -crf. h264_nvenc 's -qptương đương với libx264 ' s-qp
Meow

@Meow Điều đó đủ gần với tôi, nhưng thật tốt khi biết rằng có một sự khác biệt. Đối với bất kỳ ai có thể thấy điều này trong tương lai, trang này giải thích sự khác biệt giữa CRF và QP.
Alexander01998

3

Để -crfthay thế từ libx264 có thể -cqhoặc -qptừ h264_nvenc:

-crf Chọn chất lượng cho chế độ chất lượng không đổi

-cq Đặt mức chất lượng mục tiêu (0 đến 51, 0 có nghĩa là tự động) cho chế độ chất lượng không đổi trong điều khiển tốc độ VBR

-qp Phương pháp kiểm soát tốc độ tham số lượng tử hóa không đổi (từ -1 đến 51) (mặc định -1)

Phương pháp mã hóa tăng tốc phần cứng nhanh nhất:

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

-resizeđộ phân giải trên đầu vào (trong phần cứng); không cần ffmpeg để được biên soạn với --enable-libnppcho scale_nppbộ lọc.

Để biết thêm thông tin:

ffmpeg -h encoder=h264_nvenc

ffmpeg -h denoder=h264_cuvid
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.