Initial Author of this Specification was Ian Hickson, Google Inc., with the following
copyright statement:
© Copyright 2004-2011 Apple Computer, Inc., Mozilla Foundation, and Opera Software
ASA. You are granted a license to use, reproduce and create derivative works of this document.
All subsequent changes since 26 July 2011 done by the W3C WebRTC Working Group (and previously the Device APIs Working Group) are under the following Copyright © 2011-2023 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
この文書は、音声や映像を含むローカルメディアをプラットフォームから 要求できる一連の 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 プロセス文書に準拠します。
このセクションは非規範的です。
この文書は、マイクやビデオカメラなどのローカルマルチメディア デバイスへのアクセスを要求するための API を定義します。
この文書では、マルチメディアストリームデータが消費される場所を 制御する手段を提供し、メディアを生成するデバイスをある程度 制御できる MediaStream API も定義します。また、メディアを キャプチャおよびレンダリングできるデバイスに関する情報も公開します。
非規範的と明示されたセクションに加え、この仕様におけるすべての作成ガイドライン、図、例、および注記は 非規範的です。この仕様のそれ以外のすべては規範的です。
この文書におけるキーワード MAY、MUST、MUST NOT、NOT REQUIRED、および SHOULD は、 ここに示すように、すべて 大文字で記述されている場合に限り、 BCP 14 [RFC2119] [RFC8174] に記載されているとおりに解釈されるものとします。
この仕様は、単一の 製品、すなわち、この仕様に含まれるインターフェイスを実装する ユーザーエージェント に適用される適合基準を定義します。
アルゴリズムまたは特定の手順として記述される適合要件は、 最終的な結果が同等である限り、どのような方法で実装してもかまいません。(特に、 この仕様で定義されるアルゴリズムは理解しやすいことを目的としており、 高い性能を目的としたものではありません。)
この仕様で定義される API を実装するために ECMAScript [ECMA-262] を使用する実装は、 この仕様が Web IDL 仕様とその用語を使用するため、 Web IDL 仕様で定義される ECMAScript バインディング [WEBIDL] と整合する方法で実装しなければなりません。
ソースとは、メディアストリーム トラックの供給元となる「もの」です。ソースはメディア自体の送信元です。ソースには、 物理的なウェブカメラ、マイク、ユーザーのハードドライブ上のローカル動画または音声ファイル、 ネットワークリソース、静止画像などがあります。この 文書ではマイクおよびカメラ型ソースの使用のみを説明し、 その他の種類のソースの使用については別の文書で説明されることに注意してください。
ソースに関して事前の認可を受けていないアプリケーションには、 利用可能なソースの数、その種類、および他のデバイスとの 関係のみが提供されます。アプリケーションがソースを使用する認可を受けると、 ソースに関する追加情報が利用可能になる場合があります( 9.2.1 アクセス制御 モデルを参照)。
ソースには制約がありません — 制約を持つのはトラックです。 ソースがトラックに接続されると、そのソースは、そのトラックに存在する 制約に適合するメディアをそのトラック向けに生成しなければなりません。 複数のトラックを同じソースに接続できます。すべてのトラックが 適切なメディアを得られるようにするため、ダウンサンプリングなどの ユーザーエージェント 処理を使用してもかまいません。
ソースには制約可能なプロパティがあり、それらの 能力および設定が トラック上で公開されます。制約可能なプロパティはソースによって「所有」されていますが、 ソースは複数の異なる要求に同時に対応できる場合があります。 このため、能力は同じソースを使用しているすべての(複数の)トラックに 共通ですが、設定はトラックごとに異なる場合があります(たとえば、 同じソースに結び付けられた 2 つの異なるトラックオブジェクトが能力と設定の情報を照会すると、 同じ能力が返されますが、それぞれの制約を満たすように調整された 異なる設定が返される場合があります)。
設定とは、ソースの制約可能なプロパティの 直近の現在値を指します。設定は常に 読み取り専用です。
低照度条件によってカメラが より低いフレームレートに切り替わる場合など、ソースの状態は動的に変化することがあります。 このような場合、影響を受けるソースに関連付けられたトラックは、 設定された制約を満たさなくなることがあります。プラットフォームは、このような 逸脱を可能な限り最小限に抑えるよう努めるべきですが、 制約を満たせない一時的または永続的な状態が存在する場合でも、 メディアの配信を継続します。
設定はソースのプロパティですが、
アプリケーションにはソースに接続されたトラックを通してのみ公開されます。
これは ConstrainablePattern
インターフェイスを介して公開されます。
各制約可能なプロパティには、そのプロパティが
ソースでサポートされているかどうか、およびサポートされている場合は
サポートされる値の範囲を記述する能力があります。設定と同様に、能力も
ConstrainablePattern
インターフェイスを介してアプリケーションに公開されます。
サポートされる能力の値は、この仕様で定義される 範囲および列挙型に正規化されなければなりません。
トラック上で
getCapabilities()
を呼び出すと、ソースに接続されたすべての
トラックについて、基礎となる同じソース単位の能力が返されます。
この API は意図的に単純化されています。能力では、 異なる値間の相互作用を記述できません。たとえば、 低いフレームレートでは高解像度の動画ストリームを生成でき、 高いフレームレートではより低い解像度を生成できるカメラの能力を 正確に記述することはできません。能力は各値の 完全な範囲を記述します。制約間の相互作用は、 制約を適用しようとすることで明らかになります。
制約は、アプリケーションが トラックに適切なソースを選択し、選択後に ソースの動作方法に影響を与えることのできる一般的な制御面を提供します。
制約は、ソースがトラックにメディアを提供する際に使用できる 動作モードの範囲を制限します。トラックに制約が指定されていない場合、 実装は、そのソースがサポートする能力の全範囲から自由に設定を選択できます。 実装は、適用されたすべての 制約によって課される範囲内であれば、いつでもソース設定を調整することもできます。
getUserMedia() は、
トラックに適切なソースを選択し、それを設定するために
制約を使用します。さらに、トラック上の ConstrainablePattern インターフェイスには、
後からいつでもトラックの制約を動的に変更するための API が含まれています。
初期制約を満たせない場合、トラックは
getUserMedia()
を使用してソースに接続されません。
ただし、トラック上の制約を満たす能力は
時間の経過とともに変化する可能性があり、制約自体も変更できます。状況が
変化して制約を満たせなくなった場合、
ConstrainablePattern インターフェイスは、
アプリケーションに通知するための適切なエラーを定義します。5. モデル: ソース、シンク、制約、および設定では、
制約がどのように相互作用するかをさらに詳しく説明します。
各制約可能なプロパティには、対応する ソース設定名および能力名に対応する名前を持つ制約が存在します。
制約は、制約構造内での位置に応じて 3 つのグループのいずれかに分類されます。グループは次のとおりです:
一般に、適用する制約が少ないほど、ユーザーエージェントは メディアストリーミング体験を最適化する柔軟性が高くなるため、 アプリケーション作成者には必須 制約を控えめに使用することが強く推奨されます。
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 オブジェクトの配列にすることもできます。後者の形式では、
異なるソースストリームからストリームを構成できます。
MediaStream と
MediaStreamTrack の両方のオブジェクトはクローンできます。クローンされた
MediaStream には、
元のストリームのすべてのメンバートラックのクローンが含まれます。クローンされた MediaStreamTrack には、
クローン元のインスタンスとは独立した
制約の集合があり、同じソースからのメディアに対して、
異なる コンシューマー向けに異なる制約を適用できます。MediaStream オブジェクトは、
[WEBRTC] など、
getUserMedia 以外のコンテキストでも使用されます。
MediaStreamMediaStream constructor は、既存のトラックから新しい
ストリームを構成します。このコンストラクターは、
MediaStream 型、または
MediaStreamTrack
オブジェクトの配列型の任意の引数を取ります。コンストラクターが
呼び出されたとき、ユーザー
エージェントは次の手順を実行しなければなりません:
stream を、新しく構築された
MediaStream オブジェクトとします。
stream.id 属性を、新しく生成された
値に初期化します。
コンストラクターの引数が存在する場合、次の 手順を実行します:
引数の型に基づいて、トラックの集合 tracks を 構築します:
MediaStream オブジェクト:
tracks を、
MediaStreamTrack
オブジェクトのうち、MediaStream の トラック
集合内にあるすべてのオブジェクトを含む集合とします。
MediaStreamTrack
オブジェクトのシーケンス:
tracks を、指定された
シーケンス内のすべての
MediaStreamTrack
オブジェクトを含む集合とします。
tracks 内の各 MediaStreamTrack
track について、次の
手順を実行します:
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 の
トラック集合は、
メディアセッションの変更によって更新される場合があります。
track を MediaStream stream に
トラックを追加するには、ユーザーエージェントは次の手順を実行しなければなりません:
track がすでに stream's の トラック集合に 存在する場合、この手順を中止します。
track を stream の トラック集合に追加します。
トラックイベントを発火し、名前を addtrack、
track を指定して stream に対して発火します。
track を
MediaStream stream から
トラックを削除するには、ユーザーエージェントは次の手順を実行しなければなりません:
track が stream's の トラック集合に 存在しない場合、この手順を中止します。
トラックイベントを発火し、名前を removetrack、
track を指定して 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;
};
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 メソッドが
呼び出されたとき、ユーザーエージェントは
次の手順を実行しなければなりません:
track をメソッドの引数とし、
stream をメソッドが呼び出された
MediaStream オブジェクトとします。
track がすでに stream の トラック集合に存在する場合、この 手順を中止します。
removeTrack()指定された MediaStreamTrack オブジェクトを
この MediaStream
から削除します。
removeTrack
メソッドが呼び出されたとき、ユーザーエージェントは
次の手順を実行しなければなりません:
track をメソッドの引数とし、
stream をメソッドが呼び出された
MediaStream オブジェクトとします。
track が stream's の トラック集合に存在しない場合、この手順を中止します。
clone()指定された MediaStream と、
そのすべてのトラックをクローンします。
clone() メソッドが
呼び出されたとき、ユーザー
エージェントは次の手順を実行しなければなりません:
streamClone を、新しく構築された
MediaStream オブジェクトとします。
streamClone.MediaStream.id を、新しく
生成された値に初期化します。
この
MediaStream オブジェクト内の
各トラックをクローンし、
その結果を streamClone の トラック
集合に追加します。
addtrack または removetrack イベントを発火することを想定するユーザーエージェントコードは、
別のオブジェクトからの参照によって、対象となる MediaStream
オブジェクトを存続させることが期待されます。
addtrack または removetrack のイベントリスナーが存在することは、
MediaStream オブジェクトをガベージコレクションしようとする際に
考慮する必要はありません。
MediaStreamTrackMediaStreamTrack オブジェクトは、
ユーザーエージェント内のメディアソースを表します。ソースの一例は、
ユーザーエージェントに接続されたデバイスです。他の仕様は、
ここで規定される動作を上書きする MediaStreamTrack
のソースを定義することがあります。
複数の MediaStreamTrack オブジェクトが
同じメディアソースを表すこともできます。たとえば、
getUserMedia() を連続して 2
回呼び出した際に表示される UI で、
ユーザーが同じカメラを選択した場合などです。
MediaStreamTrack ソースは、次の
プロパティを定義します:
MediaStreamTrack または
MediaStreamTrack の
サブタイプのいずれかに設定されます。
デフォルトでは、MediaStreamTrack
に設定されます。
MediaStreamTrack
を作成するときに実行されます。
この手順は、新しく作成された MediaStreamTrack
を入力として取ります。デフォルトでは、
手順は空です。MediaStreamTrack
をクローンするときに実行されます。
この手順は、ソースおよび宛先の MediaStreamTrack
を入力として取ります。デフォルトでは、
手順は空です。MediaStreamTrack オブジェクトからのデータは、
必ずしも正規のバイナリ形式を持つとは限りません。たとえば、単に
「ユーザーのビデオカメラから現在送られてきている映像」である場合があります。これにより、
ユーザーエージェントは、ユーザーのプラットフォームに最も
適した方法でメディアを操作できます。
スクリプトは、MediaStreamTrack
オブジェクトがそのソースをもう必要としないことを、
stop()
メソッドで示すことができます。ソースを使用しているすべてのトラックが
停止されるか、別の手段によって終了すると、そのソースは
停止されます。ソースが
getUserMedia()
によって公開されたデバイスである場合、
ソースが停止されたとき、ユーザーエージェントは
次の手順を実行しなければなりません:
mediaDevices を、対象の MediaDevices オブジェクトとします。
deviceId を、ソースデバイスの deviceId
とします。
mediaDevices.[[devicesLiveMap]][deviceId]
を
false に設定します。
デバイスの種類および
deviceId に関連付けられた許可について、
mediaDevices の関連する
設定オブジェクトに対する許可状態が
「granted」でない場合、
mediaDevices.[[devicesAccessibleMap]][deviceId]
を
false に設定します。
基礎となる source と mediaDevicesToTieSourceTo を指定して MediaStreamTrack を作成するには、次の 手順を実行します:
track を、source の MediaStreamTrack ソース 型の新しいオブジェクトとします。
次の内部スロットで 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 に初期化します。
ConstrainablePattern
で規定されているとおりに初期化します。
[[Restrictable]]、false に初期化します。
mediaDevicesToTieSourceTo が null でない場合、
source および mediaDevicesToTieSourceTo を指定して
トラックソースを
MediaDevices に関連付けます。
track をパラメーターとして、 source の MediaStreamTrack ソース固有の構築手順を実行します。
track を返します。
track の 基礎となるソースを初期化するには、 source を指定して、次の手順を実行します:
track.[[Source]] を
source に初期化します。
track の [[Capabilities]]、
[[Constraints]]、および
[[Settings]] を、
ConstrainablePattern で
規定されているとおりに初期化します。
source および
mediaDevices を指定して、トラックソースを
MediaDevices に関連付けるには、次の手順を実行します:
source を
mediaDevices.[[mediaStreamTrackSources]]
に追加します。
globalObject という名前のグローバルオブジェクトの すべてのソースを停止するには、 ユーザーエージェントは次の手順を実行しなければなりません:
関連するグローバル
オブジェクトが globalObject である各
MediaStreamTrack
オブジェクト track について、
track の [[ReadyState]] を
「ended」に設定します。
globalObject が Window
である場合、その globalObject の
関連付けられた MediaDevices.[[mediaStreamTrackSources]]
内の各 source について、source を
停止します。
ユーザーエージェントは、次の条件で globalObject のすべてのソースを停止しなければなりません:
globalObject が Window
オブジェクトであり、その関連付けられた
文書に対して文書のアンロード
クリーンアップ手順が実行された場合。
globalObject が WorkerGlobalScope
オブジェクトであり、その
closing
フラグが true に設定された場合。
実装は、ソースの使用状況を追跡するために ソースごとの参照カウントを使用してもかまいませんが、その具体的な方法は この仕様の範囲外です。
トラックをクローンするには、ユーザーエージェントは 次の手順を実行しなければなりません:
track を、クローン対象の
MediaStreamTrack
オブジェクトとします。
source を track の
[[Source]] とします。
trackClone を、source と null を指定して
MediaStreamTrack を作成した結果とします。
trackClone の [[ReadyState]] を
track の [[ReadyState]] の値に設定します。
trackClone の [[Capabilities]] を、 track の [[Capabilities]] のクローンに設定します。
trackClone の [[Constraints]] を、 track の [[Constraints]] のクローンに設定します。
trackClone の [[Settings]] を、 track の [[Settings]] のクローンに設定します。
track および trackClone をパラメーターとして、 source の MediaStreamTrack ソース固有のクローン手順を実行します。
trackClone を返します。
「live」状態の
MediaStreamTrack の
メディアフローには 2 つの側面があります:
ミュート / 非ミュート、および有効 / 無効です。
ミュートは、
MediaStreamTrack
への入力を指します。
MediaStreamTrack
は、そのソースがミュートされているとき、
ミュートされています。
つまり、ソースは一時的にトラックへデータを提供できません。
MediaStreamTrack
がミュートされている間は、
ライブサンプルを利用可能にしてはなりません。
ミュート状態は Web アプリケーションの制御外ですが、
アプリケーションは muted
属性を読み取り、関連する mute および unmute
イベントを監視することで
観測できます。MediaStreamTrack
がミュートされる理由は、そのソースによって定義されます。
カメラおよびマイクのソースについて、ミュート する理由は 実装定義です。 これにより、ユーザーエージェントは次のような状況でプライバシー 緩和策を実装できます: ユーザーがマイクの物理的なミュートボタンを押した場合、ユーザーが 内蔵カメラ付きノート PC の蓋を閉じた場合、ユーザーが オペレーティングシステムのコントロールを切り替えた場合、ユーザーが ユーザーエージェントのクロームでミュートボタンをクリックした場合、ユーザーエージェントが(ユーザーに代わって)ミュートする場合などです。
一部のオペレーティングシステムでは、たとえばモバイル OS で着信があった場合など、
より高い音声優先度を持つ別のアプリケーションがアクセスすると、
ユーザーエージェントから
マイクへのアクセスが奪われることがあります。ユーザーエージェントは、
muted および
それに関連するイベントを通じて、この情報を Web アプリケーションに提供するべきです。
ユーザーエージェントが、カメラまたはマイクのソースに対して そのような実装定義の 変更を開始するたびに、ユーザーインタラクションタスクソースを使用して タスクをキューに入れ、トラックの ミュート状態を設定して、ユーザーが望む状態にしなければなりません。
トラックの ミュート状態を設定するには、 newState を指定して、ユーザーエージェントは 次の手順を実行しなければなりません:
track を、対象の
MediaStreamTrack とします。
track.[[Muted]] がすでに
newState である場合、この手順を中止します。
track.[[Muted]] を
newState に設定します。
newState が true の場合、
eventName を mute とし、それ以外の場合は
unmute とします。
track 上で eventName という名前の イベントを 発火します。
一方、有効/無効は、アプリケーションが
enabled
属性を介して制御(および観測)できます。
コンシューマーにとっての結果は、次の意味では同じです。
MediaStreamTrack
がミュートまたは無効(あるいはその両方)であるときは常に、
コンシューマーは情報量ゼロのコンテンツを受け取ります。これは音声では無音、
映像では黒いフレームを意味します。言い換えると、ソースからのメディアは、
MediaStreamTrack
オブジェクトが非ミュートかつ有効である場合にのみ流れます。たとえば、
音声と映像についてミュートまたは無効な
MediaStreamTrackだけを
含む MediaStream をソースとする video 要素は、
再生中ではありますが、無音のまま黒い映像フレームをレンダリングします。
新しく作成された MediaStreamTrack
オブジェクトには、
次が適用されます。特に明記されない限り(たとえばクローン時)トラックは常に有効であり、
ミュート状態はトラック作成時点のソースの状態を反映します。
MediaStreamTrack
のライフサイクルには、live と ended の 2 つの状態があります。新しく作成された
MediaStreamTrack
は、作成方法に応じていずれの状態にもなり得ます。たとえば、
ended 状態のトラックをクローンすると、新しい ended 状態のトラックになります。
現在の状態は、オブジェクトの
readyState
属性に反映されます。
live 状態では、トラックはアクティブであり、メディア
(または MediaStreamTrack が
ミュートまたは無効である場合は情報量ゼロのコンテンツ)
がコンシューマーによって使用可能です。
ソースが navigator.mediaDevices.getUserMedia()
によって公開されたデバイスである場合、トラックが
ミュートまたは無効になり、その結果、そのデバイスに接続されているすべてのトラックが
ミュート、無効、または停止のいずれかになったとき、UA は、デバイスの
deviceId、deviceId
を使用して、
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() メソッドが
呼び出された場合以外の何らかの理由で終了したとき、
ユーザーエージェントは、
次の手順を実行するタスクをキューに入れなければなりません:
track の [[ReadyState]]
がすでに「ended」
である場合、この手順を中止します。
track の [[ReadyState]]
を「ended」に設定します。
track が
終了したことを、
track の [[Source]] に通知し、
他の MediaStreamTrack オブジェクトが
そのソースに依存していない限り、ソースが
停止されるようにします。
トラックの終了がユーザーの要求によるものである場合、 このイベントのイベントソースはユーザーインタラクションイベントソースです。
permissionName を指定して デバイス許可取り消しアルゴリズムを呼び出すには、 次の手順を実行します:
tracks を、
現在「live」である
すべての MediaStreamTrack のうち、
この種のトラックに関連付けられた許可("camera" または "microphone")が
permissionName と一致するものの集合とします。
tracks 内の各 track について、 トラックを終了します。
MediaStreamTrack は、
Constrainable Pattern セクションで定義される
制約可能な
オブジェクトです。
制約はトラックに設定され、ソースに影響を与える場合があります。
トラックの初期化時に
が指定された場合でも、実行時に後から設定する必要がある場合でも、
ConstraintsConstrainablePattern インターフェイスで
定義される API により、トラック上で現在設定されている制約の
取得および操作が可能です。
終了後も、トラックは
固有の制約可能なトラックプロパティの一覧を引き続き公開します。
この一覧には deviceId、
facingMode、および
groupId が含まれます。
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、
読み取り専用)id(型: DOMString、
読み取り専用)label
(型: DOMString、
読み取り専用)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 です。
cloneclone()
メソッドが呼び出されたとき、ユーザーエージェントは、
this を指定して
トラックをクローンする処理の結果を
返さなければなりません。
stopMediaStreamTrack オブジェクトの
stop()
メソッドが呼び出されたとき、ユーザー
エージェントは次の手順を実行しなければなりません:
track を現在の
MediaStreamTrack
オブジェクトとします。
track の [[ReadyState]]
が「ended」
である場合、この手順を中止します。
track が 終了したことを、 track のソースに通知します。
トラックの終了を通知されたソースは、他の
MediaStreamTrack
オブジェクトがそのソースに依存していない限り、
停止されます。
track の [[ReadyState]]
を「ended」に設定します。
getCapabilitiesこの
MediaStreamTrack、
すなわち制約可能な
オブジェクトが表すソースの能力を返します。
このメソッドの定義については、ConstrainablePattern インターフェイスを参照してください。
このメソッドは、基礎となる
デバイスについて永続的かつオリジンをまたぐ可能性の高い情報を提供するため、
デバイスのフィンガープリンティング面を増加させます。![]()
getConstraintsこのメソッドの定義については、ConstrainablePattern インターフェイスを参照してください。
getSettingsMediaStreamTrack オブジェクトの
MediaStreamTrack.getSettings()
メソッドが呼び出されたとき、
ユーザーエージェントは
次の手順を実行しなければなりません:
track を現在の MediaStreamTrack
オブジェクトとします。
track の [[ReadyState]]
が「ended」
である場合、次のサブ手順を実行します:
settings を、新しい MediaTrackSettings
辞書とします。
固有の制約可能な トラックプロパティの一覧にある各 property について、 track が終了した時点でそのプロパティを持っていた場合、 対応するプロパティを、その終了時点の値とともに settings に追加します。
settings を返します。
ConstrainablePattern インターフェイスで 定義されているトラックの現在の設定を返します。
applyConstraintsMediaStreamTrack オブジェクトの
applyConstraints()
メソッドが呼び出されたとき、ユーザー
エージェントは次の手順を実行しなければなりません:
track を現在の
MediaStreamTrack
オブジェクトとします。
track の [[ReadyState]]
が「ended」
である場合、次のサブ手順を実行します:
p を新しい promise とします。
p を undefined で
解決します。
p を返します。
次の条件で applyConstraints テンプレートメソッドを呼び出し、その結果を返します:
MediaStreamTrack
であり、
MediaTrackSettings
辞書の可能なインスタンスを指します。ユーザーエージェントは、
変更不可能な固有のデバイスプロパティを、それらが
固有の制約可能な
トラックプロパティの一覧に含まれていない限り、
メンバーとして含めてはなりません。また、
公開してはならない
デバイスプロパティをその他の方法で含めてもなりません。
他の仕様は、 場合によって公開してはならない 制約可能なプロパティを定義することがあります。
resizeMode が "none" に設定された各 settings 辞書について、 ユーザーエージェントは、 それ以外は同一で、resizeMode が "crop-and-scale" に設定された別の settings 辞書を含めなければなりません。 非ネイティブモードに対する制約はサポートされません。
結果として、crop-and-scale が none の スーパーセットであることが反映されます。
WebIDLenum MediaStreamTrackState {
"live",
"ended"
};
| 列挙値 | 説明 |
|---|---|
live |
トラックはアクティブです(トラックの基礎となるメディアソースは、 リアルタイムでデータを提供するために ベストエフォートで試みています)。 |
ended |
トラックは終了しています (トラックの基礎となるメディアソースはもうデータを提供しておらず、 このトラックに今後データを提供することもありません)。 一度トラックがこの状態になると、この状態から抜けることはありません。 たとえば、
|
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)
height(型: boolean、
デフォルト値:
true)
aspectRatio(型: boolean、
デフォルト値:
true)
frameRate
(型: boolean、
デフォルト値:
true)
facingMode(型: boolean、
デフォルト値:
true)
resizeMode(型: boolean、
デフォルト値:
true)
sampleRate(型: boolean、
デフォルト値:
true)
sampleSize(型: boolean、
デフォルト値:
true)
echoCancellation(型: boolean、
デフォルト値:
true)
autoGainControl(型: boolean、
デフォルト値:
true)
noiseSuppression(型: boolean、
デフォルト値:
true)
latency
(型: boolean、
デフォルト値:
true)
channelCount(型: boolean、
デフォルト値:
true)
deviceId
(型: boolean、
デフォルト値:
true)
groupId
(型: boolean、
デフォルト値:
true)
backgroundBlur(型: boolean、
デフォルト値:
true)
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 は、
内の ConstrainablePatternCapabilities
が期待する
sequence<DOMString> ではなく、
DOMString
です。
MediaTrackCapabilities
のメンバーwidth
(型: ULongRange)height
(型: ULongRange)aspectRatio(型: DoubleRange)frameRate(型: DoubleRange)facingMode(型:
sequence<DOMString>)
カメラは複数の facing mode を報告できます。たとえば、
ユーザーに向けられた複数のカメラを備える高性能なテレプレゼンスシステムでは、
ユーザーの左側にあるカメラは「left」
と「user」の両方を報告できます。
詳細については facingMode を参照してください。
resizeMode(型:
sequence<DOMString>)
ユーザーエージェントは、
このカメラが自然に生成するより多くの解像度の選択肢を提供するために、
クロッピングおよびダウンスケーリングを使用してもかまいません。
報告されるシーケンスには、このカメラの解像度選択肢を導出するために
UA が使用できるすべての手段を列挙しなければなりません。
値「none」を
含めなければならず、これは UA による
クロッピングおよびダウンスケーリングを制約できることを示します。
詳細については resizeMode を参照してください。
sampleRate(型: ULongRange)sampleSize(型: ULongRange)echoCancellation(型:
sequence<boolean>)
ソースがエコーキャンセレーションを実行できない場合、単一の
false だけをリスト内の要素としなければなりません。
ソースがエコーキャンセレーションを実行できる場合、true を
リストに含めなければなりません。
スクリプトがこの機能を制御できる場合、リストには少なくとも
true と false の両方を含めなければなりません。
さらに、ソースがどの音声ソースをキャンセルするか制御できる場合、
EchoCancellationModeEnum
enum のサポートされる値をすべて含めなければなりません。
true または false がリストに含まれる場合、
EchoCancellationModeEnum
の値より前に現れなければなりません。
詳細については echoCancellation
を参照してください。
autoGainControl(型:
sequence<boolean>)
ソースが自動ゲイン制御を実行できない場合、単一の
false が報告されます。自動ゲイン制御を
無効にできない場合、単一の true が報告されます。
スクリプトがこの機能を制御できる場合、ソースは
true と false の両方を可能な値として
含むリストを報告します。詳細については
autoGainControl を参照してください。
noiseSuppression(型:
sequence<boolean>)
ソースがノイズ抑制を実行できない場合、単一の
false が報告されます。ノイズ抑制を
無効にできない場合、単一の true が報告されます。
スクリプトがこの機能を制御できる場合、ソースは
true と false の両方を可能な値として
含むリストを報告します。詳細については
noiseSuppression を参照してください。
latency(型: DoubleRange)channelCount(型: ULongRange)deviceId(型: DOMString)
groupId
(型: DOMString)
backgroundBlur(型:
sequence<boolean>)
false が
報告されます。背景ぼかしを無効にできない場合、単一の true が
報告されます。スクリプトがこの機能を制御できる場合、ソースは
true と false の両方を可能な値として含むリストを報告します。詳細は backgroundBlur を参照してください。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)height(型: ConstrainULong)aspectRatio(型: ConstrainDouble)frameRate(型: ConstrainDouble)facingMode(型: ConstrainDOMString)resizeMode(型: ConstrainDOMString)sampleRate(型: ConstrainULong)sampleSize(型: ConstrainULong)echoCancellation(型: ConstrainBooleanOrDOMString)
autoGainControl(型: ConstrainBoolean)noiseSuppression(型: ConstrainBoolean)latency(型: ConstrainDouble)channelCount(型: ConstrainULong)deviceId(型: ConstrainDOMString)groupId(型: ConstrainDOMString)backgroundBlur(型: ConstrainBoolean)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)
height(型: unsigned long)
aspectRatio(型: double)frameRate
(型: double)facingMode(型: DOMString)
resizeMode(型: DOMString)
sampleRate(型: unsigned long)
sampleSize(型: unsigned long)
echoCancellation(型: boolean または DOMString)
autoGainControl(型: boolean)noiseSuppression(型: boolean)latency(型:
double)
channelCount(型: unsigned long)
deviceId(型: DOMString)
groupId
(型: DOMString)
backgroundBlur(型: boolean、
デフォルト値:
true)
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 フレームしか得られない場合でも、
|
| aspectRatio | double |
正確なアスペクト比(ピクセル単位の幅をピクセル単位の高さで 除算し、小数第 10 位に丸めた double として 表現した値)、またはアスペクト比の範囲です。 |
| facingMode | DOMString |
この文字列は、
VideoFacingModeEnum の
メンバーのいずれかです。各メンバーは、ユーザーの視点から見た
カメラが向くことのできる方向を表します。
は、この列挙型に含まれない文字列について、
必ずしもまったく同じ文字列を返すとは限らないことに注意してください。これは、
このプロパティに将来のバージョンの WebIDL
enum を使用できる可能性を維持するためです。
|
| resizeMode | DOMString |
この文字列は、
VideoResizeModeEnum の
メンバーのいずれかです。各メンバーは、
UA が解像度を導出するために使用できる手段を表します。
言い換えると、UA がカメラ出力に対して
クロッピングおよびダウンスケーリングを使用できるかどうかを表します。
UA は、"none" が使用されている場合に、
ネイティブ解像度を模倣するようダウンスケーリング、アップスケーリング、および/または
クロッピングすることでカメラの同時使用を隠蔽してもかまいませんが、
カメラが ユーザー
エージェント外の別のアプリケーションで使用されている場合に限ります。
は、この列挙型に含まれない文字列について、
必ずしもまったく同じ文字列を返すとは限らないことに注意してください。これは、
このプロパティに将来のバージョンの WebIDL
enum を使用できる可能性を維持するためです。
|
| backgroundBlur | boolean |
一部のプラットフォームまたはユーザーエージェントは、特に カメラの映像ストリームについて、映像フレームの背景ぼかしを 組み込みでサポートしている場合があります。Web アプリケーションは、 ソースレベルで背景ぼかしが適用されることを制御したい場合や、 少なくともそのことを認識したい場合があります。これにより、たとえば Web アプリケーションは UI を更新したり、自身では背景ぼかしを 適用しないようにしたりできます。 |
継続的な環境要因に応じて、結果として得られるキャプチャ映像の X
軸と Y 軸を自動的に入れ替えることが望ましい場合があるシステムでは、
width、height、および aspectRatio
の制約と能力は、すべてのアルゴリズムにおいて影響を受けず、
主方向でのみ考慮されなければなりません。
ただし、
getSettings()
アルゴリズムでは例外として、これらの
制約可能なプロパティの設定は、任意の時点で返されるキャプチャ映像の
寸法と一致させるために必要であれば入れ替えられなければなりません。
結果として得られるキャプチャ映像の X 軸と Y 軸の入れ替えをサポートするシステムの 主 方向は、その特定のシステムについてユーザー エージェントによって定義されます。
横向きモードと縦向きモードの自動切り替えをサポートするシステムでは、 ユーザーエージェントは、 横向きモードを 主方向とすることが推奨されます。
WebIDLenum VideoFacingModeEnum {
"user",
"environment",
"left",
"right"
};
| 列挙値 | 説明 |
|---|---|
user |
ソースはユーザーの方向を向いています(自分自身を映す カメラ)。 |
environment |
ソースはユーザーとは反対の方向を向いています(周囲の 環境を映す)。 |
left |
ソースはユーザーの左方向を向いています。 |
right |
ソースはユーザーの右方向を向いています。 |
以下は、ユーザーとの関係における映像の facing mode を示す
図です。
WebIDLenum VideoResizeModeEnum {
"none",
"crop-and-scale"
};
| 列挙値 | 説明 |
|---|---|
none |
この解像度およびフレームレートは、カメラ、 そのドライバー、または OS によって提供されます。 注記: UA は、同時使用を
隠蔽するためにこの値を報告してもかまいませんが、
カメラが別の ナビゲータブルで使用されている場合に限ります。 |
crop-and-scale |
この解像度は、ユーザーエージェントによって、 より高いカメラ解像度からダウンスケーリングおよび/またはクロッピングされたものです。 または、そのフレームレートが ユーザーエージェントによって 間引かれています。以下に記載する場合を除き、メディアを アップスケーリング、引き伸ばし、または入力ソースに存在しなかった 偽のデータを作成してはなりません。 注記: UA は同時使用を
隠蔽するためにアップスケーリングしてもかまいませんが、
カメラが ユーザーエージェント外の別のアプリケーションで
使用されている場合に限ります。 |
次の制約可能なプロパティは、音声の
MediaStreamTrack
オブジェクトにのみ適用されるものとして定義されます:
| プロパティ名 | 値 | 注記 |
|---|---|---|
| sampleRate | unsigned long
|
音声データの 1 秒あたりのサンプル数で表した サンプルレートです。 |
| sampleSize | unsigned long
|
ビット単位のリニアサンプルサイズです。制約としては、 リニアサンプルを生成する音声デバイスでのみ充足できます。 |
| echoCancellation | boolean または DOMString |
これは false、true、または
EchoCancellationModeEnum
のメンバーのいずれかです。
1 つ以上の音声ストリームがさまざまなマイクの処理内で
再生されている場合、マイクによって録音された入力信号から
再生中の音を取り除くことが望ましい場合がよくあります。
これはエコーキャンセレーションと呼ばれます。これが不要な場合もあり、
音声アーティファクトが生じないよう無効にすることが望ましい場合があります。
これにより、アプリケーションはこの
動作を制御できます。
|
| autoGainControl | boolean |
マイクによって録音された入力信号には、 自動ゲイン制御が望ましい場合がよくあります。これが不要な場合もあり、 音声が変更されないよう無効にすることが望ましい場合があります。 これにより、アプリケーションはこの 動作を制御できます。 |
| noiseSuppression | boolean |
マイクによって録音された入力信号には、 ノイズ抑制が望ましい場合がよくあります。これが不要な場合もあり、 音声が変更されないよう無効にすることが望ましい場合があります。 これにより、アプリケーションはこの 動作を制御できます。 |
| latency | double |
秒単位のレイテンシーまたはレイテンシー範囲です。レイテンシーとは、 処理の開始(たとえば、現実世界で音が発生した時点)から、 処理の次の段階でデータが利用可能になるまでの 時間です。低レイテンシーが重要なアプリケーションもあります。 他のアプリケーションでは、消費電力の制約に役立つため、 高いレイテンシーが許容されることがあります。この数値は、 構成の目標レイテンシーを表すことが期待されます。実際のレイテンシーは、 そこから多少変動する場合があります。 |
| channelCount | unsigned long
|
音声データに含まれる独立した音声チャネルの数、 すなわちサンプルフレームあたりの音声サンプル数です。 |
WebIDLenum EchoCancellationModeEnum {
"all",
"remote-only"
};
| 列挙値 | 説明 |
|---|---|
"all" |
システムは、システムによって再生されているすべての音を、 マイクの入力信号から除去しようとしなければなりません。 このオプションは、通知やスクリーン リーダーなどのローカル音声の送信を防ぐため、 最大限のプライバシーを提供することを意図しています。 |
"remote-only"
|
システムは、WebRTC の どの |
EchoCancellationModeEnum
の値に加えて、
echoCancellation
制約可能プロパティは、true および false の値も受け入れます。
false は、エコーキャンセレーションを一切行わないことを意味します。
true は、マイクによって録音された信号から
どの音声を除去するかを UA が決定することを意味します。true は、少なくとも
「remote-only」
と同程度の音声をキャンセルしようとしなければならず、
「all」と同程度まで
キャンセルしようとするべきです。
MediaStreamTrack
オブジェクトが
終了しておらず、かつ
mute、unmute
または 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;
};
track(型: MediaStreamTrack、必須)このセクションは非規範的です。
ユーザーエージェントは、ソースからシンクまでのメディアパイプラインを提供します。ユーザーエージェントでは、
シンクは
<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 つの異なるシンク、すなわち
<
要素(A)、別の
video><
要素(B)、およびピア
接続(C)に接続されています。ピア接続は、ソース映像を
リモートクライアントへストリーミングしています。リモートクライアントには、ピア接続をソースとして
使用するトラックを含む 2 つのメディアストリームがあります。これら 2 つのメディアストリームは、
2 つの
video><
要素のシンク(Y と
Z)に接続されています。
video>
この時点では、ホームクライアント上のすべてのシンクが、 元のソースによって提供される寸法設定に変換を適用しなければならないことに注意してください。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 つの異なる
<
要素のシンク A
と B に接続されています。シンク A は video>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 の幅と 高さはソースと同じです。
ここで、最初のトラックが、 補助照明をオンに強制するという 必須制約を追加します。この時点で、両方の 必須制約をソースが 満たすことはできません(補助照明を同時にオンとオフにすることはできません)。 この状態は、最初のトラックが競合する制約を適用しようとしたことで 発生したため、制約の適用は失敗し、ソースの設定にも どちらのトラックの制約にも変更はありません。
MediaStream をメディア要素に割り当てることができます。
MediaStream はプリロードもシークもできず、
単純で、潜在的に無限の線形な
メディアタイムラインを表します。タイムラインは
0 から開始し、メディア要素が
再生される可能性がある間、リアルタイムで線形に増加します。
MediaStream の再生が一時停止されると、
タイムラインは増加しません。
この仕様をサポートするユーザーエージェントは、
[HTML]
で定義される HTMLMediaElement
インターフェイスの
srcObject
属性をサポートしなければなりません。これには、
MediaStream
オブジェクトの再生サポートが含まれます。
[HTML]
文書では、HTMLMediaElement
がメディアプロバイダーオブジェクトとどのように動作するかを概説しています。
メディアプロバイダーオブジェクトが MediaStream の場合、次が適用されます:
AudioTrack
または VideoTrack
が作成されるたびに、id および label 属性は、
対応する MediaStreamTrack の属性に
初期化されなければならず、kind 属性は
"main" に、language 属性は
空文字列に初期化されなければなりません
MediaStream からの現在のデータを常に再生しなければならず、
バッファリングしてはなりません。
MediaStream の
トラック集合内の順序は未定義であるため、
AudioTrackList
および VideoTrackList
の順序付け方法には要件がありません
要素が HTMLVideoElement
である場合、映像再生が終了したとき、
再生を終了したと言います。
映像再生が終了するのは次の場合です:
要素の
readyState
が HAVE_METADATA
以上であり、
MediaStream
の状態が、
アクティブであった後に
非アクティブになった場合、または
play()
が最後に呼び出された後に、
MediaStream
の状態が
アクティブから
非アクティブになった後、再び
アクティブになり、かつ
autoplay
が false である場合。
一度再生が終了すると、新しい
MediaStreamTrack が
MediaStream
に追加されても、
autoplay
が
true であるか、または Web
アプリケーションが play()
を呼び出すなどして要素を再開しない限り、再生は再開されません。
要素が HTMLAudioElement
である場合、音声再生が終了したとき、
再生を終了したと言います。
音声再生が終了するのは次の場合です:
要素の
readyState
が HAVE_METADATA
以上であり、
MediaStream
の状態が、
可聴であった後に
不可聴になった場合、または
play()
が最後に呼び出された後に、
MediaStream
の状態が
可聴から
不可聴になった後、再び
可聴になり、かつ
autoplay
が false である場合。
一度再生が終了すると、新しい音声
MediaStreamTrack が
MediaStream
に追加されても、
autoplay
が
true であるか、または Web
アプリケーションが play()
を呼び出すなどして要素を再開しない限り、再生は再開されません。
HTMLMediaElement
に対する fastSeek()
メソッドの呼び出しはすべて
無視されなければなりません
MediaStream の性質により、関連付けられた
HTMLMediaElement
の属性の動作およびそれに対して実行できる操作には、
次に示すようないくつかの制限があります:
| 属性名 | 属性型 | プロバイダーが MediaStream の場合のセッター/ゲッターの動作 | 追加の考慮事項 |
|---|---|---|---|
preload
|
DOMString |
取得時: none。設定時: 無視。 |
MediaStream はプリロードできません。 |
buffered
|
TimeRanges
|
buffered.length は 0 を返さなければなりません。 |
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.length は 1 を返さなければなりません。played.start(0) は 0 を返さなければなりません。played.end(0) は、最後に認識された currentTime
を返さなければなりません。
|
MediaStream のタイムラインは常に、
0 から始まり currentTime まで続く単一の範囲で構成されます。 |
seekable
|
TimeRanges
|
seekable.length は 0 を返さなければなりません。 |
MediaStream はシークできません。 |
loop
|
boolean |
true, false |
MediaStream には定義された終端がなく、
したがってループできないため、
loop
属性を設定しても効果はありません。
|
上記のどのセッターも
HTMLMediaElement
の内部状態を変更しないため、
MediaStream が要素の
割り当てられた
メディアプロバイダーオブジェクトではなくなると、列挙された属性は、
ストリームが要素に割り当てられる前の値を再び取るように見えます。
srcObject
に null またはストリーム以外のオブジェクトが割り当てられると、
MediaStream は、要素の
割り当てられたメディア
プロバイダーオブジェクトではなくなります。これは
メディア要素の読み込み
アルゴリズムの直前です。その結果、
playbackRate
と defaultPlaybackRate
が MediaStream が割り当てられる前と異なる場合、
ratechange
イベントが(ステップ 7 から)発火することがあります。
一部の操作は OverconstrainedError をスローまたは発火します。これは、
制約の失敗に関連する追加
情報を保持する DOMException の拡張です。
WebIDL[Exposed=Window]
interface OverconstrainedError : DOMException {
constructor(DOMString constraint, optional DOMString message = "");
readonly attribute DOMString constraint;
};
OverconstrainedError次の手順を実行します:
constraint をコンストラクターの最初の 引数とします。
message をコンストラクターの 2 番目の引数とします。
e を新しい
OverconstrainedError
オブジェクトとします。
e の
DOMException
コンストラクターを、
message 引数を message に設定し、
name 引数を
"OverconstrainedError" に設定して呼び出します。
この名前には旧来の
コードへのマッピングがないため、e の code 属性は
0 を返します。
e.constraint を constraint に設定します。
e を返します。
constraint(型: DOMString、
読み取り専用)このエラーに関連付けられた制約の名前、または
特定の制約名が公開されない場合は ""。
このセクションは非規範的です。
次のイベントは MediaStream
オブジェクトで発火します:
| イベント名 | インターフェイス | 発火する条件... |
|---|---|---|
| addtrack | MediaStreamTrackEvent |
新しい MediaStreamTrack
がこの
ストリームに追加されたとき。スクリプトが
MediaStream のトラックを直接
変更した場合、このイベントは発火しないことに注意してください。
|
| removetrack | MediaStreamTrackEvent |
MediaStreamTrack
がこの
ストリームから削除されたとき。スクリプトが
MediaStream のトラックを直接
変更した場合、このイベントは発火しないことに注意してください。
|
次のイベントは MediaStreamTrack
オブジェクトで発火します:
| イベント名 | インターフェイス | 発火する条件... |
|---|---|---|
| mute | Event |
MediaStreamTrack
オブジェクトのソースが
一時的にデータを提供できなくなったとき。 |
| unmute | Event |
MediaStreamTrack
オブジェクトのソースが、一時的にデータを提供できなかった後、
再びライブになったとき。 |
| ended | Event |
|
次のイベントは MediaDevices
オブジェクトで発火します:
| イベント名 | インターフェイス | 発火する条件... |
|---|---|---|
| devicechange | DeviceChangeEvent
|
ユーザーエージェントが
利用可能なメディアデバイスの集合が
変更されたとき。現在のデバイス一覧は
devices 属性で利用できます。
|
このセクションでは、接続されているメディア入力および出力デバイス(たとえば Web カメラやヘッドセット)についてユーザー エージェントに照会するためにスクリプトが使用できる API について説明します。
MediaDevicesMediaDevices オブジェクトは、
ユーザーエージェントが利用可能なメディアデバイスを調べ、
それらへのアクセスを取得するために使用される API のエントリーポイントです。
realm を指定して MediaDevices を作成するには、 次の手順を実行します:
mediaDevices を、realm 内の新しい MediaDevices オブジェクトとし、
次の内部スロットで初期化します:
[[devicesLiveMap]]、 空のマップに初期化します。
[[devicesAccessibleMap]]、 空のマップに初期化します。
[[kindsAccessibleMap]]、 空のマップに初期化します。
[[storedDeviceList]]、 ユーザーエージェントが利用可能な すべてのメディア入力および出力デバイスのリストに初期化します。
[[canExposeCameraInfo]]、
false に初期化します。
[[canExposeMicrophoneInfo]]、
false に初期化します。
[[mediaStreamTrackSources]]、 空の集合に初期化します。
settings を、mediaDevices の関連する 設定オブジェクトとします。
MediaDevices.getUserMedia()
が公開する各デバイス種別 kind について、次の手順を実行します:
settings に対する kind に関連付けられた許可
(たとえば "camera"、
"microphone")の許可状態が
「granted」
である場合は
mediaDevices.[[kindsAccessibleMap]][kind]
を true に設定し、
それ以外の場合は
false に設定します。
MediaDevices.getUserMedia()
が公開する個々のデバイスについて、そのデバイスの
deviceId deviceId を使用して、次の手順を実行します:
mediaDevices.[[devicesLiveMap]][deviceId]
を false に設定し、
settings に対するデバイスの種別および
deviceId に関連付けられた許可の許可状態が
「granted」
である場合は mediaDevices.[[devicesAccessibleMap]][deviceId]
を
true に設定し、それ以外の場合は
false に設定します。
mediaDevices を返します。
getUserMedia() が公開する
各デバイス種別 kind について、
mediaDevices の関連する
設定オブジェクトに対する kind に関連付けられた許可の
許可状態に遷移が発生するたびに、
次の手順を実行します:
他の値から「granted」
への遷移である場合、
mediaDevices.[[kindsAccessibleMap]][kind]
を true に設定します。
「granted」
から他の値への遷移である場合、
mediaDevices.[[kindsAccessibleMap]][kind]
を false に設定します。
getUserMedia() が公開する
各デバイスについて、
mediaDevices の関連する
設定オブジェクトに対する、デバイスの種別およびその deviceId
deviceId に関連付けられた許可の
許可
状態に遷移が発生するたびに、次の
手順を実行します:
他の値から「granted」
への遷移である場合、
mediaDevices.[[devicesAccessibleMap]][deviceId]
がまだ true でなければ、
true に設定します。
「granted」
から他の値への遷移であり、かつ
デバイスが現在停止している場合、
mediaDevices.[[devicesAccessibleMap]][deviceId]
を
false に設定します。
新しいメディア入力および/または出力デバイスが
ユーザーエージェントで利用可能になった場合、利用可能な入力および/または出力デバイスのいずれかが
利用できなくなった場合、または
MediaDeviceKind の入力および/または出力デバイスについて
システムデフォルトが変更された場合、ユーザーエージェントは、
デバイス列挙を続行できるが
true である各
MediaDevices
オブジェクト mediaDevices について、次の
デバイス変更通知手順を実行しなければなりませんが、それ以外の
MediaDevices オブジェクトについては実行してはなりません:
lastExposedDevices を、
mediaDevices および
mediaDevices.[[storedDeviceList]] を指定して
デバイス情報オブジェクトの
リストを作成した結果とします。
deviceList を、ユーザーエージェントが利用可能な すべてのメディア入力および/または 出力デバイスのリストとします。
newExposedDevices を、 mediaDevices および deviceList を指定して デバイス情報オブジェクトの リストを作成した結果とします。
newExposedDevices 内の
MediaDeviceInfo
オブジェクトが lastExposedDevices 内のものと一致し、かつ同じ順序である場合、
この手順を中止します。
enumerateDevices
アルゴリズムにより、上記の手順では
devicechange イベントの発火が、
特定の MediaDeviceKind のデバイスを列挙するために
enumerateDevices を
使用することを
許可された文書に限定されます。
mediaDevices.[[storedDeviceList]] を
deviceList に設定します。
mediaDevices において、devices
を newExposedDevices に初期化した
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()
メソッドが呼び出されたとき、ユーザーエージェントは
次の手順を実行しなければなりません:
p を新しい promise とします。
proceed を、this を指定した デバイス 列挙を続行できるの結果とします。
mediaDevices を this とします。
次の手順を並列に実行します:
proceed が false の間、
ユーザーエージェントは、
mediaDevices を指定した
デバイス列挙を
続行できるの結果を proceed に設定するため
キューに入れられたタスクが、proceed を true に
設定することになるまで、次の手順への進行を待たなければなりません。
resultList を、
mediaDevices および
mediaDevices.[[storedDeviceList]]
を指定して
デバイス情報オブジェクトの
リストを作成した結果とします。
p を resultList で 解決します。
p を返します。
mediaDevices および deviceList を指定して デバイス情報オブジェクトのリストを作成するには、 次の手順を実行します:
resultList を空のリストとします。
microphoneList、cameraList、および otherDeviceList を空のリストとします。
document を、mediaDevices の
関連する
グローバルオブジェクトの関連付けられた
Document とします。
deviceList 内で検出された各デバイス device について、 次のサブ手順を実行します:
device がマイクでない場合、または document が
"microphone"
で識別される機能を使用することを
許可されていない場合、
これらのサブ手順を中止し、次のデバイス(存在する場合)に進みます。
deviceInfo を、 mediaDevices を指定して device を表す デバイス情報 オブジェクトを作成した結果とします。
device がシステムデフォルトのマイクである場合、 deviceInfo を microphoneList の先頭に追加します。 それ以外の場合、deviceInfo を microphoneList の末尾に追加します。
deviceList 内で検出された各デバイス device について、 次のサブ手順を実行します:
device がカメラでない場合、または document が
"camera"
で識別される機能を使用することを
許可されていない場合、
これらのサブ手順を中止し、次のデバイス(存在する場合)に進みます。
deviceInfo を、 mediaDevices を指定して device を表す デバイス情報 オブジェクトを作成した結果とします。
device がシステムデフォルトのカメラである場合、 deviceInfo を cameraList の先頭に追加します。 それ以外の場合、deviceInfo を cameraList の末尾に追加します。
mediaDevices において
マイク情報を
公開できるが false の場合、
microphoneList を最初の項目までに切り詰めます。
mediaDevices において
カメラ
情報を公開できるが
false の場合、
cameraList を最初の項目までに切り詰めます。
deviceList 内で検出された各デバイス device について、 次のサブ手順を実行します:
device がマイクまたはカメラである場合、 これらのサブ手順を中止し、次のデバイス(存在する場合)に進みます。
device、microphoneList、cameraList、
および mediaDevices を入力として、
カメラおよびマイク以外のデバイスに対する公開
決定アルゴリズムを実行します。
このアルゴリズムの結果が false の場合、
これらのサブ手順を中止し、次のデバイス(存在する場合)に進みます。
deviceInfo を、 mediaDevices を指定して device を表す デバイス情報 オブジェクトを作成した結果とします。
device がシステムデフォルトの音声出力である場合、 次のサブ手順を実行します:
defaultAudioOutputInfo を、 mediaDevices を指定して device を表す デバイス情報 オブジェクトを作成した結果とします。
defaultAudioOutputInfo の deviceId
を
"default" に設定します。
ユーザーエージェントは、
これがシステムデフォルトの音声出力であることを明示するように
defaultAudioOutputInfo の label
を更新するべきです。
defaultAudioOutputInfo を otherDeviceList の先頭に追加します。
microphoneList のすべてのデバイスを順番に resultList の末尾に追加します。
cameraList のすべてのデバイスを順番に resultList の末尾に追加します。
otherDeviceList のすべてのデバイスを順番に resultList の末尾に追加します。
resultList を返します。
このメソッドは、メディアキャプチャデバイスの
利用可能性を通じて、ブラウジングセッションおよびオリジンをまたいで永続的な
情報を返すため、
ユーザー
エージェントが公開するフィンガープリンティング面を増加させます。
関連する
グローバルオブジェクトの
関連付けられた
Document がキャプチャを行っていない限り、このメソッドは
公開する情報を、カメラが存在するかどうか、およびマイクが存在するかどうかという
2 ビットの情報に制限します。ユーザー
エージェントは、たとえば
関連する
グローバルオブジェクトの関連付けられた
Document が、妥当と判断された制約を指定して
getUserMedia()
を呼び出すまで、システムにカメラとマイクがあるように装うことで、
これを緩和できます。
関連する
グローバルオブジェクトの関連付けられた
Document が
キャプチャを開始した後は、すべてのメディアキャプチャデバイスのリストを通じて、
そのグループ化やキャプチャデバイスに関連付けられた人間が読めるラベルを含む、
オリジンをまたぐ追加の永続的
情報を提供するため、フィンガープリンティング面がさらに増加します。![]()
ユーザーエージェントは、デバイスラベルをサニタイズすることで
公開を制限できます。たとえば、ラベル内に含まれるユーザー名を削除し、
デバイスの製造元またはモデル情報を残すことが考えられます。
サニタイズされたラベルによって、ユーザーが対応するデバイスを識別できることが
重要です。
上記のアルゴリズムは、メディアデバイス
情報へのアクセスが、関連する
グローバルオブジェクトの関連付けられた
Documentがキャプチャを行ったかどうかに依存することを意味します。
カメラおよびマイクのデバイスについて、関連する
グローバルオブジェクトの
関連付けられた
Documentがキャプチャを行っていない場合
(すなわち、getUserMedia() が
呼び出されていないか、正常に解決されたことが一度もない場合)、
MediaDeviceInfo オブジェクトは
kind には有効な値を含みますが、
deviceId、label、および groupId には空文字列を含みます。
さらに、各 kind について最大 1 台のデバイスのみが
enumerateDevices()
の結果に列挙されます。
それ以外の場合、
MediaDeviceInfo オブジェクトは、
deviceId、kind、
label、および groupId に意味のある値を含みます。利用可能なすべてのデバイスが
enumerateDevices()
の結果に列挙されます。
mediaDevices を指定して、検出されたデバイス device を表す デバイス情報オブジェクトを作成するには、 次の手順を実行します:
deviceInfo を、device を表す新しい
MediaDeviceInfo
オブジェクトとします。
deviceInfo.kind を
device に対して初期化します。
deviceInfo.kind が
"videoinput" に等しく、かつ mediaDevices において
カメラ情報を
公開できるが false の場合、
deviceInfo を返します。
deviceInfo.kind が
"audioinput" に等しく、かつ mediaDevices において
マイク
情報を公開できるが false の場合、
deviceInfo を返します。
deviceInfo.label を
device に対して初期化します。
device について保存済みの deviceId が存在する場合、
deviceInfo.deviceId をその値に初期化します。
それ以外の場合、deviceInfo.deviceId を、
deviceId で説明されているように
新しく生成された一意の識別子とします。
device が、document についてすでに表現されているデバイスと
同じ物理
デバイスに属する場合、deviceInfo.groupId
を、既存の MediaDeviceInfo
オブジェクトの
groupId 値に初期化します。
それ以外の場合、deviceInfo.groupId
を、
groupId で説明されているように
新しく生成された一意の識別子とします。
deviceInfo を返します
mediaDevices を指定して デバイス列挙を続行できるかの確認を行うには、 次の手順を実行します:
mediaDevices において
デバイス情報を
公開できる場合、
ユーザーエージェントは
true を返してもかまいません。
mediaDevices を指定した 表示中であるの結果を返します。
mediaDevices を指定して デバイス 情報を公開できるかの確認を行うには、次の手順を実行します:
mediaDevices において
カメラ情報を
公開できる場合、
true を返します。
mediaDevices において
マイク
情報を公開できる場合、
true を返します。
false を返します。
mediaDevices を指定して カメラ 情報を公開できるかの確認を行うには、次の手順を実行します:
"videoinput" 種別のローカルデバイスのいずれかが、
mediaDevices の関連する
グローバルオブジェクトの
関連付けられた
Document内の live な
MediaStreamTrack に接続されている場合、
true を返します。
mediaDevices.[[canExposeCameraInfo]] を返します。
mediaDevices を指定して マイク 情報を公開できるかの確認を行うには、次の手順を実行します:
"audioinput" 種別のローカルデバイスのいずれかが、
関連する
グローバルオブジェクトの
関連付けられた
Document内の live な
MediaStreamTrack に接続されている場合、
true を返します。
mediaDevices.[[canExposeMicrophoneInfo]]
を返します。
mediaDevices を指定して 表示中であるかの確認を行うには、 次の手順を実行します:
mediaDevices の関連する
グローバルオブジェクトの関連付けられた
Documentが
完全に
アクティブであり、その可視性
状態
が "visible" の場合、true を返します。それ以外の場合は
false を返します。
mediaDevices を指定して システムフォーカスを持つかの確認を行うには、次の 手順を実行します:
mediaDevices の関連する
グローバルオブジェクトのナビゲータブルの
トップレベル
トラバーサブルが
システムフォーカスを持つ場合、
true を返します。それ以外の場合は false を返します。
deviceType を指定して デバイスの公開を拡張できるかの確認を行うには、次の 手順を実行します:
requestedTypes の集合と boolean の value を指定して、 mediaDevices に デバイス情報の公開を設定するには、 次の手順を実行します:
"video" が requestedTypes に含まれる場合、
次のサブ手順を実行します:
mediaDevices.[[canExposeCameraInfo]]
を value に設定します。
value が true であり、かつ "microphone" について
デバイスの公開を
拡張できる場合、
mediaDevices.[[canExposeMicrophoneInfo]]
を true に設定します。
"audio" が requestedTypes に含まれる場合、
次のサブ手順を実行します:
mediaDevices.[[canExposeMicrophoneInfo]]
を value に設定します。
value が true であり、かつ "camera" について
デバイスの公開を
拡張できる場合、
mediaDevices.[[canExposeCameraInfo]]
を true に設定します。
ユーザーエージェントは、いつでも
デバイス情報の公開を false に戻してもかまいません。
たとえば、ユーザーエージェントが特定の
Document に対するデバイスアクセスを
取り消すことを決定した場合などです。
カメラおよびマイク以外のデバイスに対する 公開決定アルゴリズムは、 device、microphoneList、cameraList、および mediaDevices を入力として受け取り、device に関する 情報を Web ページに公開するかどうかを決定する boolean を返します。
デフォルトでは、false を返します。
他の仕様は、特定のデバイス型についてこのアルゴリズムを定義できます。
globalObject について コンテキストがキャプチャ中であるかの確認を行うには、 次の手順を実行します:
globalObject が Window
でない場合、false を返します。
mediaDevices を globalObject の関連付けられた MediaDevices とします。
mediaDevices.[[mediaStreamTrackSources]]
内の各 source について、次のサブ手順を実行します:
deviceId を source のデバイスの deviceId とします。
mediaDevices.[[devicesLiveMap]][deviceId]
が
true の場合、true を返します。
false を返します。
このアルゴリズムは、マイク、カメラ、およびディスプレイを含むすべてのキャプチャトラックを対象とします。
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 を持ちます。
グループ識別子は、各 文書について一意に生成されなければなりません。
toJSONWebIDLenum MediaDeviceKind {
"audioinput",
"audiooutput",
"videoinput"
};
MediaDeviceKind 列挙型の
説明 |
|
|---|---|
audioinput |
音声入力デバイス、たとえば マイクを表します。 |
audiooutput |
音声出力デバイス、たとえば ヘッドフォンを表します。 |
videoinput |
映像入力デバイス、たとえば Web カメラを表します。 |
InputDeviceInfo インターフェイスは、それが表す
入力デバイスの能力へのアクセスを提供します。
WebIDL[Exposed=Window, SecureContext]
interface InputDeviceInfo : MediaDeviceInfo {
MediaTrackCapabilities getCapabilities();
};
getCapabilitiesユーザーが指定した制約がない場合に、デバイスの
MediaStream の
主要な音声または映像トラック(その
kind 値に従う)を記述する
MediaTrackCapabilities
オブジェクトを返します。
これらの能力は、この
MediaDeviceInfo の
deviceId 属性の値を
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;
};
devices(型: FrozenArray<MediaDeviceInfo>、
読み取り専用)
devices 属性は、
現時点で利用可能なデバイスのリストを表す
MediaDeviceInfo
オブジェクトの配列を返します。
userInsertedDevices(型: FrozenArray<MediaDeviceInfo>、
読み取り専用)
userInsertedDevices
属性は、devices 内の
MediaDeviceInfo オブジェクトのうち、
ユーザーが最近物理的に挿入または有効化し、その結果このイベントで
新たに公開されたものだけを含む配列を返します。
それ以外の場合は、空のリストを返します。
ユーザーエージェントは、
getUserMedia()
が呼び出される前にユーザーが挿入または有効化したデバイスも、
このイベントがそれらの初回公開を示し、かつ
ユーザーが getUserMedia()
内でデバイスを選択していない場合に限り、
含めてもかまいません。
MediaDeviceInfo オブジェクトが存在する場合、
それらは devices にも
存在しなければなりません。
ユーザーが通話中(または通話直前)にデバイスを挿入することは、 そのデバイスをすぐに使用したいという 強いシグナルになり得ます。
アプリケーションには、この属性を利用して、
このシグナルを、デバイス情報の公開の変更によって生じ得る
devices
の差異と区別することが推奨されます。
WebIDLdictionary DeviceChangeEventInit : EventInit {
sequence<MediaDeviceInfo> devices = [];
};
devices(型: sequence<MediaDeviceInfo>、
デフォルト値: [])
devices メンバーは、
利用可能なデバイスを表す
MediaDeviceInfo オブジェクトの
配列です。
このセクションでは、Navigator および
MediaDevices を拡張し、ユーザーエージェントが利用可能な
メディア入力デバイスへのアクセス許可を要求するための API を提供します。
あるいは、video 要素など特定の種類の DOM 要素からローカルの
MediaStream をキャプチャできます
[mediacapture-fromelement]。これは
自動テストに役立つ場合があります。
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ユーザーエージェントが認識する 制約可能なプロパティをメンバーとして持つ辞書を返します。サポートされる 制約可能なプロパティは表現されなければならず、 ユーザーエージェントが サポートしない制約可能なプロパティは、返される 辞書に存在してはなりません。返される値は ユーザー エージェントが実装するものを表し、ブラウジングセッション中に変更されません。
Web カメラまたはその他の 映像もしくは音声入力を使用する許可をユーザーに求めます。
constraints 引数は、
MediaStreamConstraints
型の辞書です。
このメソッドは promise を返します。以下で説明するように
ユーザーが有効なトラックを受け入れた場合、promise は適切な
MediaStream
オブジェクトで
履行されます。
有効なトラックの検索に失敗した場合、または 以下で説明するようにユーザーが許可を拒否した場合、promise は 拒否されます。
getUserMedia() メソッドが
呼び出されたとき、ユーザーエージェントは
次の手順を実行しなければなりません:
constraints をメソッドの最初の 引数とします。
requestedMediaTypes を、constraints 内で
辞書値または true の値を持つメディア
型の集合とします。
requestedMediaTypes が空集合の場合、
TypeError
で拒否された
promise を返します。
WebIDL の規則により WebIDL には "optional" という
語がありますが、呼び出しを成功させるには引数を
指定しなければなりません。
document を、関連する
グローバルオブジェクトの
関連付けられた
Document とします。
document が
完全に
アクティブでない場合、
name
属性の値が「InvalidStateError」
である DOMException
オブジェクトで
拒否された
promise を返します。
requestedMediaTypes に "audio" が含まれ、 document が "microphone" 許可名で識別される 機能を使用することを 許可されていない場合、 下の 許可失敗 とラベル付けされた手順にジャンプします。
requestedMediaTypes に "video" が含まれ、 document が "camera" 許可名で識別される 機能を使用することを 許可されていない場合、 下の 許可失敗 とラベル付けされた手順にジャンプします。
mediaDevices を this とします。
isInView を 表示中であるアルゴリズムの結果とします。
p を新しい promise とします。
次の手順を並列に実行します:
isInView が false の間、
ユーザーエージェントは、
表示中である
アルゴリズムの結果を isInView に設定するため
キューに入れられたタスクが、
isInView を true に設定することになるまで、
次の手順への進行を待たなければなりません。
finalSet を(初期状態では)空の 集合とします。
requestedMediaTypes 内の各メディア型 kind について、次の手順を実行します:
kind 型のメディアの、考えられる各ソースデバイスの
考えられる各構成について、ソースデバイスを保持し、
その固有の設定で構成された
設定
辞書を持つ、最終的な
MediaStreamTrack
のプレースホルダーとして
候補を想定します。
この候補集合を candidateSet と呼びます。
candidateSet が空集合の場合、 下の NotFound 失敗 とラベル付けされた手順にジャンプします。
true の場合、CS を
空の制約集合(制約なし)に設定します。それ以外の場合、
CS を constraints の
kind エントリの値に設定したまま続行します。
MediaStreamTrack
オブジェクトについて定義されていないものをすべて削除します。
これは、"video" 内の音声専用制約と、
"audio" 内の映像専用制約は、
OverconstrainedError を発生させるのではなく、
単に無視されることを意味します。
CS に、
必須
制約であり、その名前が
デバイス選択で許可される
必須制約の一覧にないメンバーが含まれる場合、
p を TypeError
で拒否し、
この手順を中止します。
candidateSet 内の各候補に対して、
CS を制約集合として
SelectSettings
アルゴリズムを実行します。アルゴリズムが
undefined を返す場合、その候補を
candidateSet から削除します。これにより、
制約を満たす設定辞書が少なくとも 1 つ存在することを
確認して、制約を満たせないデバイスを除外します。
candidateSet が空集合の場合、
failedConstraint を、
SelectSettings
アルゴリズムの実行中に調べたすべての設定辞書について
適合度距離が無限大であった
必須
制約のいずれかとするか、
そのようなものがない場合は "" とし、
下の 制約失敗 とラベル付けされた手順にジャンプします。
このエラーは、
ユーザーがどのデバイスにも認可を与える前に、
基礎となるデバイスが生成できないものについての情報を
提供するため、フィンガープリンティング面として
使用できます。![]()
candidateSet 内の、現在の
Document
内の live な MediaStreamTrack
に接続されていないすべての候補デバイスについて、
現在の許可
状態を読み取ります。
デバイスの許可状態が「denied」
である候補を candidateSet から削除します。
candidateSet がここで空になり、
この型のすべてのデバイスが
「denied」
状態であることを示す場合、
下の PermissionFailure とラベル付けされた手順に
ジャンプします。
任意で、たとえば以前に設定された ユーザーの選好、セキュリティ上の理由、またはプラットフォームの 制約に基づき、下の 許可 失敗 とラベル付けされた手順にジャンプします。
candidateSet のすべての候補を finalSet に追加します。
stream を新しい空の
MediaStream
オブジェクトとします。
requestedMediaTypes 内の各メディア型 kind について、できれば同時に次のサブ手順を 実行します:
ユーザー エージェントには、異なる種類のメディアに対する 同時要求を、ユーザー向けの単一の 許可プロンプトにまとめることが推奨されます。
kind に関連付けられた許可名
(たとえば "video" には "camera"、
"audio" には "microphone")
に name
メンバーを設定した PermissionDescriptor
を使用する許可を
要求し、
現在の Document
内の live かつ同一許可の
MediaStreamTrack
に接続されたすべてのデバイスは、許可状態が
「granted」
であるものとして扱い、その結果として提供されるメディアの集合を得ます。
この文脈での 同一許可とは、
現在要求されているものと同じレベルの
許可を取得するために必要とした
MediaStreamTrack
を意味します(たとえば隔離されたものではない)。
ユーザーに許可を求める際、 ユーザー エージェントは、 許可が選択されたデバイスのみに付与されるのか、 それともその kind のすべてのデバイスに 付与されるのかを開示しなければなりません。
ユーザーが応答しない場合、このアルゴリズムはこの 手順で停止したままになります。
要求の結果が「denied」
の場合、下の 許可失敗 とラベル付けされた手順にジャンプします。
hasSystemFocus を false とします。
hasSystemFocus が false の間、
ユーザーエージェントは、
システムフォーカスを持つ
アルゴリズムの結果を hasSystemFocus に設定するため
キューに入れられたタスクが、
hasSystemFocus を
true に設定することになるまで、
次の手順への進行を待たなければなりません。
mediaDevices において、
requestedMediaTypes および true を指定して
デバイス
情報の公開を設定します。
requestedMediaTypes 内の各メディア型 kind について、次のサブ手順を実行します:
finalCandidate を提供されたメディアとします。これは finalSet 内の kind 型の 候補を正確に 1 つ でなければなりません。 finalSet からどの候補を選択するかの判断は 完全に ユーザー エージェントに委ねられ、ユーザーに尋ねることで決定してもかまいません。
ユーザー エージェントは、 SelectSettings アルゴリズムから算出された 適合度距離の値を、 選択アルゴリズムへの入力として使用するべきです。 ただし、ユーザーの選好など、 デバイスについて内部的に利用可能な他の情報も 使用してかまいません。
これは、非必須 制約の値は保証されないことを意味します。
ユーザー エージェントには、可能であれば、kind について ユーザーの主要デバイスまたはシステムデフォルトデバイスを デフォルトで使用することが推奨されます。 ユーザーエージェントは、 事前録画されたメディアファイルを含む任意のメディア ソースをユーザーが使用できるようにしてもかまいません。
要求の結果は「granted」です。
OS/プログラム/Web ページのロックなどのハードウェアエラーにより
アクセスできない場合、
対応する候補を finalSet から削除します。
finalSet に kind 型の候補がない場合、
p を、
name
属性の値が
「NotReadableError」
である新しい
DOMException
オブジェクトで
拒否し、
この手順を中止します。
それ以外の場合、更新された
finalSet を使用してこれらのサブ手順を再開します。
上記以外の理由でデバイスアクセスに失敗した場合、
対応する候補を finalSet から削除します。
finalSet に kind 型の候補がない場合、
p を、name
属性の値が「AbortError」
である新しい DOMException
オブジェクトで拒否し、
この手順を中止します。
それ以外の場合、更新された
finalSet を使用してこれらのサブ手順を再開します。
grantedDevice を finalCandidate のソースデバイスとします。
grantedDevice の deviceId deviceId を使用して、
mediaDevices.[[devicesLiveMap]][deviceId]
がまだ true でなければ
true に設定し、
mediaDevices.[[devicesAccessibleMap]][deviceId]
がまだ
true でなければ
true に設定します。
track を、
grantedDevice および mediaDevices を指定して
MediaStreamTrack
を
作成した結果とします。
MediaStreamTrack
のソースは変更してはなりません。
track を stream のトラック集合に追加します。
stream 内のすべての
トラックに対して適切な制約を指定し、
ApplyConstraints
アルゴリズムを実行します。
いずれかが undefined 以外を返した場合、
failedConstraint をその結果とし、
下の 制約失敗 とラベル付けされた手順にジャンプします。
stream 内の各 track について、
track.[[Source]] および
mediaDevices を指定して、
トラックソースを
MediaDevices に関連付けます。
p を stream で 解決し、 この手順を中止します。
NotFound 失敗:
requestedMediaTypes を指定した
getUserMedia
固有の失敗が許可されるが
false を返す場合、下の
許可失敗 とラベル付けされた手順にジャンプします。
p を、
name
属性の値が「NotFoundError」
である新しい
DOMException
オブジェクトで
拒否します。
制約失敗:
requestedMediaTypes を指定した
getUserMedia
固有の失敗が許可されるが
false を返す場合、下の
許可失敗 とラベル付けされた手順にジャンプします。
message を
undefined または情報を提供する
人間が読めるメッセージのいずれかとし、
デバイス
情報を公開できるが
true の場合は constraint を
failedConstraint とし、それ以外の場合は
"" とします。
OverconstrainedError(constraint,
message) を呼び出して作成した新しい
OverconstrainedError で
p を拒否します。
許可失敗: p を、
name
属性の値が
「NotAllowedError」
である新しい DOMException
オブジェクトで拒否します。
p を返します。
requestedMediaTypes を指定して、 getUserMedia 固有の失敗が許可されるかを確認するには、次の手順を実行します:
上のアルゴリズムでは、制約は 2 回確認されます。1 回目は デバイス選択時、2 回目はアクセス承認後です。これらの確認の間に 時間が経過している可能性があるため、選択されたデバイスが もはや適切でなくなっていることも考えられます。この場合、 NotReadableError が発生します。
デバイス 選択で許可される必須制約には、 次の制約名が含まれます: width、 height、 aspectRatio、 frameRate、 facingMode、 resizeMode、 sampleRate、 sampleSize、 echoCancellation、 autoGainControl、 noiseSuppression、 latency、 channelCount、 deviceId、 groupId。
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 に
音声トラックを含めてはなりません。
このセクションは非規範的です。
このセクションにおける 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 ベースの構文へ変更された 他のメソッドについては、旧来の 使用法を考慮しなければならないほど、いずれの形でも広く実装されているとは 見なされていなかったことに注意してください。
実装は、このインターフェイスを実装しなくても 適合していると見なされます。
WebIDL
getUserMediaWeb カメラまたはその他の 映像もしくは音声入力を使用する許可をユーザーに求めます。
constraints 引数は、
MediaStreamConstraints
型の辞書です。
MediaDevices の
getUserMedia()
で説明されているように、ユーザーが有効なトラックを受け入れた場合、
successCallback は適切な
MediaStream
オブジェクトを引数として呼び出されます。
MediaDevices の
getUserMedia()
で説明されているように、有効なトラックの検索に失敗した場合、または
ユーザーが許可を拒否した場合、
errorCallback が呼び出されます。
getUserMedia()
メソッドが呼び出されたとき、
ユーザーエージェントは次の手順を実行しなければなりません:
constraints をメソッドの最初の 引数とします。
successCallback を、メソッドの 2 番目の 引数によって示されるコールバックとします。
errorCallback を、メソッドの 3 番目の引数によって 示されるコールバックとします。
constraints を引数として getUserMedia() アルゴリズムで指定された手順を実行し、 p をその結果の promise とします。
p が値 stream で履行されたとき、 次の手順を実行します:
stream を引数として successCallback を呼び出します。
p が理由 r で拒否されたとき、 次の手順を実行します:
r を引数として errorCallback を 呼び出します。
このセクションは非規範的です。
ユーザーエージェントには、
特定の getUserMedia()
の呼び出しが
成功すると判断した時点で、リソースを予約することが推奨されます。
返される promise を解決する前にリソースを予約することが望まれます。
その後の getUserMedia()
の呼び出し(このページまたは他の任意のページ)は、
以前に割り当てられたリソース、および他のアプリケーションが保持しているリソースを
使用中として扱うべきです。使用中とマークされたリソースは、
ユーザーが指定しない限り、現在の Web ページにソースとして
提供するべきではありません。任意で、
ユーザーエージェントは、使用中のソースを元とするストリームを
提供することを選択できますが、
そのソースを使用中にしている元のストリームの所有者とオリジンが一致する
ページに対してのみです。
この文書では、許可 付与ダイアログまたはデバイス選択インターフェイス(存在する場合)で、 ページによって要求されたストリームのソースとして利用可能な任意のハードウェアを ユーザーが選択できるようにすることを推奨します(そのリソースが 指定された必須制約を満たせることが条件です)。 ベストプラクティスとして特に推奨されているわけではありませんが、一部の ユーザーエージェントは、 映像または音声ソースをローカルファイルや その他のメディアに置き換える機能をサポートする場合があることに注意してください。 ファイル選択ダイアログを使用して、この機能を ユーザーに提供できます。
この文書ではまた、以前の getUserMedia() の呼び出し(この ページまたはまだ存続している他のページ)によって現在使用中のすべてのリソースを ユーザーに表示し、そのストリームを終了させ、 代わりに現在のページでそのリソースを利用できるようにすることを推奨します。 現在の実行環境で可能であれば、他のアプリケーションによって現在保持されている リソースも同様に提示し、扱うことが提案されます。 ユーザーがこの選択肢を選んだ場合、ストリームが影響を受けたページに 提供されていたリソースに対応するトラックは削除されなければなりません。
デバイスに対する許可が要求されたとき、 ユーザーエージェントは、同じオリジンが後で使用するために この許可を保存することを選択できます。これにより、 ユーザーは後で再び許可を与える必要がありません。 各デバイスを個別に、特定のクラスのすべてのデバイスを、または すべてのデバイスを対象として許可を保存する機能を提供するかどうかは ユーザーエージェントの選択です。その選択はユーザーに 明確である必要があり、保存される許可の対象となる集合全体について 許可が与えられていなければなりません。たとえば、すべてのカメラを使用する 許可を保存するには、ユーザーは 1 台だけでなく、すべてのカメラを使用する 許可を与えていなければなりません。
説明したとおり、この仕様では、 許可の付与によって保存された許可が生じるかどうかを 規定しません。許可が保存されない場合、その許可は、そのデバイスをソースとする すべての MediaStreamTrack が停止されるまでのみ有効です。
MediaStream には複数の
映像および音声トラックを含めることができます。これにより、たとえば
2 台以上の Web カメラからの映像を 1 つのストリームオブジェクトに
含めることができます。ただし、現在の API では、独立したソースからの
複数の映像ストリームが必要であることをページが表現することはできません。
同じページから getUserMedia() を複数回呼び出すことを、 ページが複数の個別の映像および/または音声ストリームを要求する手段として 許可することが推奨されます。
また、ページが複数の getUserMedia() 呼び出しを行う場合、 それらがリソースを要求する順序、および完了する順序は、 この仕様によって制約されないことにも注意してください。
getUserMedia() の 1 回の呼び出しは、 常に 0 または 1 個の音声トラックと、0 または 1 個の 映像トラックを持つストリームを返します。スクリプトが安定状態に達する前に getUserMedia() を複数回呼び出す場合、 この文書では UI 設計者に対し、許可ダイアログを統合して、 ユーザーが複数のカメラおよび/またはメディアソースの使用許可を 1 回のダイアログ操作で与えられるようにすることを助言します。 各 getUserMedia 呼び出しの制約を使用して、どのストリームがどの メディアソースを取得するかを決定できます。
deviceId を生成する効率的な
方法は、秘密鍵 +(ユーザー
エージェントのパーティショニング規則に基づく、オリジンまたはオリジン + トップレベルオリジン)
+ salt + ドライバー内のデバイスの基礎となる(ハードウェア)ID から
暗号学的ハッシュを生成し、その結果のハッシュを英数字文字列として提示することです。
衝突のリスクを避けるため、ハッシュには 32 ビット以下を使用することが推奨されますが、
それより大幅に少なくすることは推奨されません。
ストレージを消費する代わりに エントロピーを低くする方法として、ユーザーエージェントのパーティショニング規則に基づいて、 各オリジンまたはオリジン + トップレベルオリジンで新しく検出された各 デバイスに 0 から 255 の番号をランダムに割り当て、番号が尽きた場合には 最も長期間確認されていない番号を廃止する方法があります。
カメラまたはマイクをソースとするトラックは、 ユーザーのプライバシーを管理するため、 ユーザーエージェントによっていつでも 強制的にミュートされる場合があります。ただし、これを行うと Web 互換性の問題が生じたり、ユーザーのアクティビティに関する情報が漏洩したりする可能性があるため、 注意が必要です。
ベストプラクティスは、次の 場合にカメラまたはマイクのトラックを ミュートすることです:
ユーザーエージェントがすでに メディア再生を全体的に一時停止する OS レベルのイベントが発生したが、 JavaScript は一時停止されない場合。理由は、 この状況でキャプチャが継続すると(ユーザーが意図的にそのように 構成している場合を除き)、ユーザーが驚く可能性があるためです。 OS レベルのイベントによってすでにトラックへのフレーム入力が 停止する場合、これによって新たなユーザーアクティビティ情報が公開されることはありません。 そうでない場合であっても、キャプチャが終了することを公開することは、 ユーザーを驚かせる可能性のある状況でキャプチャを継続することと比べれば、 妥当なプライバシー上のトレードオフと考えられます。
表示中でない Web ページが、そのソースからのすべてのトラックが 無効であるときにトラックを 再び有効にした場合、 ページが表示中になるまで キャプチャの再開を遅らせるため。
ベストプラクティスは、次の 場合に、以前 ミュートしたカメラまたはマイクのトラックを ミュート解除することです:
ユーザーエージェントがすでにメディア 再生を全体的に再開する OS レベルのイベントが発生し、かつページがユーザーに 表示されている場合(たとえばロック画面中ではない場合)。 ユーザーエージェントは、 以前のキャプチャセッションに対するユーザーの認識が損なわれるほど 長い時間が経過したと判断した場合、このような動作を延期してもかまいません。
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 を解決しなければなりません。
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()
アクセサーを介して、オブジェクトの制約可能なプロパティの現在の設定を照会できます。
この仕様では正式には
ConstrainablePattern を WebIDL インターフェイスとして定義していますが、実際には
他のインターフェイスのための
テンプレートまたはパターンであり、メソッドの戻り値を拡張する必要があるため、
直接継承することはできません。これは
WebIDL ではできません。したがって、ここで定義された機能を利用したい
各インターフェイスは、ここで示される関数およびインターフェイスの
WebIDL を独自に複製して提供する必要があります。ただし、変更されない
ここで定義された意味論を参照できます。この例については
MediaStreamTrack インターフェイス
定義を参照してください。
このパターンは、制約可能なオブジェクトが 3 つの 内部スロットを定義することに依存します:
[[Capabilities]] 内部
スロット。これは、
Capabilities で説明されているように、
公開される各制約可能なプロパティについて許容される値の集合全体を記述する
Capabilities 辞書に初期化され、存在しない場合は空の
辞書に初期化されます。
[[Constraints]] 内部
スロット。空の
Constraints 辞書に初期化されます。
[[Settings]] 内部スロット。
これは、
Settings で説明されているように、
公開される各制約可能なプロパティについて現在アクティブな
設定値を記述する Settings 辞書に初期化され、存在しない場合は空の
辞書に初期化されます。
WebIDL[Exposed=Window]
interface ConstrainablePattern {
Capabilities getCapabilities();
Constraints getConstraints();
Settings getSettings();
Promise<undefined> applyConstraints(optional Constraints constraints = {});
};
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() メソッドは、
オブジェクトのすべての制約可能なプロパティの現在の
設定を、それらがプラットフォームのデフォルトであるか
ApplyConstraints
アルゴリズムによって設定されたかにかかわらず返します。
設定は制約に適合する
目標値であるため、場合によっては測定された性能と
異なる可能性があることに注意してください。呼び出されたとき、ユーザー
エージェントは [[Settings]]
内部スロットの値を返さなければなりません。
applyConstraints テンプレートメソッドが 呼び出されたとき、 ユーザーエージェントは 次の手順を実行しなければなりません:
object を、このメソッドが 呼び出されたオブジェクトとします。
newConstraints を、この メソッドへの引数とします。
p を新しい promise とします。
このメソッドが複数回呼び出された場合には呼び出し順序を維持しつつ、 次の手順を並列に実行します:
failedConstraint を、 newConstraints を引数として ApplyConstraints アルゴリズムを実行した結果とします。
successfulSettings を、上記の手順のアルゴリズムが 完了した後の object の現在の設定とします。
次の手順を実行するタスクをキューに入れます:
failedConstraint が
undefined でない場合、
message を undefined または
情報を提供する人間が読めるメッセージのいずれかとし、
OverconstrainedError(failedConstraint,
message) を呼び出して作成した
新しい OverconstrainedError で
p を拒否し、
この手順を中止します。この場合、既存の制約は有効なままです。
object の [[Constraints]]
内部スロットを newConstraints または
newConstraints とあらゆる状況で
同一の効果を持つ Constraints 辞書に設定します。
object の [[Settings]] 内部スロットを successfulSettings に設定します。
p を
undefined で
解決します。
p を返します。
制約を適用するための ApplyConstraints アルゴリズムを以下に示します。ここでは、アルゴリズムの記述で 使用される予備的な定義をいくつか示します:
オブジェクトに設定として適用され得る値の集合を指すため、 設定辞書という用語を使用します。
文字列値の制約について、以下では、シーケンス内の値の 1 つが 比較対象の値と正確に同じである場合に "==" を true と定義します。
設定辞書と制約集合 CS の間の適合度距離を、 CS 内に存在する 各メンバー(constraintName と constraintValue の組で表される) について、次の値の合計として定義します:
constraintName が ユーザーエージェントによってサポートされていない場合、 適合度距離は 0 です。
制約が必須であり (constraintValue が 'min'、'max'、または 'exact' という名前のメンバーを 1 つ以上含むか、 または高度な ConstraintSet 内でそれ自体が裸の値である)、 設定 辞書の constraintName メンバーの値が制約を満たさないか、 存在しない場合、 適合度距離は 正の無限大です。
この種類のオブジェクトに制約が適用されない場合、 適合度距離は 0 です(すなわち、その制約は 適合度距離に影響しません)。
constraintValue が boolean である一方、 制約可能なプロパティがそうでない場合、適合度距離は、 設定 辞書の constraintName メンバーが存在するかどうかに基づき、 次の式から求められます
(constraintValue == exists) ? 0 : 1
(actual == ideal) ? 0 : |actual - ideal| / max(|actual|, |ideal|)
(actual == ideal) ? 0 : 1
その他の定義:
SelectSettings アルゴリズムを次のように 定義します:
未知のプロパティは WebIDL によって破棄されるため、
未知/サポートされていない必須制約は暗黙に消えることに注意してください。
これが意外な動作にならないよう、アプリケーション作成者はまず、
以下の例に示すように
getSupportedConstraints()
メソッドを使用することが期待されます。
ConstrainablePattern
オブジェクトとします。copy を、object の制約なしの
コピーとします(すなわち、copy は、すべての ConstraintSet が
削除された object であるかのように動作するべきです)。
copy の可能なすべての 設定 辞書について、その適合度 距離を計算し、プロパティの裸の値を ideal 値として扱います。 candidates を、適合度距離が有限である 設定辞書の集合とします。
candidates が空の場合、
SelectSettings アルゴリズムの結果として
undefined を返します。
それと candidates 内の各設定辞書との 適合度 距離を計算し、プロパティの裸の値を exact として扱います。
candidates 内の 1 つ以上の 設定辞書について適合度距離が有限である場合、それらの 設定辞書を candidates に保持し、 その他を破棄します。
candidates 内のすべての設定 辞書について適合度距離が無限大である場合、この ConstraintSet を無視します。
candidates から 1 つの設定辞書を選択し、 SelectSettings アルゴリズムの結果として返します。 ユーザーエージェントは、 ステップ 3 で計算された 適合度距離が最小のものを 使用しなければなりません。複数の設定辞書が 最小の適合度距離を持つ場合、 ユーザーエージェントは、 システムのデフォルトプロパティ値および ユーザーエージェントの デフォルトプロパティ値に基づいて、そのうち 1 つを選択します。
選択されたデバイスについてシステムデフォルト値を持つすべてのプロパティでは、 上記のアルゴリズムと互換性がある場合、そのシステムデフォルト 値を使用するべきです。これは通常、 sampleRate や sampleSize などのプロパティで該当します。 echoCancellation や resizeMode などの他のプロパティには、 通常、システムデフォルト値がありません。 ユーザーエージェントは、 これらのプロパティについて独自のデフォルト値を定義します。 これらはメディアコンテンツの生成方法にしばしば影響するため、 実装者は適切なデフォルト値を選択する際に注意する必要があります。
意味のあるデフォルト値を選択するため、 既存の実装を確認することが推奨されます。 デフォルト値はシステムによって、たとえばデスクトップと モバイルで異なる場合があることに注意してください。 執筆時点では、ユーザーエージェントの 実装は、RTCPeerConnection をシンクとして使用するのに適していることから選ばれた、 次のデフォルト値を使用する傾向があります:
width を 640 に設定。
height を 480 に設定。
frameRate を 30 に設定。
echoCancellation を
true に設定。
newConstraints を引数として object に ApplyConstraints アルゴリズムを適用するには、 ユーザーエージェントは 次の手順を実行しなければなりません:
successfulSettings を、 newConstraints を制約集合として SelectSettings アルゴリズムを実行した結果とします。
successfulSettings が
undefined の場合、
failedConstraint を、
SelectSettings アルゴリズムの実行中に調べた
すべての設定辞書について適合度距離が無限大であった
必須制約のいずれかとするか、
そのようなものがない場合は "" とし、
その後 failedConstraint を返して
この手順を中止します。
undefined を返します。上記のアルゴリズムと同じ結果になる実装であれば、 どのような実装も許可されます。たとえば、 実装は、設定について可能なすべての値を 追跡する代わりに、検討された制約の下で許容される 設定の最大値と最小値を追跡することを選択できます。
設定辞書を選択するとき、UA は利用可能な任意の 情報を使用できます。そのような情報の例には、 選択が getUserMedia におけるデバイス選択の一部として行われるか、 カメラのエネルギー使用量が設定辞書間で異なるか、 または設定辞書を使用することでデバイスドライバーが リサンプリングを適用することになるかどうか、などがあります。
ユーザーエージェントは、 オブジェクトの制約可能なプロパティに対していつでも新しい設定を 選択してもかまいません。その場合、上記のアルゴリズムで説明した方法で 現在のすべての Constraints を満たそうとしなければならず、 successfulSettings を結果として得られた新しい設定とし、 次の手順を実行するタスクをキューに入れます:
object を、
1 つ以上の制約可能なプロパティの新しい設定が変更された
オブジェクトとします。
ConstrainablePattern
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"}
]
}
});
}
有効な入力集合を指定する構文は、 値の型に依存します。標準的なアトミック型 (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 ConstrainDoubleRange : DoubleRange {
double exact;
double ideal;
};
WebIDLdictionary ULongRange {
[Clamp] unsigned long max;
[Clamp] unsigned long min;
};
max(型: unsigned long)
このプロパティの有効な最大値です。
min(型: unsigned long)
このプロパティの最小値です。
WebIDLdictionary ConstrainULongRange : ULongRange {
[Clamp] unsigned long exact;
[Clamp] unsigned long ideal;
};
exact
(型: unsigned long)
このプロパティに必須の正確な値です。
ideal
(型: unsigned long)
このプロパティの理想的な(目標)値です。
WebIDLdictionary ConstrainDOMStringParameters {
(DOMString or sequence<DOMString>) exact;
(DOMString or sequence<DOMString>) ideal;
};
WebIDLdictionary ConstrainBooleanOrDOMStringParameters {
(boolean or DOMString) exact;
(boolean or DOMString) ideal;
};
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)
型を指すために使用されます。
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 {};
Settings は、1 つ以上のキーと値の
組を含む辞書です。それが返されるオブジェクト型でプロパティが定義されている場合、
getCapabilities() から返される各キーを含まなければなりません。
たとえば、音声
MediaStreamTrack には "width" プロパティがありません。
各キーには単一の値が存在しなければならず、
その値は getCapabilities() がそのプロパティについて定義する
集合のメンバーでなければなりません。
Settings 辞書は、ユーザー
エージェントがオブジェクトの制約可能なプロパティについて選択した実際の値を含みます。
値の正確な構文はプロパティの型に依存します。
適合する ユーザーエージェントは、 この仕様で定義されるすべての制約可能なプロパティをサポートしなければなりません。
Settings 辞書の例を以下に示します。この例は、 ユーザーエージェントが実際には これらだけでなく、より多くの制約可能なプロパティを サポートする必要があるという点で、あまり現実的ではありません。
{
frameRate: 30.0,
facingMode: 'user'
}
MediaTrackSettings を参照してください。
WebIDL の制限により、Constrainable パターンを実装するインターフェイスは、 ここで定義される Constraints および ConstraintSet を単純にサブクラス化することはできません。代わりに、 このパターンに従う独自の定義を提供しなければなりません。 この例については MediaTrackConstraints を参照してください。
WebIDLdictionary ConstraintSet {};
ConstraintSet の各メンバーは、
制約可能なプロパティに対応し、そのプロパティの有効な
Capability 値の部分集合を指定します。ConstraintSet を適用すると、
ユーザーエージェントに、
対応する制約可能なプロパティの設定を
指定された値または値の範囲に制限するよう指示します。特定のプロパティは、
基本 Constraints 集合と高度な ConstraintSet リストの両方に
現れてもかまわず、
高度なリスト内の各 ConstraintSet には最大 1 回現れてもかまいません。
WebIDLdictionary Constraints : ConstraintSet {
sequence<ConstraintSet> advanced;
};
advanced(型: sequence<ConstraintSet>)これは、ユーザー
エージェントが順番に満たそうとしなければならない
ConstraintSet のリストであり、満たせないものだけを
スキップします。これらの ConstraintSet の順序には意味があります。
特に、それらが
applyConstraints への引数として渡された場合、
ユーザー
エージェントは指定された順序で
それらを満たそうとしなければなりません。
したがって、高度な ConstraintSet C1 と C2 を個別には満たせても、
同時には満たせない場合、このリストで C1 と C2 のうち
先にある方が満たされ、もう一方は満たされません。
ユーザー
エージェントは、一部を満たせない場合でも、
リスト内のすべての ConstraintSet を満たそうとしなければなりません。
したがって前の例で、制約 C3 が C1 と C2 の後に指定されている場合、
ユーザーエージェントは、
C2 を満たせなくても C3 を満たそうとします。
特定のプロパティ名は各 ConstraintSet に 1 回だけ現れることができますが、
複数の ConstraintSet に現れることができることに注意してください。
このサンプルコードはボタンを表示します。クリックすると、ボタンは 無効になり、ユーザーはストリームを提供するよう求められます。ユーザーは、 ストリームを提供し(たとえば、ページにローカルカメラへの アクセスを許可し)、その後ストリームを無効にする(たとえば、そのアクセスを 取り消す)ことで、ボタンを再び有効にできます。
<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">📷</button>
<canvas id="photo"></canvas>
</section>
この仕様は、名前
"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 を
引数として渡して デバイス許可取り消しアルゴリズムを
呼び出した結果です。
この仕様は、文字列 "camera" および "microphone" で識別される
2 つのポリシー制御機能を定義します。
どちらもデフォルト
許可リストは
"self" です。
文書のPermissions
Policyは、
その文書内のコンテンツが
getUserMedia を使用して、それぞれカメラまたは
マイクを要求することを許可されるかどうかを決定します。いずれかの文書で
無効にされている場合、その文書内のコンテンツは、それぞれ
カメラまたはマイクを要求するために
getUserMedia を使用することを
許可されません。
これは使用する許可を
要求する
アルゴリズムによって適用されます。
さらに、enumerateDevices は、
文書が使用することを
許可されたデバイスのみを列挙します。
この仕様は、単一の MediaDevices オブジェクトの
視点から、アルゴリズムを使用してプライバシーインジケーターの要件を表現しています。
実装者には、iframe によってページ上に共存し得る複数の
MediaDevices オブジェクトを対象として
インジケーターの表示を統合するため、これらの原則を拡張して適用することが推奨されます。
getUserMedia() が公開する各デバイスの
kind について、
[[kindsAccessibleMap]][kind] の値と、
その種類のデバイスのすべての
[[devicesAccessibleMap]][deviceId]
の値との論理 OR として定義します。
[[kindsAccessibleMap]][kind] の値と、
その種類のデバイスのすべての
[[devicesLiveMap]][deviceId] の値との
論理 OR として定義します。
anyAccessible を、すべての any<kind>Accessible 値の論理 OR として定義します。
anyLive を、すべての any<kind>Live 値の論理 OR として定義します。
このとき、ユーザーエージェントには次の要件があります:
[[devicesAccessibleMap]][deviceId]
値および
[[devicesLiveMap]][deviceId] 値について、
少なくとも値が変化したときに
示さなければなりません。
また、ユーザーエージェントには次の動作が推奨されます:
[[devicesAccessibleMap]][deviceId]
値および
[[devicesLiveMap]][deviceId] 値について、
値の現在の状態を継続的に
示すことが推奨されます。また、デバイス固有のハードウェアインジケーターライトがある場合、
対応する [[devicesLiveMap]][deviceId] 値と
一致させることも推奨されます。
このセクションは非規範的です。新しい動作を規定するものではなく、 仕様の他の部分にすでに存在する情報を 要約します。
この仕様は、メディアの入力 デバイス、具体的にはマイクおよびカメラを管理する機能を 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 に自分の
音声/映像ストリームを送信するよう仕向けられる可能性があります。
このセクションは非規範的です。
この仕様の新しいバージョンが将来作成される可能性がありますが、 他の標準でも、この仕様の機能を基礎とする新しい 機能を定義する必要があると予想されます。このセクションの目的は、 そのような拡張の作成者にガイダンスを提供することです。
この仕様内で WebIDL によって定義されるインターフェイス、メソッド、または属性は、 すべて拡張できます。拡張点として可能性が高いものは、新しい メディア型の定義と、新しい制約可能なプロパティの定義の 2 つです。
kind を定義する(音声および映像以外)
最低限、新しいメディア型を定義するには次が必要です
MediaStream インターフェイスに追加すること、
kind 属性の追加の有効値として
MediaStreamTrack
インターフェイスに追加すること、
MediaStream と
HTMLMediaElement
がどのように動作するかを更新すること
(6.
メディア要素内の MediaStreamを参照)。これには、
新しいメディア型について 可聴/不可聴に対応する概念を
追加することも含まれます、
MediaDeviceKind を更新すること、
getCapabilities()
および
getUserMedia()
の説明を更新すること、
MediaStreamConstraints 辞書に追加すること、
kind に関連付けられた
新しい PermissionDescriptor 名、およびこれらの
許可とアクセスの開始および終了、さらに
ミュート/無効化が、新しい、および/または既存の「オンエア」および「デバイス
アクセス可能」インジケーター状態(MediaDevices を参照)にどのように影響するかを定義すること。
さらに、次を更新するべきです
label 属性の説明
(MediaStreamTrack インターフェイス上)、
さらに、次を含めることも考えられます
MediaStreamTrackState で例を示すこと。
これには、そのプロパティの Constraints、
Capabilities、および Settings(3.
用語を参照)がどのように機能するかを検討し、
定義する必要があります。
MediaTrackSupportedConstraints、
MediaTrackCapabilities、
MediaTrackConstraints、
MediaTrackSettings、4.3.8 制約可能な
プロパティ、および
MediaStreamConstraints の関連する記述を
モデルとして使用します。
拡張仕様の作成者には、仕様
リポジトリで仕様の保守担当者に通知することが強く推奨されます。
この仕様の将来のバージョンおよび WebRTC Working Group が作成する他の仕様では、
潜在的な利用上の競合を減らすため、認識しているすべての拡張を
考慮します。
MediaStreamTrack および
MediaStream の新しいシンクを定義する
他の仕様は、MediaStream および/または
MediaStreamTrack の新しいシンクを定義できます。最低限、
MediaStreamTrack の新しい
コンシューマーは次を定義する必要があります:
MediaStreamTrack が
ミュートや無効化を含む、取り得るさまざまな状態で
どのように消費されるか
(4.3.1 メディアフローとライフサイクルを参照)。
MediaStreamTrack
を定義する他の仕様は、MediaStreamTrack の新しいソースを定義できます。
最低限、MediaStreamTrack の新しいソースには次が必要です
kind の
MediaStreamTrack を作成する
新しい API を定義すること
(getUserMedia() は
カメラおよびマイクのソース専用です)、
kind に対して、
適用可能な制約可能なプロパティ(4.3.8
制約可能なプロパティを参照)がある場合はそれを宣言し、
それらがこのソースでどのように機能するかを説明すること、
編集者は、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 から受けた多大な支援に感謝の意を表します。
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: