Communitygithub.com

aelyraAI/ffmpeg

FFmpegを使用した動画・音声処理スキル。フォーマット変換、サイズ変更、圧縮、音声抽出、Remotion用アセット準備などに対応。GIF→MP4変換、動画リサイズ、音声抽出、ファイル圧縮など、あらゆるメディア変換タスクをトリガーとします。

ffmpeg とは?

このスキルは、Claude CodeなどのAIエージェントがFFmpegを活用して動画・音声処理を効率的に行うための包括的なリファレンスです。主にRemotionを使った動画制作ワークフローを念頭に置きつつ、フォーマット変換、リサイズ、圧縮、音声抽出、トリミング、速度変更、連結、フェードイン/アウトなど、一般的なメディア操作をカバーします。各コマンドにはフラグの意味や使用する理由が明記されており、ユーザーは状況に応じて適切なパラメータを選択できます。また、YouTube、Twitter/X、LinkedIn、Web埋め込みなどプラットフォーム別の最適化設定や、エラーハンドリング、品質ガイドラインも含まれているため、プロダクション品質の動画出力が可能です。AIエージェントはこのスキルに従って、ユーザーの要求に応じたFFmpegコマンドを生成し、実行を補助します。

対応✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/aelyraAI/aelyra-skills/tree/HEAD/ffmpeg

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

動画制作のための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(...) - 寸法を偶数に強制(多くのコーデックで必要)

動画のリサイズ

# 1920x1080にリサイズ(アスペクト比維持、黒帯追加)
ffmpeg -i input.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2" output.mp4

# 1920x1080にリサイズ(トリミングして埋める)
ffmpeg -i input.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=increase,crop=1920:1080" output.mp4

# 幅を指定、高さは自動
ffmpeg -i input.mp4 -vf "scale=1280:-2" output.mp4

動画の圧縮

# 良好な品質、小さなファイル(CRF 23がデフォルト、低いほど高品質)
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4

# Webプレビュー用の強めの圧縮
ffmpeg -i input.mp4 -c:v libx264 -crf 28 -preset fast -c:a aac -b:a 96k output.mp4

# 目標ファイルサイズ(例:60秒動画で約10MB = 約1.3Mbps)
ffmpeg -i input.mp4 -c:v libx264 -b:v 1300k -c:a aac -b:a 128k output.mp4

音声の抽出

# MP3として抽出
ffmpeg -i input.mp4 -vn -acodec libmp3lame -q:a 2 output.mp3

# AACとして抽出
ffmpeg -i input.mp4 -vn -acodec aac -b:a 192k output.m4a

# WAVとして抽出(非圧縮)
ffmpeg -i input.mp4 -vn output.wav

音声フォーマット変換

# M4A → MP3(ElevenLabs音声サンプル用)
ffmpeg -i input.m4a -codec:a libmp3lame -qscale:a 2 output.mp3

# WAV → MP3
ffmpeg -i input.wav -codec:a libmp3lame -b:a 192k output.mp3

# 音量調整
ffmpeg -i input.mp3 -filter:a "volume=1.5" output.mp3

動画のトリミング/カット

# タイムスタンプから指定された長さでカット(推奨 - 信頼性高い)
ffmpeg -i input.mp4 -ss 00:00:30 -t 00:00:15 -c:v libx264 -c:a aac output.mp4

# タイムスタンプからタイムスタンプまでカット
ffmpeg -i input.mp4 -ss 00:00:30 -to 00:00:45 -c:v libx264 -c:a aac output.mp4

# ストリームコピー(高速だがカットポイントでフレームが欠落する可能性あり)
# ソースにキーフレームが頻繁にある場合のみ使用
ffmpeg -i input.mp4 -ss 00:00:30 -t 00:00:15 -c copy output.mp4

注意: トリミングには再エンコードを推奨します。ストリームコピー(-c copy)は、シークポイントがキーフレームと一致しない場合、警告なしに動画をドロップする可能性があります。

動画の速度変更

# 2倍速(動画と音声)
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.5倍速(スローモーション)
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

# 動画のみ(音声なし)
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" -an output.mp4

動画の連結

# ファイルリスト作成
echo "file 'clip1.mp4'" > list.txt
echo "file 'clip2.mp4'" >> list.txt
echo "file 'clip3.mp4'" >> list.txt

# 連結(同じコーデック/解像度)
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4

# 再エンコードして連結(異なるソース)
ffmpeg -f concat -safe 0 -i list.txt -c:v libx264 -c:a aac output.mp4

フェードイン/アウトの追加

# 最初の1秒にフェードイン、最後の1秒にフェードアウト(30fps動画)
ffmpeg -i input.mp4 -vf "fade=t=in:st=0:d=1,fade=t=out:st=9:d=1" -c:a copy output.mp4

# 音声フェード
ffmpeg -i input.mp4 -af "afade=t=in:st=0:d=1,afade=t=out:st=9:d=1" -c:v copy output.mp4

動画情報の取得

# 長さ、解像度、コーデック情報
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4

# 完全な情報
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4

Remotion固有のパターン

Remotion用の動画速度調整

FFmpegとRemotionのplaybackRateの使い分け:

