ffmpeg-toolkit について
ffmpeg-toolkitは、FFmpegとffprobeで動画、音声、画像を処理するためのリファレンススキルです。一般的なメディア処理コマンドや書き出し設定を調べるクリエイターや開発者向けです。
主な機能
- 01メディア形式の変換
- 02動画のリサイズ、クロップ、切り出し
- 03再生速度の調整とファイル圧縮
- 04音声の抽出とフェード処理
- 05テキストや画像の重ね合わせとクリップ結合
- 06メディア情報の確認と一括処理
活用シーン
- 01ウェブ再生用の動画変換
- 02指定サイズやアスペクト比に合わせたクリップ作成
- 03音声抽出やサムネイル生成
- 04複数メディアファイルの一括編集
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ jakenuts/ agent-skills --skill ffmpeg-toolkitインストール後、Claude Code で/ffmpeg-toolkitを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
audio-processing.mdplatform-export.mdreference.mdremotion.mdstreaming-and-hwaccel.md詳細
FFmpeg ツールキット
トランスコード
# Convert to MP4 (H.264 + AAC)
ffmpeg -i input.mov -c:v libx264 -preset medium -crf 23 \
-c:a aac -b:a 128k output.mp4
# Convert to WebM (VP9 + Opus)
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 \
-c:a libopus -b:a 128k output.webm
サイズ変更
# Specific dimensions
ffmpeg -i input.mp4 -vf "scale=1920:1080" output.mp4
# Aspect-ratio preserve with padding (letterbox/pillarbox)
ffmpeg -i input.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2" output.mp4
# Crop to fill (no black bars)
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
# Scale to percentage (50%)
ffmpeg -i input.mp4 -vf "scale=iw/2:ih/2" output.mp4
トリミングとカット
# Cut from timestamp + duration (re-encode recommended for accuracy)
ffmpeg -i input.mp4 -ss 00:00:30 -t 00:00:15 -c:v libx264 -c:a aac output.mp4
# Cut from start to end 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 non-keyframe cut points)
ffmpeg -i input.mp4 -ss 00:00:30 -t 00:00:15 -c copy output.mp4
# Fast seek for large files (put -ss before -i)
ffmpeg -ss 00:10:00 -i large_video.mp4 -t 00:05:00 -c copy clip.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
# Extreme slow motion (0.25x) - chain atempo filters (each limited to 0.5-2.0)
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=4.0*PTS[v];[0:a]atempo=0.5,atempo=0.5[a]" \
-map "[v]" -map "[a]" output.mp4
速度係数の計算:
- X 秒の動画を Y 秒に収める場合:
speed = X / Y - setpts の乗数 =
1 / speed(例:3 倍速 =setpts=0.333*PTS) - atempo の値 =
speed(例:3 倍速 =atempo=3.0) - 音声を極端に高速化する場合(2 倍超):atempo フィルターを連結します。例:4 倍速 =
atempo=2.0,atempo=2.0
Remotion の playbackRate と FFmpeg の速度設定の使い分けについては、remotion.md を参照してください。
圧縮
# Good quality, smaller file (CRF 23 is default, lower = better)
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
プラットフォーム別のサイズ目標については、platform-export.md を参照してください。
音声の抽出と変換
# 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
# Extract audio from specific time range
ffmpeg -i video.mp4 -ss 00:01:00 -t 00:00:30 -vn audio.mp3
# M4A to MP3
ffmpeg -i input.m4a -codec:a libmp3lame -qscale:a 2 output.mp3
# Adjust volume
ffmpeg -i input.mp3 -filter:a "volume=1.5" output.mp3
クロップ
# Arbitrary crop (width:height:x:y)
ffmpeg -i input.mp4 -vf "crop=640:480:100:50" output.mp4
# Center crop to 16:9
ffmpeg -i input.mp4 -vf "crop=ih*16/9:ih" 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
フェード
# Video fade in first 1s, fade out last 1s (adjust st= for your duration)
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
オーバーレイと合成
# Watermark (bottom-right corner)
ffmpeg -i video.mp4 -i watermark.png \
-filter_complex "overlay=W-w-10:H-h-10" output.mp4
# Text overlay
ffmpeg -i input.mp4 -vf "drawtext=text='Hello World':fontsize=24:fontcolor=white:x=10:y=10" output.mp4
# Picture-in-Picture
ffmpeg -i main.mp4 -i overlay.mp4 \
-filter_complex "[1:v]scale=320:-1[pip];[0:v][pip]overlay=W-w-10:H-h-10" output.mp4
# Side by side
ffmpeg -i left.mp4 -i right.mp4 \
-filter_complex "[0:v]scale=640:-1[l];[1:v]scale=640:-1[r];[l][r]hstack" output.mp4
サムネイルとスクリーンショット
# Single screenshot at timestamp
ffmpeg -i video.mp4 -ss 00:00:10 -vframes 1 thumbnail.jpg
# Best quality thumbnail
ffmpeg -i video.mp4 -ss 00:00:10 -vframes 1 -q:v 2 thumbnail.jpg
# Generate thumbnails every N seconds
ffmpeg -i video.mp4 -vf "fps=1/10" thumbnails_%03d.jpg
# Thumbnail sprite sheet
ffmpeg -i video.mp4 -vf "fps=1/5,scale=160:-1,tile=5x5" sprite.jpg
# GIF from video (simple)
ffmpeg -i input.mp4 -vf "fps=10,scale=480:-1" output.gif
# GIF from video (palette for better quality + smaller size)
ffmpeg -i input.mp4 -vf "fps=10,scale=480:-1,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" output.gif
プローブ(ffprobe)
# Full JSON info
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4
# Duration in seconds
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4
# Resolution
ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 input.mp4
# Codec name
ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 input.mp4
# Frame count
ffprobe -v error -select_streams v:0 -count_frames -show_entries stream=nb_read_frames -of csv=p=0 input.mp4
バッチ処理
# Convert all MP4s to WebM
for f in *.mp4; do
ffmpeg -i "$f" -c:v libvpx-vp9 -crf 30 -c:a libopus "${f%.mp4}.webm"
done
# Resize all images in directory
for f in *.jpg; do
ffmpeg -i "$f" -vf "scale=1280:-1" "resized_$f"
done
# Extract audio from multiple videos
for f in *.mp4; do
ffmpeg -i "$f" -vn -c:a mp3 -b:a 192k "${f%.mp4}.mp3"
done
よくあるエラー
| エラー | 原因 | 対処方法 |
|---|---|---|
| "height not divisible by 2" | 奇数の寸法 | -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" を追加します |
| ブラウザーで動画を再生できない | Web 用のフラグがない | -movflags faststart -pix_fmt yuv420p -c:v libx264 を使用します |
| 速度変更後に音声が同期しない | フィルターの不一致 | setpts と atempo の両方を指定した filter_complex を使用します |
| ファイルサイズが大きすぎる | 圧縮率が低い | CRF を上げる(23->28)か、解像度を下げます |
| "No such file" | 入力パスが間違っている | パスを確認し、空白を含む場合は引用符で囲みます |
| "Invalid data" | 入力データが破損している | ソースを再ダウンロードするか、再録画します |
| "encoder not found" | コーデックがない | すべてのコーデックを含む FFmpeg をインストールします |
| 出力が 0 バイト | 失敗が通知されていない | FFmpeg の出力全体を確認します(-v error) |
品質ガイドライン
| 用途 | CRF | プリセット | 備考 |
|---|---|---|---|
| アーカイブ/マスター | 18 | slow | 最高品質ですが、ファイルサイズは大きくなります |
| 制作用 | 20-22 | medium | バランスが良好です |
| Web/プレビュー | 23-25 | fast | ファイルサイズを抑えられます |
| 下書き/クイック | 28+ | veryfast | エンコードが高速です |
プリセットの段階(高速になるほどファイルサイズが大きくなり、エンコード時間は短くなります):
ultrafast > superfast > veryfast > faster > fast > medium > slow > slower > veryslow
参考資料
- reference.md - コーデック、フィルター、形式の参照表(動画/音声フィルター、コーデック、CRF の範囲、コンテナ、入力/出力オプション)
- audio-processing.md - 高度な音声処理:ノーマライズ、ノイズ低減、周波数フィルター、音声トラックの結合
- streaming-and-hwaccel.md - HLS/DASH ストリーミングとハードウェアアクセラレーション(NVENC、VideoToolbox、QuickSync)
- remotion.md - Remotion との統合:アセットの準備、速度設定の使い分け、
<OffthreadVideo>に関する注意事項 - platform-export.md - ソーシャルメディア向けの書き出し最適化(YouTube、Twitter/X、LinkedIn、Instagram、TikTok、Web 埋め込み)
コメント
Markdown 対応