🎬
Unity Library

flareVideo

標準の MP4 を、デバイスごとに最適なコーデックで。
OS 公式ハードウェアデコーダだけで再生し、ゼロコピーでテクスチャに届ける Unity 6+ 向け動画再生ライブラリ。

Screenshots

サンプルアプリ

動作確認用のサンプルアプリを iPhone で実行した画面です。画像をクリックすると拡大表示します。

テストパターン動画の再生画面

テストパターン動画を HW ゼロコピーで再生。コーデック・デコード状況・フレーム時間・メモリをオーバーレイで表示

3D 空間で傾けた板に貼った動画テクスチャ

動画テクスチャを 3D 空間の板に貼って傾けた状態でも、ゼロコピーのまま 60 fps

Concept

標準フォーマットのまま、デバイス最適なデコードを

Unity でゲーム内ムービーを再生しようとすると、これまでは「標準フォーマットで ffmpeg チューニングできること」「デコード経路を自分で制御できること」「コンソール機に対応できること」のどれかを諦める必要がありました。flareVideo はこの 3 つを同時に満たすことを目指した動画再生ライブラリです。

コンテナは標準の MP4 のみ。エンコードとチューニングは使い慣れた ffmpeg で完結し、再生はデバイスごとに最適なコーデック(iOS/macOS: AV1 / HEVC、Android: AV1 / VP9 / HEVC、Windows: HEVC、フォールバック: H.264)を OS 公式のハードウェアデコーダで行います。ソフトウェアデコーダは同梱しません。デコード結果は ffmpeg のリファレンス出力とバイト一致(PSNR = ∞)することを確認しています。

Frame Budget

1 フレームの予算に、収まるかどうか

60 fps の画面では、1 フレームに使える時間は 16.7 ms しかありません。Pixel 5a で 4K H.264 を再生したときのメインスレッド時間を、デコード結果を CPU 経由でコピーしてテクスチャに載せる経路と、flareVideo のゼロコピーで GPU に直結する経路で比べました。予算を超えればコマ落ちになり、収まれば他の処理に時間を残せます。

CPU コピー経路20.0 ms · ドロップ 約 32%
MP4→ OS の HW デコーダ→ CPU メモリへコピー→ GPU へ再アップロード→ 画面
ゼロコピー (flareVideo)3.5 ms · ドロップ 約 1.5%
MP4→ OS の HW デコーダ→ GPU テクスチャにそのまま→ 画面

デコーダが出したフレームは最初から GPU のメモリにあります。ゼロコピーはそれを CPU に往復させず、Metal / D3D / GLES3 · Vulkan の仕組みで Unity のテクスチャとして直接参照する方式です。

Trade-offs

3 つを、同時に

Unity でゲーム内ムービーを再生する方法はいくつかありますが、それぞれ何かを割り切っています。flareVideo は「標準の MP4 を ffmpeg で作れる」「デコード経路を確実にハードウェアに通す」「コンソール機に展開できる構造」の 3 つを同時に満たすことを目標にしています。

欲しいこと OS 任せの標準再生 独自フォーマット変換型 ソフトウェアデコーダ同梱型 flareVideo
標準の MP4 のまま使える
ffmpeg でチューニングした動画をそのまま再生
○ ✕専用形式への変換が必要 ○ ○
デコード経路を制御できる
ハードウェア経路を保証し、通っているか照会できる
✕OS の判断に任せる ○ △CPU デコードで電池・発熱が重い ○
コンソール機に展開できる
NDA 下のデコーダを差し替えて対応
△機種ごとの対応状況に依存 ○ △性能とライセンスの確認が必要 ○アドオン分離済み・対応は検討中

各方式の列は一般的な傾向を整理したもので、個別の製品を評価したものではありません。

Features

特徴

「標準フォーマット + ffmpeg ワークフロー + HW デコード + コンソール対応」を支える設計。

📦

コンテナは MP4 のみ

独自フォーマットへの変換は不要です。ビットレート・キーフレーム間隔・解像度などのチューニングは ffmpeg のワークフローがそのまま使え、生成した MP4 をそのまま再生できます。エンコード機能は持たず、再生に集中する設計です。

🫧

透過動画

