Bagaimana saya dapat menggunakan ffmpeg
untuk mengurangi ukuran video dengan menurunkan kualitas (seminimal mungkin, secara alami, tetapi saya perlu menjalankannya di perangkat seluler yang tidak memiliki banyak ruang yang tersedia)?
Saya lupa menulis satu hal. Ketika video dapat menggunakan subtitle (* .srt atau * .sub) saya ingin mengonversinya juga agar sesuai dengan parameter file video yang dikonversi.
video
ffmpeg
compression
xralf
sumber
sumber
ffmpeg
halaman manual menunjukkan-fs
opsi untuk membatasi ukuran output, apakah sesuatu sepertiffmpeg -i in.avi -fs 100M out.avi
bekerja?man ffmpeg | wc -l --> 5254
.avi
bukan masalah utama ..avi
hanya sebuah wadah. Masalah utama adalah codec mana yang Anda gunakan .. Banyak (sebagian besar?).avi
Vids menggunakan codec gaya lama (misalnya XviD) yang baik-baik saja, tetapi lebih besar untuk kualitas yang sama jika dibandingkan dengan generasi codec berikutnya .. Anda biasanya bisa mendapatkan pengodean ketat dengan menggunakanH.264
standar kompresi video (mis. codecx264
) danaac
kompresi untuk audio .. Wadah dan codec yang Anda gunakan terserah Anda dan ponsel Anda ....mp4
Wadah diterima dengan baik .. (tetapi dapatkah telepon Anda menanganinya: lihat tautan iniJawaban:
Lihat jawaban ini . Dikutip di bawah ini untuk kenyamanan:
Variasikan codec sesuai kebutuhan - libx264 mungkin tersedia jika libx265 tidak, dengan biaya ukuran file yang dihasilkan sedikit lebih besar.
sumber
-crf 24
mengambil 255,3MB video yang saya miliki dan menguranginya menjadi 72,7MB tanpa menurunkan kualitas secara nyata. Selamat menikmati!libx265
untuk pengurangan ukuran lebih banyak.ffmpeg -i input.avi -vcodec libx264 -crf 24 output.avi
. Ini mengurangi video 100MB menjadi 9MB. Sangat sedikit perubahan dalam kualitas video. Terima kasih!Kecuali jika Anda mencari bitrate tertentu, saya akan merekomendasikan
-crf
opsi. Ini adalah yang paling umum digunakan untukx264
penyandian: http://slhck.info/articles/crfSingkatnya: CRF 23 akan menghasilkan film berkualitas "DVD" (~ 700MB-1GB) dan nilai CRF yang lebih rendah akan berkualitas lebih tinggi (file lebih besar).
sumber
Anda mengatakan ingin mengurangi ukuran file agar sesuai dengan lebih banyak video di perangkat seluler, yang juga merupakan usecase saya. Semua jawaban di sini adalah untuk mengurangi kualitas kompresi tetapi tidak ada yang menyebutkan mengurangi ukuran bingkai video. Ini jauh lebih cepat, dari sekitar 3 sampai 5 kali lebih cepat daripada kompresi ulang dalam pengalaman saya. Lihat dokumen ffmpeg tentang penskalaan untuk info lebih lanjut.
sumber
Saya menguji sebagian besar jawaban yang diajukan lainnya untuk pertanyaan ini. Kesimpulan data uji di bawah ini. Ini adalah jawaban yang diajukan yang saya uji:
(BR) Ubah bitrate, menggunakan:
(CR) Variasikan Faktor Tingkat Konstan, menggunakan:
(SZ) Ubah ukuran layar video (misalnya menjadi setengah ukuran pikselnya), menggunakan:
(BL) Ubah profil H.264 menjadi "dasar", menggunakan:
(DF) Gunakan pemrosesan ffmpeg default, menggunakan:
DATA
Saya menghitung bitrate target untuk (BL) menggunakan metode yang diusulkan.
=== File A - Bagaimana Node Membantu Menggerakkan Angular-Fnbixa7Ts6M.mkv ===
=== File B - Menggunakan GraphQL dengan Angular _ By - Lee Costello-OGyFxqt5INw.mkv ===
KESIMPULAN
Metode (SZ) jelas merupakan metode tercepat. Itu 2X hingga 4X lebih cepat. Ini bisa menjadi masalah besar pada video definisi tinggi, karena semua metode lain membutuhkan waktu lebih lama untuk dikonversi daripada panjang video yang sebenarnya! Misalnya, metode (CR) membutuhkan waktu 53 menit untuk mengonversi video 21 menit.
Metode (SZ) jelas merupakan metode terbaik jika definisi video lebih besar dari definisi layar yang akan menampilkannya. Misalnya, jika ponsel Anda hanya dapat menampilkan gambar 1080p, mengirimkannya video 3840x2160 hanya sia-sia. Akan lebih baik setengah ukurannya menjadi 1080p.
Beberapa jawaban yang diajukan sebenarnya MENINGKATKAN ukuran beberapa video. Misalnya, metode (BR) lebih dari dua kali lipat ukuran sampel 1080p. Namun itu membuat ukuran 2160p sepertiga. Untuk sampel definisi tinggi, metode (CR), (BL) dan (DF) semuanya MENINGKATKAN ukuran video.
Jawaban yang benar (atau terbaik)
Itu selalu yang terbaik untuk pertama-tama menurunkan resolusi ke maksimum yang didukung oleh tampilan target Anda.
Jika Anda ingin mengurangi ukuran file lebih lanjut, itu akan tergantung pada pilihan pribadi. Anda dapat mengurangi konten informasi atau meningkatkan kompresi.
Anda dapat menurunkan resolusi lebih banyak jika itu bukan sesuatu yang mengkhawatirkan Anda.
Jika video tidak menyertakan adegan tindakan cepat, Anda mungkin ingin menurunkan kecepatan bingkai.
Jika Anda memiliki prosesor yang kuat dan ruang adalah satu-satunya masalah, Anda dapat meningkatkan tingkat kompresi.
Bit rate adalah kombinasi dari beberapa faktor. Jadi hanya memberitahu ffmpeg untuk menurunkan bit rate mungkin tidak memberi Anda hasil yang Anda inginkan.
Cara lain untuk konten informasi yang lebih rendah adalah dengan menurunkan kedalaman warna. Cara melakukan ini belum dibahas.
sumber
Perhatikan bahwa tampaknya
ffmpeg
sudah melakukan beberapa optimasi ketika dijalankan tanpa opsi, jadi sebelum mencoba menggunakan pengaturan yang Anda tidak mengerti atau memutuskan untuk kehilangan informasi secara eksplisit, cobalah konversi default:Dalam kasus saya ini mengurangi bitrate dari video dan audio (Anda dapat memeriksa dan membandingkan file input dan output dengan menjalankannya
ffprobe
), mengubah video 700 Mb menjadi 60 Mb yang kualitasnya hampir serupa.sumber
Saya punya resep yang awalnya saya buat untuk diri sendiri untuk mengonversi video Motion JPEG yang dihasilkan kamera lama saya (itu adalah video yang sangat besar, karena setiap frame adalah gambar JPEG keseluruhan) menjadi h264. Berikut ini adalah adaptasi untuk jenis video lainnya (kursus, dll).
Saya tidak menggunakan ffmpeg , tetapi mplayer dan mencoder . Pertama, Kita harus demux audio dengan mplayer:
-vo null
dan-ao null
parameter memberitahu mplayer untuk tidak mengambil video.Pada langkah selanjutnya, kita akan melakukan kompresi 3-pass dengan mencoder. Pada pass pertama kita akan memilih kompresi Mode Kualitas Konstan yang sesuai ( parameter crf ) sebagai titik awal:
Anda dapat menambahkan parameter slow_firstpass ke -x264encopts jika Anda paranoid dengan kualitas akhir video. Manual Mencoder mengatakan bahwa opsi ini menonaktifkan beberapa parameter yang "secara signifikan meningkatkan kecepatan encoding sementara berdampak kecil atau tidak sama sekali pada kualitas umpan akhir". Jadi, gunakan hanya pada langkah terakhir.
Anda harus mencoba beberapa nilai untuk crf - coba mulai dari 25 dan terus meningkat hingga Anda mencatat artefak pada video yang dihasilkan (nilai yang lebih tinggi menekan lebih banyak). Ingat pass encoding berikutnya akan meningkatkan kualitas yang Anda pilih untuk crf .
Alternatif untuk veryslow ditetapkan adalah lambat , lambat , menengah dll Lihat panduan mencoder untuk daftar lengkap.
ratetol mengontrol variasi bitrate - Saya tidak yakin apakah saya melakukan hal yang benar di sini, tapi saya mengaturnya ke nilai maksimum untuk membiarkan kebebasan total untuk mencoder untuk memilih bitrate yang tepat untuk setiap adegan.
Setelah lulus pertama, Anda akan perhatikan bahwa baris terakhir memberi Anda bitrate rata-rata yang akan Anda gunakan pada langkah berikutnya:
Ubah parameter crf , direkomendasikan pada pass pertama, untuk bitrate , diperlukan pada pass berikutnya:
Pengkodean pass kedua ini akan membaca statistik yang dihasilkan pada pass pertama (
divx2pass.log
dandivx2pass.log.mbtree
) untuk mengoptimalkan kompresi.Catatan Anda akan menggunakan input video yang sama, bukan yang dihasilkan oleh video keluaran pertama - pertama lulus hanya berguna untuk memeriksa kualitas awal.
Perhatikan juga bahwa
pass=3
( tidakpass=2
) akan menghasilkan file statistik baru, sehingga Anda dapat mengulangi langkah terakhir sebanyak yang Anda inginkan. Saya biasanya melakukanpass=3
dua kali, selalu memperhatikan hasil bitrate.Sementara itu, Anda dapat mengompresi audio juga, menggunakan
lame
atauoggenc
:Akhirnya, kami akan mem-remux audio dan video
-of lavf -lavfopts format=mp4
menghasilkanmp4
format file menggunakan lavopts muxers.sumber
Saya mengompresi presentasi video HD 40 menit dari 505MB menjadi 183MB
Itu seperti pergi dari 100MB → 36MB.
Video asli adalah HD dan output hampir nol perbedaan nyata.
Ini adalah file video "Saya ingin tetap di sini, tetapi HD berlebihan."
Inilah perintah yang saya gunakan dengan alasan:
ffmpeg -n -loglevel error -i inputfile.mp4 -vcodec libx264 -crf 28 -preset faster -tune film outputfilename.mp4
-n
: hindari menimpa file keluaran (lebih aman untuk pengujian kemudian batching)-loglevel error
: tampilkan kesalahan dan sembunyikan baris dan baris progres-i inputfile.mp4
: masukkan nama file-vcodec libx264
: digesek dari jawaban teratas di atas-crf 28
: Single-pass kompresi dengan perbedaan yang nyata minor ( "0 = lossless, 23 = default, 51 = terburuk; subyektif berbagai waras adalah 17- 28 " ) docs ref-preset faster
: terlihat 2x lebih cepat dari waktu pengkodean default dokumen 'sedang'-tune film
: tentukan input adalah video HQ (opsi lain termasuk 'kartun', 'gambar diam' ..) ref docsoutputfilename.mp4
: nama file keluaranUntuk direktori file video:
for i in *.{avi,flv,m4v,mov,wmv,mp4,MP4,TS,mkv}; do ffmpeg -n -loglevel error -i "$i" -vcodec libx264 -crf 28 -preset faster -tune film "cc${i}"; done
Masalah:
.webm
file tidak berfungsi dengan perintah. Harus bertukar"cc${i}"
→"${i%.*}.mp4"
Handbrake adalah alternatif sumber terbuka dengan UI
sumber
Anda harus menggunakan pengodean 2-pass untuk "menyesuaikan" video dengan ukuran file yang ditentukan (bitrate), tanpa mengurangi kualitasnya terlalu drastis. Ini adalah topik yang cukup terperinci: http://web.archive.org/web/20171130050515/http://www.mpabo.com/2014/12/14/ffmpeg-and-x264-encoding-guide/
sumber
Saya menulis skrip bash untuk mengurangi ukuran video dan mencoba nilai crf yang berbeda secara otomatis.
Pada dasarnya kamu akan
Ini sangat berguna ketika Anda memiliki batas ukuran yang ingin Anda capai dan Anda tidak tahu apa nilai crf yang akan memungkinkan Anda untuk melakukannya.
Saya harap ini akan membantu seseorang. Saya berbagi dengan kolega saya dan semua orang merasa terbantu.
sumber