メディアキャプチャとストリーム

W3C 勧告候補草案

この文書の詳細
このバージョン:
https://www.w3.org/TR/2025/CRD-mediacapture-streams-20251009/
最新の公開バージョン:
https://www.w3.org/TR/mediacapture-streams/
最新の編集者草案:
https://w3c.github.io/mediacapture-main/
履歴:
https://www.w3.org/standards/history/mediacapture-streams/
コミット履歴
実装レポート:
https://wpt.fyi/mediacapture-streams
編集者:
Cullen Jennings (Cisco)
Jan-Ivar Bruaroey (Mozilla)
Henrik Boström (Google)
Youenn Fablet (Apple)
元編集者:
Daniel C. Burnett (招待 専門家) - まで
Adam Bergkvist (Ericsson) - まで
Anant Narayanan (Mozilla) - まで
Bernard Aboba (Microsoft Corporation)
フィードバック:
GitHub w3c/mediacapture-main (プルリクエスト, 新しい issue, 未解決の issue)
public-webrtc@w3.org へ、件名を [mediacapture-streams] … メッセージのトピック … として送信してください (アーカイブ)
参加
メーリングリスト
ブラウザーサポート:
Chrome ロゴ53
Edge ロゴ12
Firefox ロゴ36
Safari ロゴ11
デスクトップ
Android Chrome ロゴ141
Android Firefox ロゴ143
Android UC ロゴ15.5
iOS Safari ロゴ11.0
Samsung Internet ロゴ6.2
モバイル
詳細情報

概要

この文書は、音声や映像を含むローカルメディアをプラットフォームから 要求できる一連の JavaScript API を定義します。

この文書のステータス

このセクションでは、この文書の公開時点における ステータスについて説明します。現在の W3C 公開文書の一覧およびこの技術報告書の最新版は、 W3C 標準および草案 インデックスにあります。

この文書は未完成です。この API は、 WHATWG で行われた予備的な作業に基づいています。

この文書が勧告案に進む前に、WebRTC Working Group は、広範なレビューから生じた 課題に対処する予定です。

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

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

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

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

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

1. はじめに

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

この文書は、マイクやビデオカメラなどのローカルマルチメディア デバイスへのアクセスを要求するための API を定義します。

この文書では、マルチメディアストリームデータが消費される場所を 制御する手段を提供し、メディアを生成するデバイスをある程度 制御できる MediaStream API も定義します。また、メディアを キャプチャおよびレンダリングできるデバイスに関する情報も公開します。

2. 適合性

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

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

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

アルゴリズムまたは特定の手順として記述される適合要件は、 最終的な結果が同等である限り、どのような方法で実装してもかまいません。(特に、 この仕様で定義されるアルゴリズムは理解しやすいことを目的としており、 高い性能を目的としたものではありません。)

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

3. 用語

ソース

ソースとは、メディアストリーム トラックの供給元となる「もの」です。ソースはメディア自体の送信元です。ソースには、 物理的なウェブカメラ、マイク、ユーザーのハードドライブ上のローカル動画または音声ファイル、 ネットワークリソース、静止画像などがあります。この 文書ではマイクおよびカメラ型ソースの使用のみを説明し、 その他の種類のソースの使用については別の文書で説明されることに注意してください。

ソースに関して事前の認可を受けていないアプリケーションには、 利用可能なソースの数、その種類、および他のデバイスとの 関係のみが提供されます。アプリケーションがソースを使用する認可を受けると、 ソースに関する追加情報が利用可能になる場合があります( 9.2.1 アクセス制御 モデルを参照)。

ソースには制約がありません — 制約を持つのはトラックです。 ソースがトラックに接続されると、そのソースは、そのトラックに存在する 制約に適合するメディアをそのトラック向けに生成しなければなりません。 複数のトラックを同じソースに接続できます。すべてのトラックが 適切なメディアを得られるようにするため、ダウンサンプリングなどの ユーザーエージェント 処理を使用してもかまいません

ソースには制約可能なプロパティがあり、それらの 能力および設定が トラック上で公開されます。制約可能なプロパティはソースによって「所有」されていますが、 ソースは複数の異なる要求に同時に対応できる場合があります。 このため、能力は同じソースを使用しているすべての(複数の)トラックに 共通ですが、設定はトラックごとに異なる場合があります(たとえば、 同じソースに結び付けられた 2 つの異なるトラックオブジェクトが能力と設定の情報を照会すると、 同じ能力が返されますが、それぞれの制約を満たすように調整された 異なる設定が返される場合があります)。

設定(ソース設定)

設定とは、ソースの制約可能なプロパティの 直近の現在値を指します。設定は常に 読み取り専用です。

低照度条件によってカメラが より低いフレームレートに切り替わる場合など、ソースの状態は動的に変化することがあります。 このような場合、影響を受けるソースに関連付けられたトラックは、 設定された制約を満たさなくなることがあります。プラットフォームは、このような 逸脱を可能な限り最小限に抑えるよう努めるべきですが、 制約を満たせない一時的または永続的な状態が存在する場合でも、 メディアの配信を継続します。

設定はソースのプロパティですが、 アプリケーションにはソースに接続されたトラックを通してのみ公開されます。 これは ConstrainablePattern インターフェイスを介して公開されます。

能力

各制約可能なプロパティには、そのプロパティが ソースでサポートされているかどうか、およびサポートされている場合は サポートされる値の範囲を記述する能力があります。設定と同様に、能力も ConstrainablePattern インターフェイスを介してアプリケーションに公開されます。

サポートされる能力の値は、この仕様で定義される 範囲および列挙型に正規化されなければなりません。

トラック上で getCapabilities() を呼び出すと、ソースに接続されたすべての トラックについて、基礎となる同じソース単位の能力が返されます。

この API は意図的に単純化されています。能力では、 異なる値間の相互作用を記述できません。たとえば、 低いフレームレートでは高解像度の動画ストリームを生成でき、 高いフレームレートではより低い解像度を生成できるカメラの能力を 正確に記述することはできません。能力は各値の 完全な範囲を記述します。制約間の相互作用は、 制約を適用しようとすることで明らかになります。

制約

制約は、アプリケーションが トラックに適切なソースを選択し、選択後に ソースの動作方法に影響を与えることのできる一般的な制御面を提供します。

制約は、ソースがトラックにメディアを提供する際に使用できる 動作モードの範囲を制限します。トラックに制約が指定されていない場合、 実装は、そのソースがサポートする能力の全範囲から自由に設定を選択できます。 実装は、適用されたすべての 制約によって課される範囲内であれば、いつでもソース設定を調整することもできます。

getUserMedia() は、 トラックに適切なソースを選択し、それを設定するために 制約を使用します。さらに、トラック上の ConstrainablePattern インターフェイスには、 後からいつでもトラックの制約を動的に変更するための API が含まれています。

初期制約を満たせない場合、トラックは getUserMedia() を使用してソースに接続されません。 ただし、トラック上の制約を満たす能力は 時間の経過とともに変化する可能性があり、制約自体も変更できます。状況が 変化して制約を満たせなくなった場合、 ConstrainablePattern インターフェイスは、 アプリケーションに通知するための適切なエラーを定義します。5. モデル: ソース、シンク、制約、および設定では、 制約がどのように相互作用するかをさらに詳しく説明します。

各制約可能なプロパティには、対応する ソース設定名および能力名に対応する名前を持つ制約が存在します。

制約は、制約構造内での位置に応じて 3 つのグループのいずれかに分類されます。グループは次のとおりです:

  • 必須制約は、すべての非高度制約のうち、 必須であるものです。
  • 任意の基本制約は、残りの 非高度制約です。
  • 高度な制約は、 advanced キーワードを使用して指定されたすべての制約です。

一般に、適用する制約が少ないほど、ユーザーエージェントは メディアストリーミング体験を最適化する柔軟性が高くなるため、 アプリケーション作成者には必須 制約を控えめに使用することが強く推奨されます。

4. MediaStream API

4.1 はじめに

MediaStream API の 2 つの主要な構成要素は、 MediaStreamTrack および MediaStream インターフェイスです。 MediaStreamTrack オブジェクトは、ユーザーエージェント内の 1 つのメディアソースから生成される単一種類のメディア、たとえばウェブカメラによって 生成される映像を表します。MediaStream は、 複数の MediaStreamTrack オブジェクトを、 記録したりメディア要素でレンダリングしたりできる 1 つの単位に グループ化するために使用されます。

MediaStream は 0 個以上の MediaStreamTrack オブジェクトを含むことができます。 MediaStream 内のすべてのトラックは、 レンダリング時に同期されることを意図しています。ただし、異なるクロックを持つソースからの トラックを同期できない可能性があるため、これは厳密な要件ではありません。異なる MediaStream オブジェクト同士は、 同期する必要はありません。

注記

意図としてはトラックを同期させることですが、状況によっては トラックが同期を失うことを許可する方がよい場合があります。特に、 トラックがリモートソースであり、リアルタイム [WEBRTC] の場合、 遅延を蓄積したり、グリッチやその他のアーティファクトのリスクを負ったりするより、 同期が失われることを許可した方がよい場合があります。実装には、 再生の同期に関する選択がもたらす影響と、それがユーザーの知覚に 与える影響を理解することが期待されます。

単一の MediaStreamTrack は、 ステレオや 5.1 オーディオ、立体視映像などの マルチチャネルコンテンツを表すことができ、各チャネルは互いに明確に定義された関係を持ちます。 チャネルに関する情報は、 [WEBAUDIO] などの他の API を通じて公開される場合がありますが、 この仕様ではチャネルへの直接アクセスは提供しません。

MediaStream オブジェクトには、オブジェクトのすべてのトラックの 入力と出力を組み合わせたものを表す入力と出力があります。 MediaStream の出力は、 オブジェクトがどのようにレンダリングされるかを制御します。たとえば、オブジェクトをファイルに記録した場合に何が保存されるか、 またはオブジェクトを video 要素で使用した場合に何が表示されるかを制御します。 単一の MediaStream オブジェクトを、 同時に複数の異なる出力に接続できます。

新しい MediaStream オブジェクトは、 MediaStream() コンストラクターを使用して、 既存のメディアストリームまたはトラックから作成できます。コンストラクターの引数は、 既存の MediaStream オブジェクトにすることができ、 その場合、指定されたストリームのすべてのトラックが新しい MediaStream オブジェクトに追加されます。または、 MediaStreamTrack オブジェクトの配列にすることもできます。後者の形式では、 異なるソースストリームからストリームを構成できます。

MediaStreamMediaStreamTrack の両方のオブジェクトはクローンできます。クローンされた MediaStream には、 元のストリームのすべてのメンバートラックのクローンが含まれます。クローンされた MediaStreamTrack には、 クローン元のインスタンスとは独立した 制約の集合があり、同じソースからのメディアに対して、 異なる コンシューマー向けに異なる制約を適用できます。MediaStream オブジェクトは、 [WEBRTC] など、 getUserMedia 以外のコンテキストでも使用されます。

MediaStream constructor は、既存のトラックから新しい ストリームを構成します。このコンストラクターは、 MediaStream 型、または MediaStreamTrack オブジェクトの配列型の任意の引数を取ります。コンストラクターが 呼び出されたとき、ユーザー エージェントは次の手順を実行しなければなりません:

  1. stream を、新しく構築された MediaStream オブジェクトとします。

  2. stream.id 属性を、新しく生成された 値に初期化します。

  3. コンストラクターの引数が存在する場合、次の 手順を実行します:

    1. 引数の型に基づいて、トラックの集合 tracks を 構築します:

    2. tracks 内の各 MediaStreamTrack track について、次の 手順を実行します:

      1. track がすでに streamトラック集合内にある場合、 track をスキップします。

      2. そうでない場合、trackstreamトラック集合に追加します。

  4. stream を返します。

MediaStream のトラックは、 トラック集合に格納されます。トラック集合は、 ストリームのトラックに対応する MediaStreamTrack オブジェクトを含まなければなりません。 集合内のトラックの相対的な順序はユーザー エージェントによって定義され、API はその順序に対していかなる要件も課しません。 集合内の特定の MediaStreamTrack オブジェクトを見つける正しい方法は、その id によって検索することです。

MediaStream の出力からデータを読み取るオブジェクトは、 MediaStream コンシューマーと呼ばれます。現在の MediaStream コンシューマーには、メディア 要素( video および audio など) [HTML]、Web リアルタイム通信 (WebRTC; RTCPeerConnection) [WEBRTC]、メディア記録 (MediaRecorder)[mediastream-recording]、画像キャプチャ (ImageCapture)[image-capture]、および Web Audio (MediaStreamAudioSourceNode) [WEBAUDIO] が含まれます。

注記

MediaStream コンシューマーは、 トラックの追加および削除を処理できなければなりません。この動作は コンシューマーごとに規定されます。

MediaStream オブジェクトは、 MediaStreamTrack のうち、まだ終了していないものを少なくとも 1 つ持つ場合、アクティブであると言います。トラックをまったく持たないか、 終了したトラックだけを持つ MediaStream は、 非アクティブです。

MediaStream オブジェクトは、 [[Kind]]"audio" であり、まだ終了していない MediaStreamTrack を少なくとも 1 つ持つ場合、 可聴であると言います。音声トラックをまったく持たないか、 終了した音声トラックだけを持つ MediaStream は、 不可聴です。

ユーザーエージェントは、たとえば外部 イベントに応答して、MediaStreamトラック集合を更新することがあります。 この仕様ではそのような事例を規定していませんが、MediaStream API を使用する他の 仕様が規定する場合があります。その一例が WebRTC 1.0 [WEBRTC] 仕様であり、 別のピアから受信した MediaStreamトラック集合は、 メディアセッションの変更によって更新される場合があります。

trackMediaStream streamトラックを追加するには、ユーザーエージェントは次の手順を実行しなければなりません:

  1. track がすでに stream'sトラック集合に 存在する場合、この手順を中止します。

  2. trackstreamトラック集合に追加します。

  3. トラックイベントを発火し、名前を addtracktrack を指定して stream に対して発火します。

trackMediaStream stream から トラックを削除するには、ユーザーエージェントは次の手順を実行しなければなりません:

  1. trackstream'sトラック集合に 存在しない場合、この手順を中止します。

  2. trackstreamトラック集合から 削除します。

  3. トラックイベントを発火し、名前を removetracktrack を指定して stream に対して発火します。

WebIDL[Exposed=Window]
interface MediaStream : EventTarget {
  constructor();
  constructor(MediaStream stream);
  constructor(sequence<MediaStreamTrack> tracks);
  readonly attribute DOMString id;
  sequence<MediaStreamTrack> getAudioTracks();
  sequence<MediaStreamTrack> getVideoTracks();
  sequence<MediaStreamTrack> getTracks();
  MediaStreamTrack? getTrackById(DOMString trackId);
  undefined addTrack(MediaStreamTrack track);
  undefined removeTrack(MediaStreamTrack track);
  MediaStream clone();
  readonly attribute boolean active;
  attribute EventHandler onaddtrack;
  attribute EventHandler onremovetrack;
};

コンストラクター

MediaStream

MediaStream コンストラクターアルゴリズムを参照

パラメーターなし。
MediaStream

MediaStream コンストラクターアルゴリズムを参照

MediaStream

MediaStream コンストラクターアルゴリズムを参照

属性

id(型: DOMString、 読み取り専用)

id 属性は、オブジェクト作成時に 初期化された値を返さなければなりません

MediaStream が 作成されたとき、ユーザー エージェントは識別子文字列を生成しなければならず、また、 ストリーム ID をどのように初期化しなければならないかを規定する特殊用途のアルゴリズムの一部として オブジェクトが作成される場合を除き、オブジェクトの id 属性をその文字列で初期化しなければなりません。 良い慣行は UUID [rfc4122] を使用することであり、 その正規形式は 36 文字です。フィンガープリンティングを避けるため、 実装は UUID を生成するとき RFC 4122 のセクション 4.4 または 4.5 の形式を使用するべきです

ストリーム ID をどのように初期化しなければならないかを規定するアルゴリズムの例として、 受信ネットワークコンポーネントを MediaStream オブジェクトに関連付けるアルゴリズムがあります。 [WEBRTC]

active(型: boolean、読み取り専用)

active 属性は、この MediaStreamアクティブである場合は true を、それ以外の場合は false を返さなければなりません

