mcpField
F
ffmpeg

ffmpeg

github.com/calesthioクリエイティブ・メディア72.7k1.2k 回インストール今日更新
リポジトリ

ffmpeg について

Remotionの動画制作向けFFmpegスキルです。変換、編集、エンコード、トラブルシューティングや、配信先に応じた書き出しの手順をまとめています。

主な機能

  1. 01動画の変換・リサイズ・圧縮
  2. 02音声の抽出と形式変換
  3. 03動画のカット・速度変更・連結
  4. 04フェードイン・フェードアウトの追加
  5. 05メディア情報の確認と問題調査
  6. 06Remotion素材と配信用書き出しの準備

活用シーン

  1. 01GIFをRemotion対応のMP4に変換
  2. 02デモ映像をナレーションの長さに調整
  3. 03Webやソーシャル向けに動画を最適化
  4. 04エンコード失敗や音ズレの原因を調査

インストール

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

$npx skills add https://github.com/calesthio/openmontage --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プリセット備考
アーカイブ/マスター18slow最高品質、大容量ファイル
本番用20-22mediumバランス良好
Web/プレビュー23-25fastファイルサイズ小
下書き/簡易版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

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
プラットフォーム要件のクイックリファレンス
プラットフォーム最大解像度最大サイズ最大時間音声
YouTube8K256GB12 hoursAAC 48kHz
Twitter/X1920x1200512MB140sAAC 44.1kHz
LinkedIn4096x23045GB10 minAAC 48kHz
Instagram フィード1080x13504GB60sAAC 48kHz
Instagram リール1080x19204GB90sAAC 48kHz
TikTok1080x1920287MB10 minAAC
全プラットフォーム向けの一括エクスポート
#!/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 の出力全体を確認してエラーを探します

フィードバックと貢献

このスキルに情報が足りない場合や、改善できる点がある場合:

  • コマンドが足りませんか? 必要だった内容をお知らせください
  • 誤りを見つけましたか? 問題の内容をお知らせください
  • 貢献したいですか? 次のことをお手伝いできます:
    1. このスキルを改善して更新する
    2. github.com/digitalsamba/claude-code-video-toolkit に PR を作成する

「improve this skill」と伝えていただければ、.claude/skills/ffmpeg/SKILL.md の更新をご案内します。

コメント