# FFmpeg 動画編集キット v1.1（Claude Code が FFmpeg を自動導入して動画編集・macOS）

このファイルを Claude Code に読み込ませると、**FFmpeg の導入（管理者パスワード不要）→ 動画編集スキルの配置 → 動作確認**まで自動で進みます。
朝倉駿の顧問生向けに配布しています。zip 版（ffmpeg-kit.zip）と中身は同じです。

- **できあがるもの**: Claude Code に「動画編集して」と頼むだけで、切り出し・結合・縦動画化・テロップ・字幕・無音カット・音声処理・圧縮・GIF ができる状態
- **対応**: macOS 12 以降（Apple Silicon / Intel）
- **費用**: 0円 ／ **所要**: 5分（ダウンロード約 60MB）
- **使い方**: Claude Code を起動 → このファイルを渡して「このファイルを読んで、その通りに進めて」

---

## Claude Code への指示

**このファイルを読んだ Claude Code は、ここから下を「あなたへの指示書」として実行してください。応答は日本語で。**

### あなたの役割

- `sudo` や管理者パスワードを要するコマンドは実行しない。ネット越しのスクリプトをそのまま実行しない
- 手順は 1 → 4 の順に進め、各手順の結果を1〜2行で報告する
- 埋め込まれたファイルの内容は1文字も変えずに書き出す（コードフェンス ```` ```` ```` の内側だけを保存する）

### 手順1: スキルフォルダを作る

```bash
mkdir -p ~/.claude/skills/ffmpeg-kit/references
```

### 手順2: 下の【ファイル1】〜【ファイル4】を書き出す

| 保存先 | 内容 |
|---|---|
| `~/.claude/skills/ffmpeg-kit/SKILL.md` | 【ファイル1】 |
| `~/.claude/skills/ffmpeg-kit/setup.sh` | 【ファイル2】 |
| `~/.claude/skills/ffmpeg-kit/references/recipes.md` | 【ファイル3】 |
| `~/.claude/skills/ffmpeg-kit/README.md` | 【ファイル4】 |

書き出したら実行権限を付ける。

```bash
chmod +x ~/.claude/skills/ffmpeg-kit/setup.sh
```

### 手順3: セットアップを実行し、結果を報告する

```bash
bash ~/.claude/skills/ffmpeg-kit/setup.sh
```

- すべて `[OK]` → 「セットアップ完了」を伝える
- `[NG]` が出た → 表示された案内に従う。まずネット接続を確認して同じコマンドをもう一度実行し、それでも入らないときの最終手段として、ユーザーに Terminal.app で Homebrew を入れてもらい（管理者パスワードが要るので Claude は実行しない）、終わったら `bash ~/.claude/skills/ffmpeg-kit/setup.sh --check` で再確認する

### 手順4: 案内して終了

「Claude Code を再起動すると、次から『動画編集して』で使えます」と伝える。

---

## 【ファイル1】 `~/.claude/skills/ffmpeg-kit/SKILL.md`

````markdown
---
name: ffmpeg-kit
description: Mac の Claude Code で FFmpeg（ffmpeg / ffprobe）を管理者パスワードなしで自動導入し、動画・音声の編集を行う汎用スキル。「動画編集して」「この動画を◯秒〜◯秒で切って」「動画をつなげて」「縦動画（9:16）にして」「テロップを入れて」「字幕を焼き込んで」「無音をカットして」「音声だけ抜いて」「BGMを付けて」「動画を圧縮して」「MP4に変換して」「GIFにして」「サムネ用の静止画を出して」「FFmpeg入れて」「動画編集の準備をして」などと言われたら必ずこのスキルを使う。talk-reel / daily-vlog / afureko-reel などの専用編集スキルを名指しされたときはそちらを優先し、このスキルは FFmpeg の導入と汎用編集を担当する。
---

# ffmpeg-kit — FFmpeg の自動導入と汎用動画編集（macOS）

このスキルが入っている Mac では、Claude Code が FFmpeg を自分で導入し、動画編集まで行います。
応答は日本語で、結論から短く伝えてください。

## 0. 最初に必ず（セッションごとに1回）

```bash
bash ~/.claude/skills/ffmpeg-kit/setup.sh --check
```

- 全行 `[OK]` → そのまま編集に進む
- `[NG]` がある → 「FFmpeg を導入します（パスワード不要・1〜3分）」と一言伝えてから導入する（ネット接続が必要）
- `[注意] フィルタ zscale が無い…` だけが出た → 編集には進める。ただし iPhone の HDR 素材を扱う前に同じ導入コマンドを実行する（静的版が入って解決する）

```bash
bash ~/.claude/skills/ffmpeg-kit/setup.sh
```

- 既に Homebrew などの ffmpeg が入っていても、テロップ・字幕・HDR 変換のフィルタが足りないビルドなら `setup.sh` が署名済みの静的版を `~/.local/bin` に入れて優先する（既存の ffmpeg や Homebrew は触らない）
- `setup.sh` が見当たらないときだけ、次の1行で直接導入する（Apple Silicon / Intel を自動判定して `~/.local/bin` に置く）

```bash
mkdir -p ~/.local/bin && cd "$(mktemp -d)" && A=$([ "$(sysctl -n hw.optional.arm64 2>/dev/null)" = "1" ] && echo arm64 || echo amd64) && for n in ffmpeg ffprobe; do curl -fL -o $n.zip "https://ffmpeg.martin-riedl.de/redirect/latest/macos/$A/release/$n.zip" && unzip -oq $n.zip $n && chmod +x $n && mv -f $n ~/.local/bin/; done && ~/.local/bin/ffmpeg -version | head -1
```

- 自動導入に失敗したときは、まずネット接続を確認してもう一度 `setup.sh` を実行する。それでも入らないときの最終手段として、ユーザーに Terminal.app で Homebrew を入れてもらう（管理者パスワードが要るので Claude は実行しない）。案内する2行は `/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"` と `brew install ffmpeg`。終わったらもう一度 `setup.sh --check`（Homebrew 版は HDR 変換だけ使えない）
- `sudo` は使わない。パスワードを聞くコマンドを実行しない

## 1. コマンドの約束（毎回）

1. **ffmpeg / ffprobe を呼ぶ Bash は、必ずこの1行から始める**（Claude Code のシェルは `.zshrc` を読まないことがあるため）
   ```bash
   export PATH="$HOME/.local/bin:/opt/homebrew/bin:/usr/local/bin:$PATH"
   ```
