Technology & Dev

WebAssembly(Wasm)とは?ブラウザで高速処理を実現する技術

2026-04-03

WebAssembly(Wasm)はWebブラウザ上でネイティブに近い速度でプログラムを実行するためのバイナリ命令形式です。C・C++・Rustなどで書かれたコードをWebAssemblyにコンパイルし、ブラウザで実行できます。VideoAudioTuneが使用するffmpeg.wasmはWebAssembly技術の代表的な応用例です。

WebAssemblyとは

WebAssembly(Wasm)は2019年にW3Cの正式勧告となったWeb標準技術です。バイナリ形式の低レベル命令セットで、主要なブラウザ(Chrome・Firefox・Safari・Edge)でネイティブサポートされています。JavaScriptが動的型付けのインタープリター言語であるのに対し、WebAssemblyはコンパイル済みの静的型付けバイナリコードです。

WebAssemblyのコードはブラウザのJITコンパイラによって、ほぼネイティブコード(機械語)に近い速度で実行されます。JavaScriptより3〜10倍程度高速なケースが多く、特に演算集約的な処理(画像処理・音声処理・物理シミュレーション・暗号化等)で大きな性能差が出ます。

EmscriptenとCからWebAssemblyへのコンパイル

Emscriptenは、CとC++のコードをWebAssemblyにコンパイルするためのツールチェーンです。LLVMコンパイラをバックエンドとして使用し、CのポータブルなAPIをWebブラウザの環境にマッピングします。ファイルI/OはメモリFS(仮想ファイルシステム)にマッピングされ、システムコールはJavaScriptのAPIにエミュレートされます。

ffmpegはCで書かれた数十万行のコードで構成されています。ffmpeg.wasmはEmscriptenを使ってffmpegをWebAssemblyにコンパイルし、JavaScriptのAPIラッパーを添付したライブラリです。これにより、JavaScriptからffmpegの処理を呼び出すことができます。ファイルはEmscriptenの仮想ファイルシステム(MemFS)を通じて読み書きされます。

WebAssemblyのセキュリティモデル

WebAssemblyはブラウザのサンドボックス環境内で実行されます。JavaScriptと同じセキュリティモデルを持ち、ブラウザのセキュリティポリシーに従います。WebAssemblyモジュールはJavaScriptから明示的に渡された値とメモリしかアクセスできず、OSのファイルシステム・ネットワーク・デバイスへの直接アクセスは制限されています。

これはVideoAudioTuneのセキュリティ上の重要な特性です。ffmpeg.wasmが動画ファイルを処理しても、処理はブラウザのメモリ内(WebAssemblyの線形メモリ)で完結し、ユーザーのローカルファイルシステムへの無断アクセスは不可能です。ユーザーが選択して許可したファイルのみが処理対象になります。

SharedArrayBufferとマルチスレッド

WebAssemblyはSharedArrayBufferとWeb Workers(Atomics API)を使うことで、マルチスレッド処理が可能になります。ffmpeg.wasmはSharedArrayBufferが利用可能な場合はマルチスレッドモードで動作し、処理速度が向上します。SharedArrayBufferはCross-Origin-Opener-Policy(COOP)とCross-Origin-Embedder-Policy(COEP)ヘッダーが設定されているページでのみ使用できます。

SharedArrayBufferが使えない環境(iOSやCOEP未設定のページ等)では、シングルスレッドモードで動作します。シングルスレッドモードはマルチスレッドモードより処理速度が低下します。これがiOS SafariでVideoAudioTuneの処理が遅い・または動作しない原因の一つです。

WebAssemblyの今後と応用

WebAssemblyはWeb以外の環境(サーバーサイド・エッジコンピューティング等)でも注目されています。WASI(WebAssembly System Interface)はWebAssemblyをブラウザ外で動かすための標準仕様で、CloudflareワーカーやFastlyのエッジコンピューティングでも利用されています。

ブラウザでの応用例としては、ffmpeg.wasmのほかにも、OpenCV.js(コンピュータビジョン)・SQLite.wasm(インブラウザSQL)・TensorFlow.js(機械学習)などがWebAssemblyを使用しています。これらはすべて、元々ネイティブアプリ向けに書かれたC/C++コードをブラウザで高速に動作させるというWebAssemblyの強みを活かした応用例です。

まとめ

WebAssemblyはCやC++などで書かれたコードをブラウザでネイティブに近い速度で実行させる技術です。ffmpeg.wasmはWebAssemblyの代表的な応用例で、VideoAudioTuneはこれを活用してサーバーなしにブラウザ内で動画処理を実現しています。WebAssemblyはWebアプリケーションの可能性を大幅に広げる重要な技術です。