Ffmpegを使用してビデオの最初または最後に単純な1秒または0.5秒のフェード効果を追加し、他のすべてを同じに保つ方法(コーデック、品質)
持続時間が10秒のビデオの場合、最初は1秒フェードイン、最後は1秒フェードアウトします fade フィルターを使用します。
ffmpeg -i input.mp4 -vf "fade=type=in:duration=1,fade=type=out:duration=1:start_time=9" -c:a copy output.mp4
オーディオもフェードしたい場合は、 afade フィルターを追加します。
ffmpeg -i input.mp4 -filter_complex "[0:v]fade=type=in:duration=1,fade=type=out:duration=1:start_time=9[v];[0:a]afade=type=in:duration=1,afade=type=out:duration=1:start_time=9[a]" -map "[v]" -map "[a]" output.mp4
これを自動化するには、ffprobe
を使用して期間を取得し、bc
を使用して最後のフェードアウトの開始時間を計算します。
#!/bin/bash
mkdir fade
for f in *.mp4; do
dur=$(ffprobe -loglevel error -show_entries format=duration -of default=nk=1:nw=1 "$f")
offset=$(bc -l <<< "$dur"-1)
ffmpeg -i "$f" -filter_complex "[0:v]fade=type=in:duration=1,fade=type=out:duration=1:start_time='$offset'[v];[0:a]afade=type=in:duration=1,afade=type=out:duration=1:start_time='$offset'[a]" -map "[v]" -map "[a]" fade/"$f"
done
これは、すべての入力にビデオとオーディオがあることを前提としています。そうでない場合は、if/thenステートメントをffprobe
と組み合わせて使用して、オーディオがあるかどうかを確認できます。
...そして他のすべてを同じに保つ(コーデック、品質)
フィルタリングにはエンコードが必要です。非可逆フォーマットを出力する場合、品質を維持できません。ロスレスフォーマットを出力する(推奨されない、巨大なファイル、互換性の問題)、またはある程度のロスを受け入れる。幸いなことに、おそらく気付かないでしょう。 -crf
H.264ビデオ出力時のオプション。それでも十分に見える最高値を使用します。詳細は FFmpeg Wiki:H.264 を参照してください。