![使用交叉淡入淡出連接多個視訊(附音訊)](https://rvso.com/image/1568491/%E4%BD%BF%E7%94%A8%E4%BA%A4%E5%8F%89%E6%B7%A1%E5%85%A5%E6%B7%A1%E5%87%BA%E9%80%A3%E6%8E%A5%E5%A4%9A%E5%80%8B%E8%A6%96%E8%A8%8A%EF%BC%88%E9%99%84%E9%9F%B3%E8%A8%8A%EF%BC%89.png)
我有 7 個短視訊剪輯,它們的大小、幀速率等都相同。摘自此處之前的一篇文章,我嘗試使用以下方法連接/交叉淡化前兩個:
ffmpeg -i *clip1.mp4 -i *clip2.mp4 \
-filter_complex "[0]fade=t=out:st=0:d=1:alpha=1,setpts=PTS-STARTPTS[va0]; \
[1]fade=t=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS[va1]; \
[va0][va1]overlay[outv];[0][1]amix[outa]" \
-map [outv] -map "[outa]" -crf 10 out.mp4
然而,這會產生一個視頻,該視頻會立即淡出第一個視頻,並最終與第二個視頻的長度完全相同(恰好是 40 秒)。我認為這是因為第一個視頻 [0] 的“st=0”?但是,如果我將其更改為“st=18”(第一個視頻長20 秒),則生成的組合視頻(out.mp4) 仍然會使第一個視頻立即消失(並且整個視頻仍然只有40 秒長)共 58 條)。但是,第一個視訊的音訊現在持續 18 秒(但它現在覆蓋第二個視訊及其音訊 18 秒)。有什麼建議可以嘗試嗎?
答案1
對於使用交叉淡入淡出連接剪輯 - 您需要注意兩件事 - 在正確的時間和正確的類型應用淡入淡出,並延遲視訊時間戳,以便每個視訊在最終組件中在正確的時間開始。
在本例中,您的第一個影片為 20 秒,第二個影片為 40 秒,並且您需要 2 秒的交叉淡入淡出。當使用覆蓋過濾器執行交叉淡入淡出時,我們只需要對傳入影片套用淡入淡出。對傳出的影片應用程式淡出會產生亮度下降 - 有時是理想的,但我避免這樣做。
所以,首先,我們應用 2 秒淡入淡出在在第二個影片的開頭。
[1]format=yuva444p,fade=t=in:st=0:d=2:alpha=1,setpts=PTS-STARTPTS+18/TB[va1];
由於淡入淡出僅應用於 Alpha 通道,因此視訊需要具有 Alpha 通道。通常,視訊不會,因此在淡入淡出之前應用像素格式轉換過濾器,將第二個視訊的像素格式變更為具有 alpha 的像素格式 - 請注意a
in yuva444p
。類型的淡入淡出in
從時間開始應用0
,持續時間2s
為阿爾法通道只是影片的顏色像素不受影響。
現在第二個影片應該被推遲了。由於第一個影片的長度為 20 秒,並且需要 2 秒的交叉淡入淡出,因此第二個影片應在組件內從 18 秒開始。所以應用了 setpts 過濾器
setpts=PTS-STARTPTS+18/TB
結核病是指時基,並且是為流儲存時間戳記的單位。
對於音頻交叉淡入淡出,有一個交叉淡入淡出過濾器
[0][1]acrossfade=d=2
這設定了 2 秒的交叉淡入淡出。
現在我們可以組裝兩個剪輯,
ffmpeg -i *clip1.mp4 -i *clip2.mp4 \
-filter_complex \
"[1]format=yuva444p,fade=t=in:st=0:d=2:alpha=1,setpts=PTS-STARTPTS+18/TB[va1]; \
[0][va1]overlay[outv];[0][1]acrossfade=d=2[outa]" \
-map [outv] -map "[outa]" -crf 10 out.mp4