シナリオFFmpegを使用Remotionを使用
一定速度(1.5倍、2倍)どちらでも可✅ よりシンプル
極端な速度(4倍超または0.25倍未満)✅ より信頼性高い問題が発生する可能性あり
可変速度(時間とともに加速)✅ 事前処理複雑な回避策が必要
完全な音声同期が必要✅ 保証あり通常は問題なし
デモをナレーションタイミングに合わせる必要あり✅ 事前計算実行時調整

Remotionの制限: playbackRateは一定でなければなりません。playbackRate={interpolate(frame, [0, 100], [1, 5])}のような動的な補間は、Remotionがフレームを独立して評価するため正しく動作しません。

# デモをシーンに合わせて高速化(例:60秒デモを20秒に=3倍速)
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

# 強調のためのスローモーション(0.5倍速)
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

# 音声なしで高速化(画面録画でよくある)
ffmpeg -i demo.mp4 -filter:v "setpts=0.5*PTS" -an public/demos/demo-2x.mp4

# タイムラプス効果(10倍速、音声削除)
ffmpeg -i long-demo.mp4 -filter:v "setpts=0.1*PTS" -an public/demos/timelapse.mp4

速度係数の計算:

  • X秒の動画をY秒のシーンに収める場合: 速度 = X / Y
  • setpts乗数 = 1 / 速度(例:3倍速 = setpts=0.333*PTS)
  • atempo値 = 速度(例:3倍速 = atempo=3.0)

極端な速度(2倍速を超える音声): atempoフィルターを連鎖(各々0.5~2.0の範囲に制限):

# 4倍速音声
-filter_complex "[0:a]atempo=2.0,atempo=2.0[a]"

# 8倍速音声
-filter_complex "[0:a]atempo=2.0,atempo=2.0,atempo=2.0[a]"

Remotion用のデモ録画準備

# 標準1080p、30fps、Remotion対応
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アセットへ

# iPhone/iPad録画から(通常60fps、可変解像度)
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で割り切れない」

scaleフィルターを追加: -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レンダリング(マスター)     FFmpeg最適化      プラットフォームアップロード
       ↓                            ↓                       ↓
   out/video.mp4  ────────→  out/video-youtube.mp4  ───→  YouTube
                  ────────→  out/video-twitter.mp4  ───→  Twitter/X
                  ────────→  out/video-linkedin.mp4 ───→  LinkedIn
                  ────────→  out/video-web.mp4      ───→  Webサイト埋め込み

YouTube(推奨設定)

YouTubeはすべてを再エンコードするため、高品質でアップロードします:

# YouTube最適化(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(縦型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最適化(高速アップロードのために15MB未満を目標)
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

# ファイルサイズと長さを確認
ffprobe -v error -show_entries format=duration,size -of csv=p=0 out/video-twitter.mp4

LinkedIn

LinkedInはAAC音声付きMP4を推奨、最大10分:

# LinkedIn最適化
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最適化MP4(小さなファイル、プログレッシブ読み込み)
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代替(より良い圧縮、広いブラウザサポート)
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(プレビュー/サムネイル用)

# 高品質GIF(最初の5秒)
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

# より小さなファイルの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時間AAC 48kHz
Twitter/X1920x1200512MB140秒AAC 44.1kHz
LinkedIn4096x23045GB10分AAC 48kHz
Instagram フィード1080x13504GB60秒AAC 48kHz
Instagram Reels1080x19204GB90秒AAC 48kHz
TikTok1080x1920287MB10分AAC

全プラットフォームへの一括エクスポート

#!/bin/bash
# 保存先: export-all-platforms.sh
INPUT="out/video.mp4"

# YouTube(高品質)
ffmpeg -i "$INPUT" -c:v libx264 -preset slow -crf 18 \
  -c:a aac -b:a 192k -movflags +faststart \
  out/video-youtube.mp4

# Twitter(圧縮)
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埋め込み(小)
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 "エクスポート完了:"
ls -lh out/video-*.mp4

エラーハンドリング

動画処理時の一般的なエラーと修正方法:

# FFmpegが成功したか確認
ffmpeg -i input.mp4 -c:v libx264 output.mp4 && echo "成功" || echo "失敗: 入力ファイルを確認してください"

# 出力ファイルが再生可能か検証
ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of csv=p=0 output.mp4

# 詳細なエラー情報を取得
ffmpeg -v error -i input.mp4 -f null - 2>&1 | head -20

よくある障害の対処

エラー原因修正方法
「そのようなファイルはありません」入力パスが間違っているパスを確認、スペースを含む場合は引用符を使用
「無効なデータ」入力が破損しているソースを再ダウンロードまたは再録画
「高さが2で割り切れません」奇数寸法truncを使用したscaleフィルターを追加
「エンコーダーが見つかりません」コーデックがないフルコーデックでFFmpegをインストール
出力が0バイト黙示的な失敗エラー出力全体を確認

フィードバックと貢献

このスキルに不足している情報や改善点がある場合:

  • コマンドが足りない? 何が必要だったか教えてください
  • エラーを見つけた? 何が間違っているか教えてください
  • 貢献したい? 以下の方法で協力できます:
    1. このスキルを改善して更新
    2. github.com/digitalsamba/claude-code-video-toolkit にPRを作成

「このスキルを改善してください」と言うだけで、.claude/skills/ffmpeg/SKILL.mdの更新を案内します。

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

関連スキル