Bagaimana cara membuat video dari gambar menggunakan FFmpeg?

86

Apakah mungkin untuk menggunakan ffmpegmembuat video dari serangkaian sekuens, di mana angkanya tidak dimulai dari nol?

Misalnya, saya punya beberapa gambar [test_100.jpg, test_101.jpg, test_102.jpg, ..., test_200.jpg], dan saya ingin mengonversinya menjadi video. Saya mencoba perintah berikut, tetapi tidak berhasil (sepertinya angkanya harus dimulai dari nol):

ffmpeg -i test_% d.jpg -vcodec mpeg4 test.avi

Adakah saran?

JakeGould
sumber
Sudah lama sejak Anda menanyakan hal ini, tetapi jika Anda masih tertarik dengan pertanyaan itu, jawabannya adalah YA - Saya telah memposting detail dan contoh di bawah ini: stackoverflow.com/a/12160155/181638
Assad Ebrahim
@casperOne akan berguna untuk memiliki ide mengapa ini di luar topik. Sepertinya masalah pemrograman tertentu. Tag FFmpeg memiliki 3,7k pengikut, dan dengan 27k tampilan yang jelas orang merasa itu berguna ..
geotheory
2
@geotheory Statistik tag tidak relevan. ffmpeg adalah program yang banyak bicara, WinRar. Meskipun Anda dapat memprogram melawan pustaka di ffmpeg , pertanyaan ini bukan tentang itu. Menggunakan ffmpeg dari baris perintah harus ditanyakan pada Pengguna Super , di mana itu pada topik.
casperOne

Jawaban:

81

Tidak perlu mengganti nama file jika menggunakan -start_numbersakelar seperti ini:

ffmpeg -start_number n -i test_%d.jpg -vcodec mpeg4 test.avi

di mana nawal dari urutan stills.

Catatan, ini akan berfungsi selama urutan tidak terputus begitu dimulai. Jika ada celah dan Anda ingin semua stills dimasukkan, maka penomoran ulang mungkin diperlukan untuk mengisi kesenjangan.

Ada beberapa sakelar lain yang mungkin berguna bagi Anda.

Saya menggunakan one-liner berikut untuk mendapatkan frame rate yang lebih lambat dan untuk mengompres gambar dan menghasilkan video yang lebih kecil:

ffmpeg.exe -f image2 -framerate 25 -pattern_type sequence -start_number 1234 -r 3 -i Imgp%04d.jpg -s 720x480 test.avi

The -r 3pilihan menetapkan framerate dari video yang dihasilkan dengan 3 frame per detik sehingga saya bisa melihat masing-masing masih untuk waktu singkat. The -spilihan rescales gambar untuk resolusi yang diinginkan untuk mengelola ukuran video yang dihasilkan.

