mcpField
V
video-to-gif

video-to-gif

github.com/nicepkgクリエイティブ・メディア28859 回インストール40 週間前に更新
リポジトリ

video-to-gif について

video-to-gifは、動画クリップをGIFに変換するスキルおよびコマンドラインのワークフローです。SNS、ドキュメント、チュートリアル、プレゼン用のアニメーション制作に向け、時間範囲や見た目、効果、ファイルサイズを調整できます。

主な機能

  1. 01時間範囲を指定して切り出し
  2. 02速度変更と逆再生
  3. 03動画のリサイズとクロップ
  4. 04テキストと視覚効果の追加
  5. 05出力サイズと品質の最適化
  6. 06複数クリップの一括処理

活用シーン

  1. 01動画の一部からGIFを作成
  2. 02SNS向けサイズのGIFを準備
  3. 03チュートリアル動画に字幕を追加
  4. 04指定時刻の動画フレームを出力

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/nicepkg/ai-workflow --skill video-to-gif

インストール後、Claude Code で/video-to-gifを入力して読み込まれたか確認します。

同梱ファイルscripts/gif_workshop.pyscripts/requirements.txt

詳細

動画から GIF を作成するワークショップ

動画クリップを、ソーシャルメディア、ドキュメント、チュートリアル、プレゼンテーションに最適な、高品質で最適化された GIF に変換します。正確なタイミング調整、テキストオーバーレイ、エフェクト、ファイルサイズのインテリジェントな最適化に対応しています。

主な機能

  • クリップの選択:動画から特定の時間範囲を抽出します
  • 速度の調整:スローモーション、倍速、逆再生に対応します
  • トリミング:任意のサイズに変更し、切り抜きます
  • テキストオーバーレイ:キャプション、タイトル、透かしを追加します
  • エフェクト:フィルター、フェード、色調整
  • 最適化:目標ファイルサイズに合わせてスマートに圧縮します
  • 一括処理:複数のクリップを一度に変換します

クイックスタート

from scripts.gif_workshop import GifWorkshop

# Basic conversion
workshop = GifWorkshop("video.mp4")
workshop.to_gif("output.gif")

# With options
workshop = GifWorkshop("video.mp4")
workshop.clip(start=5, end=10)          # 5-10 seconds
workshop.resize(width=480)               # Resize to 480px wide
workshop.set_fps(15)                     # 15 frames per second
workshop.optimize(max_size_kb=500)       # Max 500KB
workshop.to_gif("output.gif")

基本的なワークフロー

1. 動画を読み込む
from scripts.gif_workshop import GifWorkshop

# From file
workshop = GifWorkshop("video.mp4")

# With initial settings
workshop = GifWorkshop("video.mp4", fps=15, width=480)
2. クリップの範囲を選択する
# By time (seconds)
workshop.clip(start=5, end=15)  # 5s to 15s

# By time string
workshop.clip(start="00:01:30", end="00:01:45")  # 1:30 to 1:45

# From start or to end
workshop.clip(start=10)  # From 10s to end
workshop.clip(end=5)     # First 5 seconds

# Multiple clips
workshop.clip_multi([
    (0, 3),
    (10, 15),
    (20, 25)
])  # Concatenates clips
3. 速度を調整する
# Speed up
workshop.speed(2.0)  # 2x faster

# Slow motion
workshop.speed(0.5)  # Half speed

# Reverse
workshop.reverse()

# Boomerang effect (forward then reverse)
workshop.boomerang()
4. サイズを変更して切り抜く
# Resize by width (maintain aspect)
workshop.resize(width=480)

# Resize by height
workshop.resize(height=360)

# Exact dimensions
workshop.resize(width=480, height=360)

# Crop to region
workshop.crop(x=100, y=50, width=400, height=300)

# Crop to aspect ratio
workshop.crop_to_aspect(16, 9)  # 16:9
workshop.crop_to_aspect(1, 1)   # Square
5. テキストを追加する
# Simple text overlay
workshop.add_text(
    "Hello World!",
    position='bottom',
    fontsize=24,
    color='white'
)

# Text with timing
workshop.add_text(
    "Watch this!",
    position='top',
    start_time=0,
    end_time=3  # Show for first 3 seconds
)

# Multiple text overlays
workshop.add_text("Step 1", position='top-left', start_time=0, end_time=2)
workshop.add_text("Step 2", position='top-left', start_time=2, end_time=4)

# Caption bar
workshop.add_caption_bar(
    "This is a caption",
    position='bottom',
    background='black',
    padding=10
)
6. エフェクトを適用する
# Color filters
workshop.filter('grayscale')
workshop.filter('sepia')

# Adjustments
workshop.adjust(brightness=0.1, contrast=0.2)

# Fade in/out
workshop.fade_in(duration=0.5)
workshop.fade_out(duration=0.5)

# Blur
workshop.blur(intensity=2)
7. サイズを最適化する
# Target file size
workshop.optimize(max_size_kb=500)

