#1音声を同時にフェードイン/フェードアウトするには:
ffmpeg -i clip.mp4 -vf 'fade=in:0:30,fade=out:960:30'
-af 'afade=in:st=0:d=1,afade=out:st=32:d=1'
-c:v libx264 -crf 22 -preset veryfast fadeInOut.mp4
フェード時間は秒単位です。
#2自動的に?いいえ。ただし、以下の回避策を参照してください
最初にffprobeを実行して期間を取得できます。
ffprobe -i clip.mp4 -show_entries stream=codec_type,duration -of compact=p=0:nk=1
次のようなものが得られます。
video|13.556000
audio|13.816000
その後、上記を使用してフェードを配置できます。これらの時間は秒単位です。
回避策
ffmpeg -i clip.mp4 -sseof -1 -copyts -i clip.mp4 -filter_complex
"[1]fade=out:0:30[t];[0][t]overlay,fade=in:0:30[v];
anullsrc,atrim=0:2[at];[0][at]acrossfade=d=1,afade=d=1[a]"
-map "[v]" -map "[a]" -c:v libx264 -crf 22 -preset veryfast -shortest fadeInOut.mp4
FFmpegにはsseof
、最後から入力を求めることができるオプションがあります。これを使用して目標を達成できます。したがって、入力を2回フィードし、2回目は最後の1秒のみを取り込みます。ffmpegがこのテール部分の時間的位置を保持するように、FFmpegにタイムスタンプを保持するように指示します。
このテールにフェードアウトを適用し、結果を完全な入力にオーバーレイします。これらは同じメディアファイルであるため、前景は完全に背景を覆い、copyts
適用されたため、背景入力の対応する同一フレームにオーバーレイが発生します。
オーディオの場合、2秒間の空のダミーダミーオーディオを作成し、メインオーディオからこのダミーオーディオにオーディオクロスフェードを適用します。2番目のオーディオは空白なので、これは実質的にメイン入力のフェードアウトです。-shortest
クロスフェードが発生した後にダミーオーディオの部分を除外するために追加されます。