標準の MP4 を、デバイスごとに最適なコーデックで。
OS 公式ハードウェアデコーダだけで再生し、ゼロコピーでテクスチャに届ける Unity 6+ 向け動画再生ライブラリ。
Unity でゲーム内ムービーを再生しようとすると、これまでは「標準フォーマットで ffmpeg チューニングできること」「デコード経路を自分で制御できること」「コンソール機に対応できること」のどれかを諦める必要がありました。flareVideo はこの 3 つを同時に満たすことを目指した動画再生ライブラリです。
コンテナは標準の MP4 のみ。エンコードとチューニングは使い慣れた ffmpeg で完結し、再生はデバイスごとに最適なコーデック(iOS/macOS: AV1 / HEVC、Android: AV1 / VP9 / HEVC、Windows: HEVC、フォールバック: H.264)を OS 公式のハードウェアデコーダで行います。ソフトウェアデコーダは同梱しません。デコード結果は ffmpeg のリファレンス出力とバイト一致(PSNR = ∞)することを確認しています。
60 fps の画面では、1 フレームに使える時間は 16.7 ms しかありません。Pixel 5a で 4K H.264 を再生したときのメインスレッド時間を、デコード結果を CPU 経由でコピーしてテクスチャに載せる経路と、flareVideo のゼロコピーで GPU に直結する経路で比べました。予算を超えればコマ落ちになり、収まれば他の処理に時間を残せます。
Pixel 5a / Android 14、同じ 4K H.264 の MP4 を MediaCodec でデコードした実測値。1080p 以下では CPU コピーでも予算に収まることが多く、差は 4K で大きくなります。
デコーダが出したフレームは最初から GPU のメモリにあります。ゼロコピーはそれを CPU に往復させず、Metal / D3D / GLES3 · Vulkan の仕組みで Unity のテクスチャとして直接参照する方式です。
Unity でゲーム内ムービーを再生する方法はいくつかありますが、それぞれ何かを割り切っています。flareVideo は「標準の MP4 を ffmpeg で作れる」「デコード経路を確実にハードウェアに通す」「コンソール機に展開できる構造」の 3 つを同時に満たすことを目標にしています。
| 欲しいこと | OS 任せの標準再生 | 独自フォーマット変換型 | ソフトウェアデコーダ同梱型 | flareVideo |
|---|---|---|---|---|
標準の MP4 のまま使える |
○ | ✕専用形式への変換が必要 | ○ | ○ |
デコード経路を制御できる |
✕OS の判断に任せる | ○ | △CPU デコードで電池・発熱が重い | ○ |
コンソール機に展開できる |
△機種ごとの対応状況に依存 | ○ | △性能とライセンスの確認が必要 | ○アドオン分離済み・対応は検討中 |
各方式の列は一般的な傾向を整理したもので、個別の製品を評価したものではありません。
「標準フォーマット + ffmpeg ワークフロー + HW デコード + コンソール対応」を支える設計。
独自フォーマットへの変換は不要です。ビットレート・キーフレーム間隔・解像度などのチューニングは ffmpeg のワークフローがそのまま使え、生成した MP4 をそのまま再生できます。エンコード機能は持たず、再生に集中する設計です。
色とアルファを 1 枚に縦連結した MP4(上半分が色、下半分がアルファ)で、切り抜きだけでなく連続的な半透明も正しく合成できます。素材は ffmpeg の alphaextract と vstack で作れ、コーデックを問わず全プラットフォームで同じ 1 本が使えます。ピクセル数が 2 倍になるぶんハードウェアデコーダのレベル上限が効くため、再生可否は連結後の解像度で能力照会できます。
デコードは VideoToolbox(iOS/macOS)・MediaCodec(Android)・Media Foundation + DXVA(Windows)の OS 公式ハードウェアデコーダのみを使用します。ソフトウェアデコーダを同梱しないため、電池・発熱面で有利なデコード経路を確実に通ります。実際にハードウェア経路を通っているかは実行時に照会できます。
デコーダが出した NV12 フレームを CPU にコピーせず、Metal(iOS/macOS)・D3D(Windows)・GLES3 / Vulkan(Android)でそのまま Unity のテクスチャとして扱います。Pixel 5a の 4K H.264 では、CPU コピー経路のメインスレッド 20.0 ms・ドロップ約 32% が、ゼロコピーで 3.5 ms・約 1.5% まで下がりました。
MP4 内の AAC-LC 音声を AudioToolbox / MediaCodec / Media Foundation でデコードし、AudioSource から出力します。音声をマスタークロックとして映像を追従させ、提示ラグ(平均・最大)を統計として取得できます。映像のみの MP4 も正式対応です。
負荷の高い端末では遅れたフレームの表示をスキップし、大きく遅れた場合は次のキーフレームまで読み捨てて全体の同期を守ります。可変フレームレートの素材にも対応。OS 側でデコーダが失われた場合は自動で再初期化して再生を続けます。
同一内容を複数コーデックのバリアントで用意しておくと、実行時にデバイスの再生能力を照会し、最適な 1 本を自動選択できます。新しめの端末では AV1 や HEVC の効率を活かし、そうでない端末には H.264 でフォールバック——という構成をコード数行で組めます。
moov 前置(faststart)の MP4 はヘッダ読了後すぐに再生を開始でき、動画全体をメモリに展開しません。再生に必要なメモリ量は再生開始前に確定します。
コンテナ層は Unity 非依存の pure C# で、ネイティブコードが必要なのはデコーダ部分のみ。デコーダはアドオンとして本体から分離されており、NDA が必要なコンソール向けデコーダを個別に提供できる構造です(対応は検討中)。
すべての非同期 API が async/await と CancellationToken / IProgress<float> に対応。シーン遷移での中断も素直に書けます。シーク・ループ・再生速度変更、フォーマット情報と再生統計の取得、実機で状態を確認できるデバッグオーバーレイも用意しています。
ロードは「ファイルパス」「メモリ上のバイト列」「カスタムソース」の 3 系統で、StreamingAssets への平文配置に依存しません。バイト列は複製せずそのまま読み、暗号化済み配信からも渡せます。コンテナ層と再生コアは Unity 非依存の C# として分離しています。
各 OS の公式デコーダ API を通じて、そのデバイスで最も効率のよいコーデックを使います。H.264 は全プラットフォーム共通のフォールバック、VP9 は Android のみです。
| プラットフォーム | デコーダ API | 第一候補 | フォールバック |
|---|---|---|---|
iOS / macOS |
VideoToolbox | AV1(対応チップ搭載機)/ HEVC | H.264 |
Android |
MediaCodec | AV1 / VP9 / HEVC(端末能力に応じて) | H.264 |
Windows |
Media Foundation + DXVA | HEVC(HEVC ビデオ拡張機能の導入機) | H.264 |
Android の AV1 ハードウェアデコードは対応 SoC が限られるため、能力照会ではハードウェア対応とソフトウェア対応を区別し、既定ではハードウェア対応時のみ AV1 を選択します。音声は AAC-LC(ステレオまで)を各 OS のデコーダで再生します。透過動画(上下パッキング)はコーデック不問で、上記の対応範囲がそのまま適用されます。
同じ MP4 を各プラットフォームの実機で再生し、ハードウェアデコードとテクスチャ経路を確認しています。
| プラットフォーム | 検証機 | 確認したコーデック | テクスチャ経路 |
|---|---|---|---|
iOS |
iPhone 17 / iOS 26.6.1 | H.264 / HEVC / AV1(いずれもハードウェア) | Metal ゼロコピー |
macOS |
M1 Mac | H.264 / HEVC | Metal ゼロコピー |
Android |
Pixel 5a / Android 14 | H.264 / HEVC / VP9(AV1 は端末が非対応のため能力照会で除外) | GLES3 · Vulkan ゼロコピー(既定)/ CPU コピー |
Windows |
Windows 11 / Intel UHD(D3D11)・RTX 4070(D3D12) | H.264 / HEVC(DXVA) | D3D テクスチャ経路 |
Android のゼロコピーは既定で有効です。出力先の RenderTexture を接続してから再生を開始した場合に選択され、テクスチャを自前で扱う低レベル API 利用時は従来どおり CPU コピー経路になります。1080p 以下では CPU コピーでも十分な場合が多く、4K では効果が大きくなります。透過動画は Pixel 5a で 1920x2160(H.264 High Level 5.0)のハードウェアデコード再生を確認しています。
flareVideo は単体で完結した動画再生ライブラリであると同時に、マルチトラック・ストリーム再生ライブラリ flareStream の動画トラック(開発中)のコーデック層を担う設計です。コンテナ層と再生コアは Unity 非依存の C# として分離しており、MP4 以外のコンテナからもデコーダを利用できます。ゲーム内ムービーの単体再生には flareVideo を、モーション・音声・トリガーを含むカットシーンやライブ演出には flareStream を——という使い分けができます。
対応プラットフォームは iOS 15 以降 (arm64) / Android 10 (API 29) 以降 (arm64-v8a) / macOS 12 以降 (Apple Silicon のみ、Intel Mac は非対応) / Windows 10 (1809) 以降 (x64)、Unity は 6000.0 以降です。コンソール対応はアドオンとして検討中です。字幕描画・DRM の鍵管理・エンコード機能は扱わず、fMP4 / HLS / DASH・HDR・逆再生・WebGL / Linux は対象外として、MP4 のハードウェアデコード再生に集中しています。
flareOpus と同様、本体は BSD-3-Clause ライセンスで完全無料です。サードパーティのライブラリは一切同梱せず、demuxer は純 C#、デコードは OS 公式 API のみなので、追加のライセンス表記も不要です。個人・法人、売上規模を問わず、商用タイトルにもそのまま組み込めます。リポジトリはデフォルト非公開のため、利用をご希望の方は利用予定のプロジェクトと対象プラットフォームを添えて [email protected] までご連絡ください。