2. **元素材を上書き・削除・移動しない**。出力は元と同じフォルダに `元の名前_edited.mp4` のように別名で保存する（保存先の指定があればそちら）。`-y` での上書きは、自分が同じ作業で作った出力だけに使う
3. 出力は `-hide_banner -loglevel error -stats` で静かに。2分を超えそうな処理（長尺・4K・複数本）はバックグラウンドでログに落とし、5分ごとに進捗を一言伝える
4. パスや文字列は必ずダブルクォートで囲む（日本語・スペース入りのファイル名が多い）
5. 実行前に `ffprobe` で素材を確認し、実行後に出力を `ffprobe` で検証する（§2）
6. テロップ・字幕の文言はユーザーの指示どおり1文字も変えない。焼き込み後は静止画を1枚抜いて Read で目視し、位置・改行・見切れを確認する
7. 10本を超える一括処理は、対象ファイルの一覧を見せて確認してから実行する
8. どこを切るか・どの文言にするかなど内容の判断が要るときは、勝手に決めず短く確認する

### 画質を保つ書き出し（2026-09-27更新）

- カット・色補正・サイズ変更・テロップを同じフィルタグラフにまとめ、元素材から納品映像へ1回でエンコードする。レシピごとの完成MP4を順番に読み直して加工しない。
- H.264 / HEVC の中間動画は作らない。途中保存が必要な構成だけ ProRes 422 HQ（`-c:v prores_ks -profile:v 3 -pix_fmt yuv422p10le`）を使い、音声はPCMにする。容量を実行前に確認する。
- テスト用の短い動画を納品素材にしない。修正時は設定を直して元素材から作り直す。音声だけの仕上げで映像を `-c:v copy` する場合は映像の再エンコードに当たらない。
- FFmpegの終了コードが0、出力が実在し0バイトでない、予定尺・解像度・fps・必要な音声が一致していることを確認する。途中失敗や未確認を「完成」と報告しない。
- サムネイル候補の抽出ではレシピA4を使う。元動画の時刻を残し、画像を実際に開いてから推薦する。

## 2. 作業の流れ

1. **素材の確認**（尺・解像度・fps・コーデック・音声・回転・HDR）
   ```bash
   ffprobe -v error -show_entries format=duration,size:stream=index,codec_type,codec_name,width,height,r_frame_rate,pix_fmt,color_transfer,sample_rate,channels:stream_tags=rotate:stream_side_data=rotation -of default=nw=1 "IN.mp4"
   ```
2. **レシピを選ぶ** → `~/.claude/skills/ffmpeg-kit/references/recipes.md`（目的別・検証済み）。載っていない作業は FFmpeg の標準的な書き方で組み、先に短い区間（`-t 5`）で試してから本番にかける
3. **実行**
4. **検証**（終了コード・出力の実在・予定尺・解像度・fps・音声の有無・サイズ）
   ```bash
   test -s "OUT.mp4" && ffprobe -v error -show_entries format=duration,size:stream=codec_type,codec_name,width,height,r_frame_rate,sample_rate,channels -of compact "OUT.mp4"
   ```
5. **報告**: 保存先・尺・解像度・サイズを1〜3行で。省略・変更した点があれば添える

## 3. 出力の既定値（SNS 向け・指定がないとき）

| 用途 | 設定 |
|---|---|
| リール・ショート（縦） | 1080×1920、元の fps を維持（30fps 推奨） |
| フィード正方形 / 横長 | 1080×1080 / 1920×1080 |
| 映像コーデック | `-c:v libx264 -crf 20 -preset medium -pix_fmt yuv420p`（速度優先なら `-c:v h264_videotoolbox -b:v 8M -pix_fmt yuv420p`） |
| 音声 | `-c:a aac -b:a 192k`（サンプルレートは元のまま。そろえる必要があるときだけ `-ar 48000`） |
| コンテナ | MP4、`-movflags +faststart` |
| 音量 | 指示があれば `loudnorm=I=-14:TP=-1.5:LRA=11`（SNS 基準） |

## 4. 日本語フォント（テロップ・字幕）

macOS 標準のヒラギノをファイル指定で使う（fontconfig に頼らない）。使う前に `ls` で存在を確認する。

- 太め: `/System/Library/Fonts/ヒラギノ角ゴシック W6.ttc`（W7・W8・W9 も同じフォルダ）
- 細め: `/System/Library/Fonts/ヒラギノ角ゴシック W3.ttc`
- 明朝: `/System/Library/Fonts/ヒラギノ明朝 ProN.ttc`
- 無いとき: `/System/Library/Fonts/Hiragino Sans GB.ttc`

