Copyright © 2025 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
この文書は、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 プロセス文書に準拠します。
このセクションは非規範的です。
この提案により、JavaScript はメディア 要素の音声出力を、システムまたはユーザーエージェントのデフォルト以外の許可されたデバイスへ向けることができます。 これは、さまざまなリアルタイム通信シナリオだけでなく、 一般的なメディアアプリケーションにも役立ちます。たとえば、アプリケーションはこの API を使用して、 Bluetooth ヘッドセットやスピーカーフォンなどのデバイスへプログラムにより出力を向けることができます。
HTMLMediaElement
拡張このセクションは、Audio Output Devices API が
サポートされている場合の HTMLMediaElement
[HTML]
への追加を規定します。
HTMLMediaElement
コンストラクターが呼び出されたとき、ユーザー
エージェントは次の初期化ステップを追加しなければなりません(MUST)。
要素に [[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 を設定します。
このメソッドが呼び出されたとき、ユーザーエージェントは次の ステップを実行しなければなりません。
globalObject を、 現在の設定オブジェクトの 関連するグローバルオブジェクトとします。
document を globalObject の
関連付けられた Document
とします。
document が
使用を許可されていない場合、識別子が
"speaker-selection"
である機能について、
名前が NotAllowedError
である新しい DOMException
で却下された promise を返します。
globalObject が一時的な
活性化を持たない場合、
ユーザーエージェントは、name
属性の値が
InvalidStateError
である
DOMException
オブジェクトで却下された promise を返してもよい(MAY)。
element を、このメソッドが呼び出された HTMLMediaElement
オブジェクトとします。
sinkId をメソッドの最初の引数とします。
sinkId が element の
[[SinkId]]
と等しい場合、
undefined で解決された promise を返します。
p を新しい promise とします。
次の下位ステップを並列に実行します。
sinkId が空文字列ではなく、
enumerateDevices()
により提供される結果によって識別されるどの音声出力デバイスにも一致しない場合、
p を、名前が
NotFoundError
である新しい
DOMException
で却下し、
これらの下位ステップを中止します。
sinkId が空文字列ではなく、かつ
そのデバイスが現在のユーザーエージェントのデフォルトデバイスでないとした場合に、
アプリケーションが sinkId により識別されるデバイスを通じて
音声を再生出力することを許可されない場合、p を、
名前が
NotAllowedError
である新しい DOMException
で却下し、
これらの下位ステップを中止します。
element の基礎となる音声出力デバイスを、 sinkId によって識別される音声デバイスに切り替えます。
前の下位ステップが失敗した場合、p を、
名前が
AbortError
である新しい DOMException
で却下し、
これらの下位ステップを中止します。
次のステップを実行するタスクをキューに入れます。
element の [[SinkId]] を
sinkId に設定します。
p を解決します。
p を返します。
新しい音声デバイスがユーザーエージェントで利用可能になることがあります。または、
以前に利用不能になった
(メディア要素の sinkId 属性により識別される)音声デバイスが、たとえば
プラグが抜かれ、その後再び差し込まれた場合に、再び利用可能になることがあります。
このシナリオでは、ユーザーエージェントは次のステップを実行しなければなりません。
sinkId を、新しく利用可能になった デバイスの識別子とします。
sinkId
属性が
sinkId と等しい各メディア要素について:
次の段落は非規範的です。
アプリケーションがデバイスの変更に
反応したい場合、アプリケーションは
devicechange イベントをリッスンし、
更新された
デバイスのリストについて
enumerateDevices()
を照会できます。
MediaDevices
拡張このセクションは、Audio Output Devices API が
サポートされている場合の MediaDevices
への追加を規定します。
WebIDLpartial interface MediaDevices {
Promise<MediaDeviceInfo> selectAudioOutput(optional AudioOutputOptions options = {});
};
selectAudioOutput特定の音声出力デバイスを選択するようユーザーに促します。
selectAudioOutput
メソッドが呼び出されたとき、
ユーザーエージェントは
次のステップを実行しなければなりません(MUST)。
this の
関連する
グローバルオブジェクトが
一時的な
活性化を持たない場合、
name
属性の値が
InvalidStateError
である
DOMException
オブジェクトで却下された
promise を返します。
options をメソッドの最初の引数とします。
deviceId を options.deviceId とします。
mediaDevices を this とします。
p を新しい promise とします。
次のステップを並列に実行します。
descriptor を、PermissionDescriptor
とし、その
name を
"speaker-selection" に設定します
descriptor の permission
state が
"denied"
である場合、
p を、
name
属性の値が
NotAllowedError
である新しい DOMException
で却下し、
これらのステップを中止します。
利用可能な音声出力デバイスについて、 ユーザーエージェントを 探査します。
音声出力デバイスが存在しない場合、p を、
name
属性の値が NotFoundError
である新しい DOMException
で却下し、
これらのステップを中止します。
deviceId が ""
でない場合、次の下位ステップを実行します。
deviceId が、
この閲覧セッションまたは以前の閲覧
セッションで
selectAudioOutput
によって以前に公開されたデバイス id と一致する場合、または
この閲覧セッションまたは以前の閲覧
セッションで getUserMedia()
によって以前に公開された音声入力デバイスと同じ groupId を持つ音声出力デバイスの
デバイス id と一致する場合、
ユーザーエージェントは、この起源の集合に対してこの id を永続化するかどうかについての
以前の判断に基づき、次の下位ステップを実行することを決定してもよい(MAY)。
device を、 利用可能であれば deviceId によって識別されるデバイスとします。
device が利用可能である場合、 p を deviceId または device のために新たにローテーションされたデバイス id のいずれかで解決し、 並列ステップを中止します。
descriptor とともに、 音声出力デバイスを 選択するようユーザーに促します。
要求の結果が "denied"
である場合、
p を、
name
属性の値が
NotAllowedError
である新しい DOMException
で却下し、
これらのステップを中止します。
selectedDevice を、ユーザーが選択した音声出力デバイスとします。
deviceInfo を、 selectedDevice を表すために デバイス情報オブジェクトを作成する結果とし、 mediaDevices を用います。
deviceInfo.deviceId
を [[explicitlyGrantedAudioOutputDevices]]
に追加します。
p を deviceInfo で解決します。
p を返します。
selectAudioOutput
の呼び出し後にデバイスが公開されたら、
それは現在の閲覧コンテキストに対して
enumerateDevices()
によって列挙されなければなりません(MUST)。
selectAudioOutput
によって返された promise が
解決された場合、
ユーザーエージェントは、文書がただちに
再生を許可された状態で
HTMLMediaElement
においてメディアを再生でき、かつただちに
開始を許可された状態で
AudioContext
を開始できるようにしなければなりません(MUST)。
追加のユーザージェスチャーは不要です。
これは、ブラウザーにおける autoplay の標準化が現在不足しているため、不正確です。
この辞書は、音声出力デバイスへの アクセスを取得するために使用できるオプションを記述します。
WebIDLdictionary AudioOutputOptions {
DOMString deviceId = "";
};
deviceId、型は DOMString、
デフォルトは
""
この辞書メンバーの値が
"" ではなく、
selectAudioOutput
によって以前に公開された id、または
このセッションもしくは以前のセッションで
getUserMedia()
によって以前に公開された音声入力デバイスと同じ groupId を持つ
音声出力デバイスのデバイス id と一致する場合、ユーザー
エージェントは、現在そのデバイスが利用可能であると仮定して、
ユーザーに促すことを省略し、この id または同じデバイスのための新しくローテーションされた id で
解決することを選んでもよい(MAY)。
永続化されたデバイス id をサポートするユーザーエージェントに
依存したいアプリケーションは、それらを
selectAudioOutput
に渡して成功させてからでなければ、
setSinkId
で動作しません。
その理由は、これはフィンガープリンティング情報を
公開するためですが、デバイスが利用できない場合またはユーザーエージェントが
デバイス id を尊重しないと判断した場合に、ユーザーに
プロンプトを出すリスクがあります。
この文書は、ユーザーの許可が与えられた場合に、 音声出力を非デフォルトデバイスへ向ける能力で Web プラットフォームを拡張します。 非デフォルト デバイスから音声を再生出力することは、ユーザーにとって予期しない振る舞いであり、 迷惑を引き起こす可能性があるため、ユーザーの許可が必要です。 たとえば、ユーザーが図書館またはその他の静かな公共の場所にいて、 システム音声が USB ヘッドセットに向けられたラップトップを使用しているとします。 彼女の期待は、ラップトップの音声がプライベートであり、 他者を妨げないことです。任意の Web アプリケーションが 任意の出力デバイスを通じて音声出力を向けられる場合、悪意のある Web サイトが ユーザーの同意なしにラップトップの外部スピーカーから大音量の音声を再生する可能性があります。
この種の迷惑なシナリオを防ぐため、ユーザーエージェントは 非デフォルト音声出力デバイスへアクセスするためにユーザーの同意を取得しなければなりません。 これにより、前述の図書館の例は防止されます。なぜなら、 アプリケーションはシステム スピーカーから音声を再生出力することを許可されないためです。
この仕様は、デフォルトの音声 出力デバイスには許可要件を追加しません。
ユーザーエージェントは、selectAudioOutput を使用して、
非デフォルト出力デバイスから音声を再生出力するためのユーザーの同意を明示的に取得できます。
実装は、getUserMedia()
許可プロンプトによる暗黙の同意もサポートしなければなりません(MUST)。音声入力
デバイスが getUserMedia()
によって許可され開かれた場合、
これは関連付けられた任意の
音声出力デバイス(すなわち、同じ groupId
を持つもの)へのアクセスも許可します。
これは、入力音声と出力音声の両方をヘッドセットまたはスピーカーフォン
デバイスを通じてルーティングしたいという一般的なケースを便利に処理します。
ページ読み込み時に、次のステップを実行します。
関連するグローバル
オブジェクト上に、
内部スロット [[explicitlyGrantedAudioOutputDevices]] を作成します。
これは、ユーザーが selectAudioOutput
を通じて明示的に許可したデバイスを保存するために使用され、
空の集合に初期化されます。
この仕様は、 カメラおよびマイク以外のデバイスに対する公開決定アルゴリズムを規定します。 このアルゴリズムは、device、microphoneList および cameraList を入力として、次のように実行されます。
document を、
現在の設定オブジェクトの
関連するグローバルオブジェクトの
関連付けられた Document
とします。
mediaDevices を、
現在の設定オブジェクトの
関連するグローバルオブジェクトの
関連付けられた MediaDevices
とします。
deviceInfo を、device を表すために デバイス情報 オブジェクトを作成する結果とし、 mediaDevices を用います。
document が
使用を許可されていない場合、識別子が "speaker-selection"
である機能について、
または deviceInfo.kind
が "audiooutput"
でない場合、
false を返します。
deviceInfo.deviceId
が [[explicitlyGrantedAudioOutputDevices]]
に含まれる場合、
true を返します。
mediaDevices 上で
マイク
情報を公開できるが true である場合、
true を返します。
false を返します。
Audio Output Devices API は、 強力な機能であり、 name "speaker-selection" によって識別されます。
これは次の型およびアルゴリズムを定義します。
許可は、少なくとも 1 つの非デフォルトスピーカー出力デバイスへのアクセスを対象とします。
この記述子の意味は、任意の非デフォルトスピーカー
出力デバイスへのアクセスを照会するというものです。したがって、"speaker-selection" 強力な機能に対する照会が
"granted"
を返す場合、
クライアントは、以前に共有された
deviceId 群の少なくとも 1 つを、
許可プロンプトを発生させることなく
selectAudioOutput
に渡せることを知ります。
また、"denied"
が返される場合、音声出力デバイスに対するどの
selectAudioOutput
要求も成功しないことを知ります。
ユーザーエージェントが一部の音声出力デバイスには許可が与えられ、
すべてには与えられていないと見なす場合、
照会は "granted"
を返します。
ユーザーエージェントがすべての音声出力デバイスに対して許可が拒否されたと見なす場合、
照会は "denied"
を返します。
この仕様は、文字列
"speaker-selection"
によって識別される 1 つの
ポリシー制御機能を定義します。
これは "self" の
デフォルト
許可リスト
を持ちます。
document の permissions
policy は、
その文書内の任意のコンテンツが
selectAudioOutput を
使用して音声出力デバイスについてユーザーに促すことを
許可されるか、または
setSinkId
を使用して、音声出力がレンダリングされるデバイスを、
システムデフォルト以外のユーザー許可済みデバイスへ変更することを
許可されるかを
決定します。selectAudioOutput については、
これは
選択するようユーザーに
促すアルゴリズムによって強制されます。
非規範的とマークされたセクションに加え、この 仕様内のすべての作成ガイドライン、図、例、および注記は非規範的です。この仕様内のその他すべては規範的です。
この文書におけるキーワード MAY および MUST は、 ここに示すようにすべて大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174] に記述されているとおりに解釈されます。
この仕様は、単一の 製品、すなわちそれに含まれるインターフェイスを実装する user agent に適用される適合性基準を定義します。
アルゴリズムまたは特定のステップとして表現された適合性要件は、 最終結果が同等である限り、任意の方法で実装できます。(特に、 この仕様で定義されるアルゴリズムは理解しやすいことを意図しており、 高性能であることを意図していません。)
この仕様で定義される API を実装するために ECMAScript を使用する実装は、 Web IDL 仕様 [WEBIDL] で定義される ECMAScript バインディングと整合する方法でそれらを実装しなければなりません。 この仕様はその仕様および用語を使用しているためです。
次の人々は、この仕様の開発に直接貢献しました: Harald Alvestrand, Rick Byers, Dominique Hazael-Massieux(HTML5Apps プロジェクトを通じて), Philip Jägenstedt, Victoria Kirst, Shijun Sun, Martin Thomson, Chris Wilson。
Referenced in:
Referenced in:
Referenced in: