# vidstab 入り ffmpeg-core（自前ビルド）

このディレクトリの `ffmpeg-core.js` / `ffmpeg-core.wasm` は、**libvidstab を有効化した
シングルスレッド版**の ffmpeg.wasm コアです。Tebleny はこれを `public/ffmpeg-core/` に
コピーして自己ホスト配信し、`src/stabilizer.js` が vidstab を検出して2パス補正
（`vidstabdetect` → `vidstabtransform`）を実行します。

- **シングルスレッド**（`--disable-pthreads`／`SharedArrayBuffer` 不要）＝ iOS Safari 対応。
- `@ffmpeg/ffmpeg@0.12.x` / `@ffmpeg/util@0.12.x` と互換（ESM、`createFFmpegCore`）。
- **GPL**: `--enable-gpl` + libx264 + libvidstab を含むため GPL。配布時のライセンス表記は
  リポジトリの `.claude/docs/follow-up-tasks.md` タスクE参照。

## 構成（Tebleny 専用に最小化）

公式 `@ffmpeg/core`（約32MB）や元フォーク（約36MB）は多数のコーデック/ライブラリを
同梱するが、Tebleny が使うのは以下だけなので**不要ライブラリを削いで軽量化**している:

| 機能 | 由来 |
|---|---|
| `scale` / `unsharp` / `deshake` フィルタ | FFmpeg 内蔵（外部ライブラリ不要） |
| `vidstabdetect` / `vidstabtransform` | **libvidstab**（vid.stab v1.1.1, GPL） |
| `libx264` エンコーダ | **x264**（GPL） |
| AAC エンコーダ | FFmpeg 内蔵（外部ライブラリ不要） |
| mp4 muxer / h264・aac decoder 等 | FFmpeg 内蔵 |

同梱ライブラリ: **x264 + zlib + vidstab のみ**（x265/libvpx/opus/vorbis/libass/zimg 等は除外）。

実ビルド結果（2026-06-12）:
- `ffmpeg-core.wasm`: **約20MB**（公式 `@ffmpeg/core` の ~32MB より軽量。x264/zlib/vidstab以外を削った効果）。
- `ffmpeg-core.js`: 約107KB。
- `strings ffmpeg-core.wasm | grep -i vidstabtransform` でフィルタ実在確認済み。
- `--disable-pthreads` が含まれていること（SharedArrayBuffer 不要 = iOS Safari 動作）も確認済み。

## バージョン（再現用にピン留め）

| 項目 | 値 |
|---|---|
| ビルド元 | `WillyJL/ffmpeg.wasm-vidstab` @ `c8a75f90de089dc8ccfcabce72d2822b644fa81b` (2025-05-05) |
| Emscripten | `emscripten/emsdk:3.1.40` |
| FFmpeg | `n5.1.4` |
| vid.stab | `v1.1.1` |
| x264 | `ffmpegwasm/x264` @ `33cac6b77d5b9259c552156013a817ab23119612`（`4-cores` ブランチの固定コミット） |
| zlib | `v1.2.11` |
| ビルド最適化 | `-O3 -msimd128`（`make prd` = シングルスレッド本番ビルド） |

## 再現手順

Docker（buildx 対応、≥23.0）が必要。

```bash
# 1) ビルド元フォークを固定コミットで取得
git clone https://github.com/WillyJL/ffmpeg.wasm-vidstab.git
cd ffmpeg.wasm-vidstab
git checkout c8a75f90de089dc8ccfcabce72d2822b644fa81b

# 2) このディレクトリの Dockerfile（最小構成）で元の Dockerfile を置き換え
cp /path/to/Tebleny/vendor/ffmpeg-core-vidstab/Dockerfile ./Dockerfile

# 3) シングルスレッド本番ビルド（成果物は ./packages/core/dist/ に出力）
make prd

# 4) ESM 版コアを Tebleny の vendor/ に配置
cp packages/core/dist/esm/ffmpeg-core.js  /path/to/Tebleny/vendor/ffmpeg-core-vidstab/
cp packages/core/dist/esm/ffmpeg-core.wasm /path/to/Tebleny/vendor/ffmpeg-core-vidstab/
```

その後 Tebleny 側で `npm run build`（`prebuild` フックが `scripts/copy-ffmpeg-core.mjs`
を実行し、この vendor のコアを `public/ffmpeg-core/` にコピー）すれば反映される。

`Dockerfile`（最小構成）はこのディレクトリに同梱している（`Dockerfile` 参照）。