drawtext は `fontfile='…'`、SRT の焼き込みは `subtitles=sub.srt:fontsdir=/System/Library/Fonts:force_style='FontName=Hiragino Sans,…'` を使う。文言に `:` `'` `%` `\` や改行が入るときは `textfile=` にテキストファイルで渡し、`expansion=none` を付ける（エスケープ事故を防ぐ）。

## 5. iPhone 素材の注意

- **HEVC（hvc1）** はそのまま入力できる。出力は H.264 にする（`-c:v libx264 -pix_fmt yuv420p`）
- **HDR（color_transfer が arib-std-b67 か smpte2084）** を普通に変換すると白っぽく眠い色になる → recipes の「H4 HDR→SDR」を通す
- **縦撮り**は回転メタデータで縦になっている。ffmpeg は自動で回転を適用するので通常はそのままでよい。crop の幅・高さは回転後の値で考える
- 4K / 60fps は重い。先に `-t 5` で試す

## 6. 困ったとき

| 症状 | 対処 |
|---|---|
| `command not found: ffmpeg` | §1 の PATH 行を付け忘れ。`setup.sh --check` で場所を確認 |
| `Killed: 9` / 起動しない | `codesign -s - -f ~/.local/bin/ffmpeg ~/.local/bin/ffprobe` → 再実行。直らなければ `setup.sh --force` |
| `Permission denied` | `chmod +x ~/.local/bin/ffmpeg ~/.local/bin/ffprobe` |
| `moov atom not found` | 転送途中で壊れた素材。元ファイルを送り直してもらう |
| 出力が再生できない | `-pix_fmt yuv420p` と `-movflags +faststart` を付けているか確認 |
| 文字が □ になる | fontfile のパスが違う。§4 のパスを `ls` で確認 |
| `No such filter: 'zscale'` | HDR 変換フィルタが無い ffmpeg（Homebrew 版）を使っている。`bash setup.sh` で静的版を入れる |
| 更新したい | `setup.sh --force`（静的版を入れ直す） |

## 7. やらないこと

- `sudo`・管理者パスワードを要するコマンドや、ネット越しのスクリプトをそのまま実行すること
- 元素材の上書き・削除・移動、確認なしの大量一括処理
- ユーザーの文言の言い換え、頼まれていない演出の追加
````

## 【ファイル2】 `~/.claude/skills/ffmpeg-kit/setup.sh`

````bash
#!/usr/bin/env bash
# =============================================================================
# ffmpeg-kit setup.sh — Mac に FFmpeg（ffmpeg / ffprobe）を導入する
#
#   bash setup.sh            検出 → 足りなければ導入 → 動作検証 → PATH 設定
#   bash setup.sh --check    検出と検証だけ（何も変更しない）
#   bash setup.sh --force    入っていても静的バイナリを入れ直す（更新用）
#
# 方針
#   - sudo（管理者パスワード）は一切使わない
#   - ネット越しのスクリプトをそのまま実行しない（配布元から zip/gz を取得して検証するだけ）
#   - 既存の ffmpeg は「テロップ（drawtext）・字幕（subtitles）・HDR変換（zscale）・libx264・aac」が
#     そろっているときだけそのまま使う。Homebrew 版は zscale を欠くので、その場合は署名済みの
#     静的バイナリを ~/.local/bin に置いて優先する（Homebrew 側は触らない）
#   - 静的バイナリの配布元が全滅したときだけ、Homebrew があれば brew install ffmpeg を試す
#   - 何度実行しても壊れない（冪等）
# 対応: macOS 12 以降 / Apple Silicon・Intel / macOS 標準の bash 3.2 で動く
# 配布元: https://ffmpeg.martin-riedl.de/（署名済み・最新版）
#         https://github.com/eugeneware/ffmpeg-static/releases（予備）
#         https://evermeet.cx/ffmpeg/（Intel の予備）
# テスト用の環境変数（通常は使わない）:
#   FFKIT_ARCH=x86_64        CPU 判定を上書き
#   FFKIT_SOURCES="github"   静的バイナリの配布元を限定（martin / github / evermeet）
#   FFKIT_IGNORE_SYSTEM=1    Homebrew や既存の ffmpeg を無視して静的導入の経路を試す
# =============================================================================
set -u
set -o pipefail

MODE="install"; FORCE=0
for a in "$@"; do
  case "$a" in
    --check)  MODE="check" ;;
    --force)  FORCE=1 ;;
    -h|--help) sed -n '3,16p' "$0"; exit 0 ;;
    *) echo "不明な引数: $a（使えるのは --check / --force）"; exit 2 ;;
  esac
done

if [ "$(uname -s)" != "Darwin" ]; then
  echo "[NG] このスクリプトは macOS 専用です"
  exit 1
fi

DEST="$HOME/.local/bin"
TMP="$(mktemp -d "${TMPDIR:-/tmp}/ffkit.XXXXXX")"
cleanup() { rm -f "$TMP"/* 2>/dev/null; rmdir "$TMP" 2>/dev/null; }
trap cleanup EXIT

# --- CPU 判定（Rosetta 越しに動いていても実機を見る。FFKIT_ARCH はテスト用の上書き） ---
ARCH="${FFKIT_ARCH:-$(uname -m)}"
if [ -z "${FFKIT_ARCH:-}" ] && [ "$(sysctl -n hw.optional.arm64 2>/dev/null || echo 0)" = "1" ]; then
  ARCH="arm64"
fi

# --- テロップ用の日本語フォント（macOS 標準） ---
FONT=""
for f in "/System/Library/Fonts/ヒラギノ角ゴシック W6.ttc" \
         "/System/Library/Fonts/ヒラギノ角ゴシック W3.ttc" \
         "/System/Library/Fonts/Hiragino Sans GB.ttc"; do
  if [ -f "$f" ]; then FONT="$f"; break; fi
done

log()  { printf '%s\n' "$*"; }
ok()   { printf '[OK] %s\n' "$*"; }
ng()   { printf '[NG] %s\n' "$*"; }
note() { printf '[注意] %s\n' "$*"; }

# find_bin 名前 → 見つかったパスを出力（~/.local/bin → PATH → Homebrew の順）
find_bin() {
  local name="$1" c
  for c in "$DEST/$name" "$(command -v "$name" 2>/dev/null || true)" "/opt/homebrew/bin/$name" "/usr/local/bin/$name"; do
    if [ -n "${FFKIT_IGNORE_SYSTEM:-}" ]; then case "$c" in /opt/homebrew/*|/usr/local/*) continue ;; esac; fi
    if [ -n "$c" ] && [ -x "$c" ]; then printf '%s\n' "$c"; return 0; fi
  done
  return 1
}

# usable_ffmpeg パス → 0: 全部そろう / 1: 起動できない / 2: 中核機能が無い / 3: 中核はそろうが HDR変換（zscale）が無い
CORE_MISSING=""; HDR_MISSING=""
usable_ffmpeg() {
  local bin="$1" filters encs f e
  CORE_MISSING=""; HDR_MISSING=""
  "$bin" -version >/dev/null 2>&1 || return 1
  filters="$("$bin" -hide_banner -filters 2>/dev/null | awk '{print $2}')"
  for f in drawtext subtitles; do
    printf '%s\n' "$filters" | grep -qx "$f" || CORE_MISSING="$CORE_MISSING $f"
  done
  printf '%s\n' "$filters" | grep -qx zscale || HDR_MISSING=" zscale"
  encs="$("$bin" -hide_banner -encoders 2>/dev/null | awk '{print $2}')"
  for e in libx264 aac; do
    printf '%s\n' "$encs" | grep -qx "$e" || CORE_MISSING="$CORE_MISSING $e"
  done
  [ -z "$CORE_MISSING" ] || return 2
  [ -z "$HDR_MISSING" ] || return 3
  return 0
}

ver_of() { "$1" -version 2>/dev/null | head -1 | awk '{print $3}'; }

# --- 導入: Homebrew（静的バイナリが全滅したときの最終手段） ---
install_brew() {
  local brew="" c
  [ -n "${FFKIT_IGNORE_SYSTEM:-}" ] && return 1
  for c in "$(command -v brew 2>/dev/null || true)" /opt/homebrew/bin/brew /usr/local/bin/brew; do
    if [ -n "$c" ] && [ -x "$c" ]; then brew="$c"; break; fi
  done
  [ -n "$brew" ] || return 1
  log "静的バイナリが取得できなかったので Homebrew で試します → brew install ffmpeg（2〜5分・パスワード不要）"
  HOMEBREW_NO_AUTO_UPDATE=1 HOMEBREW_NO_INSTALL_CLEANUP=1 HOMEBREW_NO_ENV_HINTS=1 \
    "$brew" install ffmpeg </dev/null || return 1
  return 0
}

# --- 導入: 静的バイナリ ---
# 端末で実行したときだけ進捗バーを出す（Claude Code の出力は静かに）
if [ -t 1 ]; then CURL_PROG="-#"; else CURL_PROG="-sS"; fi
dl() { curl -fL $CURL_PROG --retry 2 --retry-delay 3 --connect-timeout 20 --max-time 900 -A "ffmpeg-kit-setup" -o "$2" "$1"; }

fetch_martin() {   # $1 = arm64 | amd64
  local a="$1" n
  for n in ffmpeg ffprobe; do
    dl "https://ffmpeg.martin-riedl.de/redirect/latest/macos/$a/release/$n.zip" "$TMP/$n.zip" || return 1
    (cd "$TMP" && unzip -oq "$n.zip" "$n") || return 1
  done
}
fetch_github() {   # $1 = arm64 | x64
  local a="$1" n
  for n in ffmpeg ffprobe; do
    dl "https://github.com/eugeneware/ffmpeg-static/releases/latest/download/$n-darwin-$a.gz" "$TMP/$n.gz" \
      || dl "https://github.com/eugeneware/ffmpeg-static/releases/download/b6.1.1/$n-darwin-$a.gz" "$TMP/$n.gz" \
      || return 1
    gunzip -f "$TMP/$n.gz" || return 1
  done
}
fetch_evermeet() { # Intel 専用
  dl "https://evermeet.cx/ffmpeg/getrelease/zip" "$TMP/ffmpeg.zip" || return 1
  dl "https://evermeet.cx/ffmpeg/getrelease/ffprobe/zip" "$TMP/ffprobe.zip" || return 1
  (cd "$TMP" && unzip -oq ffmpeg.zip ffmpeg && unzip -oq ffprobe.zip ffprobe) || return 1
}

# try_source 表示名 取得関数 引数 → 取得・検証して ~/.local/bin に置く
try_source() {
  local name="$1" fn="$2" arg="${3:-}" b rc
  rm -f "$TMP"/ffmpeg "$TMP"/ffprobe "$TMP"/*.zip "$TMP"/*.gz 2>/dev/null
  log "  ↓ $name から取得中…"
  if ! "$fn" $arg; then log "    取得できませんでした（次の配布元へ）"; return 1; fi
  for b in ffmpeg ffprobe; do
    if [ ! -s "$TMP/$b" ]; then log "    $b が展開できませんでした"; return 1; fi
    chmod +x "$TMP/$b"
    xattr -d com.apple.quarantine "$TMP/$b" 2>/dev/null || true
    "$TMP/$b" -version >/dev/null 2>&1; rc=$?
    if [ $rc -ne 0 ]; then
      # 署名の問題で起動しないときは ad-hoc 署名して再試行
      codesign -s - -f "$TMP/$b" >/dev/null 2>&1 || true
      "$TMP/$b" -version >/dev/null 2>&1 || { log "    $b が起動できません（終了コード $rc）"; return 1; }
    fi
  done
  usable_ffmpeg "$TMP/ffmpeg"; rc=$?
  if [ $rc -ne 0 ]; then log "    必要な機能が足りないビルドでした:$CORE_MISSING$HDR_MISSING（次の配布元へ）"; return 1; fi
  mkdir -p "$DEST" || return 1
  for b in ffmpeg ffprobe; do mv -f "$TMP/$b" "$DEST/$b" || return 1; done
  ok "静的バイナリを導入しました: $DEST/ffmpeg（$name / FFmpeg $(ver_of "$DEST/ffmpeg")）"
  return 0
}

install_static() {
  local srcs="${FFKIT_SOURCES:-}" s
  log "静的バイナリを $DEST に導入します（管理者パスワード不要・約60MB・1〜3分）"
  if [ "$ARCH" = "arm64" ]; then
    [ -z "$srcs" ] && srcs="martin github"
    for s in $srcs; do
      case "$s" in
        martin) try_source "martin-riedl.de（Apple Silicon）" fetch_martin arm64 && return 0 ;;
        github) try_source "GitHub eugeneware/ffmpeg-static（Apple Silicon）" fetch_github arm64 && return 0 ;;
      esac
    done
  else
    [ -z "$srcs" ] && srcs="martin evermeet github"
    for s in $srcs; do
      case "$s" in
        martin)   try_source "martin-riedl.de（Intel）" fetch_martin amd64 && return 0 ;;
        evermeet) try_source "evermeet.cx（Intel）" fetch_evermeet && return 0 ;;
        github)   try_source "GitHub eugeneware/ffmpeg-static（Intel）" fetch_github x64 && return 0 ;;
      esac
    done
  fi
  return 1
}

# --- PATH 設定（Claude Code のシェルや新しいターミナルで ~/.local/bin が先に見つかるように） ---
ensure_path() {
  local line='export PATH="$HOME/.local/bin:/opt/homebrew/bin:/usr/local/bin:$PATH"' f
  for f in "$HOME/.zprofile" "$HOME/.zshrc"; do
    if [ -f "$f" ] && grep -q 'ffmpeg-kit' "$f"; then continue; fi
    printf '\n# ffmpeg-kit: ffmpeg / ffprobe の場所を PATH に追加（setup.sh が追記）\n%s\n' "$line" >> "$f" \
      && ok "PATH 設定を追記しました: $f"
  done
}

# --- 動作検証 ---
verify() {
  local ff="$1" fp="$2" filters encs f e miss out
  ok "ffmpeg : $ff（FFmpeg $(ver_of "$ff")）"
  ok "ffprobe: $fp（FFprobe $(ver_of "$fp")）"
  filters="$("$ff" -hide_banner -filters 2>/dev/null | awk '{print $2}')"
  miss=""
  for f in drawtext subtitles; do
    printf '%s\n' "$filters" | grep -qx "$f" || miss="$miss $f"
  done
  if [ -n "$miss" ]; then ng "テロップ・字幕用のフィルタがありません:$miss"; return 1; fi
  ok "フィルタ drawtext / subtitles（テロップ・字幕）"
  if printf '%s\n' "$filters" | grep -qx zscale; then
    ok "フィルタ zscale（iPhone の HDR → SDR 変換）"
  else
    note "フィルタ zscale が無いため HDR → SDR 変換（recipes H4）は使えません。bash setup.sh を実行すると静的版を入れて解決できます"
  fi
  miss=""
  for f in silenceremove xfade loudnorm; do
    printf '%s\n' "$filters" | grep -qx "$f" || miss="$miss $f"
  done
  if [ -z "$miss" ]; then ok "フィルタ silenceremove / xfade / loudnorm"; else note "無いフィルタ:$miss"; fi
  encs="$("$ff" -hide_banner -encoders 2>/dev/null | awk '{print $2}')"
  miss=""
  for e in libx264 aac; do
    printf '%s\n' "$encs" | grep -qx "$e" || miss="$miss $e"
  done
  if [ -n "$miss" ]; then ng "必要なエンコーダがありません:$miss"; return 1; fi
  if printf '%s\n' "$encs" | grep -qx h264_videotoolbox; then
    ok "エンコーダ libx264 / aac / h264_videotoolbox（Apple ハードウェア）"
  else
    ok "エンコーダ libx264 / aac"
  fi
  if [ -n "$FONT" ]; then ok "日本語フォント: $FONT"; else note "ヒラギノが見つかりません。テロップは fontfile の指定が必要です"; fi
  out="$TMP/ffkit_test.mp4"
  if "$ff" -hide_banner -loglevel error -y \
       -f lavfi -i "color=c=black:s=320x240:d=1" -f lavfi -i "anullsrc=r=48000:cl=stereo" -t 1 \
       -vf "drawtext=fontfile='$FONT':text='テスト':fontsize=40:fontcolor=white:x=10:y=10" \
       -c:v libx264 -pix_fmt yuv420p -c:a aac "$out" 2>"$TMP/ffkit_err.log"; then
    ok "エンコードテスト（テロップ込み・1秒）"
  else
    ng "エンコードテストに失敗しました"
    head -3 "$TMP/ffkit_err.log"
    return 1
  fi
  return 0
}

manual_hint() {
  log ""
  log "自動導入ができませんでした。ネット接続を確認して、もう一度 bash setup.sh を実行してください（配布元の一時的な不調のこともあります）。"
  log "それでも入らない場合の最終手段は Homebrew です。Terminal.app で次の2行を実行してください（管理者パスワードを聞かれます）:"
  log '  /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"'
  log '  brew install ffmpeg'
  log "終わったら bash setup.sh --check で確認してください（Homebrew 版は HDR 変換だけ使えない旨が表示されます）。"
}

# =============================================================================
log "==== ffmpeg-kit セットアップ（$MODE / $ARCH）===="

FF="$(find_bin ffmpeg || true)"
FP="$(find_bin ffprobe || true)"
HAVE=0; PARTIAL=0
if [ -n "$FF" ] && [ -n "$FP" ]; then
  usable_ffmpeg "$FF"; rc=$?
  case $rc in
    0) HAVE=1 ;;
    3) HAVE=1; PARTIAL=1
       note "既存の ffmpeg（$FF）には HDR 変換用のフィルタ zscale がありません（Homebrew 版に多い）" ;;
    2) note "既存の ffmpeg（$FF）には必要な機能がありません:$CORE_MISSING" ;;
    1) note "ffmpeg が見つかりましたが起動できません: $FF" ;;
  esac
fi

if [ "$MODE" = "check" ]; then
  if [ $HAVE -eq 1 ] && verify "$FF" "$FP"; then
    log "ffmpeg-kit: ffmpeg=$FF ffprobe=$FP"
    exit 0
  fi
  ng "ffmpeg / ffprobe が使える状態ではありません → bash setup.sh を実行してください（パスワード不要・1〜3分）"
  exit 1
fi

if [ $HAVE -eq 1 ] && [ $PARTIAL -eq 0 ] && [ $FORCE -eq 0 ]; then
  log "FFmpeg は導入済みです（$FF）。導入はスキップして検証だけ行います。"
else
  DONE=0
  if [ $PARTIAL -eq 1 ] && [ $FORCE -eq 0 ]; then
    log "全機能そろった静的版を $DEST に入れて、こちらを優先します（既存の ffmpeg はそのまま残します）"
  fi
  if install_static; then DONE=1; fi
  if [ $DONE -eq 0 ] && [ $HAVE -eq 1 ]; then
    note "静的版は取得できませんでした。既存の ffmpeg（$FF）をそのまま使います"
    DONE=1
  fi
  if [ $DONE -eq 0 ]; then
    if install_brew; then DONE=1; fi
  fi
  if [ $DONE -eq 0 ]; then
    ng "FFmpeg を導入できませんでした"
    manual_hint
    exit 1
  fi
  FF="$(find_bin ffmpeg || true)"
  FP="$(find_bin ffprobe || true)"
  if [ -z "$FF" ] || [ -z "$FP" ]; then ng "導入後に ffmpeg / ffprobe が見つかりません"; manual_hint; exit 1; fi
  usable_ffmpeg "$FF"; rc=$?
  if [ $rc -eq 1 ] || [ $rc -eq 2 ]; then
    ng "導入した ffmpeg（$FF）に必要な機能がありません:$CORE_MISSING"
    manual_hint
    exit 1
  fi
fi

# 見つかった場所が PATH に無ければ、次回以降のために追記する
FFDIR="$(dirname "$FF")"
case ":$PATH:" in
  *":$FFDIR:"*) ;;
  *) ensure_path ;;
esac

log ""
if verify "$FF" "$FP"; then
  log ""
  log "セットアップ完了。Claude Code を再起動してから「動画編集して」と伝えてください。"
  log "ffmpeg-kit: ffmpeg=$FF ffprobe=$FP"
  exit 0
fi
ng "検証に失敗しました。bash setup.sh --force で入れ直すか、上の案内に従ってください。"
manual_hint
exit 1
````

## 【ファイル3】 `~/.claude/skills/ffmpeg-kit/references/recipes.md`

````markdown
# ffmpeg-kit レシピ集（macOS・検証済み）

すべて先頭に `export PATH="$HOME/.local/bin:/opt/homebrew/bin:/usr/local/bin:$PATH"` を付けて実行する。
`IN.mp4` は元素材、`OUT.mp4` は出力（元とは別名）。パスは必ずダブルクォートで囲む。

各レシピは単独の作例です。複数の編集を組み合わせるときはフィルターを統合し、元素材から1回で納品映像を書き出します。前のレシピで作ったH.264 / HEVCの完成MP4を次の加工へ回さないでください。音声だけの変更で `-c:v copy` する処理は映像を再エンコードしません。

共通オプション
- 静かに実行: `-hide_banner -loglevel error -stats`（下の例では省略している）
- 標準の書き出し（以下「標準書き出し」と呼ぶ）:
  `-c:v libx264 -crf 20 -preset medium -pix_fmt yuv420p -c:a aac -b:a 192k -movflags +faststart`
  （音声のサンプルレートは元のまま。複数素材でそろえる必要があるときだけ `-ar 48000` を足す）
- 高速書き出し（Apple Silicon のハードウェア）: `-c:v h264_videotoolbox -b:v 8M -pix_fmt yuv420p`（crf より画質は粗い。長尺・下書き向け）
- 映像を触らないときは `-c:v copy`、音声を触らないときは `-c:a copy` で無劣化・高速

検証環境: 2026-09-15 / macOS 26 / FFmpeg 9.0.1（martin-riedl 静的版）・6.0（GitHub 静的版）で全レシピを実行。Homebrew 版（8.1）は H4 の `zscale` フィルタを持たないため、setup.sh が静的版を入れて優先する

---

## A. 確認する

### A1 素材の情報（尺・解像度・fps・コーデック・音声・回転・HDR）
```bash
ffprobe -v error -show_entries format=duration,size,bit_rate:stream=index,codec_type,codec_name,width,height,r_frame_rate,pix_fmt,color_transfer,sample_rate,channels:stream_tags=rotate:stream_side_data=rotation -of default=nw=1 "IN.mp4"
```

### A2 尺だけ（秒）
```bash
ffprobe -v error -show_entries format=duration -of csv=p=0 "IN.mp4"
```

### A3 目視用に静止画を1枚抜く（テロップ位置の確認にも使う。抜いたら Read で開く）
```bash
ffmpeg -y -ss 3 -i "OUT.mp4" -frames:v 1 -update 1 "check_3s.png"
```

### A4 サムネイル候補を複数箇所から抽出して選ぶ

1. A1で尺を確認し、ユーザーの「後半」「完成した皿」などの指定区間を中心に時刻を選びます。指定がなければ全体の10点前後を初回の目安にし、短尺は少なくします。
2. 元動画を保ち、既存の候補を上書きしない新しい出力フォルダを用意します。次の例はすべての時刻が動画の尺内にある場合だけ使います。

```bash
mkdir -p "thumbnail-candidates"
for candidate_time in 1 3 5; do
  ffmpeg -n -loglevel error -ss "$candidate_time" -i "IN.mp4" -frames:v 1 -q:v 2 "thumbnail-candidates/frame_${candidate_time}s.jpg" || exit 1
