FFMpeg : ビデオが一時停止している間、X 秒間ビデオの上に画像または GIF を重ねます。

FFMpeg : ビデオが一時停止している間、X 秒間ビデオの上に画像または GIF を重ねます。

私の要件は次のとおりです。

  1. 入力ビデオはMP4です
  2. オーバーレイは gif または png のいずれかになります。

オーバーレイは、タイムスタンプで入力ビデオ上に表示されます。5 秒間続きます。GIF の場合は、5 秒間ループ再生されます。オーバーレイが表示されるこの 5 秒間、背景ビデオ (オーディオとビデオの両方) は一時停止され、オーバーレイが消えると再開されます。オーバーレイは、0 番目から最後のフレームまでどこでも発生する可能性があります。

タイムスタンプで画像を挿入し、そのタイムスタンプでフレームを計算して使用しようloopとしましたが、オーディオまたはビデオのいずれかで問題が発生しています。また、オーバーレイ時にビデオを 2 つの部分に分割し、一方に適用してからそれらを結合することも試しました。

私は過去 3 日間これに取り組んでおり、現時点では私には手に負えないため、誰かがコマンドに関して助けてくれることを願っています。

答え1

うーん、これを正しく理解するのに何時間もかかりました。@Баяр Гончикжапов からのコメントとこのトピックの回答が役に立ちました:https://stackoverflow.com/questions/43414641/repeat-last-frame-in-video-using-ffmpeg

オーバーレイの前の部分に tpad フィルターを使用する必要があります。これにより、その部分の最後のフレームを好きなだけ一時停止できます。次に、ビデオが一時停止され、apad フィルターを使用してオーバーレイが表示されている間の余分な時間を補うために、パート 1 のオーディオをパディングします。

続けて、ビデオ部分 + オーディオ部分を接触させ、結果のビデオにオーバーレイを適用します。

例として、30 秒のパート 1 を使用し、次に 5 秒間オーバーレイで一時停止し、同じく 30 秒のパート 2 を使用します。

png 画像の場合:

ffmpeg -reinit_filter 0 -t 30 -i "input.mkv" -ss 30 -t 30 -i "input.mkv" -t 35 -i apple.png -map_metadata -1 -filter_complex "[0]tpad=stop_mode=clone:stop_duration=5,setpts=PTS-STARTPTS[Part1];[0]aselect='between(t,0,30)',apad=pad_dur=5[Audio1];[1]aselect='between(t,0,30)'[Audio2];[Part1][Audio1][1][Audio2]concat=n=2:v=1:a=1[vid];[vid][2]overlay=x=W-w:y=10:enable='between(t,30,35)'[vid]" -map [vid] -c:v libx264 -c:a aac "output_png.mp4"

GIF画像の場合:

ffmpeg -reinit_filter 0 -t 30 -i "input.mkv" -ss 30 -t 30 -i "input.mkv" -t 35 -stream_loop -1 -i horse.gif -map_metadata -1 -filter_complex "[0]tpad=stop_mode=clone:stop_duration=5,setpts=PTS-STARTPTS[Part1];[0]aselect='between(t,0,30)',apad=pad_dur=5[Audio1];[1]aselect='between(t,0,30)'[Audio2];[Part1][Audio1][1][Audio2]concat=n=2:v=1:a=1[vid];[vid][2]overlay=x=W-w:y=10:enable='between(t,30,35)'[vid]" -map [vid] -c:v libx264 -c:a aac "output_gif.mp4"

関連情報