ffmpeg について
ffmpegは、FFmpegによる映像・音声処理のコマンド例をまとめたスキルで、Remotionプロジェクト向けの手順も含みます。映像制作者がメディアの変換、サイズ変更、圧縮、編集、速度調整を行い、配信用に準備できます。
主な機能
- 01映像・音声形式の変換
- 02映像のリサイズ、クロップ、圧縮
- 03音声抽出と音量調整
- 04トリミング、連結、フェード追加
- 05音声同期を保った再生速度変更
- 06配信先向けの書き出し最適化
活用シーン
- 01GIFをRemotion向けMP4に変換
- 02デモ映像をナレーションの長さに合わせる
- 03WebやSNS向けの映像を書き出す
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ digitalsamba/ claude-code-video-toolkit --skill ffmpegインストール後、Claude Code で/ffmpegを入力して読み込まれたか確認します。
同梱ファイルreference.md
詳細
動画制作向け FFmpeg
FFmpeg は動画・音声処理に不可欠なツールです。このスキルでは、Remotion の動画プロジェクトでよく使われる操作を紹介します。
クイックリファレンス
GIF を MP4 に変換(Remotion 互換)
ffmpeg -i input.gif -movflags faststart -pix_fmt yuv420p \
-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" output.mp4
これらのフラグを使う理由:
-movflags faststart- メタデータを先頭に移動し、Web ストリーミングに対応します-pix_fmt yuv420p- ほとんどのプレーヤーとの互換性を確保しますscale=trunc(...)- 寸法を偶数にします(ほとんどのコーデックで必要です)
動画のサイズ変更
# To 1920x1080 (maintain aspect ratio, add black bars)
ffmpeg -i input.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2" output.mp4
# To 1920x1080 (crop to fill)
ffmpeg -i input.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=increase,crop=1920:1080" output.mp4
# Scale to width, auto height
ffmpeg -i input.mp4 -vf "scale=1280:-2" output.mp4
動画の圧縮
# Good quality, smaller file (CRF 23 is default, lower = better quality)
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4
# Aggressive compression for web preview
ffmpeg -i input.mp4 -c:v libx264 -crf 28 -preset fast -c:a aac -b:a 96k output.mp4
# Target file size (e.g., ~10MB for 60s video = ~1.3Mbps)
ffmpeg -i input.mp4 -c:v libx264 -b:v 1300k -c:a aac -b:a 128k output.mp4
音声の抽出
# Extract to MP3
ffmpeg -i input.mp4 -vn -acodec libmp3lame -q:a 2 output.mp3
# Extract to AAC
ffmpeg -i input.mp4 -vn -acodec aac -b:a 192k output.m4a
# Extract to WAV (uncompressed)
ffmpeg -i input.mp4 -vn output.wav
音声形式の変換
# M4A to MP3 (for ElevenLabs voice samples)
ffmpeg -i input.m4a -codec:a libmp3lame -qscale:a 2 output.mp3
# WAV to MP3
ffmpeg -i input.wav -codec:a libmp3lame -b:a 192k output.mp3
# Adjust volume
ffmpeg -i input.mp3 -filter:a "volume=1.5" output.mp3
動画のトリミング/カット
# Cut from timestamp to duration (recommended - reliable)
ffmpeg -i input.mp4 -ss 00:00:30 -t 00:00:15 -c:v libx264 -c:a aac output.mp4
# Cut from timestamp to timestamp
ffmpeg -i input.mp4 -ss 00:00:30 -to 00:00:45 -c:v libx264 -c:a aac output.mp4
# Stream copy (faster but may lose frames at cut points)
# Only use when source has frequent keyframes
ffmpeg -i input.mp4 -ss 00:00:30 -t 00:00:15 -c copy output.mp4
注記: トリミングには再エンコードをおすすめします。ストリームコピー(-c copy)では、シーク位置がキーフレームと一致しない場合、動画が気付かないうちに欠落することがあります。
再生速度の変更
# 2x speed (video and audio)
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mp4
# 0.5x speed (slow motion)
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]" -map "[v]" -map "[a]" output.mp4
# Video only (no audio)
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" -an output.mp4
動画の連結
# Create file list
echo "file 'clip1.mp4'" > list.txt
echo "file 'clip2.mp4'" >> list.txt
echo "file 'clip3.mp4'" >> list.txt
# Concatenate (same codec/resolution)
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4
# Concatenate with re-encoding (different sources)
ffmpeg -f concat -safe 0 -i list.txt -c:v libx264 -c:a aac output.mp4
フェードイン/フェードアウトの追加
# Fade in first 1 second, fade out last 1 second (30fps video)
ffmpeg -i input.mp4 -vf "fade=t=in:st=0:d=1,fade=t=out:st=9:d=1" -c:a copy output.mp4
# Audio fade
ffmpeg -i input.mp4 -af "afade=t=in:st=0:d=1,afade=t=out:st=9:d=1" -c:v copy output.mp4
動画情報の取得
# Duration, resolution, codec info
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4
# Full info
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4
Remotion 固有のパターン
Remotion 向けの動画速度調整
FFmpeg と Remotion の playbackRate の使い分け:
| シナリオ | FFmpeg を使用 | Remotion を使用 |
|---|---|---|
| 一定の速度(1.5x、2x) | どちらでも対応可能 | ✅ より簡単 |
| 極端な速度(>4x または <0.25x) | ✅ より信頼性が高い | 問題が発生する場合があります |
| 可変速度(時間とともに加速) | ✅ 事前処理 | 複雑な回避策が必要 |
| 完全な音声同期が必要 | ✅ 確実 | 通常は問題ありません |
| デモをナレーションのタイミングに合わせる必要がある | ✅ 事前計算 | 実行時に調整 |
Remotion の制限: playbackRate は一定でなければなりません。playbackRate={interpolate(frame, [0, 100], [1, 5])} のような動的な補間は、Remotion が各フレームを個別に評価するため、正しく動作しません。
# Speed up demo to fit a scene (e.g., 60s demo into 20s = 3x speed)
ffmpeg -i demo-raw.mp4 \
-filter_complex "[0:v]setpts=0.333*PTS[v];[0:a]atempo=3.0[a]" \
-map "[v]" -map "[a]" \
public/demos/demo-fast.mp4
# Slow motion for emphasis (0.5x speed)
ffmpeg -i action.mp4 \
-filter_complex "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]" \
-map "[v]" -map "[a]" \
public/demos/action-slow.mp4
# Speed up without audio (common for screen recordings)
ffmpeg -i demo.mp4 -filter:v "setpts=0.5*PTS" -an public/demos/demo-2x.mp4
# Timelapse effect (10x speed, drop audio)
ffmpeg -i long-demo.mp4 -filter:v "setpts=0.1*PTS" -an public/demos/timelapse.mp4
速度係数の計算:
- 動画の X 秒分をシーンの Y 秒に収めるには:
speed = X / Y - setpts の乗数 =
1 / speed(例:3x の速度 = setpts=0.333*PTS) - atempo の値 =
speed(例:3x の速度 = atempo=3.0)
極端な速度(音声が 2 倍超): atempo フィルターを連結します(各フィルターは 0.5~2.0 の範囲に制限されています)。
# 4x speed audio
-filter_complex "[0:a]atempo=2.0,atempo=2.0[a]"
# 8x speed audio
-filter_complex "[0:a]atempo=2.0,atempo=2.0,atempo=2.0[a]"
Remotion 向けのデモ録画の準備
# Standard 1080p, 30fps, Remotion-ready
ffmpeg -i raw-recording.mp4 \
-vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,fps=30" \
-c:v libx264 -crf 18 -preset slow \
-c:a aac -b:a 192k \
-movflags faststart \
public/demos/demo.mp4
画面録画を Remotion のアセットに変換
# From iPhone/iPad recording (usually 60fps, variable resolution)
ffmpeg -i iphone-recording.mov \
-vf "scale=1920:-2,fps=30" \
-c:v libx264 -crf 20 \
-an \
public/demos/mobile-demo.mp4
GIF の一括変換
for f in assets/*.gif; do
ffmpeg -i "$f" -movflags faststart -pix_fmt yuv420p \
-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" \
"public/demos/$(basename "$f" .gif).mp4"
done
よくある問題
「高さが 2 で割り切れない」
スケールフィルターを追加します:-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2"
ブラウザーで動画が再生されない
次を使用します:-movflags faststart -pix_fmt yuv420p -c:v libx264
速度変更後に音声が同期しない
atempo を指定した filter_complex を使用します:-filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]"
ファイルサイズが大きすぎる
CRF を上げる(23→28)か、解像度を下げます
品質ガイドライン
| 用途 | CRF | プリセット | 備考 |
|---|---|---|---|
| アーカイブ/マスター | 18 | slow | 最高品質、大容量ファイル |
| 本番用 | 20-22 | medium | バランス良好 |
| Web/プレビュー | 23-25 | fast | ファイルサイズ小 |
| 下書き/簡易版 | 28+ | veryfast | 高速エンコード |
プラットフォーム別の出力最適化
Remotion で動画をレンダリングした後(通常は out/video.mp4)、FFmpeg を使って配信先の各プラットフォーム向けに最適化します。
ワークフローへの統合
Remotion render (master) FFmpeg optimization Platform upload
↓ ↓ ↓
out/video.mp4 ────────→ out/video-youtube.mp4 ───→ YouTube
────────→ out/video-twitter.mp4 ───→ Twitter/X
────────→ out/video-linkedin.mp4 ───→ LinkedIn
────────→ out/video-web.mp4 ───→ Website embed
YouTube(推奨設定)
YouTube はすべて再エンコードするため、高品質の動画をアップロードします。
# YouTube optimized (1080p)
ffmpeg -i out/video.mp4 \
-c:v libx264 -preset slow -crf 18 \
-profile:v high -level 4.0 \
-bf 2 -g 30 \
-c:a aac -b:a 192k -ar 48000 \
-movflags +faststart \
out/video-youtube.mp4
# YouTube Shorts (vertical 1080x1920)
ffmpeg -i out/video.mp4 \
-vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2" \
-c:v libx264 -crf 18 -c:a aac -b:a 192k \
out/video-shorts.mp4
Twitter/X
Twitter には厳しい制限があります:最大 140 秒、512MB、1920x1200:
# Twitter optimized (under 15MB target for fast upload)
ffmpeg -i out/video.mp4 \
-c:v libx264 -preset medium -crf 24 \
-profile:v main -level 3.1 \
-vf "scale='min(1280,iw)':'min(720,ih)':force_original_aspect_ratio=decrease" \
-c:a aac -b:a 128k -ar 44100 \
-movflags +faststart \
-fs 15M \
out/video-twitter.mp4
# Check file size and duration
ffprobe -v error -show_entries format=duration,size -of csv=p=0 out/video-twitter.mp4
LinkedIn では AAC 音声の MP4 が推奨され、最大 10 分です。
# LinkedIn optimized
ffmpeg -i out/video.mp4 \
-c:v libx264 -preset medium -crf 22 \
-profile:v main \
-vf "scale='min(1920,iw)':'min(1080,ih)':force_original_aspect_ratio=decrease" \
-c:a aac -b:a 192k -ar 48000 \
-movflags +faststart \
out/video-linkedin.mp4
Webサイト/埋め込み(高速読み込み向けに最適化)
# Web-optimized MP4 (small file, progressive loading)
ffmpeg -i out/video.mp4 \
-c:v libx264 -preset medium -crf 26 \
-profile:v baseline -level 3.0 \
-vf "scale=1280:720" \
-c:a aac -b:a 128k \
-movflags +faststart \
out/video-web.mp4
# WebM alternative (better compression, wider browser support)
ffmpeg -i out/video.mp4 \
-c:v libvpx-vp9 -crf 30 -b:v 0 \
-vf "scale=1280:720" \
-c:a libopus -b:a 128k \
-deadline good \
out/video-web.webm
GIF(プレビュー/サムネイル用)
# High-quality GIF (first 5 seconds)
ffmpeg -i out/video.mp4 -t 5 \
-vf "fps=15,scale=480:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
out/preview.gif
# Smaller file GIF
ffmpeg -i out/video.mp4 -t 3 \
-vf "fps=10,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
out/preview-small.gif
プラットフォーム要件のクイックリファレンス
| プラットフォーム | 最大解像度 | 最大サイズ | 最大時間 | 音声 |
|---|---|---|---|---|
| YouTube | 8K | 256GB | 12 hours | AAC 48kHz |
| Twitter/X | 1920x1200 | 512MB | 140s | AAC 44.1kHz |
| 4096x2304 | 5GB | 10 min | AAC 48kHz | |
| Instagram フィード | 1080x1350 | 4GB | 60s | AAC 48kHz |
| Instagram リール | 1080x1920 | 4GB | 90s | AAC 48kHz |
| TikTok | 1080x1920 | 287MB | 10 min | AAC |
全プラットフォーム向けの一括エクスポート
#!/bin/bash
# save as: export-all-platforms.sh
INPUT="out/video.mp4"
# YouTube (high quality)
ffmpeg -i "$INPUT" -c:v libx264 -preset slow -crf 18 \
-c:a aac -b:a 192k -movflags +faststart \
out/video-youtube.mp4
# Twitter (compressed)
ffmpeg -i "$INPUT" -c:v libx264 -crf 24 \
-vf "scale='min(1280,iw)':'-2'" \
-c:a aac -b:a 128k -movflags +faststart \
out/video-twitter.mp4
# LinkedIn
ffmpeg -i "$INPUT" -c:v libx264 -crf 22 \
-c:a aac -b:a 192k -movflags +faststart \
out/video-linkedin.mp4
# Web embed (small)
ffmpeg -i "$INPUT" -c:v libx264 -crf 26 \
-vf "scale=1280:720" \
-c:a aac -b:a 128k -movflags +faststart \
out/video-web.mp4
echo "Exported:"
ls -lh out/video-*.mp4
エラー処理
動画処理でよくあるエラーと解決方法:
# Check if FFmpeg succeeded
ffmpeg -i input.mp4 -c:v libx264 output.mp4 && echo "Success" || echo "Failed: check input file"
# Validate output file is playable
ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of csv=p=0 output.mp4
# Get detailed error info
ffmpeg -v error -i input.mp4 -f null - 2>&1 | head -20
よくあるエラーへの対処
| エラー | 原因 | 修正方法 |
|---|---|---|
| "No such file" | 入力パスが間違っています | パスを確認し、スペースを含む場合は引用符で囲みます |
| "Invalid data" | 入力データが破損しています | 元のデータを再ダウンロードするか、再録画します |
| "height not divisible by 2" | 寸法が奇数です | trunc を使った scale フィルターを追加します |
| "encoder not found" | コーデックがありません | コーデックがすべて含まれる FFmpeg をインストールします |
| 出力が 0 バイト | エラーが表示されずに失敗しています | ffmpeg の出力全体を確認してエラーを探します |
フィードバックと貢献
このスキルに情報が足りない場合や、改善できる点がある場合:
- コマンドが足りませんか? 必要だった内容をお知らせください
- 誤りを見つけましたか? 問題の内容をお知らせください
- 貢献したいですか? 次のことをお手伝いできます:
- このスキルを改善して更新する
- github.com/digitalsamba/claude-code-video-toolkit に PR を作成する
「improve this skill」と伝えていただければ、.claude/skills/ffmpeg/SKILL.md の更新をご案内します。