TL; DR versiyonu:
Bu örnek, her iki video klibin de aynı çözünürlük, kare hızı vb. Olduğunu varsayarak yalnızca video gerçekleştirir. Bu, fadeoutclip ve fadeinclip arasında 1 saniyelik bir solma oluşturur. Fadeoutclip'in 10 saniye uzunluğunu varsayalım. Bunun netlik için biçimlendirildiğine dikkat edin: gerçekten bir kod satırı.
ffmpeg -i fadeoutclip.mp4 -i fadeinclip.mp4 -an \
-filter_complex "\
[0:v]trim=start=0:end=9,setpts=PTS-STARTPTS[firstclip]; \
[1:v]trim=start=1,setpts=PTS-STARTPTS[secondclip]; \
[0:v]trim=start=9:end=10,setpts=PTS-STARTPTS[fadeoutsrc]; \
[1:v]trim=start=0:end=1,setpts=PTS-STARTPTS[fadeinsrc]; \
[fadeinsrc]format=pix_fmts=yuva420p, \
fade=t=in:st=0:d=1:alpha=1[fadein]; \
[fadeoutsrc]format=pix_fmts=yuva420p, \
fade=t=out:st=0:d=1:alpha=1[fadeout]; \
[fadein]fifo[fadeinfifo]; \
[fadeout]fifo[fadeoutfifo]; \
[fadeoutfifo][fadeinfifo]overlay[crossfade]; \
[firstclip][crossfade][secondclip]concat=n=3[output] \
" \
-map "[output]" <add in encoding part here>
Tam versiyon:
İşte bunun ne hakkında olduğuna dair bir açıklama:
Giriş Özellikleri ... açık
ffmpeg -i fadeoutclip.mp4 -i fadeinclip.mp4 -an
Bir Oluşturma filter_complex
: Zaten filtre kompleksleri anlama varsayarak:
-filter_complex
İlk olarak, trim filtresini kullanarak iki akışı iki parçaya ayırırız : içerik ve çapraz solma bölümü. Solma içeriği ve solma bölümüne ayrılırken solma girişi solma bölümüne ve içeriğine kesilir. Toplam dört bölüm.
Açık konuşmak gerekirse, biz olmadığını Not sahip sadece iki video klipleri zamanlarda dışarı ve solmaya solmaya belirtmek OLABİLİR: dışarı çapraz solmaya bölümleri kırmak için. Ancak, bunu yaparak:
- GUI video editörleri tarafından genellikle kullanılan metodolojiyi takip edin
overlay
Filtrenin kullanımının sinir bozucu karmaşıklığından kaçının
- Çözümün olabildiğince genel olduğundan emin olun (örn. Yeniden kullanılabilir kod)
- Çapraz ifade bölümünü gerektiği gibi önceden işlememize ve sonradan işlememize izin verin (burada yapılmaz)
Bu dört bölümün her biri şunları belirtir: başlangıç zamanı (saniye), bitiş zamanı (saniye) ve her video alt klipsini 0 saniyede başlatan gizemli setpts=PTS-STARTPTS
filtre . Onları yeniden birleştirirken bu çok önemli olacaktır.
Belirticilerin gereksiz olduğunu s=0
ve bunların setpts
filtresinin de gereksiz olduğunu unutmayın s=0
. Bununla birlikte, her ikisi de filtre kompleksini bozmadan başlangıç zamanının 0'dan değişmesine izin vermek için yedek olarak belirtilir. Ayrıca, ikinci içerik klibi sonuna kadar çalışır, bu nedenle e=
parça (end =) belirtilmez.
[0:v]trim=s=0:e=9,setpts=PTS-STARTPTS[firstclip];
[1:v]trim=s=1,setpts=PTS-STARTPTS[secondclip];
[0:v]trim=s=9:e=10,setpts=PTS-STARTPTS[fadeoutsrc];
[1:v]trim=s=0:e=1,setpts=PTS-STARTPTS[fadeinsrc];
Ardından, solmaya ve solmaya belirtiyoruz: Önce her iki solmaya bölüme bir piksel biçimi belirterek biryuva420p
alfa (saydamlık) kanalı ekliyoruz . Alfa kanalı sağlayan herhangi bir formatı kullanabilirsiniz.
Bu filtrede Sonra karartmak için birini belirtin ve tek solmaya subcomplex.alpha=1
Videonun kendisi, sadece şeffaflık miktarı olacak "solma" karartmak olmaz demektir. st
başlangıç, d
süre anlamına gelir.
[fadeinsrc]format=pix_fmts=yuva420p,
fade=t=in:st=0:d=1:alpha=1[fadein];
[fadeoutsrc]format=pix_fmts=yuva420p,
fade=t=out:st=0:d=1:alpha=1[fadeout];
Bu nedir ? : fifo
Filtre , filtre kompleksinde kullanılabilir arabellek alanı olmasını sağlar. Şaşırtıcı, bu varsayılan DEĞİLDİR. Bunu yapmazsanız, yukarıdaki sahnenin çıktısı aşağıdaki kaplama filtresini aşarsa crossfade başarısız olabilir. Evet, şu an ne düşündüğünü biliyorum. Gerçekten bir FFMPEG hatasıdır .
[fadein]fifo[fadeinfifo];
[fadeout]fifo[fadeoutfifo];
Şimdi, iki solma bölümün üzerine bindirme: İki çapraz-ifade bölümünün aynı boyutta olduğundan emin olarak , kaplama filtresinin aldığı oldukça kötü seçenekler hakkında endişelenmemiz gerekmiyor(ve bu yüzden burada yok sayıyoruz):
[fadeoutfifo][fadeinfifo]overlay[crossfade];
Son olarak, concat filtreyi kullanarak üç segmentimizi sıralıyoruz .
[firstclip][crossfade][secondclip]concat=n=3[output]
Ve şimdi, çıkış pedini video kaynağınız olarak eşleyin.
Piksel formatını NORMAL OLARAK KULLANMADIĞINIZA (tipik olarak yuv420p
) ayarlamayı UNUTMAYIN çünkü crossfade bölümü bunu yuv420
çıkış kanalında ayarlayacaktır ! (belirtmediğimiz gibi, bindirme argümanlarını kullanabilirsiniz) Tabii ki, eğer İSTİYORSANIZ yuv420
, o zaman sorun yok :-)
-map "[output]" <add your normal encoding part here>
Daha sonra sesi daha sonra yeniden birleştirebilirsiniz (bu soru ve cevap kapsamının dışında)