Mengonversi bingkai PNG ke video pada 1 FPS

21

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.

Assaf Lavie
sumber
Saya tidak yakin ffmpegcukup pintar untuk mengetahui codec video hanya dari ekstensi file format kontainer .mp4,. Coba tambahkan -vcodec libx264 -vpre hqke baris perintah, untuk memberitahukannya tentang parameter codec dan encoding.
Warren Young
Itu benar-benar menemukan jawabannya ok, dan saya seperti yang disebutkan itu bekerja dengan baik dan hanya menghasilkan hasil yang aneh ketika saya menambahkan -r 1.
Assaf Lavie
Saya pikir Anda mungkin lebih beruntung di jawaban ffmpeg di stackoverflow.com atau superuser.com .
Damien

Jawaban:

19

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:

ffmpeg -r 1 -i data / input-% 4d.png -pix_fmt yuv420p -r 10 data / output.mp4

The -r 1berarti video akan bermain pada 1 dari gambar asli per detik.
The -r 10berarti video akan bermain di 10 frame per detik.

( -pix_fmt yuv420pHanya 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. :)

SAYA
sumber
+1 pada -pix_fmt. Mudah untuk melupakan beberapa orang yang bersikeras menggunakan WMP :-)
Smalltown2k
mengapa Anda ingin format output menjadi 10 fps sementara inputnya hanya 1? Bukankah itu akan membuat 90% frame berlebihan yang persis sama?
Herbert
@ Herbert itu membuat bingkai berlebihan sehingga Anda bisa mendapatkan frame rate hingga 10, yang dilakukan supaya VLC tidak mengeluh , dan secara visual tidak mengubah video. Encoder cukup pintar untuk melihat bahwa semua frame identik sehingga Anda tidak berakhir dengan file yang lebih besar
chiliNUT
@chiliNUT jelas, hal keyframe, yang tidak semua format, tetapi sebagian besar format waras akan melakukannya. Terima kasih!
Herbert
5

Gunakan keduanya -frameratedan-r

Misalnya, untuk memiliki video final yang terlihat seperti 1FPS:

ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
    -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Ini mirip dengan apa yang Konversi bingkai PNG ke video di 1 FPS | Unix & Linux Stack Efek mengatakan, tapi aku butuh -frameratebukannya -runtuk 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 Overflow

VLC kemudian dapat memutar video secara normal.

Diuji pada Ubuntu 16.10, VLC 2.2.4, ffmpeg3.0.5, dalam direktori dengan 10 PNG.

Lihat juga: /programming/19267443/vlc-freezes-for-low-1-fps-video-created-from-images-with-ffmpeg

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber
Apa perbedaan antara -rdan -framerate?
Royi
@Royi Saya tidak begitu tahu, kecuali bahwa itu adalah satu-satunya hal yang bekerja untuk saya :-) Tetapi jika Anda berhasil mengekstraknya dari manhalaman, 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. "
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
3

Bagaimana jika Anda menambah sedikit contoh kedua sebagai berikut:

$ ffmpeg -r 1 -i data/input-%4d.png -c:v libx264 out.mp4

The -r 1kebutuhan untuk datang sebelum file .png, tidak setelah.

Dari dokumentasi FFmpeg :

Sebagai aturan umum, opsi diterapkan ke file yang ditentukan berikutnya. Oleh karena itu, pesanan penting, dan Anda dapat memiliki opsi yang sama pada baris perintah beberapa kali. Setiap kejadian kemudian diterapkan ke file input atau output berikutnya.

slm
sumber
Sayangnya ini tidak berhasil. Namun, menyebutkan bahwa pesanan itu penting menghemat banyak waktu saya. Terima kasih.
Mohammed Noureldin
0

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 fpsparameter daripada-r (yang ditunjukkan dalam jawaban lain) yang dalam beberapa kasus mungkin bermasalah (sesuai dengan dokumentasi resmi ).

ffmpeg -framerate 1 -i "img (%d).jpg" -c:v libvpx-vp9 -vf "fps=10,format=yuv420p" out.mkv

Karena input -frameratelebih rendah dari output fps, 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 -frameratedan -vf fpspenting , karena konfigurasi ini akan diterapkan pada video yang disebutkan berikutnya (in- atau output). Itu menurut dokumen resmi :

opsi diterapkan ke file yang ditentukan berikutnya. Oleh karena itu, pesanan penting ...

Mohammed Noureldin
sumber