回答:
へえ、面白い仕事。解決策は
ffmpeg -i 1.ts -i 2.ts -filter_complex "[0:v][1:v]overlay=x='if(lte(-w+(t)*100,w/2),-w+(t)*100,w/2)':y=0[out]" -map '[out]' -y out.mp4
このフィルターグラフは、画面の半分(w / 2)に達するまで、2番目の画像を左から右に移動します。したがって、変更する必要があるのは、この式のw / 2だけです。いくつかの静的停止ポイント(100ピクセル)でも同じです:
ffmpeg -i 1.ts -i 2.ts -filter_complex "[0:v][1:v]overlay=x='if(lte(-w+(t)*100,100),-w+(t)*100,100)':y=0[out]" -map '[out]' -y out.mp4
それが役に立てば幸い。
if
lte
min
max
一般的に、スライドエフェクトの場合、次のことを行う必要があります。
color
sourceを使用して、画像が表示される適切なサイズと継続時間で特定の色(黒など)の背景を作成します。movie
overlay
以下に画像を保存した例を示しますimage.png
(サイズ:1920×1080、クリップの長さ:15秒):
ffmpeg -f lavfi -i "\
color=black:d=15:s=1920x1080[background]; \
movie=image.png[overlay]; \
[background][overlay]overlay='W-n:(H-h)/2' \
" output.mp4
画像は停止することなく右から左にスライドします。
以下は、画像が中央で停止する例です。
ffmpeg -f lavfi -i "\
color=black:d=15:s=1920x1080[background]; \
movie=image.png[overlay]; \
[background][overlay]overlay='min(W-n\,0):(H-h)/2' \
" output.mp4
任意の時点でのオーバーレイの位置は、overlay
フィルターのオプションとして指定されます。位置は、画像の左上隅の座標として指定する必要があります。
上記の最初の例のX / Y座標のペアはW-n
andです(H-h)/2
。ここで、
W
背景の幅です(1920)n
現在のフレーム番号H
背景の高さ(1080)h
オーバーレイの高さです(ここでは1080ですが、異なる場合があります)したがって、フレーム0では、画像は最初は左から1920-0 = 1920ピクセルに配置されるため、nが増加すると画像は右からスライドします。
いくつかのヒント:
x
式はに評価される0
必要があるため、を使用できますmin(W-n, 0)
。この場合、フレーム番号が幅よりも大きい場合でも、イメージは負のx位置に移動されず、0のままになります。