done
```

3. 候補画像をすべて開き、ブレ・目つぶり・表情・被写体の見切れを確認します。料理の完成写真は皿に盛られた状態を優先し、工程画像しかなければ工程画像と明記します。
4. 良い場面の前後を短い間隔で追加抽出し、画像・元動画の時刻・ファイルリンク・推薦理由を添えて提示します。文字入れは別の依頼として扱います。

---

## B. 切る・つなぐ

### B1 区間を切り出す（フレーム精度・再エンコード）
```bash
ffmpeg -y -ss 00:00:05 -to 00:00:20 -i "IN.mp4" -c:v libx264 -crf 20 -preset medium -pix_fmt yuv420p -c:a aac -b:a 192k -movflags +faststart "OUT.mp4"
```

### B2 区間を切り出す（高速・無劣化。キーフレーム単位なので開始が最大1〜2秒ずれる）
```bash
ffmpeg -y -ss 00:00:05 -to 00:00:20 -i "IN.mp4" -c copy -movflags +faststart "OUT.mp4"
```

### B3 同じ仕様の動画を順につなぐ（無劣化）
解像度・fps・コーデック・音声仕様が全部同じときだけ。違うときは B4。
```bash
printf "file '%s'\n" "/絶対パス/1.mp4" "/絶対パス/2.mp4" "/絶対パス/3.mp4" > list.txt
ffmpeg -y -f concat -safe 0 -i list.txt -c copy -movflags +faststart "OUT.mp4"
```

### B4 仕様が違う動画をそろえてつなぐ（1080×1920・30fps・48kHz ステレオに統一）
```bash
ffmpeg -y -i "1.mp4" -i "2.mp4" -filter_complex "[0:v]scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=30,format=yuv420p[v0];[1:v]scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=30,format=yuv420p[v1];[0:a]aresample=48000,aformat=channel_layouts=stereo[a0];[1:a]aresample=48000,aformat=channel_layouts=stereo[a1];[v0][a0][v1][a1]concat=n=2:v=1:a=1[v][a]" -map "[v]" -map "[a]" -c:v libx264 -crf 20 -preset medium -c:a aac -b:a 192k -movflags +faststart "OUT.mp4"
```
3本以上は `[v2]` `[a2]` を同じ形で足し、`concat=n=3` にする。横長にそろえるなら 1080:1920 を 1920:1080 に。

### B5 クロスフェードでつなぐ（0.5秒）
`offset` は「1本目の尺 − フェード秒」。2本の解像度・fps は同じにします。異なる場合はB4のscale/fpsを同じフィルタグラフ内でxfadeの前に入れ、中間MP4には書き出しません。
```bash
ffmpeg -y -i "1.mp4" -i "2.mp4" -filter_complex "[0:v][1:v]xfade=transition=fade:duration=0.5:offset=5.5[v];[0:a][1:a]acrossfade=d=0.5[a]" -map "[v]" -map "[a]" -c:v libx264 -crf 20 -preset medium -pix_fmt yuv420p -c:a aac -b:a 192k -movflags +faststart "OUT.mp4"
```

### B6 無音の区間を映像ごとカットする（ジェットカット）
1) 無音を検出する（-35dB 未満が 0.6 秒以上続く区間）
```bash
ffmpeg -hide_banner -nostats -i "IN.mp4" -af "silencedetect=n=-35dB:d=0.6" -f null - 2>&1 | grep -E "silence_(start|end)"
```
2) 検出した区間から前後 0.15 秒ずつ余白を残して除外する（例: 2.0〜4.0 秒と 7.05〜9.05 秒が無音だった場合）
```bash
ffmpeg -y -i "IN.mp4" -filter_complex "[0:v]select='not(between(t,2.15,3.85))*not(between(t,7.2,8.9))',setpts=N/FRAME_RATE/TB[v];[0:a]aselect='not(between(t,2.15,3.85))*not(between(t,7.2,8.9))',asetpts=N/SR/TB[a]" -map "[v]" -map "[a]" -c:v libx264 -crf 20 -preset medium -pix_fmt yuv420p -c:a aac -b:a 192k -movflags +faststart "OUT.mp4"
```
区間が多いときは `not(between(...))` を `*` でつなげて増やす。音声だけ詰めればよいときは E6。

---

## C. サイズ・向き

### C1 横（16:9）→ 縦（9:16）中央クロップ
```bash
ffmpeg -y -i "IN.mp4" -vf "crop=ih*9/16:ih,scale=1080:1920:flags=lanczos" -c:v libx264 -crf 20 -preset medium -pix_fmt yuv420p -c:a copy -movflags +faststart "OUT.mp4"
```
被写体が中央にないときは `crop=ih*9/16:ih:x=…:y=0` で x を指定（x は 0〜iw−ih×9/16）。

### C2 横 → 縦 ぼかし背景に全体を収める
```bash
ffmpeg -y -i "IN.mp4" -filter_complex "[0:v]scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920,boxblur=20:5[bg];[0:v]scale=1080:-2[fg];[bg][fg]overlay=(W-w)/2:(H-h)/2" -c:v libx264 -crf 20 -preset medium -pix_fmt yuv420p -c:a copy -movflags +faststart "OUT.mp4"
```

### C3 正方形 1080×1080（中央クロップ）
```bash
ffmpeg -y -i "IN.mp4" -vf "crop='min(iw,ih)':'min(iw,ih)',scale=1080:1080" -c:v libx264 -crf 20 -preset medium -pix_fmt yuv420p -c:a copy -movflags +faststart "OUT.mp4"
```

### C4 黒帯で 1920×1080 に収める（レターボックス）
```bash
ffmpeg -y -i "IN.mp4" -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2" -c:v libx264 -crf 20 -preset medium -pix_fmt yuv420p -c:a copy -movflags +faststart "OUT.mp4"
```

### C5 回転
時計回り 90°: `-vf "transpose=1"` ／ 反時計回り 90°: `-vf "transpose=2"` ／ 180°: `-vf "transpose=1,transpose=1"`

### C6 fps を変える
`-vf "fps=30"`（60fps → 30fps など）

---

## D. テロップ・字幕

### D1 1行テロップ（表示時間の指定・縁取り）
```bash
ffmpeg -y -i "IN.mp4" -vf "drawtext=fontfile='/System/Library/Fonts/ヒラギノ角ゴシック W7.ttc':text='今日のレシピ':fontsize=88:fontcolor=white:borderw=6:bordercolor=black:x=(w-text_w)/2:y=h*0.78:enable='between(t,0,3)'" -c:v libx264 -crf 20 -preset medium -pix_fmt yuv420p -c:a copy -movflags +faststart "OUT.mp4"
```
位置の目安（1080×1920）: 上部 `y=h*0.12`、中央 `y=(h-text_h)/2`、下部（リールの UI に被らない）`y=h*0.75`。

### D2 複数行・記号入りの文言は textfile で渡す
`expansion=none` を付けると `%` `\` `'` `:` もそのまま文字として表示される。
```bash
printf '%s\n' "1行目の文言" "2行目の文言" > "telop.txt"
ffmpeg -y -i "IN.mp4" -vf "drawtext=fontfile='/System/Library/Fonts/ヒラギノ角ゴシック W7.ttc':textfile=telop.txt:expansion=none:fontsize=72:fontcolor=white:borderw=6:bordercolor=black:line_spacing=12:x=(w-text_w)/2:y=h*0.75" -c:v libx264 -crf 20 -preset medium -pix_fmt yuv420p -c:a copy -movflags +faststart "OUT.mp4"
```

