Cara mempertimbangkan bitrate, -maxrate, dan -bufsize video untuk web

13

Saya menggunakan ffmpeg untuk menyandikan video saya untuk mengunggahnya di web. Saya melihat posting ini tentang menggunakan ffmpeg, tetapi tidak cukup mengerti bagaimana mempertimbangkan nilai-nilai.

Misalkan saya punya video ukuran 70 MB dengan durasi 4 menit. Bagaimana saya akan mempertimbangkan nilai untuk bendera ini: -b:v, -maxratedan -bufsizeuntuk perintah ini?

ffmpeg -i input -codec:v libx264 -profile:v main -preset slow -b:v ? -maxrate ? -bufsize ? -vf "scale=720:trunc(ow/a/2)*2" -threads 0 -codec:a libfdk_aac -movflags +faststart output

Atau adakah nilai normal, seperti untuk crfnilai 19-24? Saya akan sangat menghargai bantuan dan bimbingan Anda.

Robin
sumber
Pengkodean video adalah seni, dan ada ratusan parameter untuk dikuasai. Perhatikan bahwa pengkodean dua-pass akan menawarkan (banyak) kualitas dan kompresi yang lebih baik di sebagian besar skenario daripada bermain dengan bitrate. Biasanya ukuran akhir dan bitrate video tergantung terutama pada ukuran output video. ffmpeg biasanya cukup pintar untuk memilih maxrate dan bitrate jika Anda mengatakannya untuk menjaga kualitas video yang sama. Perhatikan juga bahwa membuat video dengan lebar 480px cukup baik di sebagian besar skenario, dan itu akan menghemat lebih banyak bandwidth yang diputar dengan bitrate.
earizon
1
@ Earizon Saya setuju, encoding video adalah seni dan 480 biasanya cukup baik. Namun, saya juga suka memiliki resolusi yang lebih tinggi karena saya tidak menggunakan CRT pada 640x480 lagi. Ini jelas cara yang lebih baik untuk mengurangi ukuran daripada mengutak-atik bitrate, tapi sekali lagi, saya suka pilihan.
Wyatt8740

Jawaban:

20

Ini sangat tergantung pada kecepatan unggah Anda.

bufsizeakan menentukan bagaimana ffmpeg agama menjaga bitrate Anda konstan. Jika Anda menetapkan bufsize64k, sesuai FFmpeg Wiki: Membatasi bitrate output , itu akan menghitung bitrate saat ini setiap 64 kilobyte dan menyesuaikan sesuai. Ukuran yang lebih kecil untuk bufsizedapat berbahaya bagi kualitas karena tidak memungkinkan cukup ruang di antara pemeriksaan x264 untuk melakukan perubahan mendadak - Anda akan mendapatkan blockiness.

Jika Anda maxrate640kbps, dan Anda bufsize64k, maka setiap persepuluh x264 kedua akan diperiksa. Ini kurang optimal - FFmpeg Wiki: Pengkodean untuk situs streaming merekomendasikan untuk menjalankannya setiap 1 hingga 2 detik. Jika ini tidak masuk akal, anggap itu sebagai maxrate/ bufsize= frekuensi pemeriksaan. Jaga frekuensi ini antara 1 dan 2 detik sebagai aturan praktis.

Jika Anda mengatur keduanya maxratedan bufsize, Anda harus:

  • atur maxrateberapa pun kecepatan unggahan terendah Anda (dalam contoh wiki ffmpeg , ini adalah 80% dari total kecepatan unggah, tetapi jarak tempuh Anda mungkin beragam).
  • atur bufsizeke tempat yang sama dengan maxrate(satu detik) dan dua kali dari maxrate(2 detik) Anda. Jika ini masih belum cukup rendah, turunkan maxratedan atur ulang bufsize.

Kemudian, Anda harus bermain-main sedikit, tetapi karena Anda harus mulai di suatu tempat saya baru saja mulai maxratesekitar 600k, yang biasanya cukup memuaskan bagi saya sebelum saya gunakan crfuntuk semuanya.

Jika mau, Anda dapat mencoba nilai yang lebih rendah untuk bufsize, seperti untuk setiap tiga atau empat detik, hanya untuk melihat bagaimana nilai mengubah bagaimana output Anda terlihat. Kemudian Anda dapat menentukan seberapa besar Anda harus mengkhawatirkannya untuk video Anda.

Tidak ada nilai normal, sungguh - apa yang crfdilakukan adalah mengoptimalkan output berdasarkan apa yang dianggapnya sebagai ukuran buffer terbaik untuk mempertahankan berapa pun rate yang ditetapkan. Itu mencoba untuk menjaga ukuran file serendah sambil mempertahankan beberapa kualitas, dengan biaya paku sesekali.

Wyatt8740
sumber
1
Tidak boleh "mengatur bufsize ke suatu tempat di antara yang sama dengan maxrate Anda (satu detik) dan setengah dari maxrate Anda (2 detik)" menjadi "set bufsize ke suatu tempat antara sama dengan maxrate Anda (satu detik) dan dua kali maxrate Anda (2 detik) "?
Ely
@ Ya, saya pikir Anda benar. Milik saya akan melakukannya setiap setengah detik. Saya akan memperbaikinya!
Wyatt8740
@ Wyatt8740 Maaf, saya sangat sibuk. Hanya satu pertanyaan. Jika saya menggunakan crf, maka saya tidak perlu menentukan bitrate, buffsizedan maxrate? Dan jika demikian, mana yang lebih efisien (gunakan crfatau bitrate, buffsizedan maxrate)?
Robin
@Robin Anda dapat menggunakan bufsize dan memaksimalkan dengan crf. Ingat, crf akan menyesuaikan bitrate dengan cepat untuk mencocokkan kualitas tertentu, dan jika bagian video sangat kompleks, bitrate akan menembak setinggi langit dan Anda mungkin tidak menginginkannya, jadi lebih baik "letakkan kunci" dengan bufsize dan maksimalkan (tetapi tidak terlalu ketat, atau video Anda akan terlihat seperti omong kosong! :))
Ely
@Robin benar, Anda tidak perlu menggunakan crf dengan yang lain. Namun, Anda bisa jika ingin membatasi. crf mencoba mempertahankan kualitas konstan - Anda dapat memaksanya melakukannya dalam batas dengan bufsizedan maxrate. Anda tidak perlu bitrate. Seperti kata Ely, itu akan membuatnya lebih baik untuk streaming.
Wyatt8740