Command-Line

如何使用命令行工具在兩個影片之間平滑且重複地過渡?

  • February 12, 2019

我想使用兩個影片作為輸入輸出一個影片,這兩個影片以平滑和重複的方式彼此淡入(或溶解),每秒左右。我假設ffmpegwith meltmkvmerge或其他類似工具的組合可能會產生我想要的效果。基本上,我想用來ffmpeg根據特定的間隔剪切影片 A,每秒丟棄一次剪切(自動)。對於影片 B 也是如此,但在這種情況下反轉過程以保留丟棄的部分。然後我希望將這些部分交織在一起。

文件名的格式應該正確,以便我可以根據上述工具之一使用萬用字元命令參數或批處理列表連接結果。過渡效果(例如“延遲時間溶解”)不是絕對必要的,但如果有一個過濾器也能實現這一點,那就太好了。最後,如果這個過程可以在幾乎沒有重新編碼的情況下完成,以保持影片質量,那也是很棒的。

除了 ffmpeg 手冊之外,我還閱讀了這個執行緒Melt Framework 文件。

假設兩個影片具有相同的解析度和样本縱橫比,您可以在 ffmpeg中使用混合過濾器。

舉幾個例子,


ffmpeg -i videoA -i videoB -filter_complex \
      "[0][1]blend=all_expr=if(mod(trunc(T),2),A,B);\
       [0]volume=0:enable='mod(trunc(t+1),2)'[a]; [1]volume=0:enable='mod(trunc(t),2)'[b];\
       [a][b]amix"  out.mp4

直切。

輸出:

time,  in seconds,
[0,1) -> videoB
[1,2) -> videoA
[2,3) -> videoB
...
[2N  ,2N+1) -> videoB
[2N+1,2N+2) -> videoA

ffmpeg -i videoA -i videoB -filter_complex \
      "[0][1]blend=all_expr='if(mod(trunc(T/2),2),min(1,2*(T-2*trunc(T/2))),max(0,1-2*(T-2*trunc(T/2))))*A+if(mod(trunc(T/2),2),max(0,1-2*(T-2*trunc(T/2))),min(1,2*(T-2*trunc(T/2))))*B';\
       [0]volume='if(mod(trunc(t/2),2),min(1,2*(t-2*trunc(t/2))),max(0,1-2*(t-2*trunc(t/2))))':eval=frame[a]; [1]volume='if(mod(trunc(t/2),2),max(0,1-2*(t-2*trunc(t/2))),min(1,2*(t-2*trunc(t/2))))':eval=frame[b];\
       [a][b]amix"  out.mp4

每個輸入的影片/音頻持續 2 秒,過渡為 0.5 秒。

輸出:

time,  in seconds,
[0,0.5) -> videoA fades out 1 to 0 + videoB fades in from 0 to 1
[0.5,2) -> videoB
[2,2.5) -> videoB fades out 1 to 0 + videoA fades in from 0 to 1
[2.5,4) -> videoA
[4,4.5) -> videoA fades out 1 to 0 + videoB fades in from 0 to 1
[4.5,6) -> videoB
[6,6.5) -> videoB fades out 1 to 0 + videoA fades in from 0 to 1
[6.5,8) -> videoA
...
[4N    ,4N+0.5) -> videoA fades out 1 to 0 + videoB fades in from 0 to 1
[4N+0.5,4N+2)   -> videoB
[4N+2  ,4N+2.5) -> videoB fades out 1 to 0 + videoA fades in from 0 to 1
[4N+2.5,4N+4)   -> videoA

引用自:https://unix.stackexchange.com/questions/499573