### D3 背景帯付き（黒 60%）
D1/D2 の drawtext に `:box=1:boxcolor=black@0.6:boxborderw=24` を足す。

### D4 複数のテロップを時間で切り替える
drawtext をカンマでつなぎ、それぞれに `enable='between(t,開始,終了)'` を付ける。
```bash
-vf "drawtext=fontfile='…W7.ttc':text='まずは':fontsize=80:fontcolor=white:borderw=6:bordercolor=black:x=(w-text_w)/2:y=h*0.75:enable='between(t,0,3)',drawtext=fontfile='…W7.ttc':text='次に':fontsize=80:fontcolor=white:borderw=6:bordercolor=black:x=(w-text_w)/2:y=h*0.75:enable='between(t,3,6)'"
```

### D5 SRT 字幕の焼き込み
```bash
ffmpeg -y -i "IN.mp4" -vf "subtitles=sub.srt:fontsdir=/System/Library/Fonts:force_style='FontName=Hiragino Sans,FontSize=22,Bold=1,Outline=2,MarginV=60'" -c:v libx264 -crf 20 -preset medium -pix_fmt yuv420p -c:a copy -movflags +faststart "OUT.mp4"
```
FontSize は 384 ライン基準で動画の高さに比例して拡大される。1080×1920 なら 22〜28 が目安。SRT のファイル名に `:` や `'` を含めない。

