AEやiMovieでわざわざフェードだけのために書き出し直すの面倒だったので、ffmpegで完結するスクリプトを作成。
使い方1(ファイル名指定版)
$ chmod +x fade_video.sh
$ ./fade_video.sh input.mp4 output.mp4 2 2
入力ファイル 出力ファイル フェードイン秒 フェードアウト秒
ソース1(ファイル名指定版)
fade_video.sh
#!/bin/bash
INPUT="$1"
OUTPUT="$2"
FADE_IN_DURATION="$3"
FADE_OUT_DURATION="$4"
# ffprobeで動画の長さ(秒)を取得
DURATION=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$INPUT")
DURATION=$(printf "%.2f" "$DURATION") # 小数第2位まで
# フェードアウトの開始時間(動画の終わり - フェードアウトの長さ)
FADE_OUT_START=$(echo "$DURATION - $FADE_OUT_DURATION" | bc)
echo "動画の長さ: $DURATION 秒"
echo "フェードアウト開始: $FADE_OUT_START 秒"
# ffmpegでフェード適用(映像と音声両方)
ffmpeg -i "$INPUT" \
-vf "fade=t=in:st=0:d=$FADE_IN_DURATION,fade=t=out:st=$FADE_OUT_START:d=$FADE_OUT_DURATION" \
-af "afade=t=in:st=0:d=$FADE_IN_DURATION,afade=t=out:st=$FADE_OUT_START:d=$FADE_OUT_DURATION" \
-y "$OUTPUT"
使い方2(フォルダ指定版)
$ chmod +x fade_folder.sh
$ ./fade_folder.sh input_folder output_folder 2 2
入力フォルダ 出力フォルダ フェードイン秒 フェードアウト秒
ソース2(フォルダ指定版)
fade_folder.sh
#!/bin/bash
INPUT_DIR="$1"
OUTPUT_DIR="$2"
FADE_IN_DURATION="$3"
FADE_OUT_DURATION="$4"
mkdir -p "$OUTPUT_DIR"
for INPUT_FILE in "$INPUT_DIR"/*; do
# 拡張子チェック(動画ファイルのみ)
if [[ "$INPUT_FILE" =~ \.(mp4|mov|mkv|avi)$ ]]; then
BASENAME=$(basename "$INPUT_FILE")
OUTPUT_FILE="$OUTPUT_DIR/$BASENAME"
# 出力ファイル名を変更したい場合
#OUTPUT_FILE="$OUTPUT_DIR/faded_$BASENAME"
# 動画の長さを取得
DURATION=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$INPUT_FILE")
DURATION=$(printf "%.2f" "$DURATION")
FADE_OUT_START=$(echo "$DURATION - $FADE_OUT_DURATION" | bc)
echo "処理中: $BASENAME (長さ: $DURATION 秒, フェードアウト開始: $FADE_OUT_START 秒)"
# ffmpegでフェード適用(映像と音声両方)
ffmpeg -i "$INPUT_FILE" \
-vf "fade=t=in:st=0:d=$FADE_IN_DURATION,fade=t=out:st=$FADE_OUT_START:d=$FADE_OUT_DURATION" \
-af "afade=t=in:st=0:d=$FADE_IN_DURATION,afade=t=out:st=$FADE_OUT_START:d=$FADE_OUT_DURATION" \
-y "$OUTPUT_FILE"
fi
done