(Di shell Windows, ganti -i Imgp%04d.jpgdengan -i "Imgp%%04d.jpg". Kredit untuk ini ke Mike Fitzpatrick https://superuser.com/a/344178/153054 )

Assad Ebrahim
sumber
4
apa perbedaan antara -r dan -framerate?
1
mereka adalah IIRC yang sama
rogerdpack
22
Tidak perlu penomoran bilangan, asalkan Anda senang menerima pesanan mereka muncul (katakanlah) 'ls' ... cukup gunakan: ffmpeg -pattern_type glob -i '* .jpg'
movie.mp4
2
Apakah ada saklar untuk mengontrol kesenjangan waktu antara gambar, katakanlah, saya ingin menunjukkan gambar 13 pertama, 15 detik kedua, 24 detik untuk ketiga, perbedaan waktu ditentukan pengguna, apakah itu mungkin?
zionpi
2
lihat juga trac.ffmpeg.org/wiki/…
david.libremone
38

Anda dapat menggunakan potongan kode di bawah ini:

 cat *.jpg | ffmpeg -f image2pipe -r 1 -vcodec mjpeg -i - -vcodec libx264 out.mp4

sumber
Ini tidak memutar JPG ke rotasi yang dinyatakan dalam metadata.
Erik Johansson
17

Anda dapat menemukan contoh skrip dalam dokumentasi ffmpeg :

3.2 Bagaimana cara saya menyandikan gambar tunggal ke dalam film?

Jika Anda memiliki banyak gambar untuk diganti namanya, Anda dapat menggunakan perintah berikut untuk meringankan beban. Perintah, menggunakan sintaksis bourne shell, secara simbolis menautkan semua file dalam direktori saat ini yang cocok dengan * jpg ke /tmp' directory in the sequence ofimg001.jpg ', `img002.jpg' dan seterusnya.

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done

Lalu lari:

ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg
gaizka
sumber
2
Anda sebaiknya membuat x = 0 untuk memulai sehingga nama gambar mulai img000.jpg karena inilah yang diharapkan oleh ffmpeg. Juga symlinking tidak bekerja untuk saya karena ffmpeg tidak dapat menemukan file jadi saya harus menggunakan cp sebagai gantinya (kecepatan dan ruang jelas menarik kembali tetapi saya tetap setelahnya). mv juga akan berfungsi jika Anda tidak keberatan kehilangan dokumen asli.
Perhatikan bahwa dalam jawaban ini, perintah yang diberikan menciptakan hardlink, bukan symlink. Mengenai penggunaan cpjika tautan tidak berfungsi, jika sistem file Anda mendukungnya cp --reflink=autoakan mencapai kecepatan / penggunaan ruang yang jauh lebih baik.
Félix Saparelli
12

Dari dokumen ffmpeg:

Menggunakan pola gumpalan

ffmpeg juga mendukung bash-style globbing (* mewakili sejumlah karakter apa pun).

Ini berguna jika gambar Anda berurutan tetapi tidak harus dalam urutan berurutan seperti pada contoh sebelumnya.

ffmpeg -r 1 -pattern_type glob -i 'test_*.jpg' -c:v libx264 out.mp4

Jadi, selama file Anda diurutkan, menggunakan -pattern_type globsaklar harus bekerja untuk Anda.

Nevin Williams
sumber
Perhatikan bahwa gumpalan ini lebih terbatas daripada gumpalan shell biasa: trac.ffmpeg.org/ticket/3620 tampaknya karena jenis gambar disimpulkan dari ekstensi.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
11

Sejauh yang saya tahu, Anda tidak dapat memulai urutan dalam angka acak (saya tidak ingat apakah Anda harus memulainya pada 0 atau 1), ditambah, itu tidak dapat memiliki celah, jika ya, ffmpeg akan menganggap urutannya sudah berakhir dan berhenti menambahkan lebih banyak gambar.

Juga, seperti yang dinyatakan dalam komentar untuk jawaban saya, ingat Anda harus menentukan lebar indeks Anda. Suka:

gambar% 03d.jpg

Dan jika Anda menggunakan tipe indeks% 03d, Anda harus mengisi nama file Anda dengan 0, seperti:

image001.jpg image002.jpg image003.jpg

dll.

Francisco Soto
sumber
1
Jika nama file gambar memiliki angka nol di depan maka string format juga harus menentukan lebar seperti "% 03d".
1
Jika itu satu-satunya kendala, Anda bisa menulis skrip untuk mengganti nama atau menyinkronkan gambar Anda ke set yang diindeks ulang dengan benar.
Cascabel
1
Ya, saya pernah bekerja dengan ini sebelumnya, saya menulis pembungkus di Ruby beberapa waktu lalu di mana Anda memanggil instance.addImage (), lalu instance.processVideo () dan itu akan membuat direktori temporal, menyalin / mengganti nama gambar dengan indeks yang tepat dan buat videonya. Cukup mudah.
@ Jefromi Saya telah membuat symlink tetapi bagaimana cara memberikan path file symlink ke ffmpeg? Itu hanya mengasumsikan file symlink adalah gambar yang saya coba konversi? Saya berada di win7 btw
Urutan dapat mulai dari 0 hingga 4 inklusif.
Assad Ebrahim
5

Saya setuju dengan Francisco, tetapi sebagai solusi Anda hanya bisa menulis skrip cepat untuk memindahkan atau membuat tautan simbolis ke file dengan nomor urut yang dibutuhkan ffmpeg. Script kemudian dapat memanggil ffmpeg dan kemudian menghapus tautan atau memindahkan file kembali ke lokasi aslinya.

Jason B
sumber
1

Lihatlah

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i"
/tmp/img"$counter".jpg; x=$(($x+1)); done

sumber
1

Saya tahu ini adalah pertanyaan lama tetapi saya menemukan di Google sambil mencari jawaban yang sama. Tidak ada jawaban di sini yang memuaskan saya sepenuhnya sehingga saya melakukan lebih banyak pencarian dan membaca dan ini adalah perintah yang saya buat untuk masalah saya sendiri.

cat {0032..1501}*.png | ffmpeg -f image2pipe -framerate 5 -i - -s 720x480 test2.avi

Alasan mengapa saya menggunakan perintah seperti ini adalah ...

  1. Cat dan -f image2pipe memberi Anda kontrol lebih baik atas gambar apa yang Anda gunakan. Sebagai contoh, ini memungkinkan Anda untuk menggunakan fitur bash seperti ekspansi braket dan perintah lain seperti grep untuk menyempurnakan hasil Anda jika Anda memilih.
  2. Lebih sedikit beralih ke mengingat.
  3. Saya sarankan TIDAK menggunakan -r, dan gunakan saja -framerate saja. Dalam pengalaman saya -r cenderung menjatuhkan frame lebih sering.
  4. Tidak terlalu rumit, tidak ada switch yang tidak perlu digunakan dan akan berfungsi apa adanya. Anda dapat menambahkan lebih banyak kerumitan (misalnya, menentukan enkoder) dan menyempurnakan agar sesuai dengan kebutuhan Anda.
David Bobb
sumber
Untuk pertanyaan OP, -start_numberitulah yang dibutuhkan.
Gyan
0

Saya menggunakan flv encoder karena video saya menggunakan flash player (Jwplayer)

ffmpeg -i% d.jpg -vcodec flv test.flv


sumber
0

Dari dokumentasi , sepertinya Anda cukup menggunakan *

For example, for creating a video from filenames matching the glob pattern foo-*.jpeg:

ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi

Sebagai catatan, untuk meningkatkan pengaruh kualitas, laju / fps mungkin penting (mis., Tentukan dulu frame rate sangat rendah / tinggi dan kemudian beralih dari filter kedua yang akan membuat video gerakan lambat menjadi normal?)

ntg
sumber
0

Dalam kasus saya, itu sedikit rumit karena angka dalam file. Begini tampilannya gambar saya:

$ ls | head -5
2014_aq_unprocessed 001.jpg
2014_aq_unprocessed 002.jpg
2014_aq_unprocessed 003.jpg
2014_aq_unprocessed 004.jpg
2014_aq_unprocessed 005.jpg

dan inilah perintah yang saya gunakan:

ffmpeg -i 2014_aq_unprocessed\ %3d.jpg  -vcodec mpeg4 test.avi
Mona Jalal
sumber
0

Anda dapat melakukan ini dengan convert -morph:

convert *.jpg -delay 10 -morph 10 %05d.jpg

Jika Anda ingin menggunakan ffmpeg, saya menggunakan

ffmpeg -pattern_type glob -i '*.jpg' -vf "setpts=10*PTS" movie.mp4

di mana 10*PTSmemberitahu ffmpeg untuk memperlambatnya 10 kali. Anda juga dapat memiliki pecahan di sana untuk mempercepatnya.

Martin Thoma
sumber
Ini hanya menginterpolasi urutan gambar asli Anda ke ruang baru, itu tidak membuat file video seperti yang diminta OP.
f0ster
0

-pattern_type glob contoh nyata dengan audio

Opsi ini disebutkan di: https://superuser.com/a/782520/128124 tetapi di sini ada beberapa contoh nyata penggunaannya, termasuk menambahkan audio ke video keluaran.

Video tayangan slide dengan satu gambar per detik

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

Tambahkan musik ke dalamnya, potong ketika audio ketika gambar berakhir:

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

Berikut adalah dua demo di YouTube:

Jadilah hippie dan gunakan format video Theora patent-unencumbered :

ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \
  -c:a copy -shortest -c:v libtheora -r 30 -pix_fmt yuv420p out.ogg

Gambar Anda tentu saja harus disortir berdasarkan abjad, biasanya sebagai:

0001-first-thing.jpg
0002-second-thing.jpg
0003-and-third.jpg

dan seterusnya.

Lihat juga: http://unix.stackexchange.com/questions/68770/converting-png-frames-to-video-at-1-fps/339399#339399

Video kecepatan normal dengan satu gambar per bingkai pada 30 FPS

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

Begini tampilannya:

GIF dihasilkan dengan: https://askubuntu.com/questions/648603/how-to-create-an-animated-gif-from-mp4-video-via-command-line/837574#837574

Tambahkan beberapa audio ke dalamnya:

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -i audio.ogg -c:a copy -shortest -c:v libx264 -pix_fmt yuv420p out.mp4

Hasil: https://www.youtube.com/watch?v=HG7c7lldhM4

Konversi satu file musik ke video dengan gambar tetap untuk unggahan YouTube

Dijawab di: Bagaimana cara mengkonversi format video yang diizinkan ke MP3?

Dapatkan beberapa gambar input uji sintetis

Ini adalah gambar uji yang telah saya gunakan dalam jawaban ini:

wget -O opengl-rotating-triangle.zip https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.zip?raw=true
unzip opengl-rotating-triangle.zip
cd opengl-rotating-triangle
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg

Gambar dibuat dengan: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292

Sangat keren untuk mengamati seberapa banyak video mengompres urutan urutan gambar lebih baik daripada ZIP karena mampu mengompresi seluruh frame dengan algoritma khusus:

  • opengl-rotating-triangle.mp4: 340K
  • opengl-rotating-triangle.zip: 7.3M

Tentang opsi CLI

Namun perlu dicatat bahwa terlepas dari namanya, -globini tidak umum seperti patters shell Glob, misalnya: -i '*'gagal: https://trac.ffmpeg.org/ticket/3620 (tampaknya karena filetype disimpulkan dari ekstensi).

-r 30membuat -framerate 1video 30 FPS untuk mengatasi bug pada pemain seperti VLC untuk framerates rendah: https://stackoverflow.com/questions/19267443/playback-issues-in-vlc-with-low-fps-video-from-images-using- menggunakan- ffmpeg / 41797724 # 41797724 Oleh karena itu ia mengulangi setiap frame 30 kali untuk menjaga efek 1 gambar per detik yang diinginkan.

Langkah selanjutnya

Anda juga ingin:

TODO: belajar memotong dan menggabungkan beberapa file audio ke dalam video dari baris perintah:

Diuji pada

ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.

Bibliografi

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber