Perintah FFmpeg untuk menemukan bingkai kunci yang paling dekat dengan menit ke-3


1

Saya menggunakan FFmpeg untuk mengekstrak keyframe pada menit ke-3. Ini berarti bahwa ini adalah bingkai 3 * 60 * 25 (dengan asumsi 25 FPS). Sekarang, seringkali frame ini tidak bingkai kunci.

Saya ingin mengekstrak bingkai yang paling dekat dengan bingkai di atas tetapi memastikan bahwa itu adalah bingkai kunci. Ini berarti bingkai dapat terjadi beberapa detik sebelum atau setelah menit ketiga video.

Saya telah mencari ke mana-mana tanpa hasil! Saya melakukan ini di Linux, jadi jika Anda menggunakan FFmpeg dengan sesuatu yang khusus diinstal atau dibundel, beri tahu saya!

Jawaban:


4

Menggunakan -ss parameter dengan select filter akan bekerja.

Sesuatu yang mirip dengan:

ffmpeg -ss 180 -i yourvideo.mp4 -vf select="eq(pict_type\,I)" -vframes 1 thumbnails.jpeg

Saya pikir ini upaya yang adil! Mengapa Anda memilihnya? setuju saya ketinggalan -vframe 1
d33pika

1
Bagian yang penting adalah konsep menggunakan -ss dan filter pilih untuk memilih frame I saja. OP dapat melatih bentuk solusi di sana. Saya tidak perlu menyuapi jawaban!
d33pika

Saya sudah mencobanya. Itu memang menghasilkan gambar !, posisi -ss sebelum atau sesudah -i memang pilihan yang harus diambil. Saya pikir sebelumnya lebih cepat, saya berasumsi bahwa OP baik-baik saja dengan menemukan bingkai kunci setelah 3 menit, itu asumsi besar yang saya akui.
d33pika

Oke, saya mengujinya lagi dengan opsi yang ditempatkan seperti itu (juga berubah PICT_TYPE_I untuk I ), dan ternyata berfungsi sekarang seperti yang diharapkan, +1 (saya menghapus beberapa opsi usang yang tidak masalah dalam kasus ini)
slhck

1
Apakah Anda melihat ini: superuser.com/questions/538112/… , Saya telah membagikan apa yang saya gunakan untuk memilih thumbnail yang baik dari video.
d33pika

2

Jika Anda menganggap bahwa I-frame terdekat ke 00:03:00 muncul sebelum stempel waktu itu, Anda harus menebak, karena panjang GOP (jumlah bingkai di antara masing-masing bingkai I) tidak sama untuk setiap video. Jika Anda mengetahui panjang GOP Anda, mis. 125 frame, lalu mulai 5 detik sebelum itu, pada 00:02:55, misalnya.

Perhatikan bahwa ini tidak harus panjang tetap. Encoders yang baik akan menempatkan bingkai-I pada pemotongan adegan daripada titik tetap untuk mencapai kompresi dan keandalan yang lebih baik.

Jadi, mari kita menggeser input dengan jumlah waktu yang kita hitung sebelumnya, menggunakan -itsoffset.

Kami menentukan select filter untuk mendapatkan kita hanya I-frame, dan -vframes hanya menerima satu bingkai. Akhirnya, tulis itu ke a .jpg mengajukan.

ffmpeg -itsoffset -00:02:55 -i in.mp4 -filter:v select='eq(pict_type\,I)' -vframes 1 out.jpg

Saya mengujinya dengan video yang awalnya memiliki P-frame pada 00:03:00, dan saya menerima frame ke-13 setelah itu, yang merupakan awal dari adegan baru — I-frame.

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.