# Quality settings
workshop.optimize(
    quality='medium',  # 'low', 'medium', 'high'
    colors=128         # Color palette size (2-256)
)

# Manual FPS control
workshop.set_fps(10)  # Lower FPS = smaller file

# Lossy compression
workshop.optimize(lossy=80)  # 0-100, higher = more compression
8. エクスポートする
# Basic export
workshop.to_gif("output.gif")

# With options
workshop.to_gif(
    "output.gif",
    optimize=True,
    colors=256,
    loop=0  # 0 = infinite loop, 1+ = loop count
)

# Export as video (for comparison)
workshop.to_video("output.mp4")

# Export frames
workshop.export_frames("frames/", format='png')

プリセット

# Social media presets
workshop.preset('twitter')     # 512px wide, 5MB max
workshop.preset('discord')     # 256px, 8MB max
workshop.preset('slack')       # 480px, 5MB max
workshop.preset('reddit')      # 720px, optimized

# Quality presets
workshop.preset('high')        # High quality, larger file
workshop.preset('medium')      # Balanced
workshop.preset('low')         # Small file, lower quality

# Special presets
workshop.preset('thumbnail')   # Small preview GIF
workshop.preset('reaction')    # Reaction GIF (small, fast)

テキストの位置オプション

位置説明
'top'上部中央
'bottom'下部中央
'center'フレームの中央
'top-left'左上隅
'top-right'右上隅
'bottom-left'左下隅
'bottom-right'右下隅

高度な機能

フレームの抽出
# Get best frame (thumbnail)
best_frame = workshop.get_best_frame()
best_frame.save("thumbnail.png")

# Extract frame at time
frame = workshop.get_frame_at(5.5)  # Frame at 5.5 seconds
frame.save("frame.png")

# Extract all frames
workshop.export_frames("frames/", format='png')
動画情報
info = workshop.get_info()
print(f"Duration: {info['duration']} seconds")
print(f"Size: {info['width']}x{info['height']}")
print(f"FPS: {info['fps']}")
print(f"Frames: {info['frame_count']}")
カスタムフィルター
# Apply custom function to each frame
def custom_filter(frame):
    # frame is a PIL Image
    return frame.rotate(5)

workshop.apply_filter(custom_filter)
動画の結合
# Join multiple clips
workshop.concat([
    "intro.mp4",
    "main.mp4",
    "outro.mp4"
])

CLI の使い方

# Basic conversion
python gif_workshop.py video.mp4 -o output.gif

# With clip selection
python gif_workshop.py video.mp4 -o output.gif --start 5 --end 15

# With options
python gif_workshop.py video.mp4 -o output.gif \
    --width 480 \
    --fps 15 \
    --speed 1.5 \
    --max-size 500

# With text
python gif_workshop.py video.mp4 -o output.gif \
    --text "Hello World" \
    --text-position bottom

# Apply preset
python gif_workshop.py video.mp4 -o output.gif --preset twitter

最適化のヒント

ファイルサイズの削減
  1. サイズを小さくする:小さくするほどファイルサイズも大幅に小さくなります
  2. FPS を下げる:通常は 10~15 FPS で十分です
  3. 色数を制限する:64~128 色でも多くの場合、問題ありません
  4. 再生時間を短くする:1 秒増えるごとにサイズが大幅に増加します
  5. 非可逆圧縮を使う:画質の低下をわずかに抑えながら、サイズを大幅に削減できます
画質の向上
  1. 高品質なソースから始める:入力が良いほど、出力も良くなります
  2. 256 色を使う:最大のカラーパレットです
  3. FPS を上げる:滑らかな動きには 24~30 FPS を使用します
  4. 強い圧縮を避ける:非可逆圧縮率は 90 以上に保ちます
サイズと画質のプリセット
プリセット幅FPS色数用途
reaction256px1064素早いリアクション
low320px12128基本的な共有
medium480px15256一般的な用途
high640px20256高画質
max元のサイズ24256最高画質

エラー処理

from scripts.gif_workshop import GifWorkshop, GifError

try:
    workshop = GifWorkshop("video.mp4")
    workshop.clip(start=0, end=100)  # May exceed video length
    workshop.to_gif("output.gif")
except GifError as e:
    print(f"Error: {e}")
except FileNotFoundError:
    print("Video file not found")

対応フォーマット

入力(動画)
  • MP4、MOV、AVI、MKV、WebM、FLV、WMV
出力
  • GIF(アニメーション)
  • MP4(比較用)
  • PNG/JPEG(フレーム)

依存関係

moviepy>=1.0.3
Pillow>=10.0.0
imageio>=2.31.0
numpy>=1.24.0

制限事項

  • 実用上の GIF の最大サイズ:約 20~30MB
  • 非常に長い GIF は扱いにくくなります
  • 複雑なシーンでは色むらが発生する場合があります
  • GIF 形式は音声に対応していません

コメント