Kedutan memiliki pos tentang ini. Mereka menjelaskan bahwa mereka memutuskan untuk menggunakan program mereka sendiri karena beberapa alasan; salah satunya adalah bahwa ffmpeg tidak membiarkan Anda menjalankan instance x264 yang berbeda di utas yang berbeda, tetapi sebaliknya mengabdikan semua utas yang ditentukan ke satu bingkai dalam satu output sebelum beralih ke output berikutnya.
Jika Anda tidak melakukan streaming real-time, Anda memiliki lebih banyak kemewahan. Cara 'benar' mungkin untuk menyandikan pada satu resolusi hanya dengan ukuran GOP yang ditentukan dengan -g, dan kemudian menyandikan resolusi lain yang memaksa kerangka kunci di tempat yang sama.
Jika Anda ingin melakukan itu, Anda bisa menggunakan ffprobe untuk mendapatkan waktu keyframe dan kemudian menggunakan skrip shell atau bahasa pemrograman yang sebenarnya untuk mengubahnya menjadi perintah ffmpeg.
Tetapi untuk sebagian besar konten, ada sedikit perbedaan antara memiliki satu kerangka kunci setiap 5 detik dan dua kerangka kunci setiap 5 detik (satu dipaksa dan satu dari scenecut). Ini adalah tentang ukuran I-frame rata-rata vs ukuran P-frame dan B-frame. Jika Anda menggunakan x264 dengan pengaturan tipikal (satu-satunya alasan saya pikir Anda harus melakukan apa pun untuk memengaruhi ini adalah jika Anda mengatur -qmin, sebagai cara yang buruk untuk mencegah x264 dari menggunakan bitrate pada konten yang mudah; ini membatasi semua jenis bingkai dengan nilai yang sama , Saya pikir) dan dapatkan hasil seperti ukuran rata-rata I-frame 46 kB, P-frame 24 kB, B-frame 17 kB (setengah lebih sering dari frame-P), lalu frame-I ekstra setiap detik pada 30 fps hanya peningkatan 3% dalam ukuran file. Perbedaan antara h264 dan h263 mungkin terdiri dari sekelompok penurunan 3%, tetapi satu saja tidak terlalu penting.
Pada jenis konten lain, ukuran bingkai akan berbeda. Agar adil, ini tentang kompleksitas temporal dan bukan kompleksitas spasial, jadi ini bukan hanya konten yang mudah vs konten yang sulit. Tetapi secara umum, situs video streaming memiliki batas bitrate, dan konten dengan I-frame yang relatif besar adalah konten yang mudah yang akan dikodekan pada kualitas tinggi tidak peduli berapa banyak frame kunci tambahan yang ditambahkan. Ini boros, tetapi limbah ini biasanya tidak akan diperhatikan. Kasing yang paling boros mungkin adalah video yang hanya berupa gambar statis yang menyertai sebuah lagu, di mana setiap frame kunci persis sama.
Satu hal yang saya tidak yakin adalah bagaimana keyframe yang dipaksakan berinteraksi dengan rate limiter yang diset dengan -maxrate dan -bufsize. Saya pikir bahkan YouTube memiliki masalah baru-baru ini dengan benar mengkonfigurasi pengaturan buffer untuk memberikan kualitas yang konsisten. Jika Anda hanya menggunakan pengaturan bitrate rata-rata seperti yang dapat dilihat oleh beberapa situs (karena Anda dapat memeriksa opsi x264 di header / mov atom? Dengan hex editor) maka model buffer tidak menjadi masalah, tetapi jika Anda melayani konten yang dibuat pengguna, bitrate rata-rata mendorong pengguna untuk menambahkan layar hitam di akhir video mereka.
Opsi -g Ffmpeg, atau opsi enkoder lain apa pun yang Anda gunakan, dipetakan ke opsi khusus enkoder. Jadi '-x264-params keyint = GOPSIZE' sama dengan '-g GOPSIZE'.
Salah satu masalah dengan menggunakan deteksi adegan adalah jika Anda lebih suka bingkai kunci di dekat angka tertentu untuk alasan apa pun. Jika Anda menentukan keyframe setiap 5 detik dan menggunakan deteksi adegan, dan ada perubahan adegan di 4,5, maka itu harus dideteksi, tetapi kemudian keyframe berikutnya berada pada 9,5. Jika waktu terus ditingkatkan seperti ini, Anda bisa berakhir dengan keyframe di 42,5, 47,5, 52,5, dll., Bukannya 40, 45, 50, 55. Sebaliknya, jika ada perubahan adegan di 5,5, maka akan ada bingkai kunci di 5 dan 5.5 akan terlalu dini untuk yang lain. Ffmpeg tidak membiarkan Anda menentukan "buat keyframe di sini jika tidak ada perubahan adegan dalam 30 frame berikutnya". Seseorang yang mengerti C dapat menambahkan opsi itu.
Untuk video kecepatan bingkai variabel, saat Anda tidak streaming langsung seperti Twitch, Anda harus dapat menggunakan perubahan pemandangan tanpa mengkonversi secara permanen ke laju bingkai konstan. Jika Anda menggunakan filter 'select' di ffmpeg dan menggunakan konstanta 'scene' dalam ekspresi, maka output debug (-v debug atau tekan '+' beberapa kali saat encoding) menunjukkan nomor perubahan adegan. Ini mungkin berbeda dari, dan tidak berguna seperti, angka yang digunakan oleh x264, tetapi masih bisa berguna.
Prosedurnya, kemudian, mungkin akan melakukan tes video yang hanya untuk perubahan keyframe, tetapi mungkin dapat digunakan untuk data kontrol tingkat jika menggunakan 2-pass. (Tidak yakin apakah data yang dihasilkan sama sekali berguna untuk resolusi dan pengaturan yang berbeda; data macroblock-tree tidak akan.) Konversikan ke video framerate konstan, tetapi lihat bug ini tentang gagap output ketika membagi dua framerate jika Anda memutuskan untuk menggunakan filter fps untuk keperluan lain. Jalankan melalui x264 dengan kerangka kunci dan pengaturan GOP yang Anda inginkan.
Kemudian gunakan waktu keyframe ini dengan video frame-rate variabel asli.
Jika Anda mengizinkan konten yang dibuat pengguna yang benar-benar gila dengan celah 20 detik di antara frame, maka untuk pengkodean frame-rate variabel, Anda dapat membagi output, menggunakan filter fps, entah bagaimana menggunakan filter pilih (mungkin membangun ekspresi yang sangat panjang yang memiliki setiap waktu keyframe) ... atau mungkin Anda bisa menggunakan video uji sebagai input dan mendekodekan hanya keyframe, jika opsi ffmpeg bekerja, atau gunakan filter pilih untuk memilih keyframe. Kemudian skala ke ukuran yang benar (bahkan ada filter scale2ref untuk ini) dan overlay video asli di dalamnya. Kemudian gunakan filter interleave untuk menggabungkan keyframe yang ditakdirkan ini dengan video asli. Jika ini menghasilkan dua frame yang terpisah 0,001 detik sehingga filter interleave tidak mencegah, maka selesaikan sendiri masalah ini dengan filter pilih lainnya. Berurusan dengan batas buffer bingkai untuk filter interleave bisa menjadi masalah utama di sini. Ini semua bisa bekerja: gunakan beberapa jenis filter untuk buffer aliran lebih padat (filter fifo?); lihat file input beberapa kali sehingga diterjemahkan lebih dari satu kali dan frame tidak harus disimpan; gunakan filter 'streamselect', yang belum pernah saya lakukan, tepat pada waktu keyframe; tingkatkan filter interleave dengan mengubah perilaku default atau menambahkan opsi untuk menampilkan frame tertua dalam buffer alih-alih menjatuhkan frame. yang belum pernah saya lakukan, tepat pada waktu keyframe; tingkatkan filter interleave dengan mengubah perilaku default atau menambahkan opsi untuk menampilkan frame tertua dalam buffer alih-alih menjatuhkan frame. yang belum pernah saya lakukan, tepat pada waktu keyframe; tingkatkan filter interleave dengan mengubah perilaku default atau menambahkan opsi untuk menampilkan frame tertua dalam buffer alih-alih menjatuhkan frame.