Kompresi video dengan ffmpeg - Kualitas konstan


1

Saya mencoba mengompres video 10 detik pada bitrate berbeda dengan ffmpeg. Tujuan saya adalah mendapatkan video yang sama pada kualitas yang berbeda (dari sangat rendah ke sangat tinggi). Saya tidak ingin menyentuh bagian audio dan saya menggunakan H264 sebagai codec video. Saya menggunakan CLI berikut:

ffmpeg -i input.mkv -c:v libx264 -b:v $j'k' -c:a copy output.mkv

Di mana $ j bervariasi dari 150 hingga 4000.

Masalah saya adalah bahwa saya mendapatkan 10s video terkompresi tetapi kualitasnya tidak konstan sama sekali sepanjang waktu. Berikut ini sebuah contoh: Dengan bitrate sangat rendah ($ j = 150), di awal (antara 0 dan 3s), videonya benar-benar buruk tetapi pada akhirnya (antara 8 dan 10s), kualitasnya tepat! Selain itu, saat menonton video, orang dapat melihat peningkatan kualitas ini dari waktu ke waktu. Adakah yang bisa menjelaskan fenomena ini kepada saya? Bagaimana cara mendapatkan kualitas yang konstan?

Terima kasih'



Harap perhatikan pertanyaan di bawah ini (saya baru saja mempostingnya): Saya pikir saya telah menemukan masalah dalam versi Linux di mana bitrate berlebihan pada yang pertama ... dapatkan ini ... TIGA DETIK dari video. superuser.com/questions/963424/…
Mark Gerolimatos

Jawaban:


2

Seperti yang ditunjukkan oleh @LordNeckbeard, bitrate konstan tidak sama dengan kualitas konstan. Bahkan, justru sebaliknya. Bagian-bagian tertentu dari urutan video lebih mudah untuk dikodekan daripada yang lain (lebih mudah dalam arti membutuhkan lebih sedikit bit), dan yang lainnya tidak. Jika Anda menghabiskan semua bagian Anda pada bagian yang mudah, Anda akan kekurangan bagian yang lebih sulit.

Di situlah kualitas konstan berperan. Di x264 ada Faktor Tingkat Konstan , yang melakukan hal itu. Saya sarankan Anda membaca artikel yang ditautkan jika Anda ingin lebih banyak informasi latar belakang. Pada dasarnya, CRF berkisar dari 0 (lossless, terbaik) hingga 51 (terburuk). Langkah ± 6 kira-kira egal ganda atau setengah bitrate.

Jadi, untuk mengadaptasi skrip Anda, lakukan saja hal berikut:

for i in $(seq 0 5 51); do 
  ffmpeg -i input.mkv -c:v libx264 -crf $i -c:a copy output-$i.mkv
done

Skala itu sendiri — kecuali saya salah — dekat dengan logaritmik dalam hal kualitas, sehingga Anda dapat menghitung langkah-langkah Anda berdasarkan itu alih-alih seqpanggilan.


Dengan bitrate sangat rendah ($ j = 150), di awal (antara 0 dan 3s), videonya benar-benar buruk tetapi pada akhirnya (antara 8 dan 10s), kualitasnya pantas! Selain itu, saat menonton video, orang dapat melihat peningkatan kualitas ini dari waktu ke waktu. Adakah yang bisa menjelaskan fenomena ini kepada saya?

Melakukan laju bit konstan bukanlah tugas yang mudah bagi pembuat enkode. Anda memberinya nilai tertentu untuk dikerjakan, mis. Katakan "beri saya 150 kBit per detik", tetapi pembuat enkode tersebut bahkan tidak tahu apa yang akan dikodekan pada frame berikutnya.

Jadi, berapa banyak yang harus dikeluarkan untuk bingkai ini? Berapa banyak untuk selanjutnya? Beberapa bingkai — seperti yang saya sebutkan di atas — mudah dikodekan dan hanya butuh beberapa kilobit, sementara yang lain mungkin membutuhkan lebih banyak. Tetapi encoder benar-benar hanya dapat melihat apa yang disandikan di masa lalu untuk skala untuk gambar masa depan. Juga memperhitungkan berbagai jenis gambar .

Secara algoritma, melakukan bitrate konstan sangat sulit, dan itu juga yang terburuk dari mode kontrol laju yang ditawarkan x264. Khusus untuk klip pendek, karena pembuat enkode tidak akan tahu apa yang dapat diharapkan tanpa melakukan pengodean 2-pass, Anda mungkin memperhatikan ini dalam cara Anda menggambarkan: kualitas berubah secara drastis selama sepuluh detik. Tapi 150 kBit / s sebenarnya tidak cukup untuk video dengan dimensi yang lumayan.


Terima kasih atas jawaban terperinci ini! Persis seperti yang saya harapkan.
MarAja
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.