---

## E. 音声

### E1 音声だけ抜く
```bash
ffmpeg -y -i "IN.mp4" -vn -c:a aac -b:a 192k "OUT.m4a"
ffmpeg -y -i "IN.mp4" -vn -c:a libmp3lame -b:a 192k "OUT.mp3"
```

### E2 無音にする
```bash
ffmpeg -y -i "IN.mp4" -an -c:v copy "OUT.mp4"
```

### E3 音声を差し替える（ナレーションを当てる）
```bash
ffmpeg -y -i "IN.mp4" -i "voice.m4a" -map 0:v -map 1:a -c:v copy -c:a aac -b:a 192k -shortest "OUT.mp4"
```

### E4 BGM を重ねる（ループ・音量 20%・元の音声はそのまま）
```bash
ffmpeg -y -i "IN.mp4" -stream_loop -1 -i "bgm.mp3" -filter_complex "[1:a]volume=0.2[bgm];[0:a][bgm]amix=inputs=2:duration=first:dropout_transition=2[a]" -map 0:v -map "[a]" -c:v copy -c:a aac -b:a 192k -shortest "OUT.mp4"
```

### E5 音量をそろえる（SNS 基準 −14 LUFS）
```bash
ffmpeg -y -i "IN.mp4" -af "loudnorm=I=-14:TP=-1.5:LRA=11" -c:v copy -c:a aac -b:a 192k "OUT.mp4"
```

