Melakukan crossfade antara dua bagian konten video sebenarnya cukup rumit di FFmpeg. Tidak ada filter "crossfade" seperti untuk audio.
Apa cara yang efisien untuk melakukannya?
ffmpeg
video-editing
Mark Gerolimatos
sumber
sumber
[0:a][1:a] acrossfade=d=1 [audio]
ke filter dan kemudian-map "[audio]"
ke perintah dan itu berhasil. Jika Anda suka, berikan tes dan perbarui jawabannya!Jawaban:
TL; versi DR:
Contoh ini hanya menjalankan video, dengan asumsi kedua klip video memiliki resolusi yang sama, kecepatan bingkai, dll. Ini akan membuat pudar 1 detik di antara fadeoutclip dan fadeinclip. Asumsikan bahwa fadeoutclip berdurasi 10 detik. Perhatikan bahwa ini diformat untuk kejelasan: ini benar-benar satu baris kode.
Versi lengkap:
Berikut ini penjelasan tentang semua ini:
Spesifikasi Input ... jelas
Membuat
filter_complex
: dengan asumsi Anda sudah memahami kompleks filter:Pertama kita memecah dua aliran menjadi dua bagian masing-masing menggunakan filter trim : konten dan bagian memudar lintas. Fade out dipecah menjadi konten dan bagian fade, sedangkan fade in dipotong menjadi bagian fade dan konten. Total empat bagian.
Perhatikan bahwa sebenarnya, kita tidak harus memecah bagian fade out: kita BISA hanya menentukan fade out dan fade dalam waktu untuk dua klip video. Namun, dengan melakukan ini, kami:
overlay
filter yang membuat frustrasiMasing-masing dari empat bagian ini menentukan: waktu mulai (detik), waktu akhir (detik), dan
setpts=PTS-STARTPTS
filter misterius , yang pada dasarnya membuat setiap subclip video dimulai pada 0 detik. Ini akan sangat penting ketika mengomposisi ulang mereka.Perhatikan bahwa
s=0
penspesifikasi berlebihan, dansetpts
filters=0
untuknya juga berlebihan. Namun, keduanya ditentukan secara berlebihan untuk memungkinkan waktu mulai berubah dari 0, tanpa merusak kompleks filter. Juga, klip konten kedua berjalan ke akhir, sehinggae=
bagian (akhir =) tidak ditentukan.Selanjutnya, kami menentukan fade in dan fade out: Kami pertama-tama menambahkan saluran alfa (transparansi) ke kedua bagian fade dengan menentukan format piksel
yuva420p
. Anda benar-benar dapat menggunakan format apa pun yang menyediakan saluran alfa.Berikutnya dalam filter ini subcomplex kita menentukan satu memudar, dan satu memudar di. The
alpha=1
berarti bahwa video itu sendiri tidak akan gelap, hanya jumlah transparansi akan "memudar".st
berarti mulai,d
berarti durasi.Apa ini ?: The
fifo
Filter memastikan bahwa ada penyangga ruang yang tersedia dalam filter yang kompleks. Hebatnya, ini BUKAN default. Jika Anda tidak melakukan ini, crossfade bisa gagal jika output dari tahap di atas mengganti filter overlay di bawah ini. Ya, saya tahu apa yang Anda pikirkan saat ini. Ini memang bug FFMPEG .Sekarang, overlay dua bagian fade: Dengan memastikan dua bagian crossfade memiliki ukuran yang sama, kita tidak perlu khawatir tentang opsi yang agak buruk yang diambil filter overlay (dan karenanya kita abaikan di sini):
Akhirnya, kami mengatur tiga segmen kami menggunakan filter concat .
Dan sekarang, petakan pad output sebagai sumber video Anda.
JANGAN LUPA untuk mengatur format piksel KE APA YANG BIASANYA ANDA GUNAKAN (biasanya
yuv420p
), karena bagian crossfade akan mengaturnyayuv420
pada saluran output! (karena kami tidak menentukannya, Anda dapat menggunakan argumen overlay) Tentu saja, jika Anda INGINyuv420
, maka Anda baik-baik saja :-)Anda kemudian dapat menggabungkan kembali audio nanti (di luar ruang lingkup T&J ini)
sumber
trim=start=0:end=9
, (bukantrim=st=0:e=9,
..Filter setpts has an unconnected output
untuk skrip. Saya sudah mengubah parameter trim untuk memulai dan mengakhiri.