Bagaimana cara mengekstrak semua bingkai kunci dari klip video?

10

Saya mencoba mengekstrak bingkai kunci dari klip video. Saya mencoba perintah berikut, tetapi ekstrak semua bingkai.

ffmpeg -vf select="eq(pict_type\,PICT_TYPE_I)" -i 2.flv -vsync 2 -s 73x41 -r 30 -f image2 thumbnails-%%02d.jpeg
Rash Mustafa
sumber

Jawaban:

20

Anda dapat menjadikan ini lebih mudah menggunakan -skip_frametanpa perlu selectfilter video:

ffmpeg -skip_frame nokey -i 2.flv -vsync 0 -r 30 -f image2 thumbnails-%02d.jpeg
radoh
sumber
2
Luar biasa, membutuhkan waktu kurang dari 10 detik pada video 20 menit dibandingkan lebih dari 3 menit dengan filter pilih!
mad
Pastikan untuk menggunakan -threads 1, dibandingkan dengan default, -threads autoini membuat cropdetectgrafik filter ( ffmpeg -threads 1 -skip_frame nokey -i input.mkv -filter:v select='not(mod(n\,20))',cropdetect -an -f null /dev/null) 2x lebih cepat di sistem saya (60s turun menjadi 30s)!
genpfault
Saya tidak akan menggunakan nokey skip_frame. Apakah Anda sudah memeriksa hasilnya? Pada file dan build saya (agustus 2019) saya mendapatkan cap waktu yang tidak tepat, seperti pada nokey memberi saya bingkai sebelumnya sebelum bingkai I, sedangkan frame nonfilter / semua menunjukkan frame I pada cap waktu berikutnya.
JasonXA
Alasan @genpfault menyarankan penggunaan -threads 1adalah karena jika tidak, urutan keyframe output dapat dikeluarkan tidak sesuai pesanan. Jika Anda memiliki semacam cara post-hoc untuk mengatasi masalah ini, Anda dapat mempertahankan multi-threading. Juga, tampaknya masih mungkin untuk keluar dari keyframe yang rusak, bahkan ketika menggunakan -threads 1 , tetapi sekarang dalam kasus ini semua kejadian seperti itu tampaknya disertai / ditandai oleh kesalahan decoder h264 illegal short term buffer state detected.
Glenn Slayden
12

Contoh menggunakan selectdan scalefilter:

ffmpeg -i 2.flv -vf "select=eq(pict_type\,I),scale=73x41" \
-vsync vfr -qscale:v 2 thumbnails-%02d.jpeg

Beberapa tips:

  • Filter tidak boleh datang sebelum -iopsi, karena mereka merupakan opsi output. Saya tidak tahu persis dari mana Anda mendapatkan perintah itu, tetapi PICT_TYPE_Itidak ada - seharusnya I.

  • Di scalefilter Anda dapat mengganti 73atau 41membuat filter secara otomatis menghitung lebar atau tinggi untuk mempertahankan rasio aspek: seperti scale=73:-1atau scale=-1:41. Ini mencegah peregangan atau pengepresan yang dapat terjadi akibat penskalaan "paksa".

  • Kualitas output dapat dikontrol dengan -qscale:v(atau alias -q:v). Rentang efektif adalah skala linier 2 hingga 31 dan nilai yang lebih rendah adalah kualitas yang lebih tinggi.

  • Bahwa Anda ffmpegmengizinkan filter sebelum input memberi tahu saya itu bisa usang. Unduh build statis terbaru untuk sistem operasi Anda, atau bangun sendiri sesuai dengan panduan kompilasi jika hal di atas tidak berfungsi.

slhck
sumber
1
Jika tujuan Anda adalah untuk mengekstraksi frame kunci tanpa kehilangan, Anda dapat mencoba yang berikut:ffmpeg -i 2.flv -vf "select=eq(pict_type\,I)" -vsync vfr frame-%02d.png
Peltier
0

jika ini kesalahan :

Opsi vf (set filter video) tidak dapat diterapkan ke url input 1508.mp4 - Anda mencoba menerapkan opsi input ke file output atau sebaliknya. Pindahkan opsi ini sebelum file miliknya. Kesalahan opsi penguraian untuk file input 1508.mp4. Kesalahan membuka file input: Argumen tidak valid

kamu bisa melakukan ini:

ffmpeg -i 263.mp4 -vf select=eq(pict_type\,PICT_TYPE_I)  -vsync 2 -s 480x320 -r 24 -f image2 thumbnails-%05d.jpeg

== --------------------------------------------

"-I" Parameter di muka

Tom
sumber