### E6 無音を詰める（音声だけ。映像の尺は変わらないので B6 と使い分ける）
```bash
ffmpeg -y -i "IN.m4a" -af "silenceremove=stop_periods=-1:stop_duration=0.5:stop_threshold=-40dB" "OUT.m4a"
```

### E7 フェードイン・アウト（映像＋音声、各 0.5 秒。尺 6 秒の例）
```bash
ffmpeg -y -i "IN.mp4" -vf "fade=t=in:st=0:d=0.5,fade=t=out:st=5.5:d=0.5" -af "afade=t=in:st=0:d=0.5,afade=t=out:st=5.5:d=0.5" -c:v libx264 -crf 20 -preset medium -pix_fmt yuv420p -c:a aac -b:a 192k -movflags +faststart "OUT.mp4"
```

### E8 音量を上げる・下げる
```bash
ffmpeg -y -i "IN.mp4" -af "volume=1.5" -c:v copy -c:a aac -b:a 192k "OUT.mp4"
```

---

## F. 速度

### F1 1.5 倍速（atempo は 0.5〜100 の範囲）
```bash
ffmpeg -y -i "IN.mp4" -filter_complex "[0:v]setpts=PTS/1.5[v];[0:a]atempo=1.5[a]" -map "[v]" -map "[a]" -c:v libx264 -crf 20 -preset medium -pix_fmt yuv420p -c:a aac -b:a 192k -movflags +faststart "OUT.mp4"
```

### F2 0.5 倍スロー
`setpts=PTS/0.5` と `atempo=0.5` に置き換える。

---

## G. 静止画・GIF

### G1 指定秒を JPG に（サムネ用）
```bash
ffmpeg -y -ss 2 -i "IN.mp4" -frames:v 1 -q:v 2 "thumb.jpg"
```

### G2 5 秒ごとに静止画を出す（サムネ候補出し）
```bash
ffmpeg -y -i "IN.mp4" -vf "fps=1/5" -q:v 3 "thumb_%03d.jpg"
```

### G3 GIF（パレット最適化・幅 480・12fps・先頭 3 秒）
```bash
ffmpeg -y -ss 0 -t 3 -i "IN.mp4" -vf "fps=12,scale=480:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 "OUT.gif"
```

### G4 静止画 → 3 秒の動画（1080×1920・無音トラック付き）
```bash
ffmpeg -y -loop 1 -i "photo.jpg" -f lavfi -i anullsrc=r=48000:cl=stereo -t 3 -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2,format=yuv420p" -c:v libx264 -crf 20 -c:a aac -shortest -movflags +faststart "OUT.mp4"
```

---

## H. 圧縮・変換

### H1 ファイルサイズを落とす（画質を保ちつつ）
```bash
ffmpeg -y -i "IN.mp4" -c:v libx264 -crf 26 -preset slow -pix_fmt yuv420p -c:a aac -b:a 128k -movflags +faststart "OUT.mp4"
```
crf は 18（高画質）〜 30（小さい）。1 上げるとおよそ 1 割強小さくなる。

