crossfade antara 2 video menggunakan ffmpeg

27

Saya sudah mencoba untuk mencapai transisi crossfade antara 2 klip video menggunakan ffmpeg tetapi sejauh ini gagal. Saya baru mengenal ffmpeg dan sebagian besar mengandalkan mengutak-atik apa yang dapat saya temukan dalam dokumentasi dan contoh-contoh yang ada secara online. Dari apa yang saya baca sejauh ini, menggunakan campuran atau filter overlay akan membantu dalam mencapai apa yang saya cari, tetapi saya tidak bisa mengetahui detail baris perintah untuk membuatnya bekerja.

The memudar dan concat filter yang besar untuk fade-out dari video 1, video 2 fade-in dan concat 2 ke 1 klip tipe transisi tapi aku menghargai bantuan dalam mendapatkan perintah untuk transisi dari video 1 video 2 tanpa akan hitam di antaranya. Saya tidak dapat menemukan contoh untuk masalah ini di mana saja, mungkin saya mencari kata kunci yang salah ...?

Lebih khusus lagi, video saya adalah mp4 (video h264, tidak ada suara, dalam hal yang penting), masing-masing berdurasi 5 detik dan saya setelah transisi dari kira-kira. 4,5s video 1 hingga 0,5s video 2.

Mirip dengan apa yang dilakukan tutorial ini menggunakan MLT dan bingkai (lihat 2:25 untuk contoh memudar), meskipun saya sedang mencari cara untuk melakukan ini hanya di ffmpeg tanpa memanggil prog lainnya. http://www.youtube.com/watch?v=3PRZ9L_KLdI

Setiap petunjuk atau mungkin baris perintah untuk memudar seperti ini akan sangat dihargai, terima kasih banyak!

Mugba
sumber
terkait superuser.com/questions/223678/… | stackoverflow.com/questions/7565962/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

23

Saya menyarankan untuk melakukan itu:

  • Buat latar belakang hitam dengan durasi dan resolusi yang sama seperti video output seharusnya
  • Tambahkan saluran alpha ke setiap video
  • Tambahkan efek fade to alpha ke setiap video
  • Gunakan hamparan pada setiap video dengan latar belakang hitam

Jadi perintah untuk menambahkan crossfade ke 2 video (5 detik) masing-masing harus:

ffmpeg -i 1.mp4 -i 2.mp4 -f lavfi -i color=black -filter_complex \
"[0:v]format=pix_fmts=yuva420p,fade=t=out:st=4:d=1:alpha=1,setpts=PTS-STARTPTS[va0];\
[1:v]format=pix_fmts=yuva420p,fade=t=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+4/TB[va1];\
[2:v]scale=960x720,trim=duration=9[over];\
[over][va0]overlay[over1];\
[over1][va1]overlay=format=yuv420[outv]" \
-vcodec libx264 -map [outv] out.mp4

Ini akan memudar video pertama menjadi alpha pada detik ke-4 (st = 4) selama 1 detik (d = 1), memudar pada video kedua pada 0 detik (st = 0) selama 1 detik (d = 1) dan memindahkan tampilan itu waktu maju ke 4 detik (+ 4 / TB). Lalu kami hanya memotong 9 detik warna hitam, skala untuk menampilkan ukuran video dan overlay barang-barang.

Semoga ini bisa membantu.

ptQa
sumber
Hai @ptQa, terima kasih banyak, efek crossfade bekerja seperti pesona. Meskipun apa yang terjadi di video output adalah hanya menampilkan bagian kiri atas dari video asli dan sisa bingkai hilang. Saya melihat resolusi, input 960 x 720 dan output 320 x 240 tetapi tidak mengurangi seluruh video, sebaliknya memotong bagian 320 x 240 di kiri atas dan menunjukkan bahwa dalam video output, sisa dari video input tidak ada. Apakah ada tambahan pada baris perintah Anda yang mencegah ini?
Mugba
Oh, saya mengerti, Anda juga harus skala warna hitam ke resolusi yang ingin Anda dapatkan. Lihat jawaban yang diperbarui. Saya telah menambahkan skala ke filter grafik.
ptQa
Itu menyelesaikannya, terima kasih. Saya mengunggah video contoh yang memperlihatkan perkawinan
silang
Permasalahan yang sama; Saya memiliki varian ini yang bekerja pada beberapa video saya sendiri - terima kasih. Pertanyaan: Bagaimana ini akan dimodifikasi untuk juga memudar lintas trek audio video, mengikuti pola yang sama seperti video memudar?
Jim Miller
1
BTW, saya pikir ada kesalahan dalam perintah sampel jawaban - seharusnya -i 1.mp4 -i 2.mp4..., kan?
Jim Miller
7

Inilah yang saya lakukan:

  • ffmpeg versi N-77197-gdf2ce13
  • 2 video masing-masing 4 detik.
  • Perlu bergabung dengan mereka memudar di antara mereka.
  • video berukuran 25 fps.

1) Tambahkan fade out (terang ke gelap) di akhir tanggal 1 dan fade in (gelap ke terang) pada awal tanggal 2:

ffmpeg -i 1.mp4 -y -vf fade=out:76:24 1f.mp4

ffmpeg -i 2.mp4 -y -vf fade=in:0:25 2f.mp4

76:24 berarti fade out akan memulai frame 76 dan akan menyelesaikan 24 frame kemudian = 1 fade out.

0:25 berarti fade in akan memulai frame 0 dan akan menyelesaikan 25 frame nanti.

2) Gabungkan 2 video

Konversikan semua ke TS

ffmpeg -i 1f.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 1f.ts

ffmpeg -i 2f.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 2f.ts

Menggabungkan

ffmpeg -i "concat:1f.ts|2f.ts" -bsf:a aac_adtstoasc -c copy output.mp4

Terimakasih untuk:

http://www.bogotobogo.com/FFMpeg/ffmpeg_fade_in_fade_out_transitions_effects_filters.php

Erwan
sumber
6
Ini bukan crossfade.
Gyan
4
Apa yang dikatakan @Mulvya. Crossfade memudar satu klip pada saat yang sama dengan yang lain memudar. Klip pertama memiliki transparansi terus meningkat selama durasi crossfade; transparansi kedua terus menurun.
intuited
7

ffmpeg-concat adalah cara termudah untuk mencapai apa yang Anda inginkan dan memungkinkan Anda untuk menggunakan banyak transisi OpenGL yang seksi, dengan defaultnya adalah crossfade.

ffmpeg-gl-transisi adalah filter ffmpeg khusus yang memungkinkan Anda untuk menggunakan GLSL untuk transisi antara dua stream video dengan lancar. Filter ini secara signifikan lebih mudah digunakan dan disesuaikan daripada alternatif yang tercantum di sini.

Filter ini mendukung daftar besar jenis transisi, dengan defaultnya adalah crossfade.

./ffmpeg -i 0.mp4 -i 1.mp4 -filter_complex "gltransition=duration=4:offset=1.5" out.mp4
fisch2
sumber
4
Sudahkah Anda mempertimbangkan untuk mengirimkan tambalan ke FFmpeg?
Logan
1
Saya pasti akan, saya hanya perlu memperbaiki beberapa masalah kecil dan menguji lebih dulu. Panggilan bagus!
fisch2
Apakah ini di FFmpeg resmi? Saya tidak dapat menemukannya
kraftydevil