video-to-gif について
video-to-gifは、動画クリップを最適化したGIFに変換するPythonツールです。ドキュメント、チュートリアル、プレゼンテーション、SNS向け素材の作成に使え、クリップ編集や文字・効果の追加、ファイルサイズ調整に対応します。
主な機能
- 01動画の時間範囲を選択
- 02速度変更や逆再生
- 03出力のリサイズとクロップ
- 04文字、フィルター、フェードの追加
- 05ファイルサイズの最適化と一括処理
活用シーン
- 01チュートリアルやドキュメント用GIFの作成
- 02SNS投稿用クリップの準備
- 03アニメーションへの字幕や透かしの追加
- 04動画からフレームやサムネイルを抽出
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ dkyazzentwatwa/ chatgpt-skills --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
最適化のヒント
ファイルサイズの削減
- サイズを小さくする:小さくするほどファイルサイズも大幅に小さくなります
- FPS を下げる:通常は 10~15 FPS で十分です
- 色数を制限する:64~128 色でも多くの場合、問題ありません
- 再生時間を短くする:1 秒増えるごとにサイズが大幅に増加します
- 非可逆圧縮を使う:画質の低下をわずかに抑えながら、サイズを大幅に削減できます
画質の向上
- 高品質なソースから始める:入力が良いほど、出力も良くなります
- 256 色を使う:最大のカラーパレットです
- FPS を上げる:滑らかな動きには 24~30 FPS を使用します
- 強い圧縮を避ける:非可逆圧縮率は 90 以上に保ちます
サイズと画質のプリセット
| プリセット | 幅 | FPS | 色数 | 用途 |
|---|---|---|---|---|
reaction | 256px | 10 | 64 | 素早いリアクション |
low | 320px | 12 | 128 | 基本的な共有 |
medium | 480px | 15 | 256 | 一般的な用途 |
high | 640px | 20 | 256 | 高画質 |
max | 元のサイズ | 24 | 256 | 最高画質 |
エラー処理
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 形式は音声に対応していません
コメント
Markdown 対応