💬

movファイルをブログに貼り付けるためにgifに変換するコマンド

2025/01/30に公開

$ bloggif input.mov output.gif で最大横幅800のきれいなgifに変換する

#!/bin/bash

# bloggif
# Usage: bloggif input.mov output.gif

# スクリプトがエラー発生時に終了するように設定
set -e

# エラーハンドリング: 引数の数をチェック
if [ "$#" -ne 2 ]; then
    echo "Usage: $0 input.mov output.gif"
    exit 1
fi

# 引数を変数に代入
INPUT_FILE="$1"
OUTPUT_FILE="$2"
PALETTE_FILE="/tmp/palette.png"

# 中間生成ファイルの存在を確認し、存在する場合は削除
if [ -f "$PALETTE_FILE" ]; then
    echo "既存のパレットファイルを削除します: $PALETTE_FILE"
    rm "$PALETTE_FILE"
fi

# 入力動画の横幅を取得
echo "入力動画の横幅を取得しています..."
WIDTH=$(ffprobe -v error -select_streams v:0 -show_entries stream=width -of csv=p=0 "$INPUT_FILE")

# スケール値を決定
if [ "$WIDTH" -gt 800 ]; then
    SCALE=800
    echo "入力の横幅は$WIDTHピクセルなので、800ピクセルにダウンスケールします。"
else
    SCALE="$WIDTH"
    echo "入力の横幅は$WIDTHピクセルなので、そのままのサイズで使用します。"
fi

# カラーパレットの生成
echo "カラーパレットを生成しています..."
ffmpeg -y -i "$INPUT_FILE" -vf "fps=10,scale=${SCALE}:-1:flags=lanczos,palettegen" "$PALETTE_FILE"

# カラーパレットを使用してGIFを作成
echo "GIFを作成しています..."
ffmpeg -y -i "$INPUT_FILE" -i "$PALETTE_FILE" -filter_complex "fps=10,scale=${SCALE}:-1:flags=lanczos [x]; [x][1:v] paletteuse" "$OUTPUT_FILE"

# 中間生成ファイルの削除
echo "中間ファイルを削除しています..."
rm "$PALETTE_FILE"

echo "GIFの作成が完了しました: $OUTPUT_FILE"

Discussion