音声出力デバイス API

W3C 勧告候補草案

この文書の詳細
このバージョン:
https://www.w3.org/TR/2025/CRD-audio-output-20251009/
最新公開バージョン:
https://www.w3.org/TR/audio-output/
最新編集者草案:
https://w3c.github.io/mediacapture-output/
履歴:
https://www.w3.org/standards/history/audio-output/
コミット履歴
実装報告:
https://wpt.fyi/audio-output
編集者:
Guido Urdaneta (Google)
Youenn Fablet (Apple)
以前の編集者:
Justin Uberti (Google) - まで
フィードバック:
GitHub w3c/mediacapture-output (プルリクエスト, 新しい課題, 未解決の課題)
public-webrtc@w3.org 件名行を [audio-output] … メッセージのトピック … としてください (アーカイブ)
参加
メーリングリスト

概要

この文書は、Web アプリケーションがユーザーの音声出力デバイスで音声をどのようにレンダリングするかを管理できるようにする一連の JavaScript API を定義します。

この文書のステータス

このセクションでは、この 文書の公開時点におけるステータスについて説明します。現在の W3C 公開物の一覧およびこの技術報告書の最新リビジョンは、 W3C 標準および草案 索引で確認できます。

WebRTC and Device and Sensors Working Group は、この 仕様をまもなく勧告候補として公開する予定です。したがって、これはこの文書の 広範なレビューの要請です。

この文書は、Web Real-Time Communications Working Group により、 勧告トラックを使用して 勧告候補草案として公開されました。

勧告候補として公開されたことは、 W3C およびその会員による承認を意味するものではありません。勧告候補草案は、 ワーキンググループが後続の勧告候補スナップショットに含める予定である 以前の勧告候補からの変更を統合したものです。

これは草案文書であり、いつでも他の 文書によって更新、置換、または廃止される可能性があります。この文書を 進行中の作業以外のものとして引用することは適切ではありません。

この文書は、 W3C 特許 ポリシーの下で活動するグループによって作成されました。 W3C は、 そのグループの成果物に関連して行われた特許開示の公開リストを 維持しています。そのページには、 特許を開示するための手順も含まれています。実際に 認識している特許が 必須クレームを含むと 個人が考える場合、その個人は W3C 特許ポリシーのセクション 6に従って情報を開示しなければなりません。

この文書は、 2025年08月18日付 W3C プロセス文書に準拠します。

1. 導入

このセクションは非規範的です。

この提案により、JavaScript はメディア 要素の音声出力を、システムまたはユーザーエージェントのデフォルト以外の許可されたデバイスへ向けることができます。 これは、さまざまなリアルタイム通信シナリオだけでなく、 一般的なメディアアプリケーションにも役立ちます。たとえば、アプリケーションはこの API を使用して、 Bluetooth ヘッドセットやスピーカーフォンなどのデバイスへプログラムにより出力を向けることができます。

2. HTMLMediaElement 拡張

このセクションは、Audio Output Devices API が サポートされている場合の HTMLMediaElement [HTML] への追加を規定します。

HTMLMediaElement コンストラクターが呼び出されたとき、ユーザー エージェントは次の初期化ステップを追加しなければなりません(MUST)。

  1. 要素に [[SinkId]] 内部スロットを持たせ、 "" に初期化します。

WebIDLpartial interface HTMLMediaElement {
  [SecureContext] readonly attribute DOMString sinkId;
  [SecureContext] Promise<undefined> setSinkId (DOMString sinkId);
};

属性

sinkId、型は DOMString、readonly

この属性は、出力が届けられている音声デバイスの ID、 または出力がユーザーエージェントのデフォルトデバイスを通じて届けられている場合は 空文字列を含みます。空でない場合、この ID は、 enumerateDevices() から返される MediaDeviceInfo 値のいずれかの deviceId 属性と等しくなければなりません。

取得時には、 属性は [[SinkId]] スロットの値を返さなければなりません(MUST)。

メソッド

setSinkId

アプリケーションが特定の デバイスから再生出力することを許可されている場合に、音声出力がレンダリングされるべき音声デバイスの ID を設定します。

