Bagaimana cara membuat video dari gambar dengan FFmpeg?

163
ffmpeg -r 1/5 -start_number 2 -i img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Baris ini berfungsi dengan baik tetapi saya ingin membuat file video dari gambar di folder lain. Nama gambar dalam folder saya adalah:

img001.jpg
img002.jpg
img003.jpg
...

Bagaimana saya bisa memasukkan file gambar dari folder yang berbeda? Contoh:C:\mypics

Saya mencoba perintah ini tetapi hanya ffmpegmenghasilkan video dengan gambar pertama (img001.jpg).

ffmpeg -r 1/5 -start_number 0 -i C:\myimages\img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4
pengguna3877422
sumber

Jawaban:

167

Lihat Membuat tayangan slide video dari gambar - FFmpeg

Jika video Anda tidak menunjukkan bingkai dengan benar. Jika Anda mengalami masalah, seperti gambar pertama dilewati atau hanya ditampilkan untuk satu frame, maka gunakan filter video fps, bukan -r untuk framerate output

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4

Atau filter video format dapat ditambahkan ke rantai filter untuk menggantikan -pix_fmt yuv420p seperti "fps = 25, format = yuv420p" . Keuntungan dari metode ini adalah Anda dapat mengontrol filter mana yang lebih dulu

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf "fps=25,format=yuv420p" out.mp4

Saya menguji parameter di bawah ini, itu berhasil untuk saya

"e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -vf "fps=25,format=yuv420p" e:\out.mp4

parameter di bawah ini juga berfungsi tetapi selalu melompati gambar pertama

"e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -r 30 -pix_fmt yuv420p e:\out.mp4

membuat video dari gambar yang ditempatkan di folder yang berbeda

Pertama, tambahkan jalur gambar ke imagepaths.txt seperti di bawah ini.

# this is a comment details https://trac.ffmpeg.org/wiki/Concatenate

file 'E:\images\png\images__%3d.jpg'
file 'E:\images\jpg\images__%3d.jpg'

Contoh penggunaan sebagai berikut;

"h:\ffmpeg\ffmpeg.exe" -y -r 1/5 -f concat -safe 0 -i "E:\images\imagepaths.txt" -c:v libx264 -vf "fps=25,format=yuv420p" "e:\out.mp4"

Parameter -safe 0 mencegah nama file tidak aman kesalahan

Tautan yang berhubungan

FFmpeg membuat video dari gambar yang ditempatkan di folder yang berbeda

FFMPEG Panduan Menengah / urutan gambar

Concatenate - FFmpeg

khan
sumber
"Jika video Anda tidak menampilkan frame dengan benar Jika Anda mengalami masalah, seperti gambar pertama dilewati atau hanya ditampilkan untuk satu frame, maka gunakan filter video fps sebagai gantinya" Maaf, bisakah Anda jelaskan apa yang Anda maksud dengan "fps filter video "tepatnya?
arnuschky
3
Sejauh yang saya tahu -r parameter adalah frame rate variabel ini berarti bahwa FFMPEG mungkin menjatuhkan atau menduplikasi frame untuk mencapai frame rate output yang diinginkan. Menggunakan filter fps “-vf fps = value” memaksa FFMPEG untuk menghasilkan laju bingkai konstan. Lihat Membuat tayangan slide video dari gambar - FFmpeg , dan ini Apa perbedaan (teknis) antara -r dan filter fps? . Jadi menggunakan -r parameter kadang-kadang menyebabkan melewatkan gambar pertama ..
khan
Perintah pertama pada daftar ini ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4,, tampaknya berfungsi tetapi pada akhirnya menghasilkan video yang tidak dapat dibaca oleh pemain mana pun (di Ubuntu). VNC berkata, "moov atom tidak ditemukan". Mencoba untuk memperbaiki ini dengan qt-faststartmenghasilkan kesalahan "atom terakhir dalam file bukan atom moov"
sh37211
147

-pattern_type glob

Opsi hebat ini memudahkan untuk memilih gambar dalam banyak kasus.

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 beberapa musik ke dalamnya, potong ketika audio agak lama 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.

Saya juga pertama-tama akan memastikan bahwa semua gambar yang akan digunakan memiliki rasio aspek yang sama, mungkin dengan memotongnya dengan imagemagickatau nomacs sebelumnya, sehingga ffmpeg tidak harus membuat keputusan sulit. Secara khusus, lebar harus dapat dibagi 2, jika tidak konversi gagal dengan: "lebar tidak dapat dibagi 2".

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: /ubuntu/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

Ini adalah media uji yang saya gunakan: a

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 yang dihasilkan dengan: Bagaimana cara menggunakan GLUT / OpenGL untuk membuat file?

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

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

Dijawab di: /superuser/700419/how-to-convert-mp3-to-youtube-allowed-video-format/1472572#1472572

Pengaturan studi kasus slideshow penuh realistis langkah demi langkah

Ada sedikit lebih banyak untuk membuat tayangan slide daripada menjalankan perintah ffmpeg tunggal, jadi inilah contoh detail yang lebih menarik yang terinspirasi oleh timeline ini .

Dapatkan media input:

mkdir -p orig
cd orig
wget -O 1.png https://upload.wikimedia.org/wikipedia/commons/2/22/Australopithecus_afarensis.png
wget -O 2.jpg https://upload.wikimedia.org/wikipedia/commons/6/61/Homo_habilis-2.JPG
wget -O 3.jpg https://upload.wikimedia.org/wikipedia/commons/c/cb/Homo_erectus_new.JPG
wget -O 4.png https://upload.wikimedia.org/wikipedia/commons/1/1f/Homo_heidelbergensis_-_forensic_facial_reconstruction-crop.png
wget -O 5.jpg https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Sabaa_Nissan_Militiaman.jpg/450px-Sabaa_Nissan_Militiaman.jpg
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg
cd ..

# Convert all to PNG for consistency.
# /unix/29869/converting-multiple-image-files-from-jpeg-to-pdf-format
# Hardlink the ones that are already PNG.
mkdir -p png
mogrify -format png -path png orig/*.jpg
ln -P orig/*.png png

Sekarang kita memiliki pandangan cepat pada semua ukuran gambar untuk memutuskan rasio aspek akhir:

identify png/*

yang keluaran:

png/1.png PNG 557x495 557x495+0+0 8-bit sRGB 653KB 0.000u 0:00.000
png/2.png PNG 664x800 664x800+0+0 8-bit sRGB 853KB 0.000u 0:00.000
png/3.png PNG 544x680 544x680+0+0 8-bit sRGB 442KB 0.000u 0:00.000
png/4.png PNG 207x238 207x238+0+0 8-bit sRGB 76.8KB 0.000u 0:00.000
png/5.png PNG 450x600 450x600+0+0 8-bit sRGB 627KB 0.000u 0:00.000

jadi rasio aspek 480p (640x480 == 4/3) klasik tampak tepat.

Lakukan satu konversi dengan pengubahan ukuran minimal untuk membuat lebar rata (TODO mengotomatiskan untuk lebar apa pun, di sini saya hanya melihat identifykeluaran secara manual dan mengurangi lebar dan tinggi per satu):

mkdir -p raw
convert png/1.png -resize 556x494 raw/1.png
ln -P png/2.png png/3.png png/4.png png/5.png raw
ffmpeg -framerate 1 -pattern_type glob -i 'raw/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p raw.mp4

Ini menghasilkan output yang mengerikan, karena dilihat dari:

ffprobe raw.mp4

ffmpeg hanya mengambil ukuran gambar pertama, 556x494, dan kemudian mengonversi semua yang lain ke ukuran yang tepat, melanggar rasio aspek mereka.

Sekarang mari kita konversi gambar ke rasio aspek target 480p secara otomatis dengan memotong sesuai ImageMagick: bagaimana cara memangkas gambar secara minimal ke rasio aspek tertentu?

mkdir -p auto
mogrify -path auto -geometry 640x480^ -gravity center -crop 640x480+0+0 png/*.png
ffmpeg -framerate 1 -pattern_type glob -i 'auto/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p auto.mp4

Jadi sekarang, rasio aspeknya baik, tetapi mau tidak mau beberapa pemotongan harus dilakukan, jenis potongan mana yang menarik dari gambar.

Pilihan lain adalah untuk pad dengan latar belakang hitam untuk memiliki rasio aspek yang sama seperti yang ditunjukkan pada: Ubah ukuran agar sesuai dalam kotak dan mengatur latar belakang menjadi hitam pada bagian "kosong"

mkdir -p black
ffmpeg -framerate 1 -pattern_type glob -i 'black/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p black.mp4

Namun secara umum, Anda idealnya dapat memilih gambar dengan rasio aspek yang sama atau serupa untuk menghindari masalah tersebut.

Tentang opsi CLI

Namun perlu dicatat bahwa meskipun 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 framerate rendah: VLC membeku untuk video 1 FPS rendah yang dibuat dari gambar dengan ffmpeg 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 tanpa file perantara, saya cukup yakin itu mungkin:

Diuji pada

ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.

Bibliografi

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
Jika Anda menggunakan python dan subprocess.call untuk memulai ffmpeg, Anda tidak boleh menggunakan tanda kutip tunggal 'dalam nama file input dan output. Kalau tidak, ia tidak akan menemukan file.
JalankanOrVeith
Ini akan bagus untuk saya, tetapi build saya dari paket npm ffmpeg-statictidak mengimplementasikan glob. ( Pattern type 'glob' was selected but globbing is not supported by this libavformat build)
Sebi
-pix_fmtmenyebabkan Trailing options were found on the commandline.kesalahan
Anthony Kong
@AnthonyKong Saya tidak bisa mereproduksi dengan ffmpeg -framerate 1 -pattern_type glob -i '*.png' -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4pada Ubuntun 19.10 ffmpeg 4.1.4 tadi, apa versi Anda dan perintah yang tepat?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
20

Versi Sederhana dari Documents

Bekerja sangat bagus untuk gambar Google Earth Studio :

ffmpeg -framerate 24 -i Project%03d.png Project.mp4
Joshua Pinter
sumber
1
Tidak dapat memutar output ini: [h264 @ 0x7f148cc3cc40] akselerator perangkat keras gagal memecahkan kode gambar
Bram
hai bagaimana saya bisa menjalankan perintah itu saya hanya menemukan yang bisa tolong bantu saya?
Tidak bersalah
@Innocent Dari Terminal atau Konsol Anda.
Joshua Pinter
saya mengerti tetapi proyek% 3d.png tidak memilih semua gambar saya di folder dengan nama Project001.png, Project002.png dan seterusnya hanya mendapatkan 2 gambar apa yang harus saya lakukan untuk mendapatkan semua gambar saya dan mengubahnya menjadi video
Innocent
Apakah Anda menggunakan %3datau %03d?
Joshua Pinter
10

cat *.png | ffmpeg -f image2pipe -i - output.mp4

dari wiki

Kelaparan
sumber