複数のビデオ(音声付き)をクロスフェードで連結する

複数のビデオ(音声付き)をクロスフェードで連結する

サイズ、フレーム レートなどがすべて同じ 7 つの短いビデオ クリップがあります。2 秒のクロスフェードでそれらを次々に連結し、オーディオを失わないようにしたいと考えています。以前の投稿から引用すると、最初の 2 つを連結/クロスフェードするために次の操作を試しました。

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

しかし、この方法では、最初のビデオがすぐにフェードアウトし、2 番目のビデオとまったく同じ長さ (40 秒) になるビデオが生成されます。これは、最初のビデオ [0] の "st=0" が原因だと思いますが、これを "st=18" (最初のビデオの長さは 20 秒) に変更すると、結果として得られる結合ビデオ (out.mp4) では、最初のビデオがすぐにフェードアウトしたままになります (ビデオ全体の長さは 58 秒ではなく 40 秒のままです)。ただし、最初のビデオのオーディオは 18 秒間続きます (ただし、2 番目のビデオとそのオーディオが 18 秒間オーバーレイされます)。試すべき方法はありますか?

答え1

クロスフェードを使用してクリップを結合する場合は、2 つの点に注意する必要があります。正しいタイミングで正しい種類のフェードを適用し、各ビデオが最終アセンブリ内で正しいタイミングで開始されるようにビデオのタイムスタンプを遅延します。

この場合、最初のビデオは 20 秒、2 番目のビデオは 40 秒で、2 秒のクロスフェードが必要です。オーバーレイ フィルターを使用してクロスフェードを実行する場合、入力ビデオにフェードインを適用するだけで済みます。出力ビデオにフェードアウトを適用すると、輝度の低下が発生します。これは望ましい場合もありますが、私は避けています。

まず、2秒のフェードを適用します2番目のビデオの冒頭で。

[1]format=yuva444p,fade=t=in:st=0:d=2:alpha=1,setpts=PTS-STARTPTS+18/TB[va1];

フェードはアルファチャンネルのみに適用されるため、ビデオにはアルファチャンネルが必要です。通常、ビデオにはアルファチャンネルがないため、ピクセル形式変換フィルターがフェードの前に適用され、2番目のビデオのピクセル形式がアルファチャンネルを持つものに変更されます。aに注意してください。yuva444pタイプのフェードが時間から始まり、継続時間のフェードにin適用されます。02sアルファチャンネルつまり、ビデオのカラーピクセルは影響を受けません。

2番目のビデオを遅らせる必要があります。1番目のビデオの長さは20秒で、2秒のクロスフェードが必要なので、2番目のビデオはアセンブリ内で18秒で開始する必要があります。そのため、setptsフィルターが適用されます。

setpts=PTS-STARTPTS+18/TB

TBとは、タイムベースストリームのタイムスタンプが保存される単位です。

オーディオのクロスフェードには、クロスフェードフィルターがあります

[0][1]acrossfade=d=2

これにより、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

関連情報