FFmpeg dapat menangkap gambar dari video yang dapat digunakan sebagai gambar kecil untuk mewakili video. Cara paling umum untuk melakukan itu ditangkap dalam FFmpeg Wiki .
Tapi, saya tidak ingin memilih frame acak pada beberapa interval. Saya menemukan beberapa opsi menggunakan filter pada FFmpeg untuk menangkap perubahan pemandangan:
Filter thumbnail
mencoba menemukan bingkai paling representatif dalam video:
ffmpeg -i input.mp4 -vf "thumbnail,scale=640:360" -frames:v 1 thumb.png
dan perintah berikut memilih hanya frame yang memiliki lebih dari 40% perubahan dibandingkan dengan sebelumnya (dan mungkin juga perubahan adegan) dan menghasilkan urutan 5 PNG.
ffmpeg -i input.mp4 -vf "select=gt(scene\,0.4),scale=640:360" -frames:v 5 thumb%03d.png
Kredit info untuk perintah di atas ke Fabio Sonnati . Yang kedua tampak lebih baik karena saya bisa mendapatkan gambar dan memilih yang terbaik. Saya mencobanya dan menghasilkan gambar yang sama 5 kali.
Beberapa investigasi membuat saya:
ffmpeg -i input.mp4 -vf "select=gt(scene\,0.5)" -frames:v 5 -vsync vfr out%02d.png
-vsync vfr
memastikan bahwa Anda mendapatkan gambar yang berbeda. Ini masih selalu mengambil frame pertama dari video, dalam banyak kasus frame pertama adalah kredit / logo dan tidak berarti, jadi saya menambahkan -ss
3 untuk membuang 3 detik pertama video.
Perintah terakhir saya terlihat seperti ini:
ffmpeg -ss 3 -i input.mp4 -vf "select=gt(scene\,0.5)" -frames:v 5 -vsync vfr out%02d.jpg
Ini adalah yang terbaik yang bisa saya lakukan. Saya perhatikan bahwa karena saya hanya mengambil 5 video, semuanya kebanyakan dari awal video dan mungkin kehilangan adegan penting yang terjadi kemudian dalam video
Saya ingin memilih otak Anda untuk opsi lain yang lebih baik.
sumber
libopenjpeg
.. tidak yakin apakah itu membuat perbedaan.mjpeg
encoder untuk saya juga, dan saya juga memeriksajpegoptim
danexiv2
, keduanya bekerja dengan baik untuk saya dengan semua hasil JPG dari perintah contoh Anda.Jawaban:
Bagaimana kalau mencari, idealnya, frame perubahan pertama> 40% dalam masing-masing 5 rentang waktu, di mana rentang waktu adalah 1, 2, 3, 4, dan 20% dari video.
Anda juga dapat membaginya menjadi 6 rentang waktu dan mengabaikan yang pertama untuk menghindari kredit.
Dalam praktiknya, ini berarti mengatur fps ke angka rendah sambil menerapkan pemeriksaan perubahan adegan Anda dan argumen Anda untuk membuang sedikit pertama video.
...sesuatu seperti:
sumber
Unable to find a suitable output format for 'fps=fps=1/600'
. Solusinya adalah menambahkan-vf
sebelum argumen itu (lihat stackoverflow.com/questions/28519403/ffmpeg-command-issue )Mendefinisikan bermakna itu sulit, tetapi jika Anda ingin membuat thumbnail N efisien menjangkau seluruh file video ini adalah apa yang saya gunakan untuk menghasilkan thumbnail pada produksi dengan konten yang diunggah pengguna.
Kode semu
Dimana:
ffmpeg -i <movie>
sendiri atauffprobe
yang memiliki JSON bagus penulis keluaran btwCukup yang di atas menuliskan frame kunci tengah dari setiap partisi film. Misal, jika film berdurasi 300an dan Anda ingin 3 thumbnail maka diperlukan satu bingkai kunci setelah 50an, 150an, dan 250an. Untuk 5 thumbnail, 30-an, 90-an, 150-an, 210-an, 270-an. Anda dapat menyesuaikan N tergantung pada durasi film D, misalnya film 5 menit akan memiliki 3 thumbnail tetapi lebih dari 1 jam akan memiliki 20 thumbnail.
Performa
Setiap doa dari
ffmpeg
perintah di atas membutuhkan sepersekian detik (!) Untuk ~ 1GB H.264. Itu karena ia langsung melompat ke<time>
posisi (pikiran-ss
sebelumnya-i
) dan mengambil bingkai kunci pertama yang praktis menyelesaikan JPEG. Tidak ada waktu yang terbuang untuk membuat film agar sesuai dengan posisi waktu yang tepat.Pengolahan pasca
Anda dapat mencampur di atas dengan
scale
atau metode pengubahan ukuran lainnya. Anda juga dapat menghapus bingkai warna solid atau mencoba mencampurnya dengan filter lain sepertithumbnail
.sumber
-ss N
ke sebelumnya-i
adalah tip yang luar biasa. Terima kasih!Saya pernah melakukan sesuatu yang serupa, tetapi saya mengekspor semua bingkai video (dalam 1 fps) dan membandingkannya dengan utilitas perl yang saya temukan yang menghitung perbedaan antara gambar. Saya membandingkan setiap frame dengan thumbnail sebelumnya, dan jika berbeda dari semua thumbnail, saya menambahkannya ke koleksi thumbnail. Keuntungannya di sini adalah jika video Anda bergerak dari adegan A ke B dan mereka kembali ke A, ffmpeg akan mengekspor 2 frame A.
sumber
Coba ini
Dengan menggunakan perintah ini, saya dapat menghasilkan jumlah thumbnail yang diperlukan yang mewakili seluruh video.
sumber
fps
menjadi(no_of_frames_req * fps_of_vid) / total_video_frames
?Inilah yang saya lakukan untuk membuat thumbnail berkala untuk streaming live m3u8 untuk digunakan sebagai poster. Saya menemukan menjalankan tugas ffmpeg terus menerus hanya untuk menghasilkan thumbnail memakan semua CPU saya, jadi saya menjalankan cronjob setiap 60 detik yang menghasilkan semua thumbnail untuk stream saya.
Jika Anda perlu melakukan lebih dari 60 detik (pembatasan cronjob), maka Anda dapat melakukan
while
loop pada skrip Anda dan itu akan dijalankan selamanya. Tambahkan sajasleep 30
untuk mengubah frekuensi menjadi 30 detik. Saya tidak menyarankan melakukan ini dengan sejumlah besar video, karena tayangan sebelumnya mungkin tidak selesai sebelum yang berikutnya dimulai.Idealnya dengan cronjob, saya menjalankannya setiap 5 menit.
sumber