Bagaimana saya bisa menggunakan pengkodean CRF dengan nvenc di ffmpeg?

22

Ini adalah perintah saya saat ini untuk mengubah ukuran video (1080p) dari 2GB menjadi 300MB, tetapi butuh banyak waktu:

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

Saya mencoba nvenc dengan NVIDIA GTX1070 saya:

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

Ukuran output selalu 3⨉ atau 5⨉ ukuran asli - nvenc tidak digunakan -crf.

Jadi bagaimana saya menggunakan nvenc dengan ffmpeg untuk mengkonversi / mengubah ukuran video dengan kualitas tinggi dan ukuran kecil? Haruskah saya menggunakan GPU untuk penyandian?

hongducwb
sumber
Anda dapat mengubah slowke fastdalam perintah pertama Anda. CRF tidak diterapkan di nvenc.
Gyan
Tujuan NVENC adalah untuk memungkinkan pengodean video waktu-nyata (untuk hal-hal seperti panggilan video); kualitas adalah pertimbangan bawahan.
CL.

Jawaban:

23

Untuk penyandian berbasis CRF, berikan argumen berikut dalam cuplikan di bawah ini ke FFmpeg:

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

Tentu saja, Anda harus menyesuaikan laju bit target dan cqnilai tetap . 19 adalah pengaturan yang direkomendasikan karena 'identik secara visual dengan 0, namun mempertahankan kompresi kompresi yang baik ke ukuran file. Lihat artikel ini untuk informasi lebih lanjut tentang apa yang dilakukan CRF.

Catat bahwa -cqskalanya adalah logaritmik, artinya 0 pada dasarnya adalah lossless dan 51 akan menjadi yang terburuk absolut.

