Tugas, dan mengapa tugas tersebut lebih rumit dari yang terlihat
"Beri saya satu frame per detik dari klip ini" adalah salah satu tugas video paling umum yang pernah ada. Penguji QA memerlukan tangkapan layar dengan jarak yang sama untuk dilampirkan ke laporan bug. Seorang peneliti memerlukan urutan gambar sampel untuk dimasukkan ke dalam alat anotasi. Seorang editor sosial membutuhkan dua puluh foto kandidat dari potongan dua menit tanpa harus menghapus timeline dengan tangan.
Tugasnya sendiri sederhana. Apa yang membuatnya rumit adalah bahwa "satu frame per detik" menjadi ambigu saat Anda melihatnya lebih dekat. Apakah yang Anda maksud adalah satu bingkai untuk setiap detik waktu pemutaran, atau setiap Nbingkai dari aliran yang dikodekan? Itu adalah hal yang berbeda: klip 24 fps dan klip 60 fps menghasilkan hitungan yang sama pada pembacaan pertama dan hitungan yang sangat berbeda pada pembacaan kedua. Pilih yang salah dan Anda akan mendapatkan folder yang hampir duplikat atau urutannya terlalu jarang untuk berguna.
Kedua pendekatan di bawah ini menghasilkan piksel yang identik. Keduanya berbeda dalam cara Anda mengekspresikan apa yang Anda inginkan, dan dalam seberapa cepat Anda mengetahui bahwa Anda salah menyatakannya.
Metode 1: FFmpeg, parameter demi parameter
Perintah kanoniknya singkat:
ffmpeg -i input.mp4 -vf fps=1 -q:v 2 frame_%04d.jpg
Setiap bagian penting:
-i input.mp4— file sumber. FFmpeg membacanya sekali, mulai sampai selesai; ia tidak mencari setiap stempel waktu satu per satu.-vf fps=1— filter video yang melakukan pekerjaan sebenarnya.fps=1berarti satu frame keluaran per detik waktu pemutaran, terlepas dari kecepatan bingkai sumber. Gunakanfps=1/5untuk satu frame setiap lima detik, ataufps=2untuk dua frame per detik. Ini adalah pembacaan waktu pemutaran.-q:v 2— Kualitas JPEG, pada skala terbalik dengan 2 hampir tanpa kerugian dan 31 sangat terkompresi. Abaikan saja dan Anda mendapatkan default FFmpeg, yang terasa lebih lembut dari perkiraan kebanyakan orang. Jika Anda ingin hasil yang lossless, tulisframe_%04d.pngsebagai gantinya dan hilangkan tanda ini seluruhnya.frame_%04d.jpg— pola keluaran.%04dmemutar angka nol pada penghitung menjadi empat digit:frame_0001.jpg,frame_0002.jpg. Bantalannya bukan kosmetik; lihat masalah penomoran di bawah ini.
Jika Anda ingin bacaan lain — setiap Nbingkai yang dikodekan, bukan setiap N detik — filter berubah:
ffmpeg -i input.mp4 -vf "select=not(mod(n\,10))" -vsync vfr frame_%04d.png
Ini menjaga bingkai tetap berada di indeks bingkai n dapat dibagi 10, dan -vsync vfr menghentikan FFmpeg dari penggandaan bingkai untuk menghasilkan tingkat keluaran yang konstan. Biarkan tanda itu hilang dan Anda akan mendapatkan lebih banyak file daripada yang diminta, yang merupakan hasil pertama yang umum dan membingungkan.
Untuk membatasi pekerjaan pada satu segmen, gunakan -ss sebelum -i sehingga FFmpeg mencari sebelum mendekode, bukan mendekode dan membuang:
ffmpeg -ss 00:01:30 -to 00:02:15 -i input.mp4 -vf fps=1 frame_%04d.png
Metode 2: Pekerjaan yang sama di browser
ekstraksi bingkai di situs ini memetakan ke dua bacaan yang sama, dengan ambiguitas dibuat eksplisit di antarmuka dan bukan disembunyikan dalam string filter.
- Masukkan file. Dibaca langsung dari disk ke dalam memori browser — tidak ada pengunggahan, jadi sumber 3 GB langsung diproses, bukan setelah transfer.
- Pilih metode ekstraksi. "Interval Waktu" setara dengan
fps=1/N— Anda memasukkan jeda dalam hitungan detik. "Frame Rate (FPS)" setara denganselect/modfilter — Anda memasukkan N untuk menyimpan setiap Nbingkai ke-th. - Baca petunjuk jumlah frame sebelum mengekstraksi. Ini adalah bagian yang paling menghemat waktu. Antarmuka menunjukkan berapa banyak gambar yang akan dihasilkan oleh pengaturan Anda saat ini sebelum apa pun berjalan, sehingga kesalahan 4.000 file menjadi nomor yang Anda lihat, bukan folder yang Anda temukan.
- Atur format dan kualitas. PNG untuk lossless, JPG atau WebP dengan penggeser 10–100% jika ukuran penting. Posisi penggeser sesuai dengan
-q:vkontrol, mengungkapkan cara berpikir kebanyakan orang tentangnya. - Pangkas rentang jika diperlukan. Penggeser dua pegangan adalah
-ss/-tosetara, dengan stempel waktu ditampilkan saat Anda menyeret. - Ekspor. Bingkai muncul di kotak pratinjau; klik salah satu untuk menyimpannya sendiri, atau ambil seluruh rangkaian sebagai satu ZIP.
Aturan jempol untuk memilih interval: untuk kepala bicara atau rekaman layar, 1 bingkai setiap 2–5 detik menangkap setiap perubahan keadaan yang berarti. Untuk olahraga atau apa pun dengan gerakan cepat, 2–5 frame per detik. Cadangan "setiap frame" untuk analisis akurat frame asli — satu menit 60 fps sama dengan 3.600 gambar dan beberapa gigabyte PNG.
Tiga masalah yang sebenarnya menghabiskan waktu orang
1. Outputnya adalah ribuan frame yang hampir identik
Hampir selalu ada kesalahan unit: maksud Anda "setiap frame ke-10" dan menulis fps=10, yang berarti sepuluh frame per detik — pada sumber 30 fps yang menghasilkan gambar 3× lebih banyak dari perkiraan naif, bukan 3× lebih sedikit.
Sebelum menjalankan apa pun, lakukan aritmatika. Mode waktu pemutaran: duration ÷ interval. Mode indeks bingkai: duration × source_fps ÷ N. Klip berdurasi 10 menit dengan kecepatan 30 fps pada "setiap bingkai ke-10" adalah 600 × 30 10 = 1.800 gambar. Jika angka tersebut mengejutkan Anda, sesuaikan sebelum memulai, bukan setelahnya. Di alat browser, angka yang sama muncul di bawah bidang interval secara otomatis.
2. Ekstraksi terhenti di tengah-tengah video yang panjang
Penyebabnya berbeda-beda. di setiap sisi, jadi perbaikannya juga berbeda.
Dengan FFmpeg, kemacetan biasanya terkait dengan disk — ribuan PNG masuk satu direktori dan sistem file, bukan decoder, yang menjadi penghambat. Tulis ke direktori kosong yang baru, pilih JPG ketika Anda tidak memerlukan lossless, dan pisahkan sumber yang sangat panjang menjadi beberapa segmen dengan -ss/-to.
Di browser, batasannya adalah RAM: setiap frame yang diekstraksi disimpan di memori hingga Anda mengunduh ZIP. Beberapa ratus 4K PNG adalah beberapa gigabyte dan sebuah tab dapat dimatikan karenanya. Pola yang dapat diandalkan adalah bekerja dalam beberapa bagian — gunakan penggeser rentang waktu untuk mengambil waktu 0:00–2:00, unduh ZIP tersebut, lalu pindahkan rentang tersebut ke 2:00–4:00. Menutup tab lain sebelum melakukan pekerjaan besar benar-benar membantu, dan JPG dengan kualitas 85–90% mengurangi tekanan memori beberapa kali lipat tanpa perbedaan yang terlihat untuk sebagian besar penggunaan.
3. Penomoran bingkai memutus urutan impor
Yang ini digigit setelah ekspor terlihat baik-baik saja. Alat yang mengurutkan nama file sebagai teks — dan sebagian besar melakukan hal tersebut — berurutan frame_10.png sebelum frame_2.png, karena "1" mengurutkan sebelum "2" karakter demi karakter. Urutan Anda diputar ulang secara acak dan tidak jelas alasannya.
Perbaikannya adalah zero-padding, cukup lebar untuk penghitungan terbesar yang pernah Anda hasilkan. Itulah yang %04d adalah untuk; use %05d jika Anda mungkin melebihi 9.999 frame. Alat browser melakukan pad secara otomatis, yang merupakan alasan utama mengapa keluarannya cenderung langsung turun ke pengimpor urutan gambar tanpa mengganti nama.
Ketika FFmpeg masih merupakan pilihan yang tepat
Banyak waktu. Hal ini tidak terjadi ketika browser menang secara keseluruhan:
- Apa pun yang ditulis atau dijadwalkan. Pekerjaan cron, langkah CI, pipeline sisi server — browser tidak dapat berpartisipasi sama sekali.
- Membuat batch di banyak file. Perulangan shell lebih dari 200 klip adalah hal yang sepele di FFmpeg dan membosankan di tempat lain.
- Codec browser tidak akan mendekode. ProRes, DNxHD, format kamera mentah, wadah yang tidak biasa. Jika browser tidak dapat memutarnya, maka browser tidak dapat mengekstraknya. FFmpeg menangani hampir semuanya.
- Pemfilteran selama ekstraksi. Deinterlacing, penskalaan, konversi ruang warna, pemotongan, deteksi perubahan pemandangan — semuanya tersedia sebagai filter dalam satu gerakan.
- Reproduksibilitas. Perintah dalam README sudah tepat. "Setel penggeser ke sekitar sini" tidak.
Alat browser lebih cocok untuk pekerjaan yang dilakukan sekali saja, bagi siapa saja yang tidak ingin menginstal dan memelihara rantai alat untuk tugas sesekali, ketika sumbernya cukup rahasia sehingga pemrosesan lokal saja menjadi penting, dan ketika Anda ingin melihat frame sebelum melakukan ekspor. Itu adalah situasi yang benar-benar berbeda, bukan peringkat.
Referensi cepat
| Apa yang Anda inginkan | FFmpeg | Alat browser |
|---|---|---|
| Satu frame per detik | -vf fps=1 |
Interval Waktu = 1 |
| Satu frame setiap 5 detik | -vf fps=1/5 |
Interval Waktu = 5 |
| Setiap bingkai ke-10 yang dikodekan | -vf "select=not(mod(n\,10))" -vsync vfr |
Mode Kecepatan Bingkai, N = 10 |
| Hanya 1:30 hingga 2:15 | -ss 00:01:30 -to 00:02:15 |
Penggeser rentang waktu |
| Hasil tanpa hilang | .png pola keluaran |
Format = PNG |
| File yang lebih kecil | -q:v 5 dengan .jpg |
JPG + penggeser kualitas |
| Lihat hitungan sebelum berlari | Hitung secara manual | Ditampilkan di bawah bidang interval |
| Pratinjau sebelum menyimpan | Buka folder output | Kisi pratinjau bawaan |
| Otomasi / batch | Shell loop, cron, CI | Tidak mungkin |
| ProRes, DNxHD, mentah | Tugas | Hanya apa yang didekodekan oleh browser |
Rute mana pun yang Anda ambil, keputusan interval akan didahulukan dan alat akan didahulukan. Cari tahu berapa banyak bingkai yang benar-benar Anda perlukan, konfirmasikan penghitungannya sebelum memulai, dan sisanya bersifat mekanis.