web-dev-qa-db-ja.com

ffmpegでビデオの最後に1秒のフェードアウト効果を追加するにはどうすればよいですか?

Ffmpegを使用してビデオの最初または最後に単純な1秒または0.5秒のフェード効果を追加し、他のすべてを同じに保つ方法(コーデック、品質)

4
user497767

持続時間が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 を参照してください。

5
llogan
  1. ビデオクリップのフレーム数を調べます。コマンド:

    ffmpeg -i clip.mp4 -vcodec copy -f rawvideo -y /dev/null 2>&1 | tr ^M '\n' | awk '/^frame=/ {print $2}'|tail -n 1
    5130
    
  2. 1秒あたりのフレームを見つける

fps

24です

  1. フェードイン/アウトを追加

    ffmpeg -i clip.mp4 -vf "fade=in:0:24,fade=out:5106:24" -acodec copy clip-out.mp4
    

できた

1
Vijay