Kualitas dapat ditingkatkan lebih lanjut dengan menambahkan opsi seperti B-frame (batasi hingga 3, paling banyak, dan ini membutuhkan profil utama H.264 dan di atasnya. Profil dasar tidak mendukung B-frame. Untuk melakukan ini, teruskan -bf {uint}ke encoder video, sehingga -bf:v 4akan menghasilkan encoder menggunakan 4 B-frame.

Bagian-bagian penting di sini adalah argumen -cq:v 19dan -rc:v vbr_hqargumennya, yang memungkinkan Anda untuk menyetel encoder dengan bitrate variabel preset dan bitrate maksimum yang diijinkan ( -b:vdan -maxrate:v) sambil mematuhi nilai CRF 19.

Dan sekarang, catatan kecil tentang NVENC, dan menyetelnya untuk penyandian berkualitas tinggi:

NVENC, seperti encoder berbasis perangkat keras lainnya, memiliki beberapa keterbatasan, dan khususnya dengan HEVC, berikut adalah batasan yang diketahui:

  1. Di Pascal:

    Untuk encode HEVC, batasan berikut ini berlaku:

    • Ukuran CTU di atas 32 tidak didukung.
    • B-frame di HEVC juga tidak didukung.
    • Format tekstur yang didukung oleh NVENC encoder membatasi ruang warna yang dapat digunakan oleh encoder. Untuk saat ini, kami memiliki dukungan untuk 4: 2: 0 (8-bit) dan 4: 4: 4 (untuk 10-bit). Format asing seperti 4: 2: 2 10-bit tidak didukung. Ini akan memengaruhi beberapa alur kerja di mana ruang warna semacam itu diperlukan.
    • Kontrol ke depan juga dibatasi hingga 32 frame. Anda mungkin ingin melihat editorial ini untuk lebih jelasnya.

Turing memiliki semua perangkat tambahan yang tersedia untuk Pascal, dengan tambahan dukungan B-frame untuk HEVC dan kemampuan untuk menggunakan B-frame sebagai referensi. Lihat jawaban ini untuk contoh tentang kemampuan ini.

  1. Dan di Maxwell Gen 2 (GPU seri GM200x):

    Pengkodean HEVC tidak memiliki fitur berikut:

    • Kemampuan filter loop Adaptive Offset (SAO).
    • Kuantisasi adaptif
    • Kontrol tingkat lihat-depan.

Dampak di sini untuk Maxwell adalah bahwa adegan berat gerak dengan HEVC di bawah bitrate terbatas dapat menderita artifacting (blockiness) karena fungsi lookahead yang hilang dan kemampuan penyaringan loop adaptif sampel offset (SAO) adaptif. Pascal agak meningkatkan kemampuan ini, tetapi tergantung pada versi SDK yang membuat video encoder, tidak semua fitur mungkin tersedia.

Misalnya, mode prediksi berbobot untuk enkode H.264 pada Pascal memerlukan NVENC SDK 8.0x dan di atasnya, dan mode enkode ini juga akan menonaktifkan dukungan bingkai-B. Demikian juga, kombinasi scaler berbasis perangkat keras yang menjalankan Nvidia Performance Primitives (NPP) dengan NVENC dapat memperkenalkan peningkatan kinerja dengan aplikasi penskalaan video dengan biaya penskalaan artefak, terutama dengan konten yang ditingkatkan. Hal yang sama juga berdampak pada pipa penyandian video karena fungsi penskalaan NPP menjalankan inti CUDA pada GPU, dan dengan demikian, dampak kinerja yang diperkenalkan oleh beban tambahan harus dianalisis berdasarkan kasus per kasus untuk menentukan apakah kualitas-kinerja trade-off dapat diterima.

Ingatlah ini: Encoder berbasis perangkat keras akan selalu menawarkan penyesuaian yang sedikit lebih rendah daripada implementasi berbasis perangkat lunak yang setara, dan karenanya, jarak tempuh Anda dan kualitas output yang dapat diterima akan selalu berbeda.

Dan untuk referensi Anda:

Dengan FFmpeg, Anda selalu dapat merujuk ke pengaturan penyandi untuk penyesuaian dengan:

ffmpeg -h encoder {encoder-name}

Jadi, untuk enkode berbasis NVENC, Anda dapat menjalankan:

ffmpeg -h encoder=hevc_nvenc

ffmpeg -h encoder=h264_nvenc

Anda juga dapat melihat semua encoders berbasis NVENC dan scaler berbasis NPP (jika dibangun seperti itu) dengan menjalankan:

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

Contoh hasil pada testbed saya:

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
林正浩
sumber
1
Jawaban bagus! Wiki ffmpeg di nvenc sedikit ketinggalan jaman dan tidak memiliki semua info itu ... jika Anda punya waktu beberapa menit, akan lebih bagus jika Anda bisa menyumbangkan pengetahuan Anda di sana: trac.ffmpeg.org/wiki/HWAccelIntro
slhck
1
terima kasih atas jawaban :) wiki ffmpeg butuh jawaban lebih seperti ini
hongducwb
Terima kasih untuk umpan baliknya. Saya akan melihat menambahkan ini ke wiki FFmpeg.
林正浩
file warna output tampak lebih gelap, saya ingat satu argumen dapat mengontrol warna sama dengan file input
hongducwb
2
vbr_minqptampaknya sudah ditinggalkan sekarang. Agak setuju bahwa jawaban ini bisa disalahpahami karena tidak ada mode CRF untuk h264_nvenc.
slhck
4

Saya yakin saya menemukan solusinya:

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

Tampaknya h264_nvenc menggunakan -qpbukan -crf. Opsi ini hanya berfungsi saat -rcdiatur ke constqp.

Alexander01998
sumber
1
Tidak, -qpsemuanya berbeda dari -crf. h264_nvenc 's -qpsetara dengan libx264 ' s-qp
Meow
@ Meow Itu cukup dekat bagi saya, tapi senang mengetahui ada perbedaan. Bagi siapa saja yang mungkin melihat ini di masa depan, halaman ini menjelaskan perbedaan antara CRF dan QP.
Alexander01998
3

Untuk -crfpenggantian dari libx264 mungkin -cqatau -qpdari h264_nvenc:

-crf Pilih kualitas untuk mode kualitas konstan

-cq Tetapkan tingkat kualitas target (0 hingga 51, 0 berarti otomatis) untuk mode kualitas konstan dalam kontrol laju VBR

-qp Metode kontrol laju parameter kuantisasi konstan (dari -1 hingga 51) (default -1)

Metode penyandian dipercepat perangkat keras tercepat:

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

-resizeresolusi input (dalam perangkat keras); tidak perlu untuk ffmpeg untuk dikompilasi dengan --enable-libnppuntuk scale_nppfilter.

Untuk info lebih lanjut:

ffmpeg -h encoder=h264_nvenc

ffmpeg -h denoder=h264_cuvid
abc
sumber