色とアルファを 1 枚に縦連結した MP4(上半分が色、下半分がアルファ)で、切り抜きだけでなく連続的な半透明も正しく合成できます。素材は ffmpeg の alphaextract と vstack で作れ、コーデックを問わず全プラットフォームで同じ 1 本が使えます。ピクセル数が 2 倍になるぶんハードウェアデコーダのレベル上限が効くため、再生可否は連結後の解像度で能力照会できます。

⚙️

OS 公式 HW デコーダのみ

デコードは 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% まで下がりました。

🔊

音声も OS デコーダで、AV 同期は音声基準

MP4 内の AAC-LC 音声を AudioToolbox / MediaCodec / Media Foundation でデコードし、AudioSource から出力します。音声をマスタークロックとして映像を追従させ、提示ラグ(平均・最大)を統計として取得できます。映像のみの MP4 も正式対応です。

🛡️

コマ飛び許容と自動復帰

負荷の高い端末では遅れたフレームの表示をスキップし、大きく遅れた場合は次のキーフレームまで読み捨てて全体の同期を守ります。可変フレームレートの素材にも対応。OS 側でデコーダが失われた場合は自動で再初期化して再生を続けます。

🎛️

能力照会と自動選択

同一内容を複数コーデックのバリアントで用意しておくと、実行時にデバイスの再生能力を照会し、最適な 1 本を自動選択できます。新しめの端末では AV1 や HEVC の効率を活かし、そうでない端末には H.264 でフォールバック——という構成をコード数行で組めます。

▶️

プログレッシブ再生・有界メモリ

moov 前置(faststart)の MP4 はヘッダ読了後すぐに再生を開始でき、動画全体をメモリに展開しません。再生に必要なメモリ量は再生開始前に確定します。

🎮

コンソール対応を前提とした設計

コンテナ層は Unity 非依存の pure C# で、ネイティブコードが必要なのはデコーダ部分のみ。デコーダはアドオンとして本体から分離されており、NDA が必要なコンソール向けデコーダを個別に提供できる構造です(対応は検討中)。

🧵

シンプルな C# API

すべての非同期 API が async/await と CancellationToken / IProgress<float> に対応。シーン遷移での中断も素直に書けます。シーク・ループ・再生速度変更、フォーマット情報と再生統計の取得、実機で状態を確認できるデバッグオーバーレイも用意しています。

🔐

アセット保護を前提としたロード

ロードは「ファイルパス」「メモリ上のバイト列」「カスタムソース」の 3 系統で、StreamingAssets への平文配置に依存しません。バイト列は複製せずそのまま読み、暗号化済み配信からも渡せます。コンテナ層と再生コアは Unity 非依存の C# として分離しています。

Codecs

プラットフォーム別コーデック

各 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 のデコーダで再生します。透過動画(上下パッキング)はコーデック不問で、上記の対応範囲がそのまま適用されます。

On Device

実機で動いています

同じ MP4 を各プラットフォームの実機で再生し、ハードウェアデコードとテクスチャ経路を確認しています。

プラットフォーム 検証機 確認したコーデック テクスチャ経路
iOS
arm64
iPhone 17 / iOS 26.6.1 H.264 / HEVC / AV1(いずれもハードウェア) Metal ゼロコピー
macOS
Apple Silicon
M1 Mac H.264 / HEVC Metal ゼロコピー
Android
arm64-v8a
Pixel 5a / Android 14 H.264 / HEVC / VP9(AV1 は端末が非対応のため能力照会で除外) GLES3 · Vulkan ゼロコピー(既定)/ CPU コピー
Windows
x86_64
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)のハードウェアデコード再生を確認しています。

Ecosystem

flareStream の動画コーデック層としても

flareVideo は単体で完結した動画再生ライブラリであると同時に、マルチトラック・ストリーム再生ライブラリ flareStream の動画トラック(開発中)のコーデック層を担う設計です。コンテナ層と再生コアは Unity 非依存の C# として分離しており、MP4 以外のコンテナからもデコーダを利用できます。ゲーム内ムービーの単体再生には flareVideo を、モーション・音声・トリガーを含むカットシーンやライブ演出には flareStream を——という使い分けができます。

Availability

提供はお問い合わせから

対応プラットフォームは 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] までご連絡ください。