onaddtrack(型: EventHandler

このイベントハンドラーのイベント型は addtrack です。

onremovetrack(型: EventHandler

このイベントハンドラーのイベント型は removetrack です。

メソッド

getAudioTracks()

このストリーム内の音声トラックを表す MediaStreamTrack オブジェクトのシーケンスを返します。

getAudioTracks メソッドは、このストリームの トラック集合内にある MediaStreamTrack オブジェクトのうち、 [[Kind]]"audio" に等しいものすべての スナップショットを表すシーケンスを返さなければなりませんトラック集合からシーケンスへの変換は ユーザーエージェントによって定義され、 呼び出し間で順序が安定している必要はありません。

getVideoTracks()

このストリーム内の映像トラックを表す MediaStreamTrack オブジェクトのシーケンスを返します。

getVideoTracks メソッドは、このストリームの トラック集合内にある MediaStreamTrack オブジェクトのうち、 [[Kind]]"video" に等しいものすべての スナップショットを表すシーケンスを返さなければなりませんトラック集合からシーケンスへの変換は ユーザーエージェントによって定義され、 呼び出し間で順序が安定している必要はありません。

getTracks()

このストリーム内のすべてのトラックを表す MediaStreamTrack オブジェクトのシーケンスを返します。

getTracks メソッドは、 [[Kind]] に関係なく、 このストリームの トラック集合内のすべての MediaStreamTrack オブジェクトの スナップショットを表すシーケンスを返さなければなりませんトラック集合からシーケンスへの 変換はユーザー エージェントによって定義され、呼び出し間で順序が安定している必要はありません。

getTrackById()

getTrackById メソッドは、このストリームの トラック集合から、 [[Id]]trackId に等しい MediaStreamTrack オブジェクトを返すか、そのようなトラックが 存在しない場合は null を返さなければなりません

addTrack()

指定された MediaStreamTrack を、この MediaStream に追加します。

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

  1. track をメソッドの引数とし、 stream をメソッドが呼び出された MediaStream オブジェクトとします。

  2. track がすでに streamトラック集合に存在する場合、この 手順を中止します。

  3. trackstreamトラック集合追加します。

removeTrack()

指定された MediaStreamTrack オブジェクトを この MediaStream から削除します。

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

  1. track をメソッドの引数とし、 stream をメソッドが呼び出された MediaStream オブジェクトとします。

  2. trackstream'sトラック集合に存在しない場合、この手順を中止します。

  3. trackstreamトラック集合から 削除します。

clone()

指定された MediaStream と、 そのすべてのトラックをクローンします。

clone() メソッドが 呼び出されたとき、ユーザー エージェントは次の手順を実行しなければなりません:

  1. streamClone を、新しく構築された MediaStream オブジェクトとします。

  2. streamClone.MediaStream.id を、新しく 生成された値に初期化します。

  3. この MediaStream オブジェクト内の 各トラックをクローンし、 その結果を streamCloneトラック 集合に追加します。

  4. streamClone を返します。

ガベージコレクション

addtrack または removetrack イベントを発火することを想定するユーザーエージェントコードは、 別のオブジェクトからの参照によって、対象となる MediaStream オブジェクトを存続させることが期待されます。 addtrack または removetrack のイベントリスナーが存在することは、 MediaStream オブジェクトをガベージコレクションしようとする際に 考慮する必要はありません。

MediaStreamTrack オブジェクトは、 ユーザーエージェント内のメディアソースを表します。ソースの一例は、 ユーザーエージェントに接続されたデバイスです。他の仕様は、 ここで規定される動作を上書きする MediaStreamTrack のソースを定義することがあります。 複数の MediaStreamTrack オブジェクトが 同じメディアソースを表すこともできます。たとえば、 getUserMedia() を連続して 2 回呼び出した際に表示される UI で、 ユーザーが同じカメラを選択した場合などです。

MediaStreamTrack ソースは、次の プロパティを定義します:

  1. ソースは MediaStreamTrack ソース型を持ちます。 これは MediaStreamTrack または MediaStreamTrack の サブタイプのいずれかに設定されます。 デフォルトでは、MediaStreamTrack に設定されます。
  2. ソースには MediaStreamTrack ソース固有の 構築手順があり、 ソースから MediaStreamTrack を作成するときに実行されます。 この手順は、新しく作成された MediaStreamTrack を入力として取ります。デフォルトでは、 手順は空です。
  3. ソースには MediaStreamTrack ソース固有のクローン手順があり、 指定されたソースの MediaStreamTrack をクローンするときに実行されます。 この手順は、ソースおよび宛先の MediaStreamTrack を入力として取ります。デフォルトでは、 手順は空です。

MediaStreamTrack オブジェクトからのデータは、 必ずしも正規のバイナリ形式を持つとは限りません。たとえば、単に 「ユーザーのビデオカメラから現在送られてきている映像」である場合があります。これにより、 ユーザーエージェントは、ユーザーのプラットフォームに最も 適した方法でメディアを操作できます。

スクリプトは、MediaStreamTrack オブジェクトがそのソースをもう必要としないことを、 stop() メソッドで示すことができます。ソースを使用しているすべてのトラックが 停止されるか、別の手段によって終了すると、そのソースは 停止されます。ソースが getUserMedia() によって公開されたデバイスである場合、 ソースが停止されたとき、ユーザーエージェントは 次の手順を実行しなければなりません:

  1. mediaDevices を、対象の MediaDevices オブジェクトとします。

  2. deviceId を、ソースデバイスの deviceId とします。

  3. mediaDevices.[[devicesLiveMap]][deviceId] を false に設定します。

  4. デバイスの種類および deviceId に関連付けられた許可について、 mediaDevices関連する 設定オブジェクトに対する許可状態が 「granted」でない場合、 mediaDevices.[[devicesAccessibleMap]][deviceId] を false に設定します。

基礎となる sourcemediaDevicesToTieSourceTo を指定して MediaStreamTrack を作成するには、次の 手順を実行します:

  1. track を、sourceMediaStreamTrack ソース 型の新しいオブジェクトとします。

    次の内部スロットで track を初期化します:

    • [[Source]]source に初期化します。

    • [[Id]]、 新しく生成された一意の識別子文字列に初期化します。そのような識別子を 生成する方法についてのガイドラインは、 MediaStream.id 属性を参照してください。

    • [[Kind]]source が音声ソースの場合は "audio" に、 source が映像ソースの場合は "video" に初期化します。

    • [[Label]]、 ユーザーエージェントによって提供されている場合は source のラベルに、 そうでない場合は "" に初期化します。ユーザー エージェントは音声および 映像ソースにラベルを付けてもかまいません(たとえば、「Internal microphone」や「External USB Webcam」)。

    • [[ReadyState]]、 「live」に初期化します。

    • [[Enabled]]true に初期化します。

    • [[Muted]]sourceミュートされている場合は true に、 そうでない場合は false に初期化します。

    • [[Capabilities]][[Constraints]]、および [[Settings]] はすべて、 ConstrainablePattern で規定されているとおりに初期化します。

    • [[Restrictable]]false に初期化します。

  2. mediaDevicesToTieSourceTonull でない場合、 source および mediaDevicesToTieSourceTo を指定して トラックソースを MediaDevices に関連付けます

  3. track をパラメーターとして、 sourceMediaStreamTrack ソース固有の構築手順を実行します。

  4. track を返します。

track基礎となるソースを初期化するには、 source を指定して、次の手順を実行します:

  1. track.[[Source]]source に初期化します。

  2. track[[Capabilities]][[Constraints]]、および [[Settings]] を、 ConstrainablePattern で 規定されているとおりに初期化します。

source および mediaDevices を指定して、トラックソースを MediaDevices に関連付けるには、次の手順を実行します:

  1. sourcemediaDevices.[[mediaStreamTrackSources]] に追加します。

globalObject という名前のグローバルオブジェクトすべてのソースを停止するには、 ユーザーエージェントは次の手順を実行しなければなりません:

  1. 関連するグローバル オブジェクトglobalObject である各 MediaStreamTrack オブジェクト track について、 track[[ReadyState]] を 「ended」に設定します。

  2. globalObjectWindow である場合、その globalObject関連付けられた MediaDevices.[[mediaStreamTrackSources]] 内の各 source について、source停止します。

ユーザーエージェントは、次の条件で globalObjectすべてのソースを停止しなければなりません:

  1. globalObjectWindow オブジェクトであり、その関連付けられた 文書に対して文書のアンロード クリーンアップ手順が実行された場合。

  2. globalObjectWorkerGlobalScope オブジェクトであり、その closing フラグが true に設定された場合。

実装は、ソースの使用状況を追跡するために ソースごとの参照カウントを使用してもかまいませんが、その具体的な方法は この仕様の範囲外です。

トラックをクローンするには、ユーザーエージェントは 次の手順を実行しなければなりません:

  1. track を、クローン対象の MediaStreamTrack オブジェクトとします。

  2. sourcetrack[[Source]] とします。

  3. trackClone を、sourcenull を指定して MediaStreamTrack を作成した結果とします。

  4. trackClone[[ReadyState]]track[[ReadyState]] の値に設定します。

  5. trackClone[[Capabilities]] を、 track[[Capabilities]] のクローンに設定します。

  6. trackClone[[Constraints]] を、 track[[Constraints]] のクローンに設定します。

  7. trackClone[[Settings]] を、 track[[Settings]] のクローンに設定します。

  8. track および trackClone をパラメーターとして、 sourceMediaStreamTrack ソース固有のクローン手順を実行します。

  9. trackClone を返します。

4.3.1 メディアフローとライフサイクル

4.3.1.1 メディアフロー

live」状態の MediaStreamTrack の メディアフローには 2 つの側面があります: ミュート / 非ミュート、および有効 / 無効です。

ミュートは、 MediaStreamTrack への入力を指します。 MediaStreamTrack は、そのソースがミュートされているとき、 ミュートされています。 つまり、ソースは一時的にトラックへデータを提供できません。 MediaStreamTrackミュートされている間は、 ライブサンプルを利用可能にしてはなりません

ミュート状態は Web アプリケーションの制御外ですが、 アプリケーションは muted 属性を読み取り、関連する mute および unmute イベントを監視することで 観測できます。MediaStreamTrack がミュートされる理由は、そのソースによって定義されます。

カメラおよびマイクのソースについて、ミュート する理由は 実装定義です。 これにより、ユーザーエージェントは次のような状況でプライバシー 緩和策を実装できます: ユーザーがマイクの物理的なミュートボタンを押した場合、ユーザーが 内蔵カメラ付きノート PC の蓋を閉じた場合、ユーザーが オペレーティングシステムのコントロールを切り替えた場合、ユーザーが ユーザーエージェントのクロームでミュートボタンをクリックした場合、ユーザーエージェントが(ユーザーに代わって)ミュートする場合などです。

一部のオペレーティングシステムでは、たとえばモバイル OS で着信があった場合など、 より高い音声優先度を持つ別のアプリケーションがアクセスすると、 ユーザーエージェントから マイクへのアクセスが奪われることがあります。ユーザーエージェントは、 muted および それに関連するイベントを通じて、この情報を Web アプリケーションに提供するべきです

ユーザーエージェントが、カメラまたはマイクのソースに対して そのような実装定義の 変更を開始するたびに、ユーザーインタラクションタスクソースを使用して タスクをキューに入れ、トラックの ミュート状態を設定して、ユーザーが望む状態にしなければなりません

注記
これは、他の仕様で定義されたソースには適用されません。 他の仕様は、必要に応じて トラックのミュート状態を設定するための独自の手順を定義する必要があります。

トラックの ミュート状態を設定するには、 newState を指定して、ユーザーエージェントは 次の手順を実行しなければなりません:

  1. track を、対象の MediaStreamTrack とします。

  2. track.[[Muted]] がすでに newState である場合、この手順を中止します。

  3. track.[[Muted]]newState に設定します。

  4. newStatetrue の場合、 eventNamemute とし、それ以外の場合は unmute とします。

  5. track 上で eventName という名前の イベントを 発火します。

一方、有効/無効は、アプリケーションが enabled 属性を介して制御(および観測)できます。

コンシューマーにとっての結果は、次の意味では同じです。 MediaStreamTrack がミュートまたは無効(あるいはその両方)であるときは常に、 コンシューマーは情報量ゼロのコンテンツを受け取ります。これは音声では無音、 映像では黒いフレームを意味します。言い換えると、ソースからのメディアは、 MediaStreamTrack オブジェクトが非ミュートかつ有効である場合にのみ流れます。たとえば、 音声と映像についてミュートまたは無効な MediaStreamTrackだけを 含む MediaStream をソースとする video 要素は、 再生中ではありますが、無音のまま黒い映像フレームをレンダリングします。

新しく作成された MediaStreamTrack オブジェクトには、 次が適用されます。特に明記されない限り(たとえばクローン時)トラックは常に有効であり、 ミュート状態はトラック作成時点のソースの状態を反映します。

4.3.1.2 ライフサイクル

MediaStreamTrack のライフサイクルには、live と ended の 2 つの状態があります。新しく作成された MediaStreamTrack は、作成方法に応じていずれの状態にもなり得ます。たとえば、 ended 状態のトラックをクローンすると、新しい ended 状態のトラックになります。 現在の状態は、オブジェクトの readyState 属性に反映されます。

live 状態では、トラックはアクティブであり、メディア (または MediaStreamTrackミュートまたは無効である場合は情報量ゼロのコンテンツ) がコンシューマーによって使用可能です。

ソースが navigator.mediaDevices.getUserMedia() によって公開されたデバイスである場合、トラックが ミュートまたは無効になり、その結果、そのデバイスに接続されているすべてのトラックが ミュート、無効、または停止のいずれかになったとき、UA は、デバイスの deviceIddeviceId を使用して、 navigator.mediaDevices.[[devicesLiveMap]][deviceId] を false に設定してもかまいません。 ただし、このデバイスに接続され停止していないトラックが再び非ミュートまたは有効に なった時点で、UA が直ちにこれを true に戻すことが条件です。

getUserMedia() によって公開されたデバイスをソースとする 「live」で、 非ミュートかつ 有効なトラックが、 ミュートまたは無効になり、 その結果、デバイスに接続されたすべてのトラック(ユーザーエージェントが動作させるすべての ナビゲータブル にまたがる)がミュート、無効、または停止のいずれかになった場合、 UA は、十分に注意深いユーザーがその遷移を認識できる時間を確保しつつ、 3 秒以内にデバイスを解放するべきです。 UA は、デバイスをソースとする live トラックのいずれかが再び 非ミュートかつ 有効になった時点で、デバイスを再取得しようとするべきです。 ただし、そのトラックの 関連する グローバルオブジェクト関連付けられた Documentが、その時点で 表示中であることが条件です。 その時点で文書が表示中でない場合、 UA は代わりにタスクをキューに入れてトラックをミュートし、 文書が表示中になるまで、 トラックを非ミュートにするタスクをキューに入れないべきです。 デバイスの再取得に失敗した場合、UA は トラックを終了しなければなりません(UA は、デバイスが物理的に取り外された場合など、 デバイスの問題を検出した場合には、より早く終了してもかまいません)。

注記

意図は、少なくとも現在の文書がデバイスの唯一の利用者である間は、 物理的および論理的な「プライバシーインジケーター」を一致させることによって、 物理的なカメラ(およびマイク)のハードウェアライトが消灯していることで得られる プライバシー上の安心感をユーザーに与えることです。

デバイスを同時に使用する他のアプリケーションや文書が この意図を妨げる場合がありますが、それらによって ここで定められた規則が妨げられることはありません。

MediaStreamTrack オブジェクトは、トラックのソースが切断されるか 枯渇したときに終了すると言います。

同じソースを使用しているすべての MediaStreamTrack終了した場合、そのソースは 停止されます。

アプリケーションが MediaStreamTrack オブジェクトに対して stop() メソッドを呼び出した後、または MediaStreamTrackソースがトラックへのライブサンプルの生成を 永続的に終了した時点のうち、いずれか早い方の時点で、 MediaStreamTrack終了したと言います。

カメラおよびマイクのソースについて、 stop() 以外にソースが 終了する理由は、 実装定義です (たとえば、ユーザーがページに対するローカルカメラ使用許可を取り消した場合、 またはユーザーエージェントが何らかの理由でトラックに終了を指示した場合)。

MediaStreamTrack track が、 stop() メソッドが 呼び出された場合以外の何らかの理由で終了したとき、 ユーザーエージェントは、 次の手順を実行するタスクをキューに入れなければなりません:

  1. track[[ReadyState]] がすでに「ended」 である場合、この手順を中止します。

  2. track[[ReadyState]] を「ended」に設定します。

  3. track終了したことを、 track[[Source]] に通知し、 他の MediaStreamTrack オブジェクトが そのソースに依存していない限り、ソースが 停止されるようにします。

  4. オブジェクトに対して ended という名前の イベントを 発火します。

トラックの終了がユーザーの要求によるものである場合、 このイベントのイベントソースはユーザーインタラクションイベントソースです。

permissionName を指定して デバイス許可取り消しアルゴリズムを呼び出すには、 次の手順を実行します:

  1. tracks を、 現在「live」である すべての MediaStreamTrack のうち、 この種のトラックに関連付けられた許可("camera" または "microphone")が permissionName と一致するものの集合とします。

  2. tracks 内の各 track について、 トラックを終了します。

4.3.2 トラックと制約

MediaStreamTrack は、 Constrainable Pattern セクションで定義される 制約可能な オブジェクトです。 制約はトラックに設定され、ソースに影響を与える場合があります。

トラックの初期化時に Constraints が指定された場合でも、実行時に後から設定する必要がある場合でも、 ConstrainablePattern インターフェイスで 定義される API により、トラック上で現在設定されている制約の 取得および操作が可能です。

終了後も、トラックは 固有の制約可能なトラックプロパティの一覧を引き続き公開します。 この一覧には deviceIdfacingMode、および groupId が含まれます。

4.3.3 インターフェイス定義

WebIDL[Exposed=Window]
interface MediaStreamTrack : EventTarget {
  readonly attribute DOMString kind;
  readonly attribute DOMString id;
  readonly attribute DOMString label;
  attribute boolean enabled;
  readonly attribute boolean muted;
  attribute EventHandler onmute;
  attribute EventHandler onunmute;
  readonly attribute MediaStreamTrackState readyState;
  attribute EventHandler onended;
  MediaStreamTrack clone();
  undefined stop();
  MediaTrackCapabilities getCapabilities();
  MediaTrackConstraints getConstraints();
  MediaTrackSettings getSettings();
  Promise<undefined> applyConstraints(optional MediaTrackConstraints constraints = {});
};
属性
kind (型: DOMString、 読み取り専用)

kind 属性は this.[[Kind]] を 返さなければなりません

id(型: DOMString、 読み取り専用)

id 属性は this.[[Id]] を 返さなければなりません

label (型: DOMString、 読み取り専用)

label 属性は this.[[Label]] を 返さなければなりません

enabled(型: boolean

enabled 属性は、このオブジェクトの有効状態を制御します。

取得時には、 this.[[Enabled]] が 返されなければなりません。 設定時には、 this.[[Enabled]] を 新しい値に設定しなければなりません

注記

したがって、 MediaStreamTrack終了した後も、その enabled 属性は設定時に値が変化します。ただし、その新しい値によって 何かが行われることはありません。

muted (型: boolean、 読み取り専用)

muted 属性は、 トラックがミュートされているかどうかを 反映します。この属性は this.[[Muted]] を 返さなければなりません

onmute(型: EventHandler

このイベントハンドラーのイベント型は mute です。

onunmute(型: EventHandler

このイベントハンドラーのイベント型は unmute です。

readyState(型: MediaStreamTrackState、 読み取り専用)

取得時には、readyState 属性は this.[[ReadyState]] を 返さなければなりません

onended(型: EventHandler

このイベントハンドラーのイベント型は ended です。

メソッド
clone

clone() メソッドが呼び出されたとき、ユーザーエージェントは、 this を指定して トラックをクローンする処理の結果を 返さなければなりません

stop

MediaStreamTrack オブジェクトの stop() メソッドが呼び出されたとき、ユーザー エージェントは次の手順を実行しなければなりません:

  1. track を現在の MediaStreamTrack オブジェクトとします。

  2. track[[ReadyState]] が「ended」 である場合、この手順を中止します。

  3. track終了したことを、 track のソースに通知します。

    トラックの終了を通知されたソースは、他の MediaStreamTrack オブジェクトがそのソースに依存していない限り、 停止されます。

  4. track[[ReadyState]] を「ended」に設定します。

getCapabilities

この MediaStreamTrack、 すなわち制約可能な オブジェクトが表すソースの能力を返します。

このメソッドの定義については、ConstrainablePattern インターフェイスを参照してください。

このメソッドは、基礎となる デバイスについて永続的かつオリジンをまたぐ可能性の高い情報を提供するため、 デバイスのフィンガープリンティング面を増加させます。(これはフィンガープリンティングベクトルです。)

getConstraints

このメソッドの定義については、ConstrainablePattern インターフェイスを参照してください。

getSettings

MediaStreamTrack オブジェクトの MediaStreamTrack.getSettings() メソッドが呼び出されたとき、 ユーザーエージェントは 次の手順を実行しなければなりません:

  1. track を現在の MediaStreamTrack オブジェクトとします。

  2. track[[ReadyState]] が「ended」 である場合、次のサブ手順を実行します:

    1. settings を、新しい MediaTrackSettings 辞書とします。

    2. 固有の制約可能な トラックプロパティの一覧にある各 property について、 track が終了した時点でそのプロパティを持っていた場合、 対応するプロパティを、その終了時点の値とともに settings に追加します。

    3. settings を返します。

  3. ConstrainablePattern インターフェイスで 定義されているトラックの現在の設定を返します。

applyConstraints

MediaStreamTrack オブジェクトの applyConstraints() メソッドが呼び出されたとき、ユーザー エージェントは次の手順を実行しなければなりません:

  1. track を現在の MediaStreamTrack オブジェクトとします。

  2. track[[ReadyState]] が「ended」 である場合、次のサブ手順を実行します:

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

    2. pundefined解決します。

    3. p を返します。

  3. 次の条件で applyConstraints テンプレートメソッドを呼び出し、その結果を返します:

WebIDLenum MediaStreamTrackState {
  "live",
  "ended"
};
MediaStreamTrackState 列挙型の 説明
列挙値 説明
live

トラックはアクティブです(トラックの基礎となるメディアソースは、 リアルタイムでデータを提供するために ベストエフォートで試みています)。

live」 状態のトラックの出力は、 enabled 属性でオンとオフを切り替えることができます。

ended

トラックは終了しています (トラックの基礎となるメディアソースはもうデータを提供しておらず、 このトラックに今後データを提供することもありません)。 一度トラックがこの状態になると、この状態から抜けることはありません。

たとえば、 MediaStream 内の映像トラックは、 そのトラックのメディアソースとして機能する USB ウェブカメラを ユーザーが取り外したときに終了します。

4.3.4 MediaTrackSupportedConstraints

MediaTrackSupportedConstraints は、能力を制御するために ユーザーエージェントが認識する MediaStreamTrack オブジェクトの制約一覧を表します。 この辞書は関数の戻り値として使用され、操作の引数としては 決して使用されません。

将来の仕様は、型 boolean の 辞書メンバーを持つ partial dictionary を定義することによって、 MediaTrackSupportedConstraints 辞書を拡張できます。

注記

この仕様で規定される制約は、 他の仕様で別途明記されない限り、 MediaDevices.getUserMedia() によって生成された MediaStreamTrack のインスタンスにのみ適用されます。

WebIDLdictionary MediaTrackSupportedConstraints {
  boolean width = true;
  boolean height = true;
  boolean aspectRatio = true;
  boolean frameRate = true;
  boolean facingMode = true;
  boolean resizeMode = true;
  boolean sampleRate = true;
  boolean sampleSize = true;
  boolean echoCancellation = true;
  boolean autoGainControl = true;
  boolean noiseSuppression = true;
  boolean latency = true;
  boolean channelCount = true;
  boolean deviceId = true;
  boolean groupId = true;
  boolean backgroundBlur = true;
};
辞書 MediaTrackSupportedConstraints のメンバー
width(型: boolean、 デフォルト値: true
詳細は width を参照してください。
height(型: boolean、 デフォルト値: true
詳細は height を参照してください。
aspectRatio(型: boolean、 デフォルト値: true
詳細は aspectRatio を参照してください。
frameRate (型: boolean、 デフォルト値: true
詳細は frameRate を 参照してください。
facingMode(型: boolean、 デフォルト値: true
詳細は facingMode を 参照してください。
resizeMode(型: boolean、 デフォルト値: true
詳細は resizeMode を 参照してください。
sampleRate(型: boolean、 デフォルト値: true
詳細は sampleRate を 参照してください。
sampleSize(型: boolean、 デフォルト値: true
詳細は sampleSize を 参照してください。
echoCancellation(型: boolean、 デフォルト値: true
詳細は echoCancellation を参照してください。
autoGainControl(型: boolean、 デフォルト値: true
詳細は autoGainControl を 参照してください。
noiseSuppression(型: boolean、 デフォルト値: true
詳細は noiseSuppression を参照してください。
latency (型: boolean、 デフォルト値: true
詳細は latency を参照してください。
channelCount(型: boolean、 デフォルト値: true
詳細は channelCount を 参照してください。
deviceId (型: boolean、 デフォルト値: true
詳細は deviceId を参照してください。
groupId (型: boolean、 デフォルト値: true
詳細は groupId を参照してください。
backgroundBlur(型: boolean、 デフォルト値: true
詳細は backgroundBlur を参照してください。

4.3.5 MediaTrackCapabilities

MediaTrackCapabilities は、 MediaStreamTrack オブジェクトの 能力を表します。

将来の仕様は、適切な型の辞書メンバーを持つ partial dictionary を定義することで、MediaTrackCapabilities 辞書を拡張できます。

WebIDLdictionary MediaTrackCapabilities {
  ULongRange width;
  ULongRange height;
  DoubleRange aspectRatio;
  DoubleRange frameRate;
  sequence<DOMString> facingMode;
  sequence<DOMString> resizeMode;
  ULongRange sampleRate;
  ULongRange sampleSize;
  sequence<(boolean or DOMString)> echoCancellation;
  sequence<boolean> autoGainControl;
  sequence<boolean> noiseSuppression;
  DoubleRange latency;
  ULongRange channelCount;
  DOMString deviceId;
  DOMString groupId;
  sequence<boolean> backgroundBlur;
};
注記

歴史的な理由により、deviceId および groupId は、 ConstrainablePattern 内の Capabilities が期待する sequence<DOMString> ではなく、 DOMString です。

辞書 MediaTrackCapabilities のメンバー
width (型: ULongRange
詳細は width を参照してください。
height (型: ULongRange
詳細は height を参照してください。
aspectRatio(型: DoubleRange
詳細は aspectRatio を参照してください。
frameRate(型: DoubleRange
詳細は frameRate を 参照してください。
facingMode(型: sequence<DOMString>

カメラは複数の facing mode を報告できます。たとえば、 ユーザーに向けられた複数のカメラを備える高性能なテレプレゼンスシステムでは、 ユーザーの左側にあるカメラは「left」 と「user」の両方を報告できます。 詳細については facingMode を参照してください。

resizeMode(型: sequence<DOMString>

ユーザーエージェントは、 このカメラが自然に生成するより多くの解像度の選択肢を提供するために、 クロッピングおよびダウンスケーリングを使用してもかまいません。 報告されるシーケンスには、このカメラの解像度選択肢を導出するために UA が使用できるすべての手段を列挙しなければなりません。 値「none」を 含めなければならず、これは UA による クロッピングおよびダウンスケーリングを制約できることを示します。 詳細については resizeMode を参照してください。

sampleRate(型: ULongRange
詳細は sampleRate を 参照してください。
sampleSize(型: ULongRange
詳細は sampleSize を 参照してください。
echoCancellation(型: sequence<boolean>

ソースがエコーキャンセレーションを実行できない場合、単一の false だけをリスト内の要素としなければなりません。 ソースがエコーキャンセレーションを実行できる場合、true を リストに含めなければなりません。 スクリプトがこの機能を制御できる場合、リストには少なくとも truefalse の両方を含めなければなりません。 さらに、ソースがどの音声ソースをキャンセルするか制御できる場合、 EchoCancellationModeEnum enum のサポートされる値をすべて含めなければなりません。 true または false がリストに含まれる場合、 EchoCancellationModeEnum の値より前に現れなければなりません。 詳細については echoCancellation を参照してください。

autoGainControl(型: sequence<boolean>

ソースが自動ゲイン制御を実行できない場合、単一の false が報告されます。自動ゲイン制御を 無効にできない場合、単一の true が報告されます。 スクリプトがこの機能を制御できる場合、ソースは truefalse の両方を可能な値として 含むリストを報告します。詳細については autoGainControl を参照してください。

noiseSuppression(型: sequence<boolean>

ソースがノイズ抑制を実行できない場合、単一の false が報告されます。ノイズ抑制を 無効にできない場合、単一の true が報告されます。 スクリプトがこの機能を制御できる場合、ソースは truefalse の両方を可能な値として 含むリストを報告します。詳細については noiseSuppression を参照してください。

latency(型: DoubleRange
詳細は latency を参照してください。
channelCount(型: ULongRange
詳細は channelCount を 参照してください。
deviceId(型: DOMString
詳細は deviceId を参照してください。
groupId (型: DOMString
詳細は groupId を参照してください。
backgroundBlur(型: sequence<boolean>
ソースに組み込みの背景ぼかし機能がない場合、単一の false が 報告されます。背景ぼかしを無効にできない場合、単一の true が 報告されます。スクリプトがこの機能を制御できる場合、ソースは true と false の両方を可能な値として含むリストを報告します。詳細は backgroundBlur を参照してください。

4.3.6 MediaTrackConstraints

WebIDLdictionary MediaTrackConstraints : MediaTrackConstraintSet {
  sequence<MediaTrackConstraintSet> advanced;
};
辞書 MediaTrackConstraints のメンバー
advanced (型: sequence<MediaTrackConstraintSet>

この要素の定義については、制約および ConstraintSet を参照してください。

将来の仕様は、適切な型の辞書メンバーを持つ partial dictionary を定義することで、 MediaTrackConstraintSet 辞書を拡張できます。

WebIDLdictionary MediaTrackConstraintSet {
  ConstrainULong width;
  ConstrainULong height;
  ConstrainDouble aspectRatio;
  ConstrainDouble frameRate;
  ConstrainDOMString facingMode;
  ConstrainDOMString resizeMode;
  ConstrainULong sampleRate;
  ConstrainULong sampleSize;
  ConstrainBooleanOrDOMString echoCancellation;
  ConstrainBoolean autoGainControl;
  ConstrainBoolean noiseSuppression;
  ConstrainDouble latency;
  ConstrainULong channelCount;
  ConstrainDOMString deviceId;
  ConstrainDOMString groupId;
  ConstrainBoolean backgroundBlur;
};
辞書 MediaTrackConstraintSet のメンバー
width(型: ConstrainULong
詳細は width を参照してください。
height(型: ConstrainULong
詳細は height を参照してください。
aspectRatio(型: ConstrainDouble
詳細は aspectRatio を参照してください。
frameRate(型: ConstrainDouble
詳細は frameRate を 参照してください。
facingMode(型: ConstrainDOMString
詳細は facingMode を 参照してください。
resizeMode(型: ConstrainDOMString
詳細は resizeMode を 参照してください。
sampleRate(型: ConstrainULong
詳細は sampleRate を 参照してください。
sampleSize(型: ConstrainULong
詳細は sampleSize を 参照してください。
echoCancellation(型: ConstrainBooleanOrDOMString
詳細は echoCancellation を参照してください。
autoGainControl(型: ConstrainBoolean
詳細は autoGainControl を 参照してください。
noiseSuppression(型: ConstrainBoolean
詳細は noiseSuppression を参照してください。
latency(型: ConstrainDouble
詳細は latency を参照してください。
channelCount(型: ConstrainULong
詳細は channelCount を 参照してください。
deviceId(型: ConstrainDOMString
詳細は deviceId を参照してください。
groupId(型: ConstrainDOMString
詳細は groupId を参照してください。
backgroundBlur(型: ConstrainBoolean
詳細は backgroundBlur を参照してください。

4.3.7 MediaTrackSettings

MediaTrackSettings は、MediaStreamTrack オブジェクトの 設定を表します。

将来の仕様は、適切な型の辞書メンバーを持つ partial dictionary を定義することで MediaTrackSettings 辞書を 拡張できます。

WebIDLdictionary MediaTrackSettings {
  unsigned long width;
  unsigned long height;
  double aspectRatio;
  double frameRate;
  DOMString facingMode;
  DOMString resizeMode;
  unsigned long sampleRate;
  unsigned long sampleSize;
  (boolean or DOMString) echoCancellation;
  boolean autoGainControl;
  boolean noiseSuppression;
  double latency;
  unsigned long channelCount;
  DOMString deviceId;
  DOMString groupId;
  boolean backgroundBlur;
};
辞書 MediaTrackSettings のメンバー
width(型: unsigned long
詳細は width を参照してください。
height(型: unsigned long
詳細は height を参照してください。
aspectRatio(型: double
詳細は aspectRatio を参照してください。
frameRate (型: double
詳細は frameRate を 参照してください。
facingMode(型: DOMString
詳細は facingMode を 参照してください。
resizeMode(型: DOMString
詳細は resizeMode を 参照してください。
sampleRate(型: unsigned long
詳細は sampleRate を 参照してください。
sampleSize(型: unsigned long
詳細は sampleSize を 参照してください。
echoCancellation(型: boolean または DOMString
詳細は echoCancellation を参照してください。
autoGainControl(型: boolean
詳細は autoGainControl を 参照してください。
noiseSuppression(型: boolean
詳細は noiseSuppression を参照してください。
latency(型: double
詳細は latency を参照してください。
channelCount(型: unsigned long
詳細は channelCount を 参照してください。
deviceId(型: DOMString
詳細は deviceId を参照してください。
groupId (型: DOMString
詳細は groupId を参照してください。
backgroundBlur(型: boolean、 デフォルト値: true
詳細は backgroundBlur を参照してください。

4.3.8 制約可能なプロパティ

MediaStreamTrack の制約可能なプロパティの初期セットの名前を 以下に定義します。

次の制約可能なプロパティは、映像と音声の両方の MediaStreamTrack オブジェクトに適用されるものとして定義されます:

プロパティ名 注記
deviceId DOMString MediaStreamTrack のコンテンツを 生成するデバイスの識別子です。これは MediaDeviceInfo.deviceId の定義に 適合します。このプロパティの設定は、 MediaStreamTrack に接続された ソースによって一意に決定されることに注意してください。特に、 getCapabilities() は deviceId について 単一の値のみを返します。したがって、このプロパティは getUserMedia() による初期メディア選択に使用できます。 ただし、異なる値を 設定しようとすると充足不能な ConstraintSet になるため、 applyConstraints() による後続のメディア制御には役立ちません。 長さ 0 の文字列を deviceId 値の制約として getUserMedia() で使用した場合、その制約は指定されていないものとして 解釈してもかまいません
groupId DOMString MediaStreamTrack のコンテンツを 生成するデバイスの、文書内で一意なグループ 識別子です。 これは MediaDeviceInfo.groupId の定義に 適合します。このプロパティの設定は、 MediaStreamTrack に接続された ソースによって一意に決定されることに注意してください。特に、 getCapabilities() は groupId について 単一の値のみを返します。このプロパティはブラウジングセッション間で 安定しないため、getUserMedia() による初期メディア選択での有用性は 限られています。また、異なる値を 設定しようとすると充足不能な ConstraintSet になるため、 applyConstraints() による後続のメディア制御にも役立ちません。

次の制約可能なプロパティは、映像の MediaStreamTrack オブジェクトにのみ適用されるものとして定義されます:

プロパティ名 注記
width unsigned long ピクセル単位の幅です。能力として、その有効な 範囲は、映像ソースの事前設定された幅の値を包含し、 min は 1 に等しく、max は最大の 幅に等しくなるべきです。ユーザーエージェントは、 min の幅範囲値からネイティブ解像度の幅までの任意の値への ダウンサンプリングをサポートしなければなりません
height unsigned long ピクセル単位の高さです。能力として、その有効な 範囲は、映像ソースの事前設定された高さの値を包含し、 min は 1 に等しく、max は最大の 高さに等しくなるべきです。ユーザーエージェントは、 min の高さ範囲値からネイティブ解像度の高さまでの任意の値への ダウンサンプリングをサポートしなければなりません
frameRate double

フレームレート(1 秒あたりのフレーム数)です。 映像ソースの事前設定からフレームレートを決定できる場合、能力として、 その有効な範囲は映像ソースの事前設定されたフレームレート値を包含し、 min は 0 に等しく、max は最大のフレームレートに等しくなるべきです。 ユーザーエージェントは、 ネイティブ解像度のフレームレートを 整数間引きして得られるフレームレートをサポートしなければなりません。 フレームレートを決定できない場合(たとえば、ソースが ネイティブにフレームレートを提供しない場合、またはソースストリームから フレームレートを決定できない場合)、能力値は ユーザーエージェントの vsync 表示レートを 参照しなければなりません

設定として、この値は構成されたフレームレートを表します。 間引きが使用される場合、これはネイティブ フレームレートではなく、その間引き後の値です。たとえば、間引きによって 設定が 1 秒あたり 25 フレームであり、カメラのネイティブフレームレートが 1 秒あたり 30 フレームであるものの、照明条件によって実際には 1 秒あたり 20 フレームしか得られない場合でも、 frameRate は設定値である 1 秒あたり 25 フレームを報告します。

aspectRatio double 正確なアスペクト比(ピクセル単位の幅をピクセル単位の高さで 除算し、小数第 10 位に丸めた double として 表現した値)、またはアスペクト比の範囲です。
facingMode DOMString この文字列は、 VideoFacingModeEnum の メンバーのいずれかです。各メンバーは、ユーザーの視点から見た カメラが向くことのできる方向を表します。 getConstraints は、この列挙型に含まれない文字列について、 必ずしもまったく同じ文字列を返すとは限らないことに注意してください。これは、 このプロパティに将来のバージョンの WebIDL enum を使用できる可能性を維持するためです。
resizeMode DOMString この文字列は、 VideoResizeModeEnum の メンバーのいずれかです。各メンバーは、 UA が解像度を導出するために使用できる手段を表します。 言い換えると、UA がカメラ出力に対して クロッピングおよびダウンスケーリングを使用できるかどうかを表します。

UA は、"none" が使用されている場合に、 ネイティブ解像度を模倣するようダウンスケーリング、アップスケーリング、および/または クロッピングすることでカメラの同時使用を隠蔽してもかまいませんが、 カメラが ユーザー エージェント外の別のアプリケーションで使用されている場合に限ります。(これはフィンガープリンティングベクトルです。)

getConstraints は、この列挙型に含まれない文字列について、 必ずしもまったく同じ文字列を返すとは限らないことに注意してください。これは、 このプロパティに将来のバージョンの WebIDL enum を使用できる可能性を維持するためです。
backgroundBlur boolean 一部のプラットフォームまたはユーザーエージェントは、特に カメラの映像ストリームについて、映像フレームの背景ぼかしを 組み込みでサポートしている場合があります。Web アプリケーションは、 ソースレベルで背景ぼかしが適用されることを制御したい場合や、 少なくともそのことを認識したい場合があります。これにより、たとえば Web アプリケーションは UI を更新したり、自身では背景ぼかしを 適用しないようにしたりできます。

継続的な環境要因に応じて、結果として得られるキャプチャ映像の X 軸と Y 軸を自動的に入れ替えることが望ましい場合があるシステムでは、 widthheight、および aspectRatio の制約と能力は、すべてのアルゴリズムにおいて影響を受けず、 主方向でのみ考慮されなければなりません。 ただし、 getSettings() アルゴリズムでは例外として、これらの 制約可能なプロパティの設定は、任意の時点で返されるキャプチャ映像の 寸法と一致させるために必要であれば入れ替えられなければなりません

結果として得られるキャプチャ映像の X 軸と Y 軸の入れ替えをサポートするシステムの 主 方向は、その特定のシステムについてユーザー エージェントによって定義されます。

注記

横向きモードと縦向きモードの自動切り替えをサポートするシステムでは、 ユーザーエージェントは、 横向きモードを 主方向とすることが推奨されます。

WebIDLenum VideoFacingModeEnum {
  "user",
  "environment",
  "left",
  "right"
};
VideoFacingModeEnum 列挙型の 説明
列挙値 説明
user

ソースはユーザーの方向を向いています(自分自身を映す カメラ)。

environment

ソースはユーザーとは反対の方向を向いています(周囲の 環境を映す)。

left

ソースはユーザーの左方向を向いています。

right

ソースはユーザーの右方向を向いています。

以下は、ユーザーとの関係における映像の facing mode を示す 図です。
ユーザーとの関係における映像の facing mode の図

WebIDLenum VideoResizeModeEnum {
  "none",
  "crop-and-scale"
};
VideoResizeModeEnum 列挙型の 説明
列挙値 説明
none

この解像度およびフレームレートは、カメラ、 そのドライバー、または OS によって提供されます。

注記: UA は、同時使用を 隠蔽するためにこの値を報告してもかまいませんが、 カメラが別の ナビゲータブルで使用されている場合に限ります。(これはフィンガープリンティングベクトルです。)

crop-and-scale

この解像度は、ユーザーエージェントによって、 より高いカメラ解像度からダウンスケーリングおよび/またはクロッピングされたものです。 または、そのフレームレートが ユーザーエージェントによって 間引かれています。以下に記載する場合を除き、メディアを アップスケーリング、引き伸ばし、または入力ソースに存在しなかった 偽のデータを作成してはなりません

注記: UA は同時使用を 隠蔽するためにアップスケーリングしてもかまいませんが、 カメラが ユーザーエージェント外の別のアプリケーションで 使用されている場合に限ります。(これはフィンガープリンティングベクトルです。)

次の制約可能なプロパティは、音声の MediaStreamTrack オブジェクトにのみ適用されるものとして定義されます:

プロパティ名 注記
sampleRate unsigned long 音声データの 1 秒あたりのサンプル数で表した サンプルレートです。
sampleSize unsigned long ビット単位のリニアサンプルサイズです。制約としては、 リニアサンプルを生成する音声デバイスでのみ充足できます。
echoCancellation boolean または DOMString これは falsetrue、または EchoCancellationModeEnum のメンバーのいずれかです。 1 つ以上の音声ストリームがさまざまなマイクの処理内で 再生されている場合、マイクによって録音された入力信号から 再生中の音を取り除くことが望ましい場合がよくあります。 これはエコーキャンセレーションと呼ばれます。これが不要な場合もあり、 音声アーティファクトが生じないよう無効にすることが望ましい場合があります。 これにより、アプリケーションはこの 動作を制御できます。
autoGainControl boolean マイクによって録音された入力信号には、 自動ゲイン制御が望ましい場合がよくあります。これが不要な場合もあり、 音声が変更されないよう無効にすることが望ましい場合があります。 これにより、アプリケーションはこの 動作を制御できます。
noiseSuppression boolean マイクによって録音された入力信号には、 ノイズ抑制が望ましい場合がよくあります。これが不要な場合もあり、 音声が変更されないよう無効にすることが望ましい場合があります。 これにより、アプリケーションはこの 動作を制御できます。
latency double 秒単位のレイテンシーまたはレイテンシー範囲です。レイテンシーとは、 処理の開始(たとえば、現実世界で音が発生した時点)から、 処理の次の段階でデータが利用可能になるまでの 時間です。低レイテンシーが重要なアプリケーションもあります。 他のアプリケーションでは、消費電力の制約に役立つため、 高いレイテンシーが許容されることがあります。この数値は、 構成の目標レイテンシーを表すことが期待されます。実際のレイテンシーは、 そこから多少変動する場合があります。
channelCount unsigned long 音声データに含まれる独立した音声チャネルの数、 すなわちサンプルフレームあたりの音声サンプル数です。
WebIDLenum EchoCancellationModeEnum {
  "all",
  "remote-only"
};
EchoCancellationModeEnum 列挙型の 説明
列挙値 説明
"all"

システムは、システムによって再生されているすべての音を、 マイクの入力信号から除去しようとしなければなりません

このオプションは、通知やスクリーン リーダーなどのローカル音声の送信を防ぐため、 最大限のプライバシーを提供することを意図しています。

"remote-only"

システムは、WebRTC の RTCPeerConnection をソースとする受信音声 MediaStreamTrackからの 音を除去しようとしなければなりません

このオプションは、ローカルで再生される音声を 送信することが望ましい場合に役立ちます。一例としてリモートの音楽 レッスンがあり、生徒が楽器を演奏しながら、ローカルアプリケーションが生成する 伴奏を同時に再生します。この場合、 アプリケーションはエコーを避けるためにリモート参加者 (すなわち教師)から来る音声をキャンセルする必要がありますが、 リモート側の音楽教師が伴奏と 楽器の音を一緒に聞く必要があるため、伴奏はキャンセルされないことも 必要です。

どの RTCPeerConnection を キャンセルするかは UA の判断に委ねられますが、 マイクをキャプチャしているブラウジングコンテキストによって再生されるものは、 キャンセル対象に含めるべきです

EchoCancellationModeEnum の値に加えて、 echoCancellation 制約可能プロパティは、true および false の値も受け入れます。 false は、エコーキャンセレーションを一切行わないことを意味します。 true は、マイクによって録音された信号から どの音声を除去するかを UA が決定することを意味します。true は、少なくとも 「remote-only」 と同程度の音声をキャンセルしようとしなければならず、 「all」と同程度まで キャンセルしようとするべきです

4.3.9 ガベージコレクション

MediaStreamTrack オブジェクトが 終了しておらず、かつ muteunmute または ended イベントに対してイベントリスナーが 登録されている場合、そのオブジェクトをガベージコレクションしてはなりません。 ソースが特定のイベントを決して発火しない場合もあるため、 各ソース型はガベージコレクション規則をさらに細かく定めることができます。

注記
作成者には、MediaStreamTrack に対して stop() を 呼び出すことが推奨されます。特にキャプチャトラックでは、 基礎となるリソースのコストが高く、 ユーザーに提示されるプライバシーインジケーターにも影響する可能性があるためです。

addtrack および removetrack イベントは、 MediaStreamTrackEvent インターフェイスを使用します。

addtrack および removetrack イベントは、 MediaStreamトラック集合ユーザーエージェントによって更新されたことを スクリプトに通知します。

MediaStreamTrack track を指定して、e という名前のトラックイベントを 発火するとは、名前が e であり、 バブリングせず(別途明記される場合を除く)、キャンセル可能でもなく (別途明記される場合を除く)、 MediaStreamTrackEvent インターフェイスを使用し、その track 属性が track に設定されたイベントを作成し、指定されたターゲットに ディスパッチしなければならないことを意味します。

WebIDL[Exposed=Window]
interface MediaStreamTrackEvent : Event {
  constructor(DOMString type, MediaStreamTrackEventInit eventInitDict);
  [SameObject] readonly attribute MediaStreamTrack track;
};

コンストラクター

constructor()

新しい MediaStreamTrackEvent を構築します。

属性

track(型: MediaStreamTrack、読み取り専用)

track 属性は、このイベントに関連付けられた MediaStreamTrack オブジェクトを表します。

WebIDLdictionary MediaStreamTrackEventInit : EventInit {
  required MediaStreamTrack track;
};

辞書 MediaStreamTrackEventInit のメンバー

track(型: MediaStreamTrack、必須)

5. モデル: ソース、 シンク、制約、および設定

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

ユーザーエージェントは、ソースからシンクまでのメディアパイプラインを提供します。ユーザーエージェントでは、 シンクは <img>、 <video>、 および <audio> タグです。 従来のソースには、ストリーミングコンテンツ、ファイル、および Web リソースが含まれます。これらの ソースによって生成されるメディアは通常、時間の経過とともに変化しません。つまり、これらの ソースは静的であると見なすことができます。

これらのソースをユーザーに表示するシンク(実際のタグ 自体)には、ソースコンテンツを操作するためのさまざまな制御があります。 たとえば、 <img> タグは、 1600x1200 ピクセルの巨大なソース画像を、 width="400" および height="300" で定義された矩形に収まるよう縮小します。

ソースには寿命があります。デフォルトでは、ソースの寿命は それを作成したコンテキストに結び付けられます。たとえば、 MediaDevices.getUserMedia() によって作成されたソースは、 その navigator.mediaDevices コンテキストによって 作成されたものと見なされます。 同様に、RTCRtpReceiver オブジェクトのソースは、 それ自体が作成コンテキストに結び付けられている RTCPeerConnection 自体に 結び付けられます。 特定のソースの定義で明示的に別途記載されている場合を除き、 ソースは、その作成コンテキストが消滅すると常に停止されます。 異なるコンテキストの 2 つのソースが、同じキャプチャデバイスを 同時に使用する場合があることに注意してください。 一方のソースは、もう一方とは独立して停止できます。

getUserMedia API は、マイクや カメラなどの動的ソースを追加します。これらのソースの特性は、 アプリケーションのニーズに応じて変化することがあります。これらのソースは、本質的に動的であると見なすことができます。 動的ソースからのメディアを表示する <video> 要素は、 スケーリングを実行するか、またはメディアパイプラインに沿って情報をフィードバックし、 表示により適したコンテンツをソースに生成させることができます。

注記

注記: この種のフィードバックループは、明らかに単なる 「最適化」を可能にするものですが、その効果は無視できません。この 最適化により、バッテリーを節約したり、ネットワーク混雑を軽減したり できます...

MediaStream のシンク(たとえば <video>、 <audio>、 さらには RTCPeerConnection)には、 この仕様で説明される 設定能力、および Constraints が提供する範囲を超えて、 ソースストリームをさらに変換する仕組みが引き続き存在することに注意してください。 (RTCPeerConnection のものを含む シンクの変換オプションは、この 仕様の範囲外です。)

トラックの制約を変更または適用する行為は、そのソースを共有する すべてのトラックの設定、 ひいてはそのソースを使用している下流のすべてのシンクに影響する場合があります。多くのシンクは、 <video> 要素や RTCPeerConnection のように、 これらの変更に問題なく対応できる場合があります。 Recorder API のような他のものは、ソース設定の 変更によって失敗する場合があります。

RTCPeerConnection は、 ネットワーク経由のストリームに対してシンクかつソースの両方として 同時に動作するため、興味深いオブジェクトです。シンクとしては、ソースの変換 能力(たとえば、ビットレートの低下、解像度の拡大/縮小、 フレームレートの調整)を持ち、ソースとしては、トラックソースによって自身の設定が 変更される可能性があります。

特定のソースへの変更がさまざまなシンクにどのような影響を与えるかを示すため、 次の例を考えます。この例では幅と高さのみを使用しますが、 同じ原則は、この仕様で公開されるすべての 設定に適用されます。 最初の図では、ホームクライアントがローカルビデオカメラから映像 ソースを取得しています。ソースの幅と高さの設定は、 それぞれ 800 ピクセルと 600 ピクセルです。ホームクライアント上の 3 つの MediaStream オブジェクトには、 同じ <deviceId を使用するトラックが含まれています。3 つのメディアストリームは、 3 つの異なるシンク、すなわち <video> 要素(A)、別の <video> 要素(B)、およびピア 接続(C)に接続されています。ピア接続は、ソース映像を リモートクライアントへストリーミングしています。リモートクライアントには、ピア接続をソースとして 使用するトラックを含む 2 つのメディアストリームがあります。これら 2 つのメディアストリームは、 2 つの <video> 要素のシンク(Y と Z)に接続されています。

要求された変更前のメディアストリームソース変更の影響

この時点では、ホームクライアント上のすべてのシンクが、 元のソースによって提供される寸法設定に変換を適用しなければならないことに注意してください。B は 映像を縮小し、A は映像を拡大しており(品質低下が生じます)、 C もネットワーク経由で送信するために映像をわずかに拡大しています。 リモートクライアントでは、シンク Y が映像を大幅に 縮小していますが、シンク Z はスケーリングを適用していません。

applyConstraints() が呼び出されたことに応じて、いずれかの トラックがホームクライアントの映像ソースに対して、より高い解像度 (1920 × 1200 ピクセル)を要求します。

要求された変更後のメディアストリームソース変更の影響

ソースの変更は、ホームクライアント上のすべてのトラックと シンクに直ちに影響しますが、リモートクライアント上のどのシンク(またはソース)にも 影響しないことに注意してください。ホームクライアントのソース映像の 寸法が大きくなると、シンク A はスケーリングを行う必要がなくなる一方、 シンク B は以前よりさらに縮小しなければなりません。シンク C(ピア接続)は、 リモートクライアントへの送信を一定に保つため、 映像を縮小しなければならなくなります。

図には示されていませんが、同様に有効な設定変更要求を リモートクライアント側で行うこともできます。以前 A、B、C が影響を受けたのと 同じ方法でシンク Y と Z に影響するだけでなく、 ホームクライアントの映像ソースに適用している変換を 変更するため、ホームクライアント上のピア接続との 再ネゴシエーションにつながる場合があります。このような変更で、シンク A または B、あるいはホームクライアントの映像ソースに関連する何かを変更することは必須ではありません

この仕様は、リモートクライアントの映像ソースへの 変更がホームクライアントの映像ソースへの変更を自動的に 引き起こす仕組みを定義していないことに注意してください。実装は、 次の例で示すように、アプリケーションによって設定された 制約の範囲内でのみ行う限り、このようなソースからシンクへの最適化を 選択して実行できます。

特定のソースへの変更がシンクの コンシューマーに影響することは明らかです。ただし、状況によっては、特定のシンクへの変更も 実装にソース設定を調整させることがあります。これは 次の図に示されています。下の最初の図では、ホームクライアントの映像 ソースが 1920 × 1200 ピクセルの映像ストリームを送信しています。その映像 ソースには制約もなく、アプリケーションから見れば正確なソース寸法は 柔軟です。2 つの MediaStream オブジェクトには、同じ deviceId を持つトラックが含まれ、それらの MediaStream は 2 つの異なる <video> 要素のシンク A と B に接続されています。シンク A は width="1920" および height="1200" に設定されており、ソースの映像コンテンツを 変換なしで表示しています。シンク B はより小さく設定されているため、 結果として映像を縮小し、横 320 ピクセル、 縦 200 ピクセルの矩形に収めています。

メディアストリームのシンク変更がソースに影響する可能性: 要求された変更前

アプリケーションがシンク A をより小さい寸法(幅を 1920 から 1024 ピクセル、高さを 1200 から 768 ピクセル)に変更すると、ユーザーエージェントのメディア パイプラインは、どのシンクもより高いソース解像度を必要としておらず、 ソース側とシンク A 側の双方で不要な処理が行われていることを認識する場合があります。 このような場合、ソースにより高い解像度の映像を生成し続けるよう 強制する他の制約がなければ、メディア パイプラインはソース解像度を変更してもかまいません:

メディアストリームのシンク変更がソースに影響する可能性: 要求された変更後

上の図では、再生を最適化するため、 ホームクライアントの映像ソース解像度が、シンク A と B のうち より大きい方に変更されています。上には示されていませんが、同じ動作を ピア接続やその他のシンクにも適用できます。

ソース自身が制約を 満たせない、またはソースがすでに競合する制約を満たしているために、 ソースが満たせない制約がトラックに適用される可能性があります。 この場合、 applyConstraints() から返される promise は、新しい制約を一切適用せずに 拒否されます。 この場合は制約の変更が発生しないため、この条件の結果として ソース自体を変更する必要もありません。以下は この動作の例です。

この例では、2 つのメディアストリームがそれぞれ、同じソースを共有する 映像トラックを持っています。最初のトラックには当初、制約が適用されていません。 これはシンク N に接続されています。シンク N の解像度は 800 × 600 ピクセルで、 ソースの 1024 × 768 の解像度を収まるように縮小しています。もう一方のトラックには、 ソースの補助照明をオフに強制する必須制約があり、 シンク P に接続されています。シンク P の幅と 高さはソースと同じです。

制約過多のアプリケーション

ここで、最初のトラックが、 補助照明をオンに強制するという 必須制約を追加します。この時点で、両方の 必須制約をソースが 満たすことはできません(補助照明を同時にオンとオフにすることはできません)。 この状態は、最初のトラックが競合する制約を適用しようとしたことで 発生したため、制約の適用は失敗し、ソースの設定にも どちらのトラックの制約にも変更はありません。

6. メディア要素内の MediaStream

MediaStream をメディア要素に割り当てることができます。 MediaStream はプリロードもシークもできず、 単純で、潜在的に無限の線形な メディアタイムラインを表します。タイムラインは 0 から開始し、メディア要素が 再生される可能性がある間、リアルタイムで線形に増加します。 MediaStream の再生が一時停止されると、 タイムラインは増加しません。

この仕様をサポートするユーザーエージェントは、 [HTML] で定義される HTMLMediaElement インターフェイスの srcObject 属性をサポートしなければなりません。これには、 MediaStream オブジェクトの再生サポートが含まれます。

[HTML] 文書では、HTMLMediaElementメディアプロバイダーオブジェクトとどのように動作するかを概説しています。 メディアプロバイダーオブジェクトMediaStream の場合、次が適用されます:

MediaStream の性質により、関連付けられた HTMLMediaElement の属性の動作およびそれに対して実行できる操作には、 次に示すようないくつかの制限があります:

属性名 属性型 プロバイダーが MediaStream の場合のセッター/ゲッターの動作 追加の考慮事項
preload DOMString 取得時: none。設定時: 無視。 MediaStream はプリロードできません。
buffered TimeRanges buffered.length0 を返さなければなりません MediaStream はプリロードできません。したがって、 バッファリングされた量は 常に空の時間範囲です。
currentTime double 任意の非負整数。初期値は 0 で、 要素が再生される可能性がある 間、値はリアルタイムで線形に増加します。 値は秒単位の 公式再生位置です。これを変更しようとする試みは 無視されなければなりません
seeking boolean false MediaStream はシークできません。したがって、 この属性は常に false を 返さなければなりません
defaultPlaybackRate double 取得時: 1.0。設定時: 無視。 MediaStream はシークできません。したがって、 この属性は常に 1.0 を返さなければならず、 これを変更しようとする試みは無視されなければなりません。これは、 ratechange イベントも発火しないことを意味します。
playbackRate double 取得時: 1.0。設定時: 無視。 MediaStream はシークできません。したがって、 この属性は常に 1.0 を返さなければならず、 これを変更しようとする試みは無視されなければなりません。これは、 ratechange イベントも発火しないことを意味します。
played TimeRanges played.length1 を返さなければなりません
played.start(0)0 を返さなければなりません
played.end(0) は、最後に認識された currentTime を返さなければなりません
MediaStream のタイムラインは常に、 0 から始まり currentTime まで続く単一の範囲で構成されます。
seekable TimeRanges seekable.length0 を返さなければなりません MediaStream はシークできません。
loop boolean true, false MediaStream には定義された終端がなく、 したがってループできないため、 loop 属性を設定しても効果はありません。

上記のどのセッターも HTMLMediaElement の内部状態を変更しないため、 MediaStream が要素の 割り当てられた メディアプロバイダーオブジェクトではなくなると、列挙された属性は、 ストリームが要素に割り当てられる前の値を再び取るように見えます。

注記

srcObjectnull またはストリーム以外のオブジェクトが割り当てられると、 MediaStream は、要素の 割り当てられたメディア プロバイダーオブジェクトではなくなります。これは メディア要素の読み込み アルゴリズムの直前です。その結果、 playbackRatedefaultPlaybackRateMediaStream が割り当てられる前と異なる場合、 ratechange イベントが(ステップ 7 から)発火することがあります。

7. エラー処理

一部の操作は OverconstrainedError をスローまたは発火します。これは、 制約の失敗に関連する追加 情報を保持する DOMException の拡張です。

7.1 OverconstrainedError インターフェイス

WebIDL[Exposed=Window]
interface OverconstrainedError : DOMException {
  constructor(DOMString constraint, optional DOMString message = "");
  readonly attribute DOMString constraint;
};

7.1.1 コンストラクター

OverconstrainedError

次の手順を実行します:

  1. constraint をコンストラクターの最初の 引数とします。

  2. message をコンストラクターの 2 番目の引数とします。

  3. e を新しい OverconstrainedError オブジェクトとします。

  4. eDOMException コンストラクターを、 message 引数を message に設定し、 name 引数を "OverconstrainedError" に設定して呼び出します。

    注記

    この名前には旧来の コードへのマッピングがないため、ecode 属性は 0 を返します。

  5. e.constraintconstraint に設定します。

  6. e を返します。

7.1.2 属性

constraint(型: DOMString、 読み取り専用)

このエラーに関連付けられた制約の名前、または 特定の制約名が公開されない場合は ""

8. イベントの概要

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

次のイベントは MediaStream オブジェクトで発火します:

イベント名 インターフェイス 発火する条件...
addtrack MediaStreamTrackEvent 新しい MediaStreamTrack がこの ストリームに追加されたとき。スクリプトが MediaStream のトラックを直接 変更した場合、このイベントは発火しないことに注意してください。
removetrack MediaStreamTrackEvent MediaStreamTrack がこの ストリームから削除されたとき。スクリプトが MediaStream のトラックを直接 変更した場合、このイベントは発火しないことに注意してください。

次のイベントは MediaStreamTrack オブジェクトで発火します:

イベント名 インターフェイス 発火する条件...
mute Event MediaStreamTrack オブジェクトのソースが 一時的にデータを提供できなくなったとき。
unmute Event MediaStreamTrack オブジェクトのソースが、一時的にデータを提供できなかった後、 再びライブになったとき。
ended Event

MediaStreamTrack オブジェクトのソースが、 ユーザーが 許可を取り消した、ソースデバイスが取り外された、 またはリモートピアがデータ送信を永続的に停止したなどの理由により、 今後一切データを提供しなくなったとき。

次のイベントは MediaDevices オブジェクトで発火します:

イベント名 インターフェイス 発火する条件...
devicechange DeviceChangeEvent ユーザーエージェントが 利用可能なメディアデバイスの集合が 変更されたとき。現在のデバイス一覧は devices 属性で利用できます。

9. ローカルメディアデバイスの列挙

このセクションでは、接続されているメディア入力および出力デバイス(たとえば Web カメラやヘッドセット)についてユーザー エージェントに照会するためにスクリプトが使用できる API について説明します。

MediaDevices オブジェクトは、 ユーザーエージェントが利用可能なメディアデバイスを調べ、 それらへのアクセスを取得するために使用される API のエントリーポイントです。

realm を指定して MediaDevices を作成するには、 次の手順を実行します:

  1. mediaDevices を、realm 内の新しい MediaDevices オブジェクトとし、 次の内部スロットで初期化します:

    • [[devicesLiveMap]]、 空のマップに初期化します。

    • [[devicesAccessibleMap]]、 空のマップに初期化します。

    • [[kindsAccessibleMap]]、 空のマップに初期化します。

    • [[storedDeviceList]]ユーザーエージェントが利用可能な すべてのメディア入力および出力デバイスのリストに初期化します。

    • [[canExposeCameraInfo]]false に初期化します。

    • [[canExposeMicrophoneInfo]]false に初期化します。

    • [[mediaStreamTrackSources]]、 空の集合に初期化します。

  2. settings を、mediaDevices関連する 設定オブジェクトとします。

  3. MediaDevices.getUserMedia() が公開する各デバイス種別 kind について、次の手順を実行します:

    1. settings に対する kind に関連付けられた許可 (たとえば "camera""microphone")の許可状態が 「granted」 である場合は mediaDevices.[[kindsAccessibleMap]][kind]true に設定し、 それ以外の場合は false に設定します。

  4. MediaDevices.getUserMedia() が公開する個々のデバイスについて、そのデバイスの deviceId deviceId を使用して、次の手順を実行します:

    1. mediaDevices.[[devicesLiveMap]][deviceId]false に設定し、 settings に対するデバイスの種別および deviceId に関連付けられた許可の許可状態が 「granted」 である場合は mediaDevices.[[devicesAccessibleMap]][deviceId]true に設定し、それ以外の場合は false に設定します。

  5. mediaDevices を返します。

getUserMedia() が公開する 各デバイス種別 kind について、 mediaDevices関連する 設定オブジェクトに対する kind に関連付けられた許可の 許可状態に遷移が発生するたびに、 次の手順を実行します:

  1. 他の値から「granted」 への遷移である場合、 mediaDevices.[[kindsAccessibleMap]][kind]true に設定します。

  2. granted」 から他の値への遷移である場合、 mediaDevices.[[kindsAccessibleMap]][kind]false に設定します。

getUserMedia() が公開する 各デバイスについて、 mediaDevices関連する 設定オブジェクトに対する、デバイスの種別およびその deviceId deviceId に関連付けられた許可の 許可 状態に遷移が発生するたびに、次の 手順を実行します:

  1. 他の値から「granted」 への遷移である場合、 mediaDevices.[[devicesAccessibleMap]][deviceId] がまだ true でなければ、 true に設定します。

  2. granted」 から他の値への遷移であり、かつ デバイスが現在停止している場合、 mediaDevices.[[devicesAccessibleMap]][deviceId]false に設定します。

新しいメディア入力および/または出力デバイスが ユーザーエージェントで利用可能になった場合、利用可能な入力および/または出力デバイスのいずれかが 利用できなくなった場合、または MediaDeviceKind の入力および/または出力デバイスについて システムデフォルトが変更された場合、ユーザーエージェントは、 デバイス列挙を続行できるtrue である各 MediaDevices オブジェクト mediaDevices について、次の デバイス変更通知手順を実行しなければなりませんが、それ以外の MediaDevices オブジェクトについては実行してはなりません:

  1. lastExposedDevices を、 mediaDevices および mediaDevices.[[storedDeviceList]] を指定して デバイス情報オブジェクトの リストを作成した結果とします。

  2. deviceList を、ユーザーエージェントが利用可能な すべてのメディア入力および/または 出力デバイスのリストとします。

  3. newExposedDevices を、 mediaDevices および deviceList を指定して デバイス情報オブジェクトの リストを作成した結果とします。

  4. newExposedDevices 内の MediaDeviceInfo オブジェクトが lastExposedDevices 内のものと一致し、かつ同じ順序である場合、 この手順を中止します。

    注記

    enumerateDevices アルゴリズムにより、上記の手順では devicechange イベントの発火が、 特定の MediaDeviceKind のデバイスを列挙するために enumerateDevices使用することを 許可された文書に限定されます。

  5. mediaDevices.[[storedDeviceList]]deviceList に設定します。

  6. mediaDevices において、devicesnewExposedDevices に初期化した DeviceChangeEvent コンストラクターを使用して、 devicechange という名前の イベントを発火するタスクをキューに入れます。

    ユーザーエージェントは、複数のイベントが発生予定である場合や、 マイク付きカメラなど複数のデバイスが同時に追加または 削除された場合、複数のイベントの発火を 1 つのイベントの発火に 統合してもかまいません

さらに、走査された MediaDevices オブジェクトが 後になってデバイス列挙を続行できる 基準を満たすようになった場合(たとえば 表示中になった場合)、ユーザーエージェントは、 その時点で MediaDevices オブジェクトに対してデバイス変更通知 手順を実行しなければなりません

注記

これらのイベントは、異なるオリジンの文書で 同時に発生する可能性があります。ユーザーエージェントは、 オリジンをまたぐアクティビティの相関を避けるため、 イベントのタイミングにファジングを追加してもかまいません(これはフィンガープリンティングベクトルです。)

WebIDL[Exposed=Window, SecureContext]
interface MediaDevices : EventTarget {
  attribute EventHandler ondevicechange;
  Promise<sequence<MediaDeviceInfo>> enumerateDevices();
};

属性

ondevicechange(型: EventHandler

このイベントハンドラーのイベント型は devicechange です。

メソッド

enumerateDevices

ユーザーエージェントが利用可能なメディア 入力および出力デバイスに関する情報を収集します。

このメソッドは promise を返します。列挙に成功した場合、 promise は、 ユーザーエージェントが利用可能なメディア入力および出力 デバイスを表す MediaDeviceInfo オブジェクトの シーケンスで履行されます。

このシーケンス内で入力デバイスを表す要素は、 MediaDeviceInfo を拡張する InputDeviceInfo 型になります。

カメラおよびマイクのソースは列挙可能であるべきです。 追加のソース型を追加する仕様では、そのソース型を 列挙可能にするべきかどうかについて推奨事項を提供します。

enumerateDevices() メソッドが呼び出されたとき、ユーザーエージェントは 次の手順を実行しなければなりません:

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

  2. proceed を、this を指定した デバイス 列挙を続行できるの結果とします。

  3. mediaDevicesthis とします。

  4. 次の手順を並列に実行します:

    1. proceedfalse の間、 ユーザーエージェントは、 mediaDevices を指定した デバイス列挙を 続行できるの結果を proceed に設定するため キューに入れられたタスクが、proceedtrue に 設定することになるまで、次の手順への進行を待たなければなりません

    2. resultList を、 mediaDevices および mediaDevices.[[storedDeviceList]] を指定して デバイス情報オブジェクトの リストを作成した結果とします。

    3. presultList解決します。

  5. p を返します。

mediaDevices および deviceList を指定して デバイス情報オブジェクトのリストを作成するには、 次の手順を実行します:

  1. resultList を空のリストとします。

  2. microphoneListcameraList、および otherDeviceList を空のリストとします。

  3. document を、mediaDevices関連する グローバルオブジェクト関連付けられた Document とします。

  4. deviceList 内で検出された各デバイス device について、 次のサブ手順を実行します:

    1. device がマイクでない場合、または document"microphone" で識別される機能を使用することを 許可されていない場合、 これらのサブ手順を中止し、次のデバイス(存在する場合)に進みます。

    2. deviceInfo を、 mediaDevices を指定して device を表す デバイス情報 オブジェクトを作成した結果とします。

    3. device がシステムデフォルトのマイクである場合、 deviceInfomicrophoneList の先頭に追加します。 それ以外の場合、deviceInfomicrophoneList の末尾に追加します。

  5. deviceList 内で検出された各デバイス device について、 次のサブ手順を実行します:

    1. device がカメラでない場合、または document"camera" で識別される機能を使用することを 許可されていない場合、 これらのサブ手順を中止し、次のデバイス(存在する場合)に進みます。

    2. deviceInfo を、 mediaDevices を指定して device を表す デバイス情報 オブジェクトを作成した結果とします。

    3. device がシステムデフォルトのカメラである場合、 deviceInfocameraList の先頭に追加します。 それ以外の場合、deviceInfocameraList の末尾に追加します。

  6. mediaDevices において マイク情報を 公開できるfalse の場合、 microphoneList を最初の項目までに切り詰めます。

  7. mediaDevices において カメラ 情報を公開できるfalse の場合、 cameraList を最初の項目までに切り詰めます。

  8. deviceList 内で検出された各デバイス device について、 次のサブ手順を実行します:

    1. device がマイクまたはカメラである場合、 これらのサブ手順を中止し、次のデバイス(存在する場合)に進みます。

    2. devicemicrophoneListcameraList、 および mediaDevices を入力として、 カメラおよびマイク以外のデバイスに対する公開 決定アルゴリズムを実行します。 このアルゴリズムの結果が false の場合、 これらのサブ手順を中止し、次のデバイス(存在する場合)に進みます。

    3. deviceInfo を、 mediaDevices を指定して device を表す デバイス情報 オブジェクトを作成した結果とします。

    4. deviceInfootherDeviceList の末尾に追加します。

    5. device がシステムデフォルトの音声出力である場合、 次のサブ手順を実行します:

      1. defaultAudioOutputInfo を、 mediaDevices を指定して device を表す デバイス情報 オブジェクトを作成した結果とします。

      2. defaultAudioOutputInfodeviceId を "default" に設定します。

      3. ユーザーエージェントは、 これがシステムデフォルトの音声出力であることを明示するように defaultAudioOutputInfolabel を更新するべきです

      4. defaultAudioOutputInfootherDeviceList の先頭に追加します。

  9. microphoneList のすべてのデバイスを順番に resultList の末尾に追加します。

  10. cameraList のすべてのデバイスを順番に resultList の末尾に追加します。

  11. otherDeviceList のすべてのデバイスを順番に resultList の末尾に追加します。

  12. resultList を返します。

このメソッドは、メディアキャプチャデバイスの 利用可能性を通じて、ブラウジングセッションおよびオリジンをまたいで永続的な 情報を返すため、 ユーザー エージェントが公開するフィンガープリンティング面を増加させます。(これはフィンガープリンティングベクトルです。)

関連する グローバルオブジェクト関連付けられた Document がキャプチャを行っていない限り、このメソッドは 公開する情報を、カメラが存在するかどうか、およびマイクが存在するかどうかという 2 ビットの情報に制限します。ユーザー エージェントは、たとえば 関連する グローバルオブジェクト関連付けられた Document が、妥当と判断された制約を指定して getUserMedia() を呼び出すまで、システムにカメラとマイクがあるように装うことで、 これを緩和できます。(これはフィンガープリンティングベクトルです。)

関連する グローバルオブジェクト関連付けられた Document が キャプチャを開始した後は、すべてのメディアキャプチャデバイスのリストを通じて、 そのグループ化やキャプチャデバイスに関連付けられた人間が読めるラベルを含む、 オリジンをまたぐ追加の永続的 情報を提供するため、フィンガープリンティング面がさらに増加します。(これはフィンガープリンティングベクトルです。)

ユーザーエージェントは、デバイスラベルをサニタイズすることで 公開を制限できます。たとえば、ラベル内に含まれるユーザー名を削除し、 デバイスの製造元またはモデル情報を残すことが考えられます。 サニタイズされたラベルによって、ユーザーが対応するデバイスを識別できることが 重要です。(これはフィンガープリンティングベクトルです。)

9.2.1 アクセス制御モデル

上記のアルゴリズムは、メディアデバイス 情報へのアクセスが、関連する グローバルオブジェクト関連付けられた Documentがキャプチャを行ったかどうかに依存することを意味します。

カメラおよびマイクのデバイスについて、関連する グローバルオブジェクト関連付けられた Documentがキャプチャを行っていない場合 (すなわち、getUserMedia() が 呼び出されていないか、正常に解決されたことが一度もない場合)、 MediaDeviceInfo オブジェクトは kind には有効な値を含みますが、 deviceIdlabel、および groupId には空文字列を含みます。 さらに、各 kind について最大 1 台のデバイスのみが enumerateDevices() の結果に列挙されます。

それ以外の場合、 MediaDeviceInfo オブジェクトは、 deviceIdkindlabel、および groupId に意味のある値を含みます。利用可能なすべてのデバイスが enumerateDevices() の結果に列挙されます。

mediaDevices を指定して、検出されたデバイス device を表す デバイス情報オブジェクトを作成するには、 次の手順を実行します:

  1. deviceInfo を、device を表す新しい MediaDeviceInfo オブジェクトとします。

  2. deviceInfo.kinddevice に対して初期化します。

  3. deviceInfo.kind が "videoinput" に等しく、かつ mediaDevices において カメラ情報を 公開できるfalse の場合、 deviceInfo を返します。

  4. deviceInfo.kind が "audioinput" に等しく、かつ mediaDevices において マイク 情報を公開できるfalse の場合、 deviceInfo を返します。

  5. deviceInfo.labeldevice に対して初期化します。

  6. device について保存済みの deviceId が存在する場合、 deviceInfo.deviceId をその値に初期化します。 それ以外の場合、deviceInfo.deviceId を、 deviceId で説明されているように 新しく生成された一意の識別子とします。

  7. device が、document についてすでに表現されているデバイスと 同じ物理 デバイスに属する場合、deviceInfo.groupId を、既存の MediaDeviceInfo オブジェクトの groupId 値に初期化します。 それ以外の場合、deviceInfo.groupId を、 groupId で説明されているように 新しく生成された一意の識別子とします。

  8. deviceInfo を返します

9.2.2 デバイス情報の 公開

mediaDevices を指定して デバイス列挙を続行できるかの確認を行うには、 次の手順を実行します:

  1. mediaDevices において デバイス情報を 公開できる場合、 ユーザーエージェントtrue を返してもかまいません

  2. mediaDevices を指定した 表示中であるの結果を返します。

mediaDevices を指定して デバイス 情報を公開できるかの確認を行うには、次の手順を実行します:

  1. mediaDevices において カメラ情報を 公開できる場合、 true を返します。

  2. mediaDevices において マイク 情報を公開できる場合、 true を返します。

  3. false を返します。

mediaDevices を指定して カメラ 情報を公開できるかの確認を行うには、次の手順を実行します:

  1. "videoinput" 種別のローカルデバイスのいずれかが、 mediaDevices関連する グローバルオブジェクト関連付けられた Document内の live な MediaStreamTrack に接続されている場合、 true を返します。

  2. mediaDevices.[[canExposeCameraInfo]] を返します。

mediaDevices を指定して マイク 情報を公開できるかの確認を行うには、次の手順を実行します:

  1. "audioinput" 種別のローカルデバイスのいずれかが、 関連する グローバルオブジェクト関連付けられた Document内の live な MediaStreamTrack に接続されている場合、 true を返します。

  2. mediaDevices.[[canExposeMicrophoneInfo]] を返します。

mediaDevices を指定して 表示中であるかの確認を行うには、 次の手順を実行します:

  1. mediaDevices関連する グローバルオブジェクト関連付けられた Document完全に アクティブであり、その可視性 状態"visible" の場合、true を返します。それ以外の場合は false を返します。

mediaDevices を指定して システムフォーカスを持つかの確認を行うには、次の 手順を実行します:

  1. mediaDevices関連する グローバルオブジェクトナビゲータブルトップレベル トラバーサブルシステムフォーカスを持つ場合、 true を返します。それ以外の場合は false を返します。

deviceType を指定して デバイスの公開を拡張できるかの確認を行うには、次の 手順を実行します:

  1. permission を、名前が deviceType である 記述子について許可状態を読み取った結果とします。

  2. permission が「granted」 である場合、true を返します。

  3. permission が「prompt」 である場合、deviceType へのアクセスがそのオリジンに対して 以前許可されていたことをユーザーエージェントが知っていれば、 true を返してもかまいません

  4. false を返します。

9.2.3 デバイス 情報の公開を設定する

requestedTypes集合と boolean の value を指定して、 mediaDevicesデバイス情報の公開を設定するには、 次の手順を実行します:

  1. "video"requestedTypes に含まれる場合、 次のサブ手順を実行します:

    1. mediaDevices.[[canExposeCameraInfo]]value に設定します。

    2. valuetrue であり、かつ "microphone" について デバイスの公開を 拡張できる場合、 mediaDevices.[[canExposeMicrophoneInfo]]true に設定します。

  2. "audio"requestedTypes に含まれる場合、 次のサブ手順を実行します:

    1. mediaDevices.[[canExposeMicrophoneInfo]]value に設定します。

    2. valuetrue であり、かつ "camera" について デバイスの公開を 拡張できる場合、 mediaDevices.[[canExposeCameraInfo]]true に設定します。

注記

ユーザーエージェントは、いつでも デバイス情報の公開を false に戻してもかまいません。 たとえば、ユーザーエージェントが特定の Document に対するデバイスアクセスを 取り消すことを決定した場合などです。

9.2.4 カメラおよびマイク以外のデバイスに対する公開決定アルゴリズム

カメラおよびマイク以外のデバイスに対する 公開決定アルゴリズムは、 devicemicrophoneListcameraList、および mediaDevices を入力として受け取り、device に関する 情報を Web ページに公開するかどうかを決定する boolean を返します。

デフォルトでは、false を返します。

他の仕様は、特定のデバイス型についてこのアルゴリズムを定義できます。

9.2.5 コンテキストのキャプチャ状態

globalObject について コンテキストがキャプチャ中であるかの確認を行うには、 次の手順を実行します:

  1. globalObjectWindow でない場合、false を返します。

  2. mediaDevicesglobalObject関連付けられた MediaDevices とします。

  3. mediaDevices.[[mediaStreamTrackSources]] 内の各 source について、次のサブ手順を実行します:

    1. source停止しているか、またはミュートされている場合、この手順を中止します。

    2. deviceIdsource のデバイスの deviceId とします。

    3. mediaDevices.[[devicesLiveMap]][deviceId] が true の場合、true を返します。

  4. false を返します。

注記

このアルゴリズムは、マイク、カメラ、およびディスプレイを含むすべてのキャプチャトラックを対象とします。

9.3 デバイス情報

WebIDL[Exposed=Window, SecureContext]
interface MediaDeviceInfo {
  readonly attribute DOMString deviceId;
  readonly attribute MediaDeviceKind kind;
  readonly attribute DOMString label;
  readonly attribute DOMString groupId;
  [Default] object toJSON();
};

属性

deviceId (型: DOMString、 読み取り専用)

表されているデバイスの識別子です。デバイスは、その識別子と kind によって 一意に識別されなければなりません

保存された識別子が認識されるようにするため、識別子は トップレベル トラバーサブル内の同一 オリジンDocument間で 同一でなければなりません子 ナビゲータブルでは、 文書間で識別子を同一にするかどうかの判断は、 クロスサイト相関に対する緩和策を妨げないよう、 localStorage などのストレージに対するユーザー エージェントのパーティショニング規則が存在する場合、 それに従わなければなりません。 識別子によってユーザーを一意に識別できる場合、 異なるオリジン間で同一ユーザーを 相関させるために識別子が使用されることを防ぐため、 他のオリジンの文書から推測不可能でなければなりません。 識別子がユーザーに結び付けられておらず、 User-Agent 文字列のような他の手段で推測できる限り、 オリジン間で再利用できます。

このオリジンのページで、いずれかのローカルデバイスが live な MediaStreamTrack に接続された場合、 またはローカル デバイスへのアクセスに対する保存された許可が このオリジンに付与されている場合、この識別子は、以下で詳述する場合を除いて 永続化されなければなりません。一意で安定した 識別子により、アプリケーションは複数回の訪問にわたって、 特定のソースを保存し、その利用可能性を識別し、 直接要求できます。

ただし、このオリジンのページでローカルデバイスが live MediaStreamTrack に接続されたことがなく、かつローカル デバイスへのアクセスに対する保存された許可もこのオリジンに付与されていない限り、 ユーザー エージェントは、このオリジンからの最後のブラウジングセッションが 閉じられた時点で、この識別子を消去してもかまいませんユーザー エージェントがこの条件で識別子を消去しないことを選択した場合、 Cookie と同様に、ユーザーがその識別子を目視で確認し削除できる手段を 提供しなければなりません

deviceId は ブラウジングセッションをまたいで永続化される可能性があり、 フィンガープリンティング機構としての可能性を低減するため、 deviceId は、 Cookie [COOKIES] などの他の永続的ストレージ機構と同様に 扱われます。すなわち、ユーザーエージェントは、 Cookie の使用をブロックされているサイトについてデバイス 識別子を永続化してはならずユーザーエージェントは、 他の永続的ストレージが消去されたとき、オリジンごとのデバイス識別子を ローテーションしなければなりません(これはフィンガープリンティングベクトルです。)

kind(型: MediaDeviceKind、 読み取り専用)

表されているデバイスの種別です。

label(型: DOMString、 読み取り専用)

このデバイスを説明するラベル(たとえば「External USB Webcam」)です。このラベルは、エンドユーザーがデバイス間の 違いを識別できるようにすることを意図しています。アプリケーションは、 ラベルにデバイスの種類やモデルなどの特定の情報が含まれると 仮定できません。 デバイスに関連付けられたラベルがない場合、この 属性は空文字列を返さなければなりません

groupId (型: DOMString、 読み取り専用)

表されているデバイスのグループ識別子です。2 つのデバイスが 同じ物理デバイスに属する場合、それらは同じグループ識別子を 持ちます。たとえば、同じヘッドセットのスピーカーとマイクを表す 音声入力および出力デバイスは、同じ groupId を持ちます。

グループ識別子は、各 文書について一意に生成されなければなりません

メソッド

toJSON
呼び出されたとき、[WEBIDL] のデフォルトの toJSON 手順を実行します。
WebIDLenum MediaDeviceKind {
  "audioinput",
  "audiooutput",
  "videoinput"
};
MediaDeviceKind 列挙型の 説明
audioinput

音声入力デバイス、たとえば マイクを表します。

audiooutput

音声出力デバイス、たとえば ヘッドフォンを表します。

videoinput

映像入力デバイス、たとえば Web カメラを表します。

9.4 入力固有のデバイス情報

InputDeviceInfo インターフェイスは、それが表す 入力デバイスの能力へのアクセスを提供します。

WebIDL[Exposed=Window, SecureContext]
interface InputDeviceInfo : MediaDeviceInfo {
  MediaTrackCapabilities getCapabilities();
};

メソッド

getCapabilities

ユーザーが指定した制約がない場合に、デバイスの MediaStream の 主要な音声または映像トラック(その kind 値に従う)を記述する MediaTrackCapabilities オブジェクトを返します。 これらの能力は、この MediaDeviceInfodeviceId 属性の値を id として、 getUserMedia({deviceId: id}) によって返された MediaStream 内の、この型の最初の MediaStreamTrack に対して getCapabilities() を呼び出して得られる能力と同一でなければなりません

どのローカルデバイスへのアクセスも許可されておらず、この InputDeviceInfo が 一意に識別できる情報に関してフィルタリングされている場合(上記の enumerateDevices() の結果の説明を参照)、このメソッドは 空の辞書を返します。

devicechange イベントは DeviceChangeEvent インターフェイスを使用します。

WebIDL[Exposed=Window]
interface DeviceChangeEvent : Event {
  constructor(DOMString type, optional DeviceChangeEventInit eventInitDict = {});
  [SameObject] readonly attribute FrozenArray<MediaDeviceInfo> devices;
  [SameObject] readonly attribute FrozenArray<MediaDeviceInfo> userInsertedDevices;
};

コンストラクター

constructor()

this.devices を、 eventInitDict.devices から 凍結配列を作成した 結果に初期化します。

属性

devices(型: FrozenArray<MediaDeviceInfo>、 読み取り専用)

devices 属性は、 現時点で利用可能なデバイスのリストを表す MediaDeviceInfo オブジェクトの配列を返します。

userInsertedDevices(型: FrozenArray<MediaDeviceInfo>、 読み取り専用)

userInsertedDevices 属性は、devices 内の MediaDeviceInfo オブジェクトのうち、 ユーザーが最近物理的に挿入または有効化し、その結果このイベントで 新たに公開されたものだけを含む配列を返します。 それ以外の場合は、空のリストを返します。

ユーザーエージェントは、 getUserMedia() が呼び出される前にユーザーが挿入または有効化したデバイスも、 このイベントがそれらの初回公開を示し、かつ ユーザーが getUserMedia() 内でデバイスを選択していない場合に限り、 含めてもかまいません

MediaDeviceInfo オブジェクトが存在する場合、 それらは devices にも 存在しなければなりません

注記

ユーザーが通話中(または通話直前)にデバイスを挿入することは、 そのデバイスをすぐに使用したいという 強いシグナルになり得ます。

アプリケーションには、この属性を利用して、 このシグナルを、デバイス情報の公開の変更によって生じ得る devices の差異と区別することが推奨されます。

注記
この属性が存在しない場合、この UA はまだこのバージョンの仕様を 実装するようアップグレードされていないことを意味します。
WebIDLdictionary DeviceChangeEventInit : EventInit {
  sequence<MediaDeviceInfo> devices = [];
};

辞書 DeviceChangeEventInit のメンバー

devices(型: sequence<MediaDeviceInfo>、 デフォルト値: []

devices メンバーは、 利用可能なデバイスを表す MediaDeviceInfo オブジェクトの 配列です。

10. ローカルマルチメディア コンテンツの取得

このセクションでは、Navigator および MediaDevices を拡張し、ユーザーエージェントが利用可能な メディア入力デバイスへのアクセス許可を要求するための API を提供します。

あるいは、video 要素など特定の種類の DOM 要素からローカルの MediaStream をキャプチャできます [mediacapture-fromelement]。これは 自動テストに役立つ場合があります。

10.1 MediaDevices インターフェイスの拡張

注記
このセクションにおける getUserMedia() の定義は、 Navigator の下で長期間存在してきたメソッド定義からの 2 つの主要な 変更を反映しています。

第一に、getUserMedia() メソッドの正式な定義、そして 開発者に使用が推奨されるものは、現在では MediaDevices の下で ここに定義されているものです。この 決定は、後方互換性のために元の API が Navigator オブジェクトの下の Navigator.getUserMedia で引き続き利用可能である限り、合意を反映したものでした。これは、 ワーキンググループが、これらの API の初期利用者に対し、 一般的な ユーザーエージェントにおける getUserMedia() の正式な実装の 前後どちらでもコードが動作するよう、 getUserMedia を "var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;" と定義するよう推奨されてきたことを認識しているためです。 機能的同等性を確保するため、 Navigator の下の getUserMedia() メソッドは、ここにあるメソッドを用いて定義されます。

第二に、ここで定義されるメソッドは Promise ベースですが、 Navigator の下で定義されるものは現在もコールバックベースです。 Navigator の下で getUserMedia() が定義されていることを期待している開発者には、 そこに記載された詳細な注記を読むことを強く推奨します。

getSupportedConstraints メソッドは、アプリケーションが ユーザーエージェントが 認識する制約を判断できるように提供されます。アプリケーションは、 必須制約を確実に使用したり、 高度な制約における組み合わせロジックから 予測可能な結果を得たりするために、この情報を必要とする場合があります。

WebIDLpartial interface MediaDevices {
  MediaTrackSupportedConstraints getSupportedConstraints();
  Promise<MediaStream> getUserMedia(optional MediaStreamConstraints constraints = {});
};

メソッド

getSupportedConstraints

ユーザーエージェントが認識する 制約可能なプロパティをメンバーとして持つ辞書を返します。サポートされる 制約可能なプロパティは表現されなければならずユーザーエージェントが サポートしない制約可能なプロパティは、返される 辞書に存在してはなりません。返される値は ユーザー エージェントが実装するものを表し、ブラウジングセッション中に変更されません。

getUserMedia

Web カメラまたはその他の 映像もしくは音声入力を使用する許可をユーザーに求めます。

constraints 引数は、 MediaStreamConstraints 型の辞書です。

このメソッドは promise を返します。以下で説明するように ユーザーが有効なトラックを受け入れた場合、promise は適切な MediaStream オブジェクトで 履行されます。

有効なトラックの検索に失敗した場合、または 以下で説明するようにユーザーが許可を拒否した場合、promise は 拒否されます。

getUserMedia() メソッドが 呼び出されたとき、ユーザーエージェントは 次の手順を実行しなければなりません:

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

  2. requestedMediaTypes を、constraints 内で 辞書値または true の値を持つメディア 型の集合とします。

  3. requestedMediaTypes が空集合の場合、 TypeError拒否された promise を返します。 WebIDL の規則により WebIDL には "optional" という 語がありますが、呼び出しを成功させるには引数を 指定しなければなりません

  4. document を、関連する グローバルオブジェクト関連付けられた Document とします。

  5. document完全に アクティブでない場合、 name 属性の値が「InvalidStateError」 である DOMException オブジェクトで 拒否された promise を返します。

  6. requestedMediaTypes に "audio" が含まれ、 document が "microphone" 許可名で識別される 機能を使用することを 許可されていない場合、 下の 許可失敗 とラベル付けされた手順にジャンプします。

  7. requestedMediaTypes に "video" が含まれ、 document が "camera" 許可名で識別される 機能を使用することを 許可されていない場合、 下の 許可失敗 とラベル付けされた手順にジャンプします。

  8. mediaDevicesthis とします。

  9. isInView表示中であるアルゴリズムの結果とします。

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

  11. 次の手順を並列に実行します:

    1. isInViewfalse の間、 ユーザーエージェントは、 表示中である アルゴリズムの結果を isInView に設定するため キューに入れられたタスクが、 isInViewtrue に設定することになるまで、 次の手順への進行を待たなければなりません

    2. finalSet を(初期状態では)空の 集合とします。

    3. requestedMediaTypes 内の各メディア型 kind について、次の手順を実行します:

      1. kind 型のメディアの、考えられる各ソースデバイスの 考えられる各構成について、ソースデバイスを保持し、 その固有の設定で構成された 設定 辞書を持つ、最終的な MediaStreamTrack のプレースホルダーとして 候補を想定します。

        この候補集合を candidateSet と呼びます。

        candidateSet が空集合の場合、 下の NotFound 失敗 とラベル付けされた手順にジャンプします。

      2. constraintskind エントリの値が true の場合、CS を 空の制約集合(制約なし)に設定します。それ以外の場合、 CSconstraintskind エントリの値に設定したまま続行します。
      3. CS 内の制約可能なプロパティのうち、 kind 型の MediaStreamTrack オブジェクトについて定義されていないものをすべて削除します。 これは、"video" 内の音声専用制約と、 "audio" 内の映像専用制約は、 OverconstrainedError を発生させるのではなく、 単に無視されることを意味します。
      4. CS に、 必須 制約であり、その名前が デバイス選択で許可される 必須制約の一覧にないメンバーが含まれる場合、 pTypeError拒否し、 この手順を中止します。

      5. candidateSet 内の各候補に対して、 CS を制約集合として SelectSettings アルゴリズムを実行します。アルゴリズムが undefined を返す場合、その候補を candidateSet から削除します。これにより、 制約を満たす設定辞書が少なくとも 1 つ存在することを 確認して、制約を満たせないデバイスを除外します。

        candidateSet が空集合の場合、 failedConstraint を、 SelectSettings アルゴリズムの実行中に調べたすべての設定辞書について 適合度距離が無限大であった 必須 制約のいずれかとするか、 そのようなものがない場合は "" とし、 下の 制約失敗 とラベル付けされた手順にジャンプします。

        このエラーは、 ユーザーがどのデバイスにも認可を与える前に、 基礎となるデバイスが生成できないものについての情報を 提供するため、フィンガープリンティング面として 使用できます。(これはフィンガープリンティングベクトルです。)

      6. candidateSet 内の、現在の Document 内の live な MediaStreamTrack に接続されていないすべての候補デバイスについて、 現在の許可 状態を読み取ります。 デバイスの許可状態が「denied」 である候補を candidateSet から削除します。

        candidateSet がここで空になり、 この型のすべてのデバイスが 「denied」 状態であることを示す場合、 下の PermissionFailure とラベル付けされた手順に ジャンプします。

      7. 任意で、たとえば以前に設定された ユーザーの選好、セキュリティ上の理由、またはプラットフォームの 制約に基づき、下の 許可 失敗 とラベル付けされた手順にジャンプします。

      8. candidateSet のすべての候補を finalSet に追加します。

    4. stream を新しい空の MediaStream オブジェクトとします。

    5. requestedMediaTypes 内の各メディア型 kind について、できれば同時に次のサブ手順を 実行します:

      注記

      ユーザー エージェントには、異なる種類のメディアに対する 同時要求を、ユーザー向けの単一の 許可プロンプトにまとめることが推奨されます。

      1. kind に関連付けられた許可名 (たとえば "video" には "camera""audio" には "microphone") に name メンバーを設定した PermissionDescriptor使用する許可を 要求し、 現在の Document 内の live かつ同一許可MediaStreamTrack に接続されたすべてのデバイスは、許可状態が 「granted」 であるものとして扱い、その結果として提供されるメディアの集合を得ます。 この文脈での 同一許可とは、 現在要求されているものと同じレベルの 許可を取得するために必要とした MediaStreamTrack を意味します(たとえば隔離されたものではない)。

        ユーザーに許可を求める際、 ユーザー エージェントは、 許可が選択されたデバイスのみに付与されるのか、 それともその kind のすべてのデバイスに 付与されるのかを開示しなければなりません

        注記

        ユーザーが応答しない場合、このアルゴリズムはこの 手順で停止したままになります。

      2. 要求の結果が「denied」 の場合、下の 許可失敗 とラベル付けされた手順にジャンプします。

    6. hasSystemFocusfalse とします。

    7. hasSystemFocusfalse の間、 ユーザーエージェントは、 システムフォーカスを持つ アルゴリズムの結果を hasSystemFocus に設定するため キューに入れられたタスクが、 hasSystemFocustrue に設定することになるまで、 次の手順への進行を待たなければなりません

    8. mediaDevices において、 requestedMediaTypes および true を指定して デバイス 情報の公開を設定します。

    9. requestedMediaTypes 内の各メディア型 kind について、次のサブ手順を実行します:

      1. finalCandidate を提供されたメディアとします。これは finalSet 内の kind 型の 候補を正確に 1 つ でなければなりませんfinalSet からどの候補を選択するかの判断は 完全に ユーザー エージェントに委ねられ、ユーザーに尋ねることで決定してもかまいません。

        ユーザー エージェントは、 SelectSettings アルゴリズムから算出された 適合度距離の値を、 選択アルゴリズムへの入力として使用するべきです。 ただし、ユーザーの選好など、 デバイスについて内部的に利用可能な他の情報も 使用してかまいません

        注記

        これは、非必須 制約の値は保証されないことを意味します。

        ユーザー エージェントには、可能であれば、kind について ユーザーの主要デバイスまたはシステムデフォルトデバイスを デフォルトで使用することが推奨されます。 ユーザーエージェントは、 事前録画されたメディアファイルを含む任意のメディア ソースをユーザーが使用できるようにしてもかまいません

      2. 要求の結果は「granted」です。 OS/プログラム/Web ページのロックなどのハードウェアエラーにより アクセスできない場合、 対応する候補を finalSet から削除します。 finalSetkind 型の候補がない場合、 p を、 name 属性の値が 「NotReadableError」 である新しい DOMException オブジェクトで 拒否し、 この手順を中止します。 それ以外の場合、更新された finalSet を使用してこれらのサブ手順を再開します。

        上記以外の理由でデバイスアクセスに失敗した場合、 対応する候補を finalSet から削除します。 finalSetkind 型の候補がない場合、 p を、name 属性の値が「AbortError」 である新しい DOMException オブジェクトで拒否し、 この手順を中止します。 それ以外の場合、更新された finalSet を使用してこれらのサブ手順を再開します。

      3. grantedDevicefinalCandidate のソースデバイスとします。

      4. grantedDevice の deviceId deviceId を使用して、 mediaDevices.[[devicesLiveMap]][deviceId] がまだ true でなければ true に設定し、 mediaDevices.[[devicesAccessibleMap]][deviceId] がまだ true でなければ true に設定します。

      5. track を、 grantedDevice および mediaDevices を指定して MediaStreamTrack を 作成した結果とします。 MediaStreamTrack のソースは変更してはなりません

      6. trackstream のトラック集合に追加します。

    10. stream 内のすべての トラックに対して適切な制約を指定し、 ApplyConstraints アルゴリズムを実行します。 いずれかが undefined 以外を返した場合、 failedConstraint をその結果とし、 下の 制約失敗 とラベル付けされた手順にジャンプします。

    11. stream 内の各 track について、 track.[[Source]] および mediaDevices を指定して、 トラックソースを MediaDevices に関連付けます

    12. pstream解決し、 この手順を中止します。

    13. NotFound 失敗:

      1. requestedMediaTypes を指定した getUserMedia 固有の失敗が許可されるfalse を返す場合、下の 許可失敗 とラベル付けされた手順にジャンプします。

      2. p を、 name 属性の値が「NotFoundError」 である新しい DOMException オブジェクトで 拒否します。

    14. 制約失敗:

      1. requestedMediaTypes を指定した getUserMedia 固有の失敗が許可されるfalse を返す場合、下の 許可失敗 とラベル付けされた手順にジャンプします。

      2. messageundefined または情報を提供する 人間が読めるメッセージのいずれかとし、 デバイス 情報を公開できるtrue の場合は constraintfailedConstraint とし、それ以外の場合は "" とします。

      3. OverconstrainedError(constraint, message) を呼び出して作成した新しい OverconstrainedErrorp拒否します。

    15. 許可失敗: p を、 name 属性の値が 「NotAllowedError」 である新しい DOMException オブジェクトで拒否します。

  12. p を返します。

requestedMediaTypes を指定して、 getUserMedia 固有の失敗が許可されるかを確認するには、次の手順を実行します:

  1. requestedMediaTypes に "audio" が含まれる場合、 名前が "microphone" である記述子の許可状態を読み取ります。 要求の結果が「denied」 の場合、false を返します。

  2. requestedMediaTypes に "video" が含まれる場合、 名前が "camera" である記述子の許可状態を読み取ります。 要求の結果が「denied」 の場合、false を返します。

  3. true を返します。

注記

上のアルゴリズムでは、制約は 2 回確認されます。1 回目は デバイス選択時、2 回目はアクセス承認後です。これらの確認の間に 時間が経過している可能性があるため、選択されたデバイスが もはや適切でなくなっていることも考えられます。この場合、 NotReadableError が発生します。

デバイス 選択で許可される必須制約には、 次の制約名が含まれます: widthheightaspectRatioframeRatefacingModeresizeModesampleRatesampleSizeechoCancellationautoGainControlnoiseSuppressionlatencychannelCountdeviceIdgroupId

MediaStreamConstraints 辞書は、 getUserMedia() が返す MediaStream に、どのような MediaStreamTrack を含めるかを ユーザーエージェントに指示するために使用されます。

WebIDLdictionary MediaStreamConstraints {
  (boolean or MediaTrackConstraints) video = false;
  (boolean or MediaTrackConstraints) audio = false;
};

辞書 MediaStreamConstraints のメンバー

video(型: (boolean または MediaTrackConstraints)、 デフォルト値: false

true の場合、返される MediaStream に映像トラックを含めるよう要求します。 Constraints 構造が指定された場合、映像トラックの性質と 設定をさらに指定します。false の場合、 MediaStream に 映像トラックを含めてはなりません

audio(型: (boolean または MediaTrackConstraints)、 デフォルト値: false

true の場合、返される MediaStream に音声トラックを含めるよう要求します。 Constraints 構造が指定された場合、 音声トラックの性質と設定をさらに指定します。 false の場合、MediaStream に 音声トラックを含めてはなりません

10.3 旧式の GetUserMedia インターフェイス

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

注記

このセクションにおける getUserMedia() の定義は、当初提案された 呼び出し形式を反映しています。後方互換性を 維持したいブラウザー向けにのみ、ここで文書化されています。推奨される インターフェイスとは 2 つの重要な点で異なります。

第一に、getUserMedia() メソッドの正式な定義と、 開発者に使用が推奨されるものは、現在では MediaDevices にあります。この決定は、 後方互換性のために元の API が Navigator オブジェクトの下でここに引き続き利用可能である限り、 合意を反映したものでした。これは、ワーキンググループが、 これらの API の初期利用者に対し、一般的なブラウザーにおける getUserMedia() の正式な実装の前後どちらでもコードが動作するよう、 getUserMedia を "var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;" と定義するよう推奨されてきたことを認識しているためです。 機能的同等性を確保するため、ここにある getUserMedia() メソッドは MediaDevices の下のメソッドを用いて定義されます。

第二に、仕様内の他のすべてのコールバックベースのメソッドを Promise ベースに変更するという決定により、 navigator.getUserMedia() の定義も navigator.mediaDevices.getUserMedia() の使用に これを反映する必要がありました。navigator.getUserMedia() は現在、 仕様に残る唯一のコールバックベースのメソッドであるため、 a) これがまだ仕様に属するべきかどうか、および b) 属するとした場合、 その構文をコールバックベースのままにするべきか、それとも Promise を使用する何らかの形に変更するべきかについて、現在も議論が続いています。 これらの問題について、特に現在のこの機能の実装を積極的に使用している 開発者からの意見が推奨されます。

コールバックベースの構文から Promise ベースの構文へ変更された 他のメソッドについては、旧来の 使用法を考慮しなければならないほど、いずれの形でも広く実装されているとは 見なされていなかったことに注意してください。

実装は、このインターフェイスを実装しなくても 適合していると見なされます。

10.3.1 インターフェイス定義

WebIDLpartial interface Navigator {
  [SecureContext] undefined getUserMedia(MediaStreamConstraints constraints,
                                    NavigatorUserMediaSuccessCallback successCallback,
                                    NavigatorUserMediaErrorCallback errorCallback);
};
メソッド
getUserMedia

Web カメラまたはその他の 映像もしくは音声入力を使用する許可をユーザーに求めます。

constraints 引数は、 MediaStreamConstraints 型の辞書です。

MediaDevicesgetUserMedia() で説明されているように、ユーザーが有効なトラックを受け入れた場合、 successCallback は適切な MediaStream オブジェクトを引数として呼び出されます。

MediaDevicesgetUserMedia() で説明されているように、有効なトラックの検索に失敗した場合、または ユーザーが許可を拒否した場合、 errorCallback が呼び出されます。

getUserMedia() メソッドが呼び出されたとき、 ユーザーエージェントは次の手順を実行しなければなりません:

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

  2. successCallback を、メソッドの 2 番目の 引数によって示されるコールバックとします。

  3. errorCallback を、メソッドの 3 番目の引数によって 示されるコールバックとします。

  4. constraints を引数として getUserMedia() アルゴリズムで指定された手順を実行し、 p をその結果の promise とします。

  5. p が値 stream履行されたとき、 次の手順を実行します:

    1. stream を引数として successCallback を呼び出します。

  6. p が理由 r拒否されたとき、 次の手順を実行します:

    1. r を引数として errorCallback を 呼び出します。

10.4 実装に関する提案

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

ベストプラクティス 1: リソースの 予約

ユーザーエージェントには、 特定の getUserMedia() の呼び出しが 成功すると判断した時点で、リソースを予約することが推奨されます。 返される promise を解決する前にリソースを予約することが望まれます。 その後の getUserMedia() の呼び出し(このページまたは他の任意のページ)は、 以前に割り当てられたリソース、および他のアプリケーションが保持しているリソースを 使用中として扱うべきです。使用中とマークされたリソースは、 ユーザーが指定しない限り、現在の Web ページにソースとして 提供するべきではありません。任意で、 ユーザーエージェントは、使用中のソースを元とするストリームを 提供することを選択できますが、 そのソースを使用中にしている元のストリームの所有者とオリジンが一致する ページに対してのみです。

この文書では、許可 付与ダイアログまたはデバイス選択インターフェイス(存在する場合)で、 ページによって要求されたストリームのソースとして利用可能な任意のハードウェアを ユーザーが選択できるようにすることを推奨します(そのリソースが 指定された必須制約を満たせることが条件です)。 ベストプラクティスとして特に推奨されているわけではありませんが、一部の ユーザーエージェントは、 映像または音声ソースをローカルファイルや その他のメディアに置き換える機能をサポートする場合があることに注意してください。 ファイル選択ダイアログを使用して、この機能を ユーザーに提供できます。

この文書ではまた、以前の getUserMedia() の呼び出し(この ページまたはまだ存続している他のページ)によって現在使用中のすべてのリソースを ユーザーに表示し、そのストリームを終了させ、 代わりに現在のページでそのリソースを利用できるようにすることを推奨します。 現在の実行環境で可能であれば、他のアプリケーションによって現在保持されている リソースも同様に提示し、扱うことが提案されます。 ユーザーがこの選択肢を選んだ場合、ストリームが影響を受けたページに 提供されていたリソースに対応するトラックは削除されなければなりません。

ベストプラクティス 2: 保存された 許可 s

デバイスに対する許可が要求されたとき、 ユーザーエージェントは、同じオリジンが後で使用するために この許可を保存することを選択できます。これにより、 ユーザーは後で再び許可を与える必要がありません。 各デバイスを個別に、特定のクラスのすべてのデバイスを、または すべてのデバイスを対象として許可を保存する機能を提供するかどうかは ユーザーエージェントの選択です。その選択はユーザーに 明確である必要があり、保存される許可の対象となる集合全体について 許可が与えられていなければなりません。たとえば、すべてのカメラを使用する 許可を保存するには、ユーザーは 1 台だけでなく、すべてのカメラを使用する 許可を与えていなければなりません。

説明したとおり、この仕様では、 許可の付与によって保存された許可が生じるかどうかを 規定しません。許可が保存されない場合、その許可は、そのデバイスをソースとする すべての MediaStreamTrack が停止されるまでのみ有効です。

ベスト プラクティス 3: 複数の デバイスの処理

MediaStream には複数の 映像および音声トラックを含めることができます。これにより、たとえば 2 台以上の Web カメラからの映像を 1 つのストリームオブジェクトに 含めることができます。ただし、現在の API では、独立したソースからの 複数の映像ストリームが必要であることをページが表現することはできません。

同じページから getUserMedia() を複数回呼び出すことを、 ページが複数の個別の映像および/または音声ストリームを要求する手段として 許可することが推奨されます。

また、ページが複数の getUserMedia() 呼び出しを行う場合、 それらがリソースを要求する順序、および完了する順序は、 この仕様によって制約されないことにも注意してください。

getUserMedia() の 1 回の呼び出しは、 常に 0 または 1 個の音声トラックと、0 または 1 個の 映像トラックを持つストリームを返します。スクリプトが安定状態に達する前に getUserMedia() を複数回呼び出す場合、 この文書では UI 設計者に対し、許可ダイアログを統合して、 ユーザーが複数のカメラおよび/またはメディアソースの使用許可を 1 回のダイアログ操作で与えられるようにすることを助言します。 各 getUserMedia 呼び出しの制約を使用して、どのストリームがどの メディアソースを取得するかを決定できます。

ベストプラクティス 4: deviceId の生成

deviceId を生成する効率的な 方法は、秘密鍵 +(ユーザー エージェントのパーティショニング規則に基づく、オリジンまたはオリジン + トップレベルオリジン) + salt + ドライバー内のデバイスの基礎となる(ハードウェア)ID から 暗号学的ハッシュを生成し、その結果のハッシュを英数字文字列として提示することです。 衝突のリスクを避けるため、ハッシュには 32 ビット以下を使用することが推奨されますが、 それより大幅に少なくすることは推奨されません。

ストレージを消費する代わりに エントロピーを低くする方法として、ユーザーエージェントのパーティショニング規則に基づいて、 各オリジンまたはオリジン + トップレベルオリジンで新しく検出された各 デバイスに 0 から 255 の番号をランダムに割り当て、番号が尽きた場合には 最も長期間確認されていない番号を廃止する方法があります。

ベスト プラクティス 5: ユーザーエージェントによって開始されるデバイスのミュート

カメラまたはマイクをソースとするトラックは、 ユーザーのプライバシーを管理するため、 ユーザーエージェントによっていつでも 強制的にミュートされる場合があります。ただし、これを行うと Web 互換性の問題が生じたり、ユーザーのアクティビティに関する情報が漏洩したりする可能性があるため、 注意が必要です。

ベストプラクティスは、次の 場合にカメラまたはマイクのトラックを ミュートすることです:

  • ユーザーエージェントがすでに メディア再生を全体的に一時停止する OS レベルのイベントが発生したが、 JavaScript は一時停止されない場合。理由は、 この状況でキャプチャが継続すると(ユーザーが意図的にそのように 構成している場合を除き)、ユーザーが驚く可能性があるためです。 OS レベルのイベントによってすでにトラックへのフレーム入力が 停止する場合、これによって新たなユーザーアクティビティ情報が公開されることはありません。 そうでない場合であっても、キャプチャが終了することを公開することは、 ユーザーを驚かせる可能性のある状況でキャプチャを継続することと比べれば、 妥当なプライバシー上のトレードオフと考えられます。

  • 表示中でない Web ページが、そのソースからのすべてのトラックが 無効であるときにトラックを 再び有効にした場合、 ページが表示中になるまで キャプチャの再開を遅らせるため。

ベストプラクティスは、次の 場合に、以前 ミュートしたカメラまたはマイクのトラックを ミュート解除することです:

  • ユーザーエージェントがすでにメディア 再生を全体的に再開する OS レベルのイベントが発生し、かつページがユーザーに 表示されている場合(たとえばロック画面中ではない場合)。 ユーザーエージェントは、 以前のキャプチャセッションに対するユーザーの認識が損なわれるほど 長い時間が経過したと判断した場合、このような動作を延期してもかまいません。

  • Web ページが表示中になり、 かつ ミュートされている 有効なトラックが 1 つ以上ある場合。

11. Constrainable パターン

Constrainable パターンにより、アプリケーションは、それを実装する オブジェクト(制約可能な オブジェクト)のプロパティを調べて調整できます。これは、他の仕様から 参照できるように、独立した定義の集合として分離されています。中心となる概念は Capability であり、オブジェクトの制約可能なプロパティと、 その可能な値の集合から構成されます。値は、範囲または列挙として 指定できます。たとえば、カメラは、1 秒あたり 20 から 50 フレームの フレームレート(プロパティ)に対応でき(範囲)、ユーザーの方、 ユーザーとは反対の方、またはユーザーの左または右を向くように 配置(プロパティ)できる場合があります(列挙集合)。アプリケーションは、 getCapabilities() アクセサーを介して、制約可能なプロパティで サポートされる Capabilities を調べることができます。

アプリケーションは、基本および/または高度な ConstraintSet と applyConstraints() メソッドを使用して、オブジェクトの Capabilities に望む値(の範囲)を選択できます。ConstraintSet は、 オブジェクトの 1 つ以上のプロパティ名と、それぞれのプロパティに対する 望ましい値(または望ましい値の範囲)から構成されます。それぞれの プロパティ/値の組は、個別の制約と見なすことができます。たとえば、 アプリケーションは 2 つの制約を含む ConstraintSet を設定できます。1 つ目は カメラのフレームレートが 1 秒あたり 30 から 40 フレームの間であること (範囲)、2 つ目はカメラがユーザーの方を向いていること (特定の値)です。個々の制約がどのように相互作用するかは、 追加の 'advanced' プロパティを持つ ConstraintSet である基本 Constraint 構造で それらが指定されるか、その指定方法、または advanced リスト内の ConstraintSet に含まれるかによって異なります。動作は次のとおりです。基本 Constraint 構造内の すべての 'min'、'max'、および 'exact' 制約はまとめて必須制約として扱われ、指定された プロパティ名について、これらの個々の制約をすべて同時に 満たすことができない場合、ユーザーエージェントは返される promise を拒否なければなりません。 それ以外の場合、必須制約を適用しなければなりません。次に、 advanced リストに 指定された順序で与えられた ConstraintSet を検討し、それぞれの完全な ConstraintSet(すなわち ConstraintSet 内のすべての制約をまとめて)を満たして/適用しようとしますが、 その ConstraintSet 全体を満たして/適用できない場合に限り、それをスキップします。次に、 ユーザーエージェントは、各 'ideal' 制約またはプロパティに 裸の値として指定された制約(任意の基本制約と呼ばれる)を 個別に適用しようとしなければなりません。 これらのプロパティのうち、任意の順序で、可能な限り最大数を 満たさなければなりません。最後に、ユーザーエージェントは返される promise を解決なければなりません

注記
この API を介して提供される制約は、指定された 制約可能なプロパティが ユーザーエージェントでサポートされている場合にのみ考慮されます。 JavaScript アプリケーションコードは、まず getSupportedConstraints() を介して、使用する名前付きプロパティが すべて ユーザーエージェントでサポートされていることを確認することが期待されます。 その理由は、WebIDL が、制約を保持する辞書から サポートされていない名前を削除するため、 ユーザーエージェントにはそれらが見えず、サポートされていない名前が 暗黙に無視される結果となるからです。これにより、JavaScript コードが制約を 設定しているにもかかわらず、ユーザーエージェントが それらを無視するため、混乱を招くプログラミングエラーが発生します。 必須制約の名前をサポート(認識)している ユーザーエージェントがそれを満たせない場合はエラーを生成しますが、 制約可能なプロパティをサポートしていない ユーザーエージェントは エラーを生成しません。

次の例は、制約がどのように機能するかを理解する助けになるでしょう。 最初の例は基本 Constraint 構造を示しています。3 つの制約が指定され、 ユーザーエージェントはそれぞれを個別に満たそうとします。このカメラで 利用可能な解像度によっては、3 つの制約すべてを同時に 満たせない可能性があります。その場合、ユーザーエージェントは、 可能であれば 2 つを満たし、2 つすら同時に満たせない場合は 1 つだけを満たします。 3 つすべてを同時に満たせない場合、 満たすことのできる 2 つの制約の組み合わせが複数存在する場合があることに注意してください。 その場合、ユーザーエージェントが 選択します。

const stream = await navigator.mediaDevices.getUserMedia({
  video: {
    width: 1280,
    height: 720,
    aspectRatio: 3/2
  }
});

次の例では、少し複雑さが増します。width と height には 引き続き ideal 値が指定されていますが、今回はそれぞれに最小要件があり、 さらに満たさなければならない最小 frameRate もあります。frameRate、width、 または height の最小値を満たせない場合、promise を拒否します。 それ以外の場合、width、height、および aspectRatio の目標値も満たそうとし、その後 promise を解決します。

try {
  const stream = await navigator.mediaDevices.getUserMedia({
    video: {
      width: {min: 640, ideal: 1280},
      height: {min: 480, ideal: 720},
      aspectRatio: 3/2,
      frameRate: {min: 20}
    }
  });
} catch (error) {
  if (error.name != "OverconstrainedError") {
    throw error;
  }
  // 制約過多。 別の 組み合わせで 再試行 します (プロンプトは 表示されて いません)
}

この例では、'advanced' プロパティを追加することで、 Constraints 構造で可能な完全な制御を示しています。この場合、 ユーザーエージェントは 必須制約については同じように動作しますが、ideal 値を 満たそうとする前に 'advanced' リストを処理します。この例では 'advanced' リストに 2 つの ConstraintSet が含まれています。1 つ目は width と height の制約を指定し、2 つ目は aspectRatio 制約を指定します。advanced リストでは、これらの裸の値が 'exact' 値として扱われることに注意してください。この例は次の要求を表します。「映像は 少なくとも幅 640 ピクセル、高さ 480 ピクセルである必要があります。 希望は正確に 1920x1280 ですが、それが無理なら、 可能であれば aspectRatio を 4x3 にしてください。それすら 無理なら、1280x720 にできるだけ近い解像度にしてください。」

try {
  const stream = await navigator.mediaDevices.getUserMedia({
    video: {
      width: {min: 640, ideal: 1280},
      height: {min: 480, ideal: 720},
      frameRate: {min: 30},
      advanced: [
        {width: 1920, height: 1280},
        {aspectRatio: 4/3},
        {frameRate: {min: 50}},
        {frameRate: {min: 40}}
      ]
    }
  });
} catch (error) {
  if (error.name != "OverconstrainedError") {
    throw error;
  }
  // 制約過多。 別の 組み合わせで 再試行 します (プロンプトは 表示されて いません)
}

高度な ConstraintSet の順序には意味があります。前の 例では、1920x1280 の ConstraintSet と 4x3 アスペクト比の ConstraintSet を同時に満たすことは不可能です。 1920x1280 がリスト内で先に現れるため、ユーザーエージェントはそれを最初に満たそうとします。 したがってアプリケーション作成者は、同じプロパティに対して複数の高度な ConstraintSet を指定することで、バックオフ戦略を実装できます。 アプリケーションはさらに 2 つの高度な ConstraintSet を指定しており、 1 つ目は 50 を超えるフレームレートを要求し、2 つ目は 40 を超えるフレームレートを要求します。 ユーザーエージェントが 50 を超えるフレームレートを設定できる場合、 そうします(その後の ConstraintSet は自明に満たされます)。 ただし、ユーザーエージェントがフレームレートを 50 より上に設定できない場合、 その ConstraintSet をスキップし、40 より上に設定しようとします。 ユーザーエージェントが 2 つの ConstraintSet のどちらも満たせない場合、 基本 ConstraintSet の 'min' 値によって、下限は 30 であると要求されます。 言い換えると、ユーザーエージェントは 30 を超える値を得られなければ完全に失敗しますが、 可能であれば 50 を超える値を選択し、その次に 40 を超える値を試します。

基本制約とは異なり、advanced リスト内の ConstraintSet 内の制約は、まとめて満たされるか、まとめて スキップされなければならないことに注意してください。したがって、{width: 1920, height: 1280} は その特定の解像度を要求するものであり、その width またはその height の どちらかを要求するものではありません。基本制約は、個々の制約の 'or'(非排他的)を要求するものと考えることができ、一方、 各高度な ConstraintSet は ConstraintSet 内の個々の制約の 'and' を要求します。アプリケーションは getConstraints() アクセサーを介して、現在有効な Constraints の 完全な集合を調べることができます。

ユーザーエージェントが制約可能な プロパティについて選択する具体的な値は Setting と呼ばれます。たとえば、 アプリケーションが frameRate は少なくとも 1 秒あたり 30 フレーム、 かつ 40 以下でなければならないと指定する ConstraintSet を適用した場合、 Setting は、たとえば 1 秒あたり 32、35、37 フレームなど、 その間の任意の値になり得ます。アプリケーションは、 getSettings() アクセサーを介して、オブジェクトの制約可能なプロパティの現在の設定を照会できます。

11.1 インターフェイス定義

この仕様では正式には ConstrainablePattern を WebIDL インターフェイスとして定義していますが、実際には 他のインターフェイスのための テンプレートまたはパターンであり、メソッドの戻り値を拡張する必要があるため、 直接継承することはできません。これは WebIDL ではできません。したがって、ここで定義された機能を利用したい 各インターフェイスは、ここで示される関数およびインターフェイスの WebIDL を独自に複製して提供する必要があります。ただし、変更されない ここで定義された意味論を参照できます。この例については MediaStreamTrack インターフェイス 定義を参照してください。

このパターンは、制約可能なオブジェクトが 3 つの 内部スロットを定義することに依存します:

  1. [[Capabilities]] 内部 スロット。これは、 Capabilities で説明されているように、 公開される各制約可能なプロパティについて許容される値の集合全体を記述する Capabilities 辞書に初期化され、存在しない場合は空の 辞書に初期化されます。

  2. [[Constraints]] 内部 スロット。空の Constraints 辞書に初期化されます。

  3. [[Settings]] 内部スロット。 これは、 Settings で説明されているように、 公開される各制約可能なプロパティについて現在アクティブな 設定値を記述する Settings 辞書に初期化され、存在しない場合は空の 辞書に初期化されます。

テンプレート:
WebIDL[Exposed=Window]
interface ConstrainablePattern {
  Capabilities  getCapabilities();
  Constraints   getConstraints();
  Settings      getSettings();
  Promise<undefined> applyConstraints(optional Constraints constraints = {});
};

メソッド

getCapabilities

getCapabilities() メソッドは、オブジェクトがサポートする制約可能な プロパティ名の辞書を返します。呼び出されたとき、 ユーザーエージェント[[Capabilities]] 内部 スロットの値を返さなければなりません

注記

基礎となるハードウェアが、制約可能なプロパティに対して 定義された範囲に正確には対応しない場合があります。 その可能性がある場合、そのエントリでは、ハードウェア設定を プロパティに対して定義された値に変換し、 スケーリングする方法を定義するべきです。 たとえば、仮想的な fluxCapacitance プロパティが -10(min)から 10(max)までの範囲を持つ一方で、 一般的なハードウェアデバイスが "off"、"medium"、"full" の値しかサポートしないとします。 制約可能なプロパティの定義では、そのようなハードウェアについて、 ユーザーエージェントが 範囲値 -10 を "off"、10 を "full"、0 を "medium" に対応付けるべきであると指定できます。また、 3 という厳密な値を課す ConstraintSet が指定された場合、 ユーザーエージェントは ハードウェア上で "medium" の値を設定しようとするべきであり、 getSettings() は fluxCapacitance として 0 を返すべきであることも 示せます。これは、それが "medium" に対応する値として 定義されているためです。

getConstraints

getConstraints() メソッドは、 オブジェクトに対する ApplyConstraints アルゴリズムの直近の成功した呼び出しへの引数であった Constraints を、 指定された順序を維持して返します。 返される高度な ConstraintSet の一部は現在 満たされていない場合があることに注意してください。どの ConstraintSet が現在有効かを確認するには、 アプリケーションは getSettings を使用するべきです。 上記のとおり正確な制約を返す代わりに、UA は、 適用された制約とあらゆる状況で同一の効果を持つ 制約集合を返してもかまいません。 呼び出されたとき、ユーザーエージェント[[Constraints]] 内部スロットの値を 返さなければなりません

getSettings

getSettings() メソッドは、 オブジェクトのすべての制約可能なプロパティの現在の 設定を、それらがプラットフォームのデフォルトであるか ApplyConstraints アルゴリズムによって設定されたかにかかわらず返します。 設定は制約に適合する 目標値であるため、場合によっては測定された性能と 異なる可能性があることに注意してください。呼び出されたとき、ユーザー エージェントは [[Settings]] 内部スロットの値を返さなければなりません

applyConstraints

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

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

  2. newConstraints を、この メソッドへの引数とします。

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

  4. このメソッドが複数回呼び出された場合には呼び出し順序を維持しつつ、 次の手順を並列に実行します:

    1. failedConstraint を、 newConstraints を引数として ApplyConstraints アルゴリズムを実行した結果とします。

    2. successfulSettings を、上記の手順のアルゴリズムが 完了した後の object の現在の設定とします。

    3. 次の手順を実行するタスクをキューに入れます:

      1. failedConstraintundefined でない場合、 messageundefined または 情報を提供する人間が読めるメッセージのいずれかとし、 OverconstrainedError(failedConstraint, message) を呼び出して作成した 新しい OverconstrainedErrorp拒否し、 この手順を中止します。この場合、既存の制約は有効なままです。

      2. object[[Constraints]] 内部スロットを newConstraints または newConstraints とあらゆる状況で 同一の効果を持つ Constraints 辞書に設定します。

      3. object[[Settings]] 内部スロットを successfulSettings に設定します。

      4. pundefined解決します。

  5. p を返します。

制約を適用するための ApplyConstraints アルゴリズムを以下に示します。ここでは、アルゴリズムの記述で 使用される予備的な定義をいくつか示します:

オブジェクトに設定として適用され得る値の集合を指すため、 設定辞書という用語を使用します。

文字列値の制約について、以下では、シーケンス内の値の 1 つが 比較対象の値と正確に同じである場合に "==" を true と定義します。

設定辞書と制約集合 CS の間の適合度距離を、 CS 内に存在する 各メンバー(constraintNameconstraintValue の組で表される) について、次の値の合計として定義します:

  1. constraintNameユーザーエージェントによってサポートされていない場合、 適合度距離は 0 です。

  2. 制約が必須であり (constraintValue が 'min'、'max'、または 'exact' という名前のメンバーを 1 つ以上含むか、 または高度な ConstraintSet 内でそれ自体が裸の値である)、 設定 辞書constraintName メンバーの値が制約を満たさないか、 存在しない場合、 適合度距離は 正の無限大です。

  3. この種類のオブジェクトに制約が適用されない場合、 適合度距離は 0 です(すなわち、その制約は 適合度距離に影響しません)。

  4. constraintValue が boolean である一方、 制約可能なプロパティがそうでない場合、適合度距離は、 設定 辞書constraintName メンバーが存在するかどうかに基づき、 次の式から求められます

    (constraintValue == exists) ? 0 : 1
  5. 設定 辞書constraintName メンバーが存在しない場合、 適合度距離は 1 です。

  6. ideal 値が指定されていない場合(constraintValue が 'ideal' という名前のメンバーを含まないか、裸の値を 'ideal' として扱う場合に裸の値でない場合)、適合度距離は 0 です。
  7. すべての正の数値制約(height、width、frameRate、 aspectRatio、sampleRate、sampleSize など)について、適合度距離は 次の式の結果です
    (actual == ideal) ? 0 : |actual - ideal| / max(|actual|, |ideal|)
  8. すべての文字列、enum、および boolean 制約(たとえば deviceId、groupId、facingMode、resizeMode、echoCancellation)について、 適合度距離は次の式の結果です
    (actual == ideal) ? 0 : 1

その他の定義:

  • ConstraintSet の各要素(特別な用語 'advanced' を除く)を「制約」と呼びます。これは、 ConstrainablePattern オブジェクトの対応する Capability に示された完全なリストまたは範囲から、 指定された範囲または値リスト内の値へ、 指定されたプロパティの許容可能な設定を制限することを 意図しているためです。
  • オブジェクト O の「有効な Capability」C とは、 環境上の制限および/または他の制約によって課された 制限を考慮した、C の可能な値(getCapabilities から返される)の 真部分集合である場合もある集合を指します。たとえば、aspectRatio、 height、および width プロパティを制約する ConstraintSet がある場合、 そのうち 2 つのプロパティに割り当てられた値によって、 3 つ目の有効な Capability が制限されます。有効な Capability の集合は プラットフォームに依存する場合があります。たとえば、リソースが制限された デバイスでは、プロパティ P1 と P2 の両方を 'high' に設定できない場合がありますが、より制限の少ない別のデバイスでは 可能な場合があります。
  • オブジェクト O の制約可能なプロパティの値の集合である設定辞書は、 その集合と CS の間の適合度距離が 無限大より小さい場合、ConstraintSet CS を満たします。
  • ConstraintSet の集合 CS1...CSn(n >= 1)は、 CS1...CSn を同時に満たす O の設定 辞書を見つけることが可能な場合、オブジェクト O によって 満たすことができます。
  • ConstraintSet の集合 CS1...CSn をオブジェクト O に適用するとは、 CS1...CSn を満たすそのような値のシーケンスを選択し、 それらを O のプロパティの設定として割り当てることです。

SelectSettings アルゴリズムを次のように 定義します:

  1. 制約は、そのプロパティについて 1 つ以上の 値(または値の範囲)を指定します。プロパティは 'advanced' ConstraintSet のリスト内に複数回現れてもかまいません。 制約の値として空のリストが指定された場合、それは 制約が指定されていないかのように解釈されなければなりません (言い換えると、空の制約 == 制約なし)。

    未知のプロパティは WebIDL によって破棄されるため、 未知/サポートされていない必須制約は暗黙に消えることに注意してください。 これが意外な動作にならないよう、アプリケーション作成者はまず、 以下の例に示すように getSupportedConstraints() メソッドを使用することが期待されます。

  2. object を、このアルゴリズムが適用される ConstrainablePattern オブジェクトとします。copy を、object の制約なしの コピーとします(すなわち、copy は、すべての ConstraintSet が 削除された object であるかのように動作するべきです)。
  3. copy の可能なすべての 設定 辞書について、その適合度 距離を計算し、プロパティの裸の値を ideal 値として扱います。 candidates を、適合度距離が有限である 設定辞書の集合とします。

  4. candidates が空の場合、 SelectSettings アルゴリズムの結果として undefined を返します。

  5. newConstraints 内の 'advanced' ConstraintSet を、 指定された順序で反復処理します。各 ConstraintSet について:
    1. それと candidates 内の各設定辞書との 適合度 距離を計算し、プロパティの裸の値を exact として扱います。

    2. candidates 内の 1 つ以上の 設定辞書について適合度距離が有限である場合、それらの 設定辞書を candidates に保持し、 その他を破棄します。

      candidates 内のすべての設定 辞書について適合度距離が無限大である場合、この ConstraintSet を無視します。

  6. candidates から 1 つの設定辞書を選択し、 SelectSettings アルゴリズムの結果として返します。 ユーザーエージェントは、 ステップ 3 で計算された 適合度距離が最小のものを 使用しなければなりません。複数の設定辞書が 最小の適合度距離を持つ場合、 ユーザーエージェントは、 システムのデフォルトプロパティ値および ユーザーエージェントの デフォルトプロパティ値に基づいて、そのうち 1 つを選択します。

選択されたデバイスについてシステムデフォルト値を持つすべてのプロパティでは、 上記のアルゴリズムと互換性がある場合、そのシステムデフォルト 値を使用するべきです。これは通常、 sampleRatesampleSize などのプロパティで該当します。 echoCancellationresizeMode などの他のプロパティには、 通常、システムデフォルト値がありません。 ユーザーエージェントは、 これらのプロパティについて独自のデフォルト値を定義します。 これらはメディアコンテンツの生成方法にしばしば影響するため、 実装者は適切なデフォルト値を選択する際に注意する必要があります。

注記

意味のあるデフォルト値を選択するため、 既存の実装を確認することが推奨されます。 デフォルト値はシステムによって、たとえばデスクトップと モバイルで異なる場合があることに注意してください。 執筆時点では、ユーザーエージェントの 実装は、RTCPeerConnection をシンクとして使用するのに適していることから選ばれた、 次のデフォルト値を使用する傾向があります:

  1. width を 640 に設定。

  2. height を 480 に設定。

  3. frameRate を 30 に設定。

  4. echoCancellationtrue に設定。

newConstraints を引数として objectApplyConstraints アルゴリズムを適用するには、 ユーザーエージェントは 次の手順を実行しなければなりません:

  1. successfulSettings を、 newConstraints を制約集合として SelectSettings アルゴリズムを実行した結果とします。

  2. successfulSettingsundefined の場合、 failedConstraint を、 SelectSettings アルゴリズムの実行中に調べた すべての設定辞書について適合度距離が無限大であった 必須制約のいずれかとするか、 そのようなものがない場合は "" とし、 その後 failedConstraint を返して この手順を中止します。

  3. 単一の操作で、object から既存の制約を削除し、 newConstraints を適用し、 successfulSettings を現在の設定として適用します。
  4. undefined を返します。
注記

UA が、たとえばトラックが ミュートされているために デバイスを解放した場合、 設定を適用することはデバイス構成を変更することを意味しません。 代わりに、UA がデバイスを再取得するとき、 たとえばトラックが ミュート解除されたときに、 UA はトラック設定と一致するようデバイスを構成します。

注記

上記のアルゴリズムと同じ結果になる実装であれば、 どのような実装も許可されます。たとえば、 実装は、設定について可能なすべての値を 追跡する代わりに、検討された制約の下で許容される 設定の最大値と最小値を追跡することを選択できます。

注記

設定辞書を選択するとき、UA は利用可能な任意の 情報を使用できます。そのような情報の例には、 選択が getUserMedia におけるデバイス選択の一部として行われるか、 カメラのエネルギー使用量が設定辞書間で異なるか、 または設定辞書を使用することでデバイスドライバーが リサンプリングを適用することになるかどうか、などがあります。

ユーザーエージェントは、 オブジェクトの制約可能なプロパティに対していつでも新しい設定を 選択してもかまいません。その場合、上記のアルゴリズムで説明した方法で 現在のすべての Constraints を満たそうとしなければならずsuccessfulSettings を結果として得られた新しい設定とし、 次の手順を実行するタスクをキューに入れます:

  1. object を、 1 つ以上の制約可能なプロパティの新しい設定が変更された ConstrainablePattern オブジェクトとします。

  2. object[[Settings]] 内部 スロットを successfulSettings に設定します。

applyConstraints() に渡すことができる、または constraints の値として返すことのできる Constraints の例を以下に示します。これは、 カメラをソースとする MediaStreamTrack に対して定義された 制約可能なプロパティを使用しています。この例では、 すべての制約が ideal 値であり、結果はユーザーの特定のカメラに基づく 「ベストエフォート」であることを意味します:

await track.applyConstraints({
  width: 1920,
  height: 1080,
  frameRate: 30,
});
const {width, height, frameRate} = track.getSettings();

console.log(`${width}x${height}x${frameRate}`); // 1920x1080x30、またはたとえば次のようになる場合があります
                                                // ベストエフォートとして 1280x720x30

より細かな制御のため、アプリケーションは失敗を処理する準備があることを条件として、 正確な一致を要求できます:

try {
  await track.applyConstraints({
    width: {exact: 1920},
    height: {exact: 1080},
    frameRate: {min: 25, ideal: 30, max: 30},
  });
  const {width, height, frameRate} = track.getSettings();

  console.log(`${width}x${height}x${frameRate}`); // 1920x1080x25-30!

} catch (error) {
  if (error.name != "OverconstrainedError") {
    throw error;
  }
  console.log(`This camera cannot produce the requested ${error.constraint}.`);
}

Constraints は、初期化上の利便性だけでなくデバイス選択に影響を与えるために、 getUserMedia にも渡すことができます。 この場合、 固有の制約 も利用できます。

以下は、以前の訪問時に使用した特定の カメラとマイクを優先し、寸法の要件とステレオの優先設定を指定し、 許可された後に適用し、要求されたデバイスが 利用できなくなった場合(または一部のユーザーエージェントではユーザーによって上書きされた場合)に 適切な代替デバイスを見つけるのに役立てるために制約を使用する例です。

try {
  const stream = await navigator.mediaDevices.getUserMedia({
    video: {
      deviceId: localStorage.camId,
      width: {min: 800, ideal: 1024, max: 1280},
      height: {min: 600}
    },
    audio: {
      deviceId: localStorage.micId,
      channelCount: 2
    }
  });

  // 許可されました。 次回のために deviceId  保存します
  localStorage.camId = stream.getVideoTracks()[0].getSettings().deviceId;
  localStorage.micId = stream.getAudioTracks()[0].getSettings().deviceId;

} catch (error) {
  if (error.name != "OverconstrainedError") {
    throw error;
  }
  // 制約過多。 適切な 代替デバイスが 見つかりませんでした
}
注記

上の例では {exact: deviceId} の使用を避けているため、 ブラウザーは、ユーザーの選好やデバイスが存在しないことなど、 デバイスについて内部的に利用可能な情報を、指定された deviceId より優先して使用できます。

この例ではまた、新しい選択を表している場合に備えて、 許可のたびに deviceId を保存します。

これとは対照的に、以下は制約を使用して コンテンツ内のカメラピッカーを実装する例です。この場合、exact を使用し、 ユーザーが選択肢の一覧から選んだ deviceId のみに依存します:

async function switchCameraTrack(freshlyChosenDeviceId, oldTrack) {
  if (isMobile) {
    oldTrack.stop(); // 一部のプラットフォームでは一度に 1 台のカメラしか開けません。
  }
  const stream = await navigator.mediaDevices.getUserMedia({
    video: {
      deviceId: {exact: freshlyChosenDeviceId}
    }
  });
  const [track] = stream.getVideoTracks();
  localStorage.camId = track.getSettings().deviceId;
  return track;
}

以下は、スマートフォンの背面カメラを、理想的には 720p で要求しつつ、 それに近いものであれば受け入れる例です。寸法に対する制約が 横向きモードで指定されていることに注意してください:

async function getBackCamera() {
  return await navigator.mediaDevices.getUserMedia({
    video: {
      facingMode: {exact: 'environment'},
      width: 1280,
      height: 720
    }
  });
}

以下は、「720p に近いネイティブの 16:9 解像度がほしいが、 ネイティブで利用できなくてもフレームレートは正確に 10 にしたい」という例です。 これは 2 段階で行う必要があります。1 つ目はネイティブモードを検出し、 2 つ目はカスタムフレームレートを適用します。また、 回転している可能性のある現在の設定から 制約を導出する方法も示しています:

async function nativeResolutionButDecimatedFrameRate() {
  const stream = await navigator.mediaDevices.getUserMedia({
    video: {
      resizeMode: 'none', // ネイティブの解像度とフレームレートを意味します
      width: 1280,
      height: 720,
      aspectRatio: 16 / 9 // アスペクト比は完全に正確ではない場合があります
    }
  });
  const [track] = stream.getVideoTracks();
  const {width, height, aspectRatio} = track.getSettings();

  // 制約は横向きですが、設定は回転(縦向き)している場合があります
  if (width < height) {
    [width, height] = [height, width];
    aspectRatio = 1 / aspectRatio;
  }

  await track.applyConstraints({
    resizeMode: 'crop-and-scale',
    width: {exact: width},
    height: {exact: height},
    frameRate: {exact: 10},
    aspectRatio,
  });

  return stream;
}
注記
上の例は、主方向 が横向きであると仮定しています。

以下は、 getSupportedConstraints の使用方法を示す例です。ユーザーエージェントでのサポート不足により制約が 無視されることをアプリケーションが許容しない場合に使用します:

async function getFrontCameraRes() {
  const supports = navigator.mediaDevices.getSupportedConstraints();

  for (const constraint of ["facingMode", "aspectRatio", "resizeMode"]) {
    if (!(constraint in supports) {
      throw new OverconstrainedError(constraint, "Not supported");
    }
  }
  return await navigator.mediaDevices.getUserMedia({
    video: {
      facingMode: {exact: 'user'},
      advanced: [
        {aspectRatio: 16/9, height: 1080, resizeMode: "none"},
        {aspectRatio: 4/3, width: 1280, resizeMode: "none"}
      ]
    }
  });
}

11.2 制約の型

有効な入力集合を指定する構文は、 値の型に依存します。標準的なアトミック型 (boolean、long、double、DOMString)に加えて、有効な値には 以下で定義する任意のアトミック型のリスト、および min-max 範囲が含まれます。

リスト値は選言として解釈されなければなりません。たとえば、 カメラのプロパティ 'facingMode' が、有効な値として ["left", "right", "user", "environment"] を持つよう定義されている場合、 これは 'facingMode' が "left"、"right"、"environment"、および "user" の 値を取れることを意味します。同様に、 'facingMode' を ["user", "left", "right"] に制限する Constraints は、 ユーザーエージェントが、"facingMode" が "user"、"left"、または "right" のいずれかになるようにカメラを選択する (可能であればカメラを向ける)べきであることを意味します。 したがってこの Constraint は、カメラがユーザーとは反対の方を向かないよう要求しますが、 ユーザーエージェントが ユーザーに他の方向を選択させることは許可します。

WebIDLdictionary DoubleRange {
  double max;
  double min;
};

辞書 DoubleRange のメンバー

max(型: double

このプロパティの有効な最大値です。

min(型: double

このプロパティの最小値です。

WebIDLdictionary ConstrainDoubleRange : DoubleRange {
  double exact;
  double ideal;
};

辞書 ConstrainDoubleRange のメンバー

exact(型: double

このプロパティに必須の正確な値です。

ideal(型: double

このプロパティの理想的な(目標)値です。

WebIDLdictionary ULongRange {
  [Clamp] unsigned long max;
  [Clamp] unsigned long min;
};

辞書 ULongRange のメンバー

max(型: unsigned long

このプロパティの有効な最大値です。

min(型: unsigned long

このプロパティの最小値です。

WebIDLdictionary ConstrainULongRange : ULongRange {
  [Clamp] unsigned long exact;
  [Clamp] unsigned long ideal;
};

辞書 ConstrainULongRange のメンバー

exact (型: unsigned long

このプロパティに必須の正確な値です。

ideal (型: unsigned long

このプロパティの理想的な(目標)値です。

WebIDLdictionary ConstrainBooleanParameters {
  boolean exact;
  boolean ideal;
};

辞書 ConstrainBooleanParameters のメンバー

exact(型: boolean

このプロパティに必須の正確な値です。

ideal(型: boolean

このプロパティの理想的な(目標)値です。

WebIDLdictionary ConstrainDOMStringParameters {
  (DOMString or sequence<DOMString>) exact;
  (DOMString or sequence<DOMString>) ideal;
};

辞書 ConstrainDOMStringParameters のメンバー

exact(型: (DOMString または sequence<DOMString>)

このプロパティに必須の正確な値です。

ideal(型: (DOMString または sequence<DOMString>)

このプロパティの理想的な(目標)値です。

WebIDLdictionary ConstrainBooleanOrDOMStringParameters {
  (boolean or DOMString) exact;
  (boolean or DOMString) ideal;
};

辞書 ConstrainBooleanOrDOMStringParameters のメンバー

exact(型: boolean または DOMString

このプロパティに必須の正確な値です。

ideal(型: boolean または DOMString

このプロパティの理想的な(目標)値です。

WebIDLtypedef ([Clamp] unsigned long or ConstrainULongRange) ConstrainULong;
この仕様全体を通して、識別子 ConstrainULong([Clamp] unsigned long or ConstrainULongRange) 型を指すために使用されます。
WebIDLtypedef (double or ConstrainDoubleRange) ConstrainDouble;
この仕様全体を通して、識別子 ConstrainDouble(double or ConstrainDoubleRange) 型を指すために使用されます。
WebIDLtypedef (boolean or ConstrainBooleanParameters) ConstrainBoolean;
この仕様全体を通して、識別子 ConstrainBoolean(boolean or ConstrainBooleanParameters) 型を指すために使用されます。
WebIDLtypedef (DOMString or
         sequence<DOMString> or
         ConstrainDOMStringParameters) ConstrainDOMString;
この仕様全体を通して、識別子 ConstrainDOMString(DOMString or sequence<DOMString> or ConstrainDOMStringParameters) 型を指すために使用されます。
WebIDLtypedef (boolean or DOMString or ConstrainBooleanOrDOMStringParameters) ConstrainBooleanOrDOMString;
この仕様全体を通して、識別子 ConstrainBooleanOrDOMString(boolean or DOMString or ConstrainBooleanOrDOMStringParameters) 型を指すために使用されます。

11.3 能力

Capabilities は、1 つ以上の キーと値の組を含む辞書であり、各キーは制約可能なプロパティで なければならず、 各値はそのプロパティに許可される値の集合の部分集合で なければなりません。値の式の正確な構文は プロパティの型に依存します。Capabilities 辞書は、 制約可能な オブジェクトに制約として適用できる制約可能なプロパティを指定します。 制約可能なオブジェクトの Capabilities は、Web プラットフォームで定義されたプロパティの部分集合であり、 それらのプロパティについて設定された値の部分集合であってもかまいません。 Capabilities は ユーザーエージェントからアプリケーションへ返され、 アプリケーションから指定することはできないことに注意してください。ただし、 アプリケーションは Constraints によって、 ユーザーエージェントが制約可能なプロパティについて選択する Settings を制御できます。

Capabilities 辞書の例を以下に示します。この場合、 制約可能なオブジェクトは、非常に限定された Capabilities の集合を持つ映像ソースです。

{
  frameRate: {min: 1.0, max: 60.0},
  facingMode: ['user', 'left']
}

次の例は、範囲値の能力が、組み合わせではなく 個々の制約可能なプロパティについて範囲を提供することを示しています。 width と height の範囲が別々に報告されるため、 これは特に映像の width と height に関係します。例で、 制約可能なオブジェクトが 640x480 と 800x600 の解像度しか提供できない場合、返される関連する能力は次のようになります:

{
  width: {min: 640, max: 800},
  height: {min: 480, max: 600},
  aspectRatio: {min: 4/3, max: 4/3}
}

上の例では、aspectRatio によって、 width と height の任意の組み合わせが不可能であることが明確になりますが、 それでも 2 つより多くの解像度が利用可能であるように見えることに注意してください。

Constrainable パターンを使用する 仕様は、以下の辞書をサブクラス化するべきではなく、 代わりに独自の定義を提供するべきです。例については MediaTrackCapabilities を参照してください。
テンプレート:
WebIDLdictionary Capabilities {};

11.4 設定

Settings は、1 つ以上のキーと値の 組を含む辞書です。それが返されるオブジェクト型でプロパティが定義されている場合、 getCapabilities() から返される各キーを含まなければなりません。 たとえば、音声 MediaStreamTrack には "width" プロパティがありません。 各キーには単一の値が存在しなければならず、 その値は getCapabilities() がそのプロパティについて定義する 集合のメンバーでなければなりませんSettings 辞書は、ユーザー エージェントがオブジェクトの制約可能なプロパティについて選択した実際の値を含みます。 値の正確な構文はプロパティの型に依存します。

適合する ユーザーエージェントは、 この仕様で定義されるすべての制約可能なプロパティをサポートしなければなりません

Settings 辞書の例を以下に示します。この例は、 ユーザーエージェントが実際には これらだけでなく、より多くの制約可能なプロパティを サポートする必要があるという点で、あまり現実的ではありません。

{
  frameRate: 30.0,
  facingMode: 'user'
}
Constrainable パターンを使用する仕様は、 以下の辞書をサブクラス化するべきではなく、代わりに独自の定義を提供するべきです。 例については MediaTrackSettings を参照してください。
テンプレート:
WebIDLdictionary Settings {};

11.5 Constraints および ConstraintSet

WebIDL の制限により、Constrainable パターンを実装するインターフェイスは、 ここで定義される Constraints および ConstraintSet を単純にサブクラス化することはできません。代わりに、 このパターンに従う独自の定義を提供しなければなりません。 この例については MediaTrackConstraints を参照してください。

テンプレート:
WebIDLdictionary ConstraintSet {};

ConstraintSet の各メンバーは、 制約可能なプロパティに対応し、そのプロパティの有効な Capability 値の部分集合を指定します。ConstraintSet を適用すると、 ユーザーエージェントに、 対応する制約可能なプロパティの設定を 指定された値または値の範囲に制限するよう指示します。特定のプロパティは、 基本 Constraints 集合と高度な ConstraintSet リストの両方に 現れてもかまわず、 高度なリスト内の各 ConstraintSet には最大 1 回現れてもかまいません

テンプレート:
WebIDLdictionary Constraints : ConstraintSet {
  sequence<ConstraintSet> advanced;
};

11.5.1 辞書 Constraints のメンバー

advanced(型: sequence<ConstraintSet>

これは、ユーザー エージェントが順番に満たそうとしなければならない ConstraintSet のリストであり、満たせないものだけを スキップします。これらの ConstraintSet の順序には意味があります。 特に、それらが applyConstraints への引数として渡された場合、 ユーザー エージェントは指定された順序で それらを満たそうとしなければなりません。 したがって、高度な ConstraintSet C1 と C2 を個別には満たせても、 同時には満たせない場合、このリストで C1 と C2 のうち 先にある方が満たされ、もう一方は満たされません。 ユーザー エージェントは、一部を満たせない場合でも、 リスト内のすべての ConstraintSet を満たそうとしなければなりません。 したがって前の例で、制約 C3 が C1 と C2 の後に指定されている場合、 ユーザーエージェントは、 C2 を満たせなくても C3 を満たそうとします。 特定のプロパティ名は各 ConstraintSet に 1 回だけ現れることができますが、 複数の ConstraintSet に現れることができることに注意してください。

12.

このサンプルコードはボタンを表示します。クリックすると、ボタンは 無効になり、ユーザーはストリームを提供するよう求められます。ユーザーは、 ストリームを提供し(たとえば、ページにローカルカメラへの アクセスを許可し)、その後ストリームを無効にする(たとえば、そのアクセスを 取り消す)ことで、ボタンを再び有効にできます。

<button id="startBtn">開始</button>
<script>
const startBtn = document.getElementById('startBtn');

startBtn.onclick = async () => {
  try {
    startBtn.disabled = true;
    const constraints = {
      audio: true,
      video: true
    };

    const stream = await navigator.mediaDevices.getUserMedia(constraints);

    for (const track of stream.getTracks()) {
      track.onended = () => {
        startBtn.disabled = stream.getTracks().some((t) => t.readyState == 'live');
      };
    }
  } catch (err) {
    console.error(err);
  }
};
</script>

この例では、ローカルの ビデオカメラから自分自身の写真を撮ることができます。Image Capture 仕様 [image-capture] では、これを実現するより簡単な方法が提供されていることに注意してください。

<script>
window.onload = async () => {
  const video = document.getElementById('monitor');
  const canvas = document.getElementById('photo');
  const shutter = document.getElementById('shutter');

  try {
    video.srcObject = await navigator.mediaDevices.getUserMedia({video: true});

    await new Promise(resolve => video.onloadedmetadata = resolve);
    canvas.width = video.videoWidth;
    canvas.height = video.videoHeight;
    document.getElementById('splash').hidden = true;
    document.getElementById('app').hidden = false;

    shutter.onclick = () => canvas.getContext('2d').drawImage(video, 0, 0);
  } catch (err) {
    console.error(err);
  }
};
</script>

<h1>スナップショットキオスク</h1>

<section id="splash">
  <p id="errorMessage">読み込み中...</p>
</section>

<section id="app" hidden>
  <video id="monitor" autoplay></video>
  <button id="shutter">&#x1F4F7;</button>
  <canvas id="photo"></canvas>
</section>

13. Permissions との統合

この仕様は、名前 "camera" および "microphone" で識別される 2 つの強力な機能を定義します。

次の型およびアルゴリズムを定義します:

許可記述子の 型
WebIDLdictionary CameraDevicePermissionDescriptor : PermissionDescriptor {
  boolean panTiltZoom = false;
};

許可は、ある種類の少なくとも 1 台のデバイスへのアクセスを対象とします。

この記述子の意味は、その種類の任意のデバイスへのアクセスを照会することです。 したがって、 "camera" 許可に対する照会が「granted」を返した場合、 クライアントは、許可プロンプトなしで 1 台のカメラへのアクセスを得られることを認識し、 「denied」が 返された場合、カメラに対する getUserMedia 要求は どれも成功しないことを認識します。

ユーザーエージェントが、ある種類の一部のデバイスには許可が与えられているが、 すべてのデバイスには与えられていないと見なす場合、照会は 「granted」を返します。

ユーザーエージェントが、ある種類のすべてのデバイスに対する許可が拒否されていると見なす場合、照会は 「denied」を返します。

{name: "camera", panTiltZoom: true}{name: "camera", panTiltZoom: false} より強いです。

注記

granted」 の許可は、getUserMedia が成功することを保証するものではありません。 これは、ユーザーに許可を求めるプロンプトが表示されないことだけを示します。 制約やカメラが使用中であることなど、 getUserMedia が失敗する原因となる要因は他にも多数あります。

許可取り消し アルゴリズム
これは、name を 引数として渡して デバイス許可取り消しアルゴリズムを 呼び出した結果です。

14. Permissions Policy との統合

この仕様は、文字列 "camera" および "microphone" で識別される 2 つのポリシー制御機能を定義します。 どちらもデフォルト 許可リスト"self" です。

注記

文書Permissions Policyは、 その文書内のコンテンツが getUserMedia を使用して、それぞれカメラまたは マイクを要求することを許可されるかどうかを決定します。いずれかの文書で 無効にされている場合、その文書内のコンテンツは、それぞれ カメラまたはマイクを要求するために getUserMedia使用することを 許可されません。 これは使用する許可を 要求する アルゴリズムによって適用されます。

さらに、enumerateDevices は、 文書が使用することを 許可されたデバイスのみを列挙します。

15. プライバシーインジケーターの要件

注記

この仕様は、単一の MediaDevices オブジェクトの 視点から、アルゴリズムを使用してプライバシーインジケーターの要件を表現しています。 実装者には、iframe によってページ上に共存し得る複数の MediaDevices オブジェクトを対象として インジケーターの表示を統合するため、これらの原則を拡張して適用することが推奨されます。

getUserMedia() が公開する各デバイスの kind について、

anyAccessible を、すべての any<kind>Accessible 値の論理 OR として定義します。

anyLive を、すべての any<kind>Live 値の論理 OR として定義します。

このとき、ユーザーエージェントには次の要件があります:

また、ユーザーエージェントには次の動作が推奨されます:

16. プライバシーおよびセキュリティに関する 考慮事項

このセクションは非規範的です。新しい動作を規定するものではなく、 仕様の他の部分にすでに存在する情報を 要約します。

この仕様は、メディアの入力 デバイス、具体的にはマイクおよびカメラを管理する機能を Web プラットフォームに拡張します。また、 音声出力デバイス(スピーカーやヘッドフォン)など、その他のメディアデバイスに関する 情報を公開できる可能性もありますが、そのような公開の詳細は 他の仕様に委ねられます。 ユーザーのマイクおよびカメラから音声と映像をキャプチャすると、 個人を特定できる情報が アプリケーションに公開されるため、この仕様では、それを共有する前に明示的なユーザーの 同意を得ることを要求します。

カメラまたはマイクをキャプチャする前は、アプリケーション(「通りすがりの Web」)に 提供されるのは、ユーザーがカメラまたはマイクを持っているかどうか (ただし何台あるかではない)を判別する機能だけです。デバイスの 識別子は、オリジン間でユーザーを追跡できるフィンガープリントには 役立たないよう設計されていますが、カメラまたは マイク機能の存在によって、フィンガープリンティング面に 2 ビットが追加されます。オリジンごとの永続的識別子 deviceId は、 他の永続的 ストレージ(たとえば Cookie)と同様に扱うことが推奨されます。

カメラまたはマイクのキャプチャが開始されると、この仕様は、 前述のデバイスからメディアデータにアクセスし、 使用する方法を説明します。このデータは機微である可能性があります。デバイスが 使用中であることを示すインジケーターを提供するべきだという助言がありますが、 許可の性質と、使用中のデバイスを示す インジケーターのどちらもプラットフォームの判断に委ねられます。

キャプチャを開始する許可は、その都度与えることも、永続的にすることもできます。 その都度許可する場合、ユーザーが許可を与えるまで UI がユーザー操作を ブロックし続けることがない方法で「いいえ」と言えることが重要です。 これは、「永続的な NO」を選択する方法を提供するか、 モーダルな許可ダイアログを使用しないことで実現できます。

カメラまたはマイクのキャプチャが開始されると、Web 文書は、 利用可能なすべてのメディアキャプチャデバイスとそのラベルを一覧表示する 機能を得ます。この機能は Web 文書が閉じられるまで持続し、 永続化することはできません。 多くの場合、ラベルはオリジンをまたいで安定しているため、 特定のデバイスを時間およびオリジンをまたいで追跡する手段を 提供する可能性があります。

注記

この仕様は、使用中のデバイス以外のデバイスについても デバイス情報を公開します。これは後方互換性および旧来の理由によるものです。将来の 仕様には、このモデルを使用せず、代わりに デバイス列挙の設計原則で説明される ベストプラクティスに従うことが推奨されます。

キャプチャを開始した、または過去に行った開いている Web 文書や、 表示中である Web 文書では、 新しいメディアデバイスが追加または削除されるたびに、 devicechange イベントが 複数のナビゲータブル およびオリジンで同時に発火することがあります。ユーザー エージェントは、これらのイベントのタイミングにファジングを加えるか、 Web 文書が表示中になるまで発火を遅延させることで、 オリジン間のブラウジングアクティビティを相関させるリスクを緩和できます。

Web 文書がキャプチャデバイスからのメディアストリームへのアクセスを得ると、 その動作能力の範囲(たとえばカメラで利用可能な解像度)を含む、 デバイスに関する詳細情報へのアクセスも得ます。 これらの動作能力の大部分は ブラウジングセッションおよびオリジンをまたいで永続的であるため、 特定のデバイスを時間およびオリジンをまたいで追跡する手段となります。

キャプチャデバイスからの映像ストリームへのアクセスが得られると、 そのストリームを使用して、そのデバイスをほぼ確実に一意に フィンガープリントできます(たとえばデッドピクセル検出によって)。同様に、 音声ストリームへのアクセスが得られると、そのストリームを使用してユーザーの 位置を部屋のレベルまで、さらには互いに無関係なユーザーが 同じ部屋に同時にいることまでフィンガープリントできる可能性が高くなります (たとえば周囲の音声や、デバイスのスピーカーから意図的に再生した固有の 音声を分析することによって)。音声と映像の両方についてユーザーレベルでの緩和策は、 カメラおよび/またはマイクを物理的に覆うか、 ユーザーエージェントのクロームコントロールを介して許可を取り消すことです。

制約を使用すると、getUserMedia 呼び出しの失敗によって、 ユーザーにプロンプトを表示することなくシステム上のデバイスに関する情報を 返すことが可能であり、これによってフィンガープリンティングに利用できる面が増加します。 ユーザーエージェントは、この追加の面を制限するため、 失敗する getUserMedia 呼び出しを許可する頻度を制限することを 検討するべきです。

キャプチャ開始の永続的な許可が保存されている場合、 付与済みの許可一覧を容易に見つけられ、 ユーザーが取り消したい許可を取り消せることが重要です。

許可が付与された後、ユーザーエージェントは、次の 2 点を ユーザーが容易に認識できるようにするべきです:

注記

保存された許可を持つサイトの開発者は、 これらの許可が悪用されないよう注意するべきです。これらの許可は [permissions] API を使用して取り消すことができます。

特に、認可されたメディアデバイスからの 音声または映像ストリームを、第三者が選択できるエンドポイントへ 自動的に送信できるようにするべきではありません。

実際、サイトが https://webrtc.example.org/?call=user のような URL を提供し、 自動的に通話を設定して音声/映像を user に送信する場合、たとえば 次のような悪用が可能になります:

https://webrtc.example.org/ に保存された許可を付与しているユーザーは、 リンクをたどるか https://webrtc.example.org/?user=EvilSpy にリダイレクトされることで、 攻撃者 EvilSpy に自分の 音声/映像ストリームを送信するよう仕向けられる可能性があります。

17. 拡張性

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

この仕様の新しいバージョンが将来作成される可能性がありますが、 他の標準でも、この仕様の機能を基礎とする新しい 機能を定義する必要があると予想されます。このセクションの目的は、 そのような拡張の作成者にガイダンスを提供することです。

この仕様内で WebIDL によって定義されるインターフェイス、メソッド、または属性は、 すべて拡張できます。拡張点として可能性が高いものは、新しい メディア型の定義と、新しい制約可能なプロパティの定義の 2 つです。

17.1 新しいメディアの kind を定義する(音声および映像以外)

最低限、新しいメディア型を定義するには次が必要です

さらに、次を更新するべきです

さらに、次を含めることも考えられます

17.2 新しい 制約可能なプロパティを定義する

これには、そのプロパティの Constraints、 Capabilities、および Settings(3. 用語を参照)がどのように機能するかを検討し、 定義する必要があります。 MediaTrackSupportedConstraintsMediaTrackCapabilitiesMediaTrackConstraintsMediaTrackSettings4.3.8 制約可能な プロパティ、および MediaStreamConstraints の関連する記述を モデルとして使用します。

拡張仕様の作成者には、仕様 リポジトリで仕様の保守担当者に通知することが強く推奨されます。
この仕様の将来のバージョンおよび WebRTC Working Group が作成する他の仕様では、 潜在的な利用上の競合を減らすため、認識しているすべての拡張を 考慮します。

17.3 MediaStreamTrack および MediaStream の新しいシンクを定義する

他の仕様は、MediaStream および/または MediaStreamTrack の新しいシンクを定義できます。最低限、 MediaStreamTrack の新しい コンシューマーは次を定義する必要があります:

17.4 ソース の新しい MediaStreamTrack を定義する

他の仕様は、MediaStreamTrack の新しいソースを定義できます。 最低限、MediaStreamTrack の新しいソースには次が必要です

A. 謝辞

編集者は、Working Group の議長および Team Contact である Harald Alvestrand、Stefan Håkansson、Erik Lagerway、Dominique Hazaël-Massieux の支援に感謝します。この仕様の相当量の文章は、 次の多くの方々から提供されました。 Jim Barnett、Harald Alvestrand、Travis Leithead、Josh Soref、Martin Thomson、 Jan-Ivar Bruaroey、Peter Thatcher、 Dominique Hazaël-Massieux、Stefan Håkansson。Dan Burnett は、この仕様の開発中に Voxeo および Aspect から受けた多大な支援に感謝の意を表します。

B. 参考文献

B.1 規範参考文献

[COOKIES]
HTTP 状態管理機構. A. Barth. IETF. 2011年4月. 提案標準. URL: https://httpwg.org/specs/rfc6265.html
[dom]
DOM 標準. Anne van Kesteren. WHATWG. 現行標準. URL: https://dom.spec.whatwg.org/
[ECMA-262]
ECMAScript 言語仕様. Ecma International. URL: https://tc39.es/ecma262/multipage/
[HTML]
HTML 標準. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 現行 標準. URL: https://html.spec.whatwg.org/multipage/
[infra]
Infra 標準. Anne van Kesteren; Domenic Denicola. WHATWG. 現行標準. URL: https://infra.spec.whatwg.org/
[permissions]
Permissions. Marcos Caceres; Mike Taylor. W3C. 2025年10月6日. W3C 作業草案. URL: https://www.w3.org/TR/permissions/
[permissions-policy]
Permissions Policy. Ian Clelland. W3C. 2025年10月6日. W3C 作業草案. URL: https://www.w3.org/TR/permissions-policy-1/
[RFC2119]
要件レベルを示すために RFC で使用する キーワード. S. Bradner. IETF. 1997年3月. 現行のベストプラクティス. URL: https://www.rfc-editor.org/rfc/rfc2119
[rfc4122]
汎用一意識別子(UUID)の URN 名前空間. P. Leach; M. Mealling; R. Salz. IETF. 2005年7月. 提案標準. URL: https://www.rfc-editor.org/rfc/rfc4122
[RFC8174]
RFC 2119 のキーワードにおける大文字と小文字の曖昧さ. B. Leiba. IETF. 2017年5月. 現行のベストプラクティス. URL: https://www.rfc-editor.org/rfc/rfc8174
[WEBAUDIO]
Web Audio API. Paul Adenot; Hongchan Choi. W3C. 2021年6月17日. W3C 勧告. URL: https://www.w3.org/TR/webaudio-1.0/
[WEBIDL]
Web IDL 標準. Edgar Chen; Timothy Gu. WHATWG. 現行標準. URL: https://webidl.spec.whatwg.org/
[WEBRTC]
WebRTC: ブラウザーにおけるリアルタイム通信. Cullen Jennings; Jan-Ivar Bruaroey; Henrik Boström; Florent Castelli. W3C. 2025年3月13日. W3C 勧告. URL: https://www.w3.org/TR/webrtc/

B.2 参考参考文献

[image-capture]
MediaStream 画像キャプチャ. Miguel Casas-sanchez; Rijubrata Bhaumik. W3C. 2025年4月23日. W3C 作業草案. URL: https://www.w3.org/TR/image-capture/
[mediacapture-fromelement]
DOM 要素からのメディアキャプチャ. Martin Thomson; Miguel Casas-sanchez; Emircan Uysaler. W3C. 2025年2月12日. W3C 作業草案. URL: https://www.w3.org/TR/mediacapture-fromelement/
[mediastream-recording]
MediaStream 記録. Miguel Casas-sanchez. W3C. 2025年4月17日. W3C 作業草案. URL: https://www.w3.org/TR/mediastream-recording/