なぜブラウザベースの動画処理ツールを構築したのか
ウェブ用の動画ツールを構築しようと決めたとき、従来の常識は明確でした:動画処理はサーバーで行うべきだ。ファイルをアップロードし、FFmpegを実行し、結果を返す。シンプルで実績があり、帯域幅、コスト、プライバシーによって深く制限されていました。
私たちは、もっと良い方法があるはずだと考えました。結局のところ、それはずっと私たちのブラウザの中にあったのです。
現状:ffmpeg.wasm
過去数年間、ffmpeg.wasmはブラウザ内動画処理の頼りになるソリューションでした。FFmpegをWebAssemblyにコンパイルすることで、FFmpegの全ツールキットにブラウザ内で直接アクセスできます。これは機能しますが、重大な欠点があります:
- 大きなバンドルサイズ: ffmpeg.wasmのコアは約25MBで、形式固有のコーデックを含めると30MB以上になる
- 遅い初期化: 処理を開始する前に25MBのWebAssemblyモジュールをロードする
- デフォルトでシングルスレッド: ハードウェアアクセラレーションへのアクセスがない
- メモリ制約: WebAssemblyの線形メモリ制限(4GB)が大きなファイルで問題を引き起こす
- ハードウェアデコードなし: ソフトウェアのみのデコード/エンコードで、GPUアクセラレーションが完全に欠落している
私たちのベンチマークでは、50MBのMP4動画を70%の品質で圧縮するのに、ffmpeg.wasmでは45〜60秒かかりました。悪くはないですが、素晴らしいとも言えません。
WebCodecsのアプローチ
WebCodecs APIは、比較的新しいブラウザAPIで、ブラウザのネイティブメディアコーデックに直接アクセスできます — YouTube、Netflix、その他すべてのストリーミングプラットフォームで動画再生に使用されているものと同じです。主な利点は以下の通りです:
- ハードウェアアクセラレーション: 利用可能な場合、GPUをデコードとエンコードに使用
- バンドルオーバーヘッドゼロ: WebAssemblyなし、コンパイル済みバイナリなし — ネイティブブラウザAPI
- 高速初期化: すぐに利用可能、ロード時間なし
- 完全な形式サポート: H.264、H.265、VP8、VP9、AV1 — ブラウザがサポートするものすべて
ただし、WebCodecsは低レベルです。デマルチプレックス、フレームごとのエンコード、コンテナフォーマット、その他すべてを自分で処理する必要があります。それは多くの配管作業です。
mediabunnyの登場
私たちは、WebCodecsをシンプルで人間工学に基づいたAPIでラップする軽量ライブラリ、mediabunnyを構築しました。これにより、複雑な部分が処理されます:
- 自動デマルチプレックス: コンテナ形式を検出し、ビデオ/オーディオストリームを抽出
- フレームレベル制御: 個々のフレームにアクセスして正確な編集が可能
- スマートな再エンコード: リアルタイムの進行状況を伴う設定可能な品質プリセット
- メモリ効率の良いストリーミング: フレームを一度にすべてではなく、チャンクで処理
パフォーマンス比較
| メトリック | ffmpeg.wasm | mediabunny (WebCodecs) |
|---|---|---|
| バンドルサイズ | 25-30MB | ~15KB |
| 初期化 | 3-5秒 | 即時 |
| 50MB圧縮 (70%) | 45-60秒 | 10-20秒 |
| ハードウェアアクセラレーション | ❌ | ✅ |
| メモリ使用量 (50MBファイル) | ~800MB | ~300MB |
全体的に3〜5倍高速で、メモリ使用量が劇的に少なく、バンドルオーバーヘッドはゼロです。
プライバシー:キラー機能
パフォーマンスは素晴らしいですが、ブラウザベースの処理を本当に際立たせるのはこれです:アーキテクチャによるプライバシー。
サーバーベースのツールでは、あなたのデータを他人に委ねることになります。善意のサービスであっても、サーバーは侵害されたり、召喚されたり、誤って設定されたりする可能性があります。VideosKitでは:
- ファイルはデバイスから離れることはありません — ファイルアップロード用のサーバーエンドポイントは文字通り存在しません
- クッキーなし、トラッキングなし、ファイルコンテンツに関する分析なし
- ロード後はオフラインで動作 — 飛行機内、制限されたネットワーク、どこでも動画を処理できます
- 機密コンテンツ向けにエンタープライズフレンドリー — データレジデンシーやコンプライアンスの懸念なし
開発上の課題
これを構築することは課題なしではありませんでした:
大容量ファイルの処理
ブラウザはランダムなファイルアクセスを提供しません。私たちはFile APIとストリーミングを使用して、ファイル全体をメモリにロードすることなく、動画をフレームごとに処理します。これには、慎重なバッファ管理とガベージコレクションの調整が必要でした。
クロスブラウザ互換性
WebCodecsはChrome 94+、Edge 94+、Safari 16.4+でサポートされています。Firefoxはバージョン130でサポートを追加しました。私たちは機能を検出し、サポートされていないブラウザにはメッセージを表示して適切にフォールバックします。
メモリ管理
動画フレームは大きいです — 単一の4Kフレームは非圧縮で約33MBです。4Kコンテンツでもメモリ使用量を抑えるために、フレームプーリングとストリーミングパイプラインを実装しました。
進捗報告
ユーザーはどれくらい待つ必要があるかを知る必要があります。フレーム位置に基づいて進捗を報告し、正確なリアルタイム更新を提供するコールバックシステムを構築しました。
オープンソース
VideosKitとmediabunnyはどちらもオープンソースです。コードをご覧ください:
- VideosKit: github.com/nicely-gg/video-tools
- mediabunny: github.com/nicely-gg/mediabunny
貢献、問題、フィードバックを歓迎します。
ブラウザベース動画の未来
WebCodecsはまだ進化しています。AV1エンコーディング、WebGPUを活用した処理、改良されたMediaSource Extensionsにより、ブラウザベースの動画はさらに強力になるでしょう。私たちは、可能なことの限界を押し広げることに興奮しています。
まだVideosKitを試していない方は、videoskit.ccにアクセスしてください。動画の圧縮、変換、トリミング、検査をすべてブラウザで、すべて無料で。