このメソッドが呼び出されたとき、ユーザーエージェントは次の ステップを実行しなければなりません。

  1. globalObject を、 現在の設定オブジェクト 関連するグローバルオブジェクトとします。

  2. documentglobalObject 関連付けられた Document とします。

  3. document 使用を許可されていない場合、識別子が "speaker-selection" である機能について、 名前が NotAllowedError である新しい DOMException で却下された promise を返します。

  4. globalObject一時的な 活性化を持たない場合、 ユーザーエージェントは、name 属性の値が InvalidStateError である DOMException オブジェクトで却下された promise を返してもよい(MAY)。

  5. element を、このメソッドが呼び出された HTMLMediaElement オブジェクトとします。

  6. sinkId をメソッドの最初の引数とします。

  7. sinkIdelement[[SinkId]] と等しい場合、 undefined で解決された promise を返します。

  8. p を新しい promise とします。

  9. 次の下位ステップを並列に実行します。

    1. sinkId が空文字列ではなく、 enumerateDevices() により提供される結果によって識別されるどの音声出力デバイスにも一致しない場合、 p を、名前が NotFoundError である新しい DOMException で却下し、 これらの下位ステップを中止します。

    2. sinkId が空文字列ではなく、かつ そのデバイスが現在のユーザーエージェントのデフォルトデバイスでないとした場合に、 アプリケーションが sinkId により識別されるデバイスを通じて 音声を再生出力することを許可されない場合、p を、 名前が NotAllowedError である新しい DOMException で却下し、 これらの下位ステップを中止します。

    3. element の基礎となる音声出力デバイスを、 sinkId によって識別される音声デバイスに切り替えます。

      注記

      この下位ステップが成功し、かつメディア 要素の paused 属性が false である場合、音声は要素の sinkId 属性によって表されるデバイスからの再生を停止しなければならず(MUST)、 sinkId によって識別されるデバイスから 再生を開始します

    4. 前の下位ステップが失敗した場合、p を、 名前が AbortError である新しい DOMException で却下し、 これらの下位ステップを中止します。

    5. 次のステップを実行するタスクをキューに入れます。

      1. element[[SinkId]]sinkId に設定します。

      2. p を解決します。

  10. p を返します。

2.1 アルゴリズム

2.1.1 シンクが利用できなくなった

メディア要素の sinkId 属性により識別される音声デバイスは、 たとえばプラグが抜かれた場合に 利用不能になることがあります。

sinkId 属性により識別される音声デバイスが 利用できなくなった場合、ユーザーエージェントは何のアクションも取ってはなりません。たとえば、その sinkId により識別されるデバイスが利用できなくなった時点で、 メディア要素の paused 属性が false である場合、再生は通常どおり継続します。 この場合、メディア要素が接続されているデバイスが利用不能であるため、 音声はレンダリングされません。

次の段落は非規範的です。

アプリケーションがデバイスの変更に 反応したい場合、アプリケーションは devicechange イベントをリッスンし、 更新されたデバイスのリストについて enumerateDevices() を照会できます。 メディア要素の sinkId 属性の値が、 返された MediaDeviceInfo 群のリスト内の deviceId 属性としてもはや存在しない場合、 そのデバイスはもはや利用できず、 アプリケーションはそれに応じて反応することを選択できます。

2.1.2 新しいシンクが利用可能

新しい音声デバイスがユーザーエージェントで利用可能になることがあります。または、 以前に利用不能になった (メディア要素の sinkId 属性により識別される)音声デバイスが、たとえば プラグが抜かれ、その後再び差し込まれた場合に、再び利用可能になることがあります。

このシナリオでは、ユーザーエージェントは次のステップを実行しなければなりません。

  1. sinkId を、新しく利用可能になった デバイスの識別子とします。

  2. sinkId 属性が sinkId と等しい各メディア要素について:

    1. メディア要素の paused 属性が false である場合、 このオブジェクトの音声を sinkId 属性によって表されるデバイスからレンダリングし始めます。

次の段落は非規範的です。

アプリケーションがデバイスの変更に 反応したい場合、アプリケーションは devicechange イベントをリッスンし、 更新された デバイスのリストについて enumerateDevices() を照会できます。

3. MediaDevices 拡張

このセクションは、Audio Output Devices API が サポートされている場合の MediaDevices への追加を規定します。

WebIDLpartial interface MediaDevices {
  Promise<MediaDeviceInfo> selectAudioOutput(optional AudioOutputOptions options = {});
};

メソッド

selectAudioOutput

特定の音声出力デバイスを選択するようユーザーに促します。

selectAudioOutput メソッドが呼び出されたとき、 ユーザーエージェントは 次のステップを実行しなければなりません(MUST)。

  1. this関連する グローバルオブジェクト一時的な 活性化を持たない場合、 name 属性の値が InvalidStateError である DOMException オブジェクトで却下された promise を返します。

  2. options をメソッドの最初の引数とします。

  3. deviceIdoptions.deviceId とします。

  4. mediaDevicesthis とします。

  5. p を新しい promise とします。

  6. 次のステップを並列に実行します。

    1. descriptor を、PermissionDescriptor とし、その name を "speaker-selection" に設定します

    2. descriptorpermission state が "denied" である場合、 p を、 name 属性の値が NotAllowedError である新しい DOMException で却下し、 これらのステップを中止します。

    3. 利用可能な音声出力デバイスについて、 ユーザーエージェントを 探査します。

    4. 音声出力デバイスが存在しない場合、p を、 name 属性の値が NotFoundError である新しい DOMException で却下し、 これらのステップを中止します。

    5. deviceId"" でない場合、次の下位ステップを実行します。

      1. deviceId が、 この閲覧セッションまたは以前の閲覧 セッションで selectAudioOutput によって以前に公開されたデバイス id と一致する場合、または この閲覧セッションまたは以前の閲覧 セッションで getUserMedia() によって以前に公開された音声入力デバイスと同じ groupId を持つ音声出力デバイスの デバイス id と一致する場合、 ユーザーエージェントは、この起源の集合に対してこの id を永続化するかどうかについての 以前の判断に基づき、次の下位ステップを実行することを決定してもよい(MAY)。

        1. device を、 利用可能であれば deviceId によって識別されるデバイスとします。

        2. device が利用可能である場合、 pdeviceId または device のために新たにローテーションされたデバイス id のいずれかで解決し、 並列ステップを中止します。

    6. descriptor とともに、 音声出力デバイスを 選択するようユーザーに促します

    7. 要求の結果が "denied" である場合、 p を、 name 属性の値が NotAllowedError である新しい DOMException で却下し、 これらのステップを中止します。

    8. selectedDevice を、ユーザーが選択した音声出力デバイスとします。

    9. deviceInfo を、 selectedDevice を表すために デバイス情報オブジェクトを作成する結果とし、 mediaDevices を用います。

    10. deviceInfo.deviceId[[explicitlyGrantedAudioOutputDevices]] に追加します。

    11. pdeviceInfo で解決します。

  7. p を返します。

selectAudioOutput の呼び出し後にデバイスが公開されたら、 それは現在の閲覧コンテキストに対して enumerateDevices() によって列挙されなければなりません(MUST)。

selectAudioOutput によって返された promise が 解決された場合、 ユーザーエージェントは、文書がただちに 再生を許可された状態で HTMLMediaElement においてメディアを再生でき、かつただちに 開始を許可された状態で AudioContext を開始できるようにしなければなりません(MUST)。 追加のユーザージェスチャーは不要です。

注記

これは、ブラウザーにおける autoplay の標準化が現在不足しているため、不正確です。

AudioOutputOptions 辞書

この辞書は、音声出力デバイスへの アクセスを取得するために使用できるオプションを記述します。

WebIDLdictionary AudioOutputOptions {
  DOMString deviceId = "";
};

辞書 AudioOutputOptions メンバー

deviceId、型は DOMString、 デフォルトは ""

この辞書メンバーの値が "" ではなく、 selectAudioOutput によって以前に公開された id、または このセッションもしくは以前のセッションで getUserMedia() によって以前に公開された音声入力デバイスと同じ groupId を持つ 音声出力デバイスのデバイス id と一致する場合、ユーザー エージェントは、現在そのデバイスが利用可能であると仮定して、 ユーザーに促すことを省略し、この id または同じデバイスのための新しくローテーションされた id で 解決することを選んでもよい(MAY)。

注記

永続化されたデバイス id をサポートするユーザーエージェントに 依存したいアプリケーションは、それらを selectAudioOutput に渡して成功させてからでなければ、 setSinkId で動作しません。 その理由は、これはフィンガープリンティング情報を 公開するためですが、デバイスが利用できない場合またはユーザーエージェントが デバイス id を尊重しないと判断した場合に、ユーザーに プロンプトを出すリスクがあります。

4. プライバシーに関する考慮事項

