WebCodecsのデコード:キューの調整とVideoFrameの管理
WebCodecsは圧縮音声・映像を非同期に処理し、出力フレームをcallbackで返します。設定対応の確認、decoderキューのbackpressure、flush、VideoFrameの解放を説明します。
発行・訂正窓口:infostoa · 編集基準
この記事の個別の執筆者・専門査読者の情報は提供されていません。
WebCodecsは圧縮音声と映像を扱う低レベルのブラウザーcodec APIです。VideoDecoderは同期的にフレームを返すのではなく、符号化チャンクをキューに入れ、結果をoutput callbackで渡します。処理速度より速く入力を供給するとキューや出力フレームが蓄積し、メモリ使用量や遅延が増える可能性があります。対応確認、キュー観測、フレーム解放を一つの処理設計に含めます。
1. 設定前にcodec対応を確認する
アプリケーションに必要なcodec、profile、coded width・heightなどの構成を準備します。VideoDecoder.isConfigSupported()はブラウザーが構成を扱えるか確認する手段です。対応結果が得られても、すべての入力サンプルや実行条件でデコードが成功する保証ではありません。非対応の場合は別codecや、必要に応じたサーバー変換など代替経路を用意します。
対応確認後にconfigure()を呼び、EncodedVideoChunkをdecode()へ渡します。出力は非同期callbackで届き、利用可能な構成はブラウザーや端末によって異なります。decoderの状態とエラーcallbackを監視し、不正入力や構成エラーを通常の失敗経路として扱います。
2. decoderキューと入力速度
decoderは受け取ったチャンクを内部制御キューに追加します。生産側がdecoderより速くデータを供給すると未処理の作業が増え、遅延につながります。decodeQueueSizeでbacklogを推定し、キュー関連イベントを使って入力を調整できます。この値はすぐ出力されるフレーム数やシステム全体のメモリ量を示すものではありません。
リアルタイム配信で古いフレームを多く保持すると現在の再生が遅れることがあります。入力を一時停止するか、方針に応じてフレームを飛ばす判断が必要です。ただし圧縮チャンクを任意に捨てると後続フレームが参照フレームに依存してデコードできない場合があります。codecの依存関係を考慮し、キュー長と出力遅延を合わせて測定します。
3. flushとVideoFrameの明示的解放
flush()はそれ以前にキューへ入れた処理が終わるのを待つPromiseを返します。ストリーム終了やライフサイクル切り替えで使えますが、フレームごとにflushするとパイプラインを不必要に止めることがあります。入力を無制限に続けてよいという合図ではなく、decoderの状態と寿命を合わせて管理します。
output callbackに渡されたVideoFrameはアプリケーションが利用するリソースです。描画や次のencode処理に渡し、不要になったらclose()を呼んで内部リソースを解放します。高いフレームレートでcloseしないとメモリ圧迫が増える可能性があります。エラー、キャンセル、描画失敗の経路でも、所有しているフレームが残らないようにします。
4. 専門家の視点:リアルタイム遅延と資源上限
W3C仕様は対応構成確認、decoder状態、入力制御キュー、output callback、VideoFrameのclose動作を定義します。MDNはブラウザーのcodec APIとセキュリティ・対応条件を開発者向けにまとめています。WebCodecsはcodec処理を公開しますが、特定端末でのハードウェアアクセラレーションや固定遅延を保証しません。性能は入力形式、ブラウザー、端末に依存します。
試験では対象構成の対応を確認し、入力速度、decodeQueueSize、出力時刻、フレーム解放を記録します。速い入力と遅い出力、不正チャンク、構成失敗、flush中の終了も含めてください。decoderの寿命とフレーム所有権を明確にすると、キュー蓄積やリソース保持を診断しやすくなります。対象端末で支持状況と性能を確認し、必要なら低品質または代替デコード経路を準備します。