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?
ffmpeg
video-encoding
hongducwb
sumber
sumber
slow
kefast
dalam perintah pertama Anda. CRF tidak diterapkan dinvenc
.Jawaban:
Untuk penyandian berbasis CRF, berikan argumen berikut dalam cuplikan di bawah ini ke FFmpeg:
Tentu saja, Anda harus menyesuaikan laju bit target dan
cq
nilai 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
-cq
skalanya 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 4
akan menghasilkan encoder menggunakan 4 B-frame.Bagian-bagian penting di sini adalah argumen
-cq:v 19
dan-rc:v vbr_hq
argumennya, yang memungkinkan Anda untuk menyetel encoder dengan bitrate variabel preset dan bitrate maksimum yang diijinkan (-b:v
dan-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:
Di Pascal:
Untuk encode HEVC, batasan berikut ini berlaku:
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.
Dan di Maxwell Gen 2 (GPU seri GM200x):
Pengkodean HEVC tidak memiliki fitur berikut:
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:
Jadi, untuk enkode berbasis NVENC, Anda dapat menjalankan:
Anda juga dapat melihat semua encoders berbasis NVENC dan scaler berbasis NPP (jika dibangun seperti itu) dengan menjalankan:
Contoh hasil pada testbed saya:
sumber
vbr_minqp
tampaknya sudah ditinggalkan sekarang. Agak setuju bahwa jawaban ini bisa disalahpahami karena tidak ada mode CRF untukh264_nvenc
.Saya yakin saya menemukan solusinya:
Tampaknya h264_nvenc menggunakan
-qp
bukan-crf
. Opsi ini hanya berfungsi saat-rc
diatur keconstqp
.sumber
-qp
semuanya berbeda dari-crf
. h264_nvenc 's-qp
setara dengan libx264 ' s-qp
Untuk
-crf
penggantian dari libx264 mungkin-cq
atau-qp
dari 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:
-resize
resolusi input (dalam perangkat keras); tidak perlu untuk ffmpeg untuk dikompilasi dengan--enable-libnpp
untukscale_npp
filter.Untuk info lebih lanjut:
ffmpeg -h encoder=h264_nvenc
sumber