4.3 Permissions との統合

Audio Output Devices API は、 強力な機能であり、 name "speaker-selection" によって識別されます。

これは次の型およびアルゴリズムを定義します。

許可記述子 型

許可は、少なくとも 1 つの非デフォルトスピーカー出力デバイスへのアクセスを対象とします。

この記述子の意味は、任意の非デフォルトスピーカー 出力デバイスへのアクセスを照会するというものです。したがって、"speaker-selection" 強力な機能に対する照会が "granted" を返す場合、 クライアントは、以前に共有された deviceId 群の少なくとも 1 つを、 許可プロンプトを発生させることなく selectAudioOutput に渡せることを知ります。 また、"denied" が返される場合、音声出力デバイスに対するどの selectAudioOutput 要求も成功しないことを知ります。

ユーザーエージェントが一部の音声出力デバイスには許可が与えられ、 すべてには与えられていないと見なす場合、 照会は "granted" を返します。

ユーザーエージェントがすべての音声出力デバイスに対して許可が拒否されたと見なす場合、 照会は "denied" を返します。

4.4 Permissions Policy との統合

この仕様は、文字列 "speaker-selection" によって識別される 1 つの ポリシー制御機能を定義します。 これは "self"デフォルト 許可リスト を持ちます。

注記

documentpermissions policy は、 その文書内の任意のコンテンツが selectAudioOutput を 使用して音声出力デバイスについてユーザーに促すことを 許可されるか、または setSinkId を使用して、音声出力がレンダリングされるデバイスを、 システムデフォルト以外のユーザー許可済みデバイスへ変更することを 許可されるかを 決定します。selectAudioOutput については、 これは 選択するようユーザーに 促すアルゴリズムによって強制されます。

5. 適合性

非規範的とマークされたセクションに加え、この 仕様内のすべての作成ガイドライン、図、例、および注記は非規範的です。この仕様内のその他すべては規範的です。

この文書におけるキーワード MAY および MUST は、 ここに示すようにすべて大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174] に記述されているとおりに解釈されます。

この仕様は、単一の 製品、すなわちそれに含まれるインターフェイスを実装する user agent に適用される適合性基準を定義します。

アルゴリズムまたは特定のステップとして表現された適合性要件は、 最終結果が同等である限り、任意の方法で実装できます。(特に、 この仕様で定義されるアルゴリズムは理解しやすいことを意図しており、 高性能であることを意図していません。)

この仕様で定義される API を実装するために ECMAScript を使用する実装は、 Web IDL 仕様 [WEBIDL] で定義される ECMAScript バインディングと整合する方法でそれらを実装しなければなりません。 この仕様はその仕様および用語を使用しているためです。

6. 謝辞

次の人々は、この仕様の開発に直接貢献しました: Harald Alvestrand, Rick Byers, Dominique Hazael-Massieux(HTML5Apps プロジェクトを通じて), Philip Jägenstedt, Victoria Kirst, Shijun Sun, Martin Thomson, Chris Wilson。

A. 参考文献

A.1 規範参照

[GETUSERMEDIA]
Media Capture and Streams. Cullen Jennings; Jan-Ivar Bruaroey; Henrik Boström; youenn fablet. W3C. 2025年10月2日. CRD. URL: https://www.w3.org/TR/mediacapture-streams/
[HTML]
HTML Standard. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[permissions]
Permissions. Marcos Caceres; Mike Taylor. W3C. 2025年10月6日. W3C Working Draft. URL: https://www.w3.org/TR/permissions/
[permissions-policy]
Permissions Policy. Ian Clelland. W3C. 2025年10月6日. W3C Working Draft. URL: https://www.w3.org/TR/permissions-policy-1/
[RFC2119]
RFC における要件レベルを示すために用いる キーワード. S. Bradner. IETF. 1997年3月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
RFC 2119 キーワードにおける大文字と小文字の曖昧性. B. Leiba. IETF. 2017年5月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[WEBAUDIO]
Web Audio API. Paul Adenot; Hongchan Choi. W3C. 2021年6月17日. W3C Recommendation. URL: https://www.w3.org/TR/webaudio-1.0/
[WEBIDL]
Web IDL Standard. Edgar Chen; Timothy Gu. WHATWG. Living Standard. URL: https://webidl.spec.whatwg.org/

A.2 参考参照

[dom]
DOM Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://dom.spec.whatwg.org/