### H2 目標サイズに合わせる（例: 60 秒で 25MB 以内）
映像ビットレート ≒ (目標MB × 8000 ÷ 秒数) − 音声kbps。60 秒・25MB なら (25×8000÷60) − 128 ≒ 3200k。
```bash
ffmpeg -y -i "IN.mp4" -c:v libx264 -b:v 3200k -maxrate 3500k -bufsize 6400k -preset medium -pix_fmt yuv420p -c:a aac -b:a 128k -movflags +faststart "OUT.mp4"
```

### H3 MOV / HEVC（iPhone）→ MP4 / H.264
```bash
ffmpeg -y -i "IN.mov" -c:v libx264 -crf 20 -preset medium -pix_fmt yuv420p -c:a aac -b:a 192k -movflags +faststart "OUT.mp4"
```

### H4 iPhone の HDR 素材 → SDR（白っぽく眠くならない変換）
A1 で `color_transfer=arib-std-b67`（HLG）か `smpte2084`（PQ）が出た素材に使う。
```bash
ffmpeg -y -i "IN.mov" -vf "zscale=t=linear:npl=100,format=gbrpf32le,zscale=p=bt709,tonemap=tonemap=hable:desat=0,zscale=t=bt709:m=bt709:r=tv,format=yuv420p" -c:v libx264 -crf 20 -preset medium -c:a aac -b:a 192k -movflags +faststart "OUT.mp4"
```
色情報が `unknown` の素材（変換の途中で消えたものなど）で「no path between colorspaces」と止まるときは、先頭に `setparams=color_primaries=bt2020:color_trc=arib-std-b67:colorspace=bt2020nc,` を足して色情報を補ってから同じ式を通す（PQ なら `color_trc=smpte2084`）。

### H5 高速書き出し（Apple Silicon のハードウェアエンコード）
```bash
ffmpeg -y -i "IN.mp4" -c:v h264_videotoolbox -b:v 8M -pix_fmt yuv420p -c:a aac -b:a 192k -movflags +faststart "OUT.mp4"
```

### H6 音声ファイルの変換（m4a → mp3）
```bash
ffmpeg -y -i "IN.m4a" -c:a libmp3lame -b:a 192k "OUT.mp3"
```

---

## I. 一括処理（フォルダ内の全 MP4 に同じ処理）
```bash
export PATH="$HOME/.local/bin:/opt/homebrew/bin:/usr/local/bin:$PATH"
for f in "/フォルダ"/*.mp4; do
  ffmpeg -hide_banner -loglevel error -y -i "$f" -vf "scale=1080:-2" -c:v libx264 -crf 20 -preset medium -pix_fmt yuv420p -c:a copy -movflags +faststart "${f%.*}_edited.mp4" || echo "失敗: $f"
done
```
10 本を超えるときは、先に対象一覧を見せて確認を取る。
````

## 【ファイル4】 `~/.claude/skills/ffmpeg-kit/README.md`

````markdown
# ffmpeg-kit — Claude Code に FFmpeg を入れて動画編集を任せるキット（macOS）

Claude Code が、無料の動画処理ツール **FFmpeg** を自分で導入し（管理者パスワード不要）、
切り出し・結合・縦動画化・テロップ・字幕・無音カット・音声処理・圧縮・GIF などの編集を
チャットの指示だけで行えるようになります。朝倉駿の顧問生向けに配布しています。

## 導入（3ステップ・5分）

1. zip を解凍し、`ffmpeg-kit` フォルダを `~/.claude/skills/` に置く
   ```bash
   mkdir -p ~/.claude/skills && cp -r ffmpeg-kit ~/.claude/skills/
   ```
   （Claude Code に zip ごと渡して「このzipのスキルを導入して」でもOK）
2. セットアップを実行する（FFmpeg が無ければ自動で入ります・1〜3分・パスワード不要）
   ```bash
   bash ~/.claude/skills/ffmpeg-kit/setup.sh
   ```
   「セットアップ完了」が出れば OK。`[NG]` が出たら表示された案内に従ってください
3. Claude Code を再起動する（新しいセッションでスキルが読み込まれます）

## 使い方（例）

- 「デスクトップの 料理.mov を 15秒〜45秒で切って縦動画にして」
- 「この3本をつなげて、最初の3秒に『今日のレシピ』とテロップを入れて」
- 「無音のところをカットしてテンポよくして」
- 「音声だけ抜いて m4a にして」
- 「インスタ用に 1080×1920 で圧縮して」
- 「5秒ごとの静止画をサムネ候補として出して」
- 「この字幕ファイル（SRT）を焼き込んで」

## 仕組み・注意

- 配布元（martin-riedl.de、予備で GitHub）から署名済みの静的バイナリを取得して `~/.local/bin` に置きます。`sudo` は使いません
- すでに Homebrew の ffmpeg がある方も、テロップ・字幕・HDR 変換の機能が足りないビルドなら静的版を入れてそちらを優先します（Homebrew 側は触りません）
- ネット接続が必要（約 60MB）。費用 0円
- 元の動画は上書きしません。出力は別名（`_edited` など）で保存されます
- 対応: macOS 12 以降（Apple Silicon / Intel）。Windows は非対応
- 更新: `bash ~/.claude/skills/ffmpeg-kit/setup.sh --force`
- やめるとき: `~/.claude/skills/ffmpeg-kit` と `~/.local/bin/ffmpeg` `~/.local/bin/ffprobe` を削除し、`~/.zprofile` と `~/.zshrc` の末尾にある「# ffmpeg-kit」で始まる2行を消すだけ

## ファイル

| ファイル | 役割 |
|---|---|
| `SKILL.md` | Claude Code への指示書（毎回の手順・約束事） |
| `setup.sh` | FFmpeg の検出・導入・検証（何度実行しても安全） |
| `references/recipes.md` | 検証済みの編集レシピ集（目的別） |

## 困ったら

- `command not found: ffmpeg` → 一度 Claude Code を再起動。それでも出るなら `bash ~/.claude/skills/ffmpeg-kit/setup.sh --check`
- 自動導入に失敗する → ネット接続を確認して再実行。それでも入らなければ Terminal.app で Homebrew を入れてから `brew install ffmpeg`（コマンドは setup.sh が表示します）
- 「Killed: 9」と出る → `codesign -s - -f ~/.local/bin/ffmpeg ~/.local/bin/ffprobe` を実行してから再実行

## 2026-09-27 更新

元素材から1回で映像を書き出す手順と、失敗時に完成扱いにしない確認条件を追加しました。サムネイル候補を複数時刻から抜き、画像を見て選ぶ手順もレシピA4にあります。導入済みの方は、既存フォルダを別名で保管してからキットを更新してください。素材や制作中の設定は上書きしません。

2026-09-27 v1.1 朝倉駿
````
