Bagaimana cara mengekstrak 1 tangkapan layar untuk video dengan ffmpeg pada waktu tertentu?

109

Ada banyak tutorial dan hal-hal yang menunjukkan cara mengekstrak beberapa tangkapan layar dari video menggunakan ffmpeg. Anda mengatur -r dan Anda bahkan dapat memulai jumlah tertentu.

Tapi saya hanya ingin 1 tangkapan layar di, misalnya 01:23:45 masuk Atau 1 tangkapan layar di 86% masuk.

Ini semua mungkin dilakukan dengan ffmpegthumbnailer tetapi ini adalah ketergantungan lain yang tidak ingin saya andalkan. Saya ingin bisa melakukannya dengan ffmpeg.

Peter Bengtsson
sumber

Jawaban:

208

Gunakan -ssopsi:

ffmpeg -ss 01:23:45 -i input -vframes 1 -q:v 2 output.jpg
  • Untuk output JPEG digunakan -q:vuntuk mengontrol kualitas output. Rentang penuh adalah skala linier 1-31 di mana nilai yang lebih rendah menghasilkan kualitas yang lebih tinggi. 2-5 adalah rentang yang bagus untuk dicoba.

  • The pilih Filter menyediakan metode alternatif untuk kebutuhan yang lebih kompleks seperti memilih hanya jenis tertentu bingkai, atau 1 per 100, dll

  • Menempatkan -sssebelum input akan lebih cepat. Lihat FFmpeg Wiki: Mencari dan kutipan ini dari ffmpegdokumentasi alat cli :

-ss posisi (masukan / keluaran)

Ketika digunakan sebagai opsi input (sebelum -i), cari di file input ini ke posisi. Perhatikan bahwa di sebagian besar format tidak mungkin untuk mencari dengan tepat, jadi ffmpegakan mencari titik pencarian terdekat sebelum posisi. Saat melakukan transcoding dan -accurate_seekdiaktifkan (default), segmen ekstra ini antara titik dan posisi pencarian akan didekodekan dan dibuang. Saat melakukan penyalinan aliran atau saat -noaccurate_seekdigunakan, itu akan dipertahankan.

Ketika digunakan sebagai opsi keluaran (sebelum nama file keluaran), menerjemahkan kode tetapi membuang masukan sampai cap waktu mencapai posisi.

posisi bisa dalam hitungan detik atau dalam hh:mm:ss[.xxx]bentuk.

llogan
sumber
2
Ini JAUH lebih cepat. Terima kasih banyak. Menempatkan -ss terlebih dahulu membuat perbedaan besar.
Peter Bengtsson
apakah ada cara untuk mendapatkan frame ke-n setelah waktu yang ditentukan?
dorien
@ GuntherPiez Saya tidak melihat ada penyebutan di mana pun tentang kemungkinan artefak.
Stefan Reich
2
Perhatikan bahwa vframessudah usang (setidaknya) versi 4.2.2. Per manual "[ vframes] adalah alias usang untuk ' -frames:v', yang harus Anda gunakan sebagai gantinya."
Synexis
Bekerja dengan sempurna dan cepat.
Smeterlink
37

FFMpeg dapat melakukan ini dengan mencari stempel waktu yang diberikan dan mengekstrak tepat satu bingkai sebagai gambar, lihat misalnya:

ffmpeg -i input_file.mp4 -ss 01:23:45 -vframes 1 output.jpg

Mari kita jelaskan opsinya:

-i input file           the path to the input file
-ss 01:23:45            seek the position to the specified timestamp
-vframes 1              only handle one video frame
output.jpg              output filename, should have a well-known extension

The -ssparameter menerima nilai dalam bentuk HH:MM:SS[.xxx]atau sebagai nomor dalam detik. Jika Anda membutuhkan persentase, Anda perlu menghitung durasi video terlebih dahulu.

SirDarius
sumber
Sepertinya bekerja seperti yang diharapkan. Saat ini saya melakukan benchmark apakah kecepatannya sama dengan menggunakan ffmpegthumbnailer.
Peter Bengtsson
Ya, pendekatan ini sangat lambat. Lihat peterbe.com/plog/fastest-way-to-take-screencaps-out-of-videos
Peter Bengtsson
7
coba gunakan opsi -ss sebelum -i karena ini akan melewatkan bagian decoding dari pipeline. Ini mungkin mempercepat prosesnya.
SirDarius
1
Apakah ada cara untuk mengeluarkan sebagai PNG ke aliran alih-alih file?
Nicke Manarin
1
@NickeManarin Ya .. ffmpeg -ss 01:23:45 -i video.mp4 -c:v png -frames:v 1 image.jpg. Perhatikan bahwa saya juga meletakkan opsi -ss"seek" sebelum file input pada baris perintah, seperti yang direkomendasikan orang lain.
Glenn Slayden