Buat video dengan 5 gambar dengan efek fadeIn / out di ffmpeg

27

Dengan 5 gambar saya harus membuat video 60 detik di ffmpeg, setiap gambar harus ditampilkan selama 15 detik. setelah 15 detik, gambar pertama harus memudar dan gambar ke-2 harus memudar, setelah itu gambar ke-2 harus memudar, gambar ke-3 harus memudar ke dalam .. dll Tolong bimbing saya bagaimana saya bisa mencapai ini menggunakan perintah ffmpeg.

pengguna384847
sumber
4
Apa yang sudah Anda coba dan kami dapat membantu Anda? Forum ini bukan jenis "tolong beri saya jawaban tanpa melakukan pekerjaan apa pun" jenis forum. Dengan itu, saya akan memberikan Anda tautan ke ffmpeg fade dokumentasi - ffmpeg.org/ffmpeg-filters.html#fade
Mike Diglio

Jawaban:

49

Celupkan / pudar menjadi hitam

Gulir ke bawah untuk metode crossfade.

contoh fade

Contoh di mana setiap gambar ditampilkan selama 5 detik dan masing-masing memiliki pudar yang berlangsung 1 detik. Setiap input gambar memiliki rasio aspek lebar, tinggi, dan sampel yang sama. Jika ukurannya bervariasi, lihat contoh # 3 di bawah ini.

Output MP4

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4

Dengan audio

Sama seperti di atas tetapi dengan audio:

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-i audio.m4a \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" -map 5:a -shortest out.mp4

Untuk input gambar dengan ukuran bervariasi atau sewenang-wenang

Seperti contoh pertama, tetapi dengan input gambar yang bervariasi lebar x tinggi. Mereka akan diisi agar sesuai dalam kotak 1280x720:

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=out:st=4:d=1[v0]; \
 [1:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4

Lihat contoh dalam Mengubah ukuran video agar pas dengan pemutar berukuran statis jika Anda ingin memotong (mengisi layar) alih-alih kertas (kotak surat / kotak pilar), atau jika Anda ingin mencegah peningkatan.

Output GIF

Menambahkan filter dari Bagaimana cara mengkonversi video ke GIF menggunakan ffmpeg, dengan kualitas yang masuk akal?

ffmpeg \
-framerate 10 -loop 1 -t 5 -i input0.png \
-framerate 10 -loop 1 -t 5 -i input1.png \
-framerate 10 -loop 1 -t 5 -i input2.png \
-framerate 10 -loop 1 -t 5 -i input3.png \
-framerate 10 -loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,split[v0][v1]; \
 [v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" out.gif

Gunakan -loopopsi output untuk mengontrol berapa kali loop GIF. Default adalah infinite loop jika opsi ini tidak digunakan. Nilai -1is no loop.

Opsi dan filter yang digunakan:

  • -t untuk mengatur durasi dalam detik dari setiap input.

  • -loop 1 loop gambar jika tidak akan memiliki durasi 1 frame.

  • -framerateuntuk mengatur laju bingkai gambar input (default ketika dideklarasikan adalah 25). Berguna untuk membuat GIF.

  • skala dengan pad untuk menyesuaikan gambar input ke dalam ukuran seragam yang spesifik (digunakan dalam contoh # 3).

  • fade menjadi fade in dan out. dadalah durasi fade. stadalah saat dimulai.

  • concat ke concatenate (atau "gabung") setiap gambar.

  • format untuk menampilkan skema subsampling kroma yang kompatibel dengan pemain berbasis non-FFmpeg jika mengeluarkan MP4 dan penyandian dengan libx264 (penyandi default untuk keluaran MP4 jika didukung oleh build Anda).

  • terpecah untuk membuat salinan dari output filter. Dibutuhkan oleh palette * filter untuk melakukan semuanya dalam satu perintah.

  • palettegen dan paletteuse untuk membuat GIF terlihat bagus.


Crossfade

contoh crossfade

Contoh di mana setiap gambar ditampilkan selama 5 detik dan masing-masing memiliki crossfade yang berlangsung 1 detik. Setiap input gambar memiliki rasio aspek lebar, tinggi, dan sampel yang sama. Jika ukurannya berbeda, maka adaptasi contoh # 3 di atas.

Output MP4

ffmpeg \
-loop 1 -t 5 -i 1.png \
-loop 1 -t 5 -i 2.png \
-loop 1 -t 5 -i 3.png \
-loop 1 -t 5 -i 4.png \
-loop 1 -t 5 -i 5.png \
-filter_complex \
"[1]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3]; \
 [bg3][f3]overlay,format=yuv420p[v]" -map "[v]" -movflags +faststart out.mp4

Dengan audio

ffmpeg \
-loop 1 -t 5 -i 1.png \
-loop 1 -t 5 -i 2.png \
-loop 1 -t 5 -i 3.png \
-loop 1 -t 5 -i 4.png \
-loop 1 -t 5 -i 5.png \
-i music.mp3 \
-filter_complex \
"[1]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3]; \
 [bg3][f3]overlay,format=yuv420p[v]" -map "[v]" -map 5:a -shortest -movflags +faststart out.mp4

Persilangan antara dua video dengan audio

Pilih segmen 5 detik dari setiap input dan tambahkan crossfade 1 detik:

ffmpeg -i input0.mp4 -i input1.mp4 -filter_complex \
"[0:v]trim=start=5:end=10,setpts=PTS-STARTPTS[v0];
 [1:v]trim=start=12:end=17,setpts=PTS-STARTPTS+4/TB,format=yuva444p,fade=st=4:d=1:t=in:alpha=1[v1];
 [v0][v1]overlay,format=yuv420p[v];
 [0:a]atrim=start=5:end=10,asetpts=PTS-STARTPTS[a0];
 [1:a]atrim=start=12:end=17,asetpts=PTS-STARTPTS[a1];
 [a0][a1]acrossfade=d=1[a]" \
-map "[v]" -map "[a]" output.mp4

Output GIF

ffmpeg \
-framerate 10 -loop 1 -t 5 -i 1.png \
-framerate 10 -loop 1 -t 5 -i 2.png \
-framerate 10 -loop 1 -t 5 -i 3.png \
-framerate 10 -loop 1 -t 5 -i 4.png \
-framerate 10 -loop 1 -t 5 -i 5.png \
-filter_complex \
"[1]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3];[bg3][f3]overlay,split[v0][v1]; \
 [v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" out.gif

Gunakan -loopopsi output untuk mengontrol berapa kali loop GIF. Default adalah infinite loop jika opsi ini tidak digunakan. Nilai -1is no loop.

llogan
sumber
1
@ LordNeckbeard, terima kasih atas jawaban ini, saya menggunakannya untuk contoh lain. Apakah saya mengerti dengan baik bahwa nomor berikut -tdi -loop 1 -t 1 -i 001.pngmendefinisikan durasi frame individu, dan bahwa nomor-nomor berikut T/dalam filter_complexblok mendefinisikan durasi transisi ini? Dan apakah durasi bingkai dalam contoh ini dihitung termasuk durasi transisi atau tidak?
cincplug
1
@Nisarg Itu tampaknya bukan hasil lengkap dan saya tidak yakin apa perintah itu dari dua yang Anda tampilkan sebelumnya. Pokoknya, coba tambahkan -preset ultrafast.
llogan
1
@ LordNeckbeard Saya harus menggabungkan satu set gambar, klip video dan trek audio untuk membuat file video tunggal (lebih disukai ogg, tapi itu kurang relevan pada saat ini). Selain itu, saya perlu membuat beberapa efek transisi antara gambar yang berdekatan. Apakah ada cara untuk skrip seluruh tugas ini menggunakan ffmpeg dan / atau alat baris perintah lainnya? Tujuannya adalah untuk mengotomatiskan tugas melalui antarmuka baris perintah.
Pengguna Web
1
@WebUser Transitions mungkin akan lebih mudah digunakan melt.
llogan
2
Pendekatan ffmpeg bekerja dengan baik untuk saya; Terima kasih! Satu tip untuk pendatang baru ke halaman; di concat=n=9bagian perintah, yang 9berasal dari 5 gambar dalam contoh + 4 transisi antara gambar. Jika Anda menangani jumlah gambar yang berbeda, Anda harus menyesuaikannya.
Jim Miller
4

Saya menulis skrip bash umum yang mengambil jalur ke folder gambar , dan menghasilkan video crossfade dengan ffmpeg:

https://gist.github.com/anguyen8/d0630b6aef6c1cd79b9a1341e88a573e

Script pada dasarnya melihat gambar dalam folder dan mencetak perintah yang mirip dengan jawaban oleh @LordNeckbeard di atas, dan menjalankan perintah. Script ini membantu ketika Anda memiliki banyak gambar di folder dan tidak ingin mengetikkan perintah yang panjang secara manual.

anh_ng8
sumber
Maaf, tetapi skrip Anda gagal dengan ffmpeg 3.0.1, dengan input # 0 hingga # 4 mengembalikan: "Indeks file 5 tidak valid dalam deskripsi filtergraph"
Krzysztof Bociurko
TobySpeight: poin bagus, saya sudah mengedit jawabannya agar lebih jelas. Pada dasarnya ide utama sudah diberikan oleh @LordNeckbeard di atas. Script ini hanya menggeneralisasi ke banyak gambar.
anh_ng8