Saya memiliki bingkai video dalam format PNG pada 1 FPS dan saya mencoba mengubahnya menjadi video menggunakan ffmpeg.
Jika saya melakukan sesuatu seperti ini:
ffmpeg -i data/input-%4d.png data/output.mp4
Saya mendapatkan video di 25FPS yang pada dasarnya merupakan input yang sangat cepat (yang ditangkap pada 1FPS).
Jika saya mencoba:
ffmpeg -i data/input-%4d.png -r 1 data/output.mp4
Saya mendapatkan sesuatu yang VLC tidak ingin mainkan :)
Sekarang, jika saya mengambil video pertama (yang FF) dan menerapkan filter untuk memperlambatnya (misalnya -filter:v 'setpts=24.0*PTS'
), saya bisa membuatnya diputar seperti video 1 FPS, tetapi tentu saja harganya adalah ukuran file. Itu menghasilkan banyak frame berulang kurasa.
Jadi, pertanyaannya adalah bagaimana cara membuat video yang memiliki tepat 1 FPS dan benar-benar diputar pada kecepatan itu? Format output, btw, tidak begitu penting bagi saya.
sumber
ffmpeg
cukup pintar untuk mengetahui codec video hanya dari ekstensi file format kontainer.mp4
,. Coba tambahkan-vcodec libx264 -vpre hq
ke baris perintah, untuk memberitahukannya tentang parameter codec dan encoding.-r 1
.Jawaban:
Jika Anda menginginkan satu-liner untuk FFMPEG yang menghasilkan video yang diputar pada 1 frame per detik, yang ingin Anda lakukan adalah menentukan framerate untuk input dan output, seperti ini:
The
-r 1
berarti video akan bermain pada 1 dari gambar asli per detik.The
-r 10
berarti video akan bermain di 10 frame per detik.(
-pix_fmt yuv420p
Hanya ada untuk memastikan kompatibilitas dengan berbagai program pemutaran. Ini diperlukan di sini, misalnya, agar video dapat dimainkan oleh Windows Media Player.)Saya menguji banyak framerate keluaran yang berbeda, dan 10 tampaknya merupakan angka terendah yang dapat Anda gunakan yang masih akan menghasilkan video yang akan diputar VLC.
Tentu saja, perintah di atas berarti setiap gambar asli sedang dikalikan, tetapi ini adalah metode yang lebih sederhana daripada "memperlambatnya" yang Anda sebutkan, dan tergantung pada codec itu mungkin tidak menghasilkan video yang jauh lebih besar dari 1-FPS yang sebenarnya video.
Untuk menguji ini, saya baru saja menghasilkan video 1-FPS sejati, yang keluar menjadi 2,24 kiB. Saya kemudian menghasilkan video dengan gambar input yang sama tetapi output pada 24 FPS, dan keluar menjadi 5,76 kiB. Itu lebih dari dua kali lipat ukuran, dan jauh dari 24 kali ukuran. :)
sumber
Gunakan keduanya
-framerate
dan-r
Misalnya, untuk memiliki video final yang terlihat seperti 1FPS:
Ini mirip dengan apa yang Konversi bingkai PNG ke video di 1 FPS | Unix & Linux Stack Efek mengatakan, tapi aku butuh
-framerate
bukannya-r
untuk itu untuk bekerja.Ini disebutkan di wiki di: http://trac.ffmpeg.org/wiki/Slideshow#Framerates
Ini mengatur framerate output
30
, yang dapat ditangani VLC, dan menyalin setiap gambar 30 kali, sehingga video output nampaknya berada pada 1 FPS. Lihat juga: Masalah pemutaran di VLC dengan video fps rendah dari gambar menggunakan ffmpeg | Stack OverflowVLC kemudian dapat memutar video secara normal.
Diuji pada Ubuntu 16.10, VLC 2.2.4,
ffmpeg
3.0.5, dalam direktori dengan 10 PNG.Lihat juga: /programming/19267443/vlc-freezes-for-low-1-fps-video-created-from-images-with-ffmpeg
sumber
-r
dan-framerate
?man
halaman, beri tahu saya ;-) Sebuah kutipan yang bermakna adalah "-r Sebagai opsi input, abaikan stempel waktu yang tersimpan dalam file dan sebagai gantinya buat stempel waktu dengan asumsi fps laju bingkai konstan. Ini tidak sama dengan opsi -framerate yang digunakan untuk beberapa format input seperti image2 atau v4l2 (dulu sama dengan versi lama dari FFmpeg). Jika ragu gunakan -framerate bukan opsi input -r. "Bagaimana jika Anda menambah sedikit contoh kedua sebagai berikut:
The
-r 1
kebutuhan untuk datang sebelum file .png, tidak setelah.Dari dokumentasi FFmpeg :
sumber
Ini adalah bug di VLC (yang masih ada di versi 3.0.6). Setelah beberapa percobaan saya menyadari bahwa VLC crash untuk video dengan FPS kurang dari 10 . Jadi semua video dengan 10 FPS atau lebih seharusnya tidak menjadi masalah. Jadi saat ini tidak ada cara bersih untuk mendapatkan video dengan 1 FPS yang dapat diputar dalam VLC ( jangan menyerah, terus membaca ).
Satu solusi adalah - seperti yang ditunjukkan pada jawaban di atas - untuk memalsukan efek 1 FPS dengan menduplikasi gambar (ketika kita benar-benar memiliki FPS sama dengan 10 atau lebih, yang ok untuk VLC).
Contoh: jika Anda memiliki folder dengan 12 gambar, dan Anda ingin membuat video dengan 1 FPS (yang dapat diputar dalam VLC), maka Anda perlu menduplikasi setiap gambar beberapa kali (misalkan 10 kali), dan kemudian beri tahu FFMPEG untuk menghasilkan video 10 FPS. Dengan cara ini kita akan mendapatkan video dengan total frame 120, di mana setiap gambar akan diputar selama 1 detik (karena digandakan 10 kali), yang hanya palsu untuk 1 FPS.
Saya lebih suka menggunakan
fps
parameter daripada-r
(yang ditunjukkan dalam jawaban lain) yang dalam beberapa kasus mungkin bermasalah (sesuai dengan dokumentasi resmi ).Karena input
-framerate
lebih rendah dari outputfps
, FFMPEG akan menduplikasi frame untuk mencapai laju frame output yang Anda inginkan (yaitu 10 sesuai dengan perintah di atas).Penting juga untuk memperhatikan bahwa urutan
-framerate
dan-vf fps
penting , karena konfigurasi ini akan diterapkan pada video yang disebutkan berikutnya (in- atau output). Itu menurut dokumen resmi :sumber