メディア機能

W3C 作業草案,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2025/WD-media-capabilities-20250825/
最新公開バージョン:
https://www.w3.org/TR/media-capabilities/
編集者草案:
https://w3c.github.io/media-capabilities/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/media-capabilities/
フィードバック:
GitHub
仕様内でインライン
編集者:
Jean-Yves Avenard (Apple Inc.)
Mark Foltz (Google Inc.)
以前の編集者:
Will Cassella (Google Inc.)
Mounir Lamouri (Google Inc.)
Chris Cunningham (Google Inc.)
Vi Nguyen (Microsoft Corporation)
参加方法:
Git リポジトリ。
課題を提出。
バージョン履歴:
https://github.com/w3c/media-capabilities/commits

概要

本仕様は、ウェブサイトがユーザーのために最適なメディアコンテンツを選択する際に、最適な判断を行えるようにするAPIを提供することを目的としています。 APIは、指定されたフォーマットのデコードおよびエンコードの機能に関する情報だけでなく、デバイスのディスプレイに基づいて最適な一致を見つけるための出力機能も公開します。

この文書のステータス

このセクションは、公開時点でのこの文書のステータスについて説明しています。現在の W3Cの出版物一覧や、この技術レポートの最新の改訂版は、 W3C標準および草案インデックスで確認できます。

本仕様へのフィードバックやコメントを歓迎します。 GitHub Issuesでの議論が推奨されます。 または、Media Working Group のメーリングリスト public-media-wg@w3.orgアーカイブ)へコメントを送信できます。 この草案では、ワーキンググループで今後議論される保留中の課題がいくつか強調されています。 それらの課題が有効かどうかも含め、結果についてはまだ決定されていません。

この文書は、Media Working Groupによって 勧告トラックを用いて作業草案として公開されました。 この文書はW3C勧告になることを意図しています。

作業草案として公開されたことは、 W3Cおよびその会員による承認を意味しません。

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

この文書は、W3C特許ポリシーのもとで運営されているグループによって作成されました。 W3Cは、グループの成果物に関連して提出された特許開示の公開リストを管理しています。 そのページには特許開示の手順も記載されています。個人が本質的なクレームを含むと信じる特許について実際に知っている場合は、 W3C特許ポリシー第6節に従い情報を開示する必要があります。

この文書は2025年8月18日 W3Cプロセス文書に従って管理されています。

1. はじめに

このセクションは規範的ではありません

本仕様は、ユーザーエージェントの音声および映像のデコード・エンコード機能について、 コーデック、プロファイル、解像度、ビットレートなどのメディア情報に基づき 問い合わせるAPIを定義します。このAPIは構成がサポートされているかどうか、 さらに再生が滑らかであるか/省電力であるかも示します。

本仕様は主にエンコード・デコード機能に焦点を当てています。 表示デバイスの色域やダイナミックレンジなどの情報を提供する他のWeb APIと 組み合わせて利用されることを想定しています。これによりWebアプリケーションは 適切な表示用コンテンツを選択でき、例えばSDRディスプレイにHDRコンテンツを 提供しないなどの制御が可能となります。

2. デコードおよびエンコード機能

2.1. メディア設定

2.1.1. MediaConfiguration

dictionary MediaConfiguration {
  VideoConfiguration video;
  AudioConfiguration audio;
};
dictionary MediaDecodingConfiguration : MediaConfiguration {
  required MediaDecodingType type;
  MediaCapabilitiesKeySystemConfiguration keySystemConfiguration;
};
dictionary MediaEncodingConfiguration : MediaConfiguration {
  required MediaEncodingType type;
};

デコード機能への入力はMediaDecodingConfiguration 辞書で表現され、エンコード機能への入力はMediaEncodingConfiguration 辞書で表現されます。

MediaConfiguration有効な MediaConfigurationとなるためには、以下の条件すべてを満たさなければなりません:

  1. audioおよびvideoのいずれかが存在すること。
  2. audio有効な音声設定であること(存在する場合)。
  3. video有効な映像設定であること(存在する場合)。

MediaDecodingConfiguration有効な MediaDecodingConfigurationとなるためには、以下の条件すべてを満たさなければなりません:

  1. 有効なMediaConfigurationであること。
  2. keySystemConfiguration存在する場合:
    1. typemedia-source またはfileでなければなりません。
    2. keySystemConfiguration.audio存在する場合、 audio存在しなければなりません。
    3. keySystemConfiguration.video存在する場合、 video存在しなければなりません。

MediaDecodingConfiguration[ENCRYPTED-MEDIA]を記述する場合、 keySystemConfiguration存在しなければなりません。

2.1.2. MediaDecodingType

enum MediaDecodingType {
  "file",
  "media-source",
  "webrtc"
};

MediaDecodingConfiguration には3つのタイプがあります。

2.1.3. MediaEncodingType

enum MediaEncodingType {
  "record",
  "webrtc"
};

MediaEncodingConfiguration には2つのタイプがあります。

2.1.4. VideoConfiguration

dictionary VideoConfiguration {
  required DOMString contentType;
  required unsigned long width;
  required unsigned long height;
  required unsigned long long bitrate;
  required double framerate;
  boolean hasAlphaChannel;
  HdrMetadataType hdrMetadataType;
  ColorGamut colorGamut;
  TransferFunction transferFunction;
  DOMString scalabilityMode;
  boolean spatialScalability;
};

contentType メンバーは、動画トラックのMIMEタイプを表します。

VideoConfiguration configuration有効な video configurationかどうかを確認するには、以下の手順を実行します。

  1. framerate が有限でない、または0以下の場合、falseを返して手順を中止します。
  2. 任意のメンバーが、該当しないMediaDecodingType または MediaEncodingType に指定された場合、falseを返して手順を中止します。適用ルールは下記メンバー定義を参照してください。
  3. mimeTypeparse a MIME typeconfigurationcontentTypeで実行した結果とします。
  4. mimeTypefailureの場合、falseを返します。
  5. check MIME type validitymimeTypeおよびvideoで実行した結果を返します。

widthおよび heightメンバーは、 それぞれエンコードされた動画フレームの表示される水平・垂直ピクセル数を表します。

bitrateメンバーは、 動画トラックのビットレート(単位:bps)を表します。 動画ストリームが定常ビットレート(CBR)の場合は平均ビットレート、 可変ビットレート(VBR)の場合は最大ビットレートとなります。

framerateメンバーは、 動画トラックのフレームレート(1秒間のフレーム数、fps)を表します。double型で表現されます。

hasAlphaChannelメンバーは、 動画トラックがアルファチャンネル情報を含むかどうかを示します。trueの時、デコード時にピクセル毎のアルファ情報を生成可能です。 falseの場合は生成できません。未定義の場合、UAはcontentType に基づき判断し、できない場合は生成不可とみなします。

hdrMetadataTypeメンバーが存在する場合、 動画トラックに指定のHDRメタデータタイプが含まれることを示します。UAはHDRコンテンツを出力デバイスの色ボリュームや輝度にトーンマッピングするため、 このメタデータを解釈する必要があります。入力値はHdrMetadataType で定義されます。MediaDecodingConfiguration のうちmedia-sourcefile タイプにのみ適用されます。

colorGamutメンバーが存在する場合、 動画トラックが指定された色域で配信されることを示します。出力デバイスがその色域に対応していれば適切に描画し、 非対応の場合は近い色域にマッピングします。入力値はColorGamut で定義されます。MediaDecodingConfiguration のうちmedia-sourcefile タイプにのみ適用されます。

transferFunctionメンバーが存在する場合、 動画トラックが指定された伝達関数の理解をUAに要求します。伝達関数は、表示デバイスとは独立して、 デコードしたメディアの色を表示色へ変換するユーザーエージェントのレンダリング能力を記述します。 入力値はTransferFunction で定義されます。MediaDecodingConfiguration のうちmedia-sourcefile タイプにのみ適用されます。

scalabilityModeメンバーが存在する場合、 [webrtc-svc]で定義される スケーラビリティモードを表します。未指定の場合は、contentType に対する実装依存のデフォルトモードとなります(setParameters() で指定しない場合に得られるモード)。scalabilityModeはMediaEncodingConfiguration のうち webrtc タイプにのみ適用されます。

scalabilityMode が複数の空間レイヤーを示す場合、 width およびheight の値は、エンコードされた最大の空間レイヤーを表します。

spatialScalabilityメンバーが存在する場合、 空間予測(異なる解像度のフレームを依存関係に使う)機能を示します。未指定の場合、spatialScalability のデフォルト値はfalseです。spatialScalability がtrueなら、デコーダはエンコーダが設定したコーデック用の任意のscalabilityMode をデコード可能です。falseなら空間スケーラビリティモードはデコードできませんが、他のscalabilityMode はデコードできます。spatialScalabilityMediaDecodingConfiguration のうちmedia-sourcefilewebrtc タイプにのみ適用されます。

2.1.5. HdrMetadataType

enum HdrMetadataType {
  "smpteSt2086",
  "smpteSt2094-10",
  "smpteSt2094-40"
};

存在する場合、HdrMetadataType は指定された種類のHDRメタデータを解釈する能力を表します。

VideoConfiguration には以下のいずれかの種類が含まれる場合があります。

  • smpteSt2086: [SMPTE-ST-2086]で定義される静的メタデータタイプ。
  • smpteSt2094-10: [SMPTE-ST-2094]で定義される動的メタデータタイプ。
  • smpteSt2094-40: [SMPTE-ST-2094]で定義される動的メタデータタイプ。

2.1.6. ColorGamut

enum ColorGamut {
  "srgb",
  "p3",
  "rec2020"
};

VideoConfiguration には以下のいずれかの種類が含まれる場合があります。

  • srgb: [sRGB] 色域。
  • p3: DCI P3 カラースペース色域。この色域はsrgb色域を含みます。
  • rec2020: ITU-R勧告BT.2020色域。この色域はp3色域を含みます。

2.1.7. TransferFunction

enum TransferFunction {
  "srgb",
  "pq",
  "hlg"
};

VideoConfiguration には以下のいずれかの種類が含まれる場合があります。

  • srgb: [sRGB]で定義される伝達関数。
  • pq: [SMPTE-ST-2084]で定義される「Perceptual Quantizer」伝達関数。
  • hlg: BT.2100で定義される「Hybrid Log Gamma」伝達関数。

2.1.8. AudioConfiguration

dictionary AudioConfiguration {
  required DOMString contentType;
  DOMString channels;
  unsigned long long bitrate;
  unsigned long samplerate;
  boolean spatialRendering;
};

contentType メンバーは、音声トラックのMIMEタイプを表します。

AudioConfiguration configuration有効な audio configurationかどうかを確認するには、以下の手順を実行します。

  1. mimeTypeparse a MIME typeconfigurationcontentTypeで実行した結果とします。
  2. mimeTypefailureの場合、falseを返します。
  3. check MIME type validitymimeTypeaudioで実行した結果を返します。

channels メンバーは、音声トラックに使用されるチャンネル構成を表します。channelsは、デコードタイプmedia-sourcefilewebrtcおよびエンコードタイプwebrtcにのみ適用されます。

channels は、double(2.1、4.1、5.1など)、unsigned short(チャンネル数)、またはenum値として定義する必要があります。現在の定義はプレースホルダーです。

bitrate メンバーは、音声トラックの平均ビットレートを表します。ビットレートは音声トラックの1秒間のエンコードに使用されるビット数です。

samplerate メンバーは、音声トラックのサンプリングレートを表します。サンプリングレートは毎秒の音声サンプル数です。samplerateは、デコードタイプmedia-sourcefilewebrtcおよびエンコードタイプwebrtcにのみ適用されます。

samplerateHz(毎秒のサンプル数)で表記されます。場合によってはサンプリングレートがkHz(毎秒千サンプル)で表記されることがあります。
44100Hzは44.1kHzと同等です。

spatialRendering メンバーは、音声を空間的にレンダリングすべきであることを示します。空間レンダリングの詳細はcontentTypeから推測されるべきです。 存在しない場合、UAは空間レンダリング不要とみなす必要があります。trueの場合、ユーザーエージェントは現在の音声出力デバイスで空間レンダリングをサポートできる場合のみ、この構成をsupportedとして報告するべきです。 spatialRenderingMediaDecodingConfiguration のうちmedia-sourceおよびfileタイプにのみ適用されます。

2.1.9. MediaCapabilitiesKeySystemConfiguration

dictionary MediaCapabilitiesKeySystemConfiguration {
  required DOMString keySystem;
  DOMString initDataType = "";
  MediaKeysRequirement distinctiveIdentifier = "optional";
  MediaKeysRequirement persistentState = "optional";
  sequence<DOMString> sessionTypes;
  KeySystemTrackConfiguration audio;
  KeySystemTrackConfiguration video;
};

この辞書では[ENCRYPTED-MEDIA] (EME)で定義される複数の型を参照します。EMEタイプのシーケンスは、シーケンスの目的がrequestMediaKeySystemAccess()によってサポートされる部分集合を選択する場合、 単一値にフラット化されます。 MediaCapabilities では、呼び出し元が複数回の呼び出しでシーケンスを指定し、最終的にどの構成を使用するかを呼び出し元が選択できます。

keySystem メンバーは、 [ENCRYPTED-MEDIA]で説明されるkeySystem名を表します。

initDataType メンバーは、 [ENCRYPTED-MEDIA]で説明されるinitDataTypes シーケンスからの単一値を表します。

distinctiveIdentifier メンバーは、 [ENCRYPTED-MEDIA]で説明されるdistinctiveIdentifier要件を表します。

persistentState メンバーは、 [ENCRYPTED-MEDIA]で説明されるpersistentState要件を表します。

sessionTypes メンバーは、 [ENCRYPTED-MEDIA]で説明されるsessionTypesの必須シーケンスを表します。

audio メンバーは、 KeySystemTrackConfigurationで、 AudioConfigurationに関連付けられます。

video メンバーは、 KeySystemTrackConfigurationで、 VideoConfigurationに関連付けられます。

2.1.10. KeySystemTrackConfiguration

dictionary KeySystemTrackConfiguration {
  DOMString robustness = "";
  DOMString? encryptionScheme = null;
};

robustness メンバーは、[ENCRYPTED-MEDIA]で説明される robustness レベルを表します。

encryptionScheme メンバーは、[ENCRYPTED-MEDIA-DRAFT]で説明される encryptionScheme を表します。

2.2. メディア機能情報

dictionary MediaCapabilitiesInfo {
  required boolean supported;
  required boolean smooth;
  required boolean powerEfficient;
};
dictionary MediaCapabilitiesDecodingInfo : MediaCapabilitiesInfo {
  required MediaKeySystemAccess? keySystemAccess;
  required MediaDecodingConfiguration configuration;
};
dictionary MediaCapabilitiesEncodingInfo : MediaCapabilitiesInfo {
  required MediaEncodingConfiguration configuration;
};

MediaCapabilitiesInfo には、supportedsmoothpowerEfficient というフィールドがあり、いずれもboolean型です。

エンコードまたはデコードが省電力であるとみなされるのは、電力消費が最適である場合です。エンコードやデコードの最適な電力消費の定義はユーザーエージェントに委ねられますが、一般的な実装方針としてはハードウェア利用が最適な消費の指標となることが多いです。ユーザーエージェントはハードウェアエンコード/デコードをデフォルトで省電力とみなすべきではありません。非ハードウェアコーデックでも低解像度動画では同等に効率的な場合があります。ユーザーエージェントは、省電力の判定にデバイスの電源供給(電源の有無)を考慮すべきではありませんが、電源供給によって異なるエンコード・デコードモジュールが有効化されるなど副作用がある場合は考慮しても構いません。

MediaCapabilitiesDecodingInfo には、keySystemAccess という、MediaKeySystemAccess またはnullが適宜関連付けられます。

暗号化デコード構成がサポートされている場合、返されるMediaCapabilitiesInfo には MediaKeySystemAccess が含まれます。著者はこれを利用して MediaKeys を作成し、暗号化再生のセットアップが可能です。

MediaCapabilitiesDecodingInfo には、configurationが関連付けられ、 MediaCapabilitiesDecodingInfo を生成するために使われたデコード構成プロパティです。

MediaCapabilitiesEncodingInfo には、configurationが関連付けられ、 MediaCapabilitiesEncodingInfo を生成するために使われたエンコード構成プロパティです。

2.3. アルゴリズム

2.3.1. MediaCapabilitiesEncodingInfoの作成

MediaCapabilitiesEncodingInfoの作成を行うには、 MediaEncodingConfiguration configurationが与えられたとき、以下の手順を実行します。返値はMediaCapabilitiesEncodingInfoです:

  1. infoを新しいMediaCapabilitiesEncodingInfo インスタンスとして作成します。特に明記がない限り、以後の手順の読取・書込はinfoに対して行います。
  2. configuration を新しいMediaEncodingConfigurationとします。 configuration内の各プロパティについて、同名・同値の新しいプロパティをconfigurationに作成します。
  3. videoSupportedunknownとします。
  4. videoconfigurationに存在する場合、以下を実行します:
    1. videoMimeTypeconfigurationcontentTypeMIMEタイプの解析を実行した結果とします。
    2. videoSupportedに、MIMEタイプサポートの確認videoMimeTypeconfigurationtypeで実行した結果を設定します。
  5. audioSupportedunknownとします。
  6. audioconfigurationに存在する場合、以下を実行します:
    1. audioMimeTypeconfigurationcontentTypeMIMEタイプの解析を実行した結果とします。
    2. audioSupportedに、MIMEタイプサポートの確認audioMimeTypeconfigurationtypeで実行した結果を設定します。
  7. videoSupportedまたはaudioSupportedunsupportedの場合、supportedfalsesmoothfalsepowerEfficientfalseを設定し、infoを返します。
  8. それ以外の場合、supportedtrueを設定します。
  9. ユーザーエージェントがconfigurationで示されたフレームレートでメディアをエンコードできる場合、 smoothtrueを設定し、そうでない場合はfalseにします。
  10. ユーザーエージェントがconfigurationで示されたメディアを 省電力で エンコードできる場合、powerEfficienttrueを設定し、そうでない場合はfalseにします。
  11. infoを返します。

2.3.2. MediaCapabilitiesDecodingInfoの作成

MediaCapabilitiesDecodingInfoの作成を行うには、 MediaDecodingConfiguration configurationが与えられたとき、以下の手順を実行します。返値はMediaCapabilitiesDecodingInfoです:

  1. infoを新しいMediaCapabilitiesDecodingInfo インスタンスとして作成します。特に明記がない限り、以後の手順の読取・書込はinfoに対して行います。
  2. configuration を新しいMediaDecodingConfigurationとします。 configuration内の各プロパティについて、同名・同値の新しいプロパティをconfigurationに作成します。
  3. configuration.keySystemConfiguration存在する場合:
    1. keySystemAccess暗号化デコードサポートの確認アルゴリズムを configurationで実行した結果を設定します。
    2. keySystemAccessnullの場合、supportedfalsesmoothfalsepowerEfficientfalseを設定し、infoを返します。
    3. それ以外の場合、supportedtrueを設定し、ステップ6に進みます。
  4. それ以外の場合は以下を実行します:
    1. keySystemAccessnullを設定します。
    2. videoSupportedunknownとします。
    3. videoconfigurationに存在する場合、以下を実行します:
      1. videoMimeTypeconfigurationcontentTypeMIMEタイプの解析を実行した結果とします。
      2. videoSupportedに、MIMEタイプサポートの確認videoMimeTypeconfigurationtypeconfigurationcolorGamuttransferFunctionで実行した結果を設定します。
    4. audioSupportedunknownとします。
    5. audioconfigurationに存在する場合、以下を実行します:
      1. audioMimeTypeconfigurationcontentTypeMIMEタイプの解析を実行した結果とします。
      2. audioSupportedに、MIMEタイプサポートの確認audioMimeTypeconfigurationtypeで実行した結果を設定します。
    6. videoSupportedまたはaudioSupportedunsupportedの場合、supportedfalsesmoothfalsepowerEfficientfalseを設定し、infoを返します。
  5. supportedtrueを設定します。
  6. ユーザーエージェントがconfigurationで示されたフレームレートで フレーム落ちなしにメディアをデコードできる場合、 smoothtrueを設定し、そうでない場合はfalseにします。
  7. ユーザーエージェントがconfigurationで示されたメディアを 省電力で デコードできる場合、powerEfficienttrueを設定し、そうでない場合はfalseにします。
  8. infoを返します。

2.3.3. MIMEタイプの有効性の確認

MIMEタイプの有効性の確認を行うには、 MIMEタイプレコード mimeTypeと 文字列mediaが与えられたとき、以下の手順を実行します:

  1. mimeTypeの型([RFC9110]参照)がmediaでもapplicationでもない場合、falseを返します。
  2. mimeTypetypesubtypeが単一メディアコーデックを許容し、 mimeTypeparametersが空でない場合、falseを返します。
  3. mimeTypetypesubtypeが複数メディアコーデックを許容する場合は、以下を実行します:
    1. mimeTypeparametersに"codecs"というキーが1つだけ含まれていなければfalseを返します。

      単一メディアコーデックのみが記載されていることがなぜ重要か?[Issue #235]

    2. mimeType.parameters["codecs"]の値が単一メディアコーデックを記述していなければfalseを返します。
  4. trueを返します。

このロジックはwebrtcにも適用されるか?[Issue #238]

2.3.4. MIMEタイプサポートの確認

MIMEタイプサポートの確認を行うには、 MIMEタイプレコード mimeTypeMediaEncodingType またはMediaDecodingType encodingOrDecodingType、任意のcolorGamut colorGamut、 任意のtransferFunction transferFunction が与えられたとき、以下の手順を実行します。MIMEタイプが ユーザーエージェントでサポートされていればsupported、 サポートされていなければunsupportedを返します:

  1. encodingOrDecodingTypewebrtc (MediaEncodingType) またはwebrtc (MediaDecodingType) かつmimeTypeがRTPで使用されるものでない場合(RTPペイロードフォーマット仕様参照 [IANA-MEDIA-TYPES] [RFC6838])、 unsupportedを返します。

    コーデック名は通常subtypeとして指定され、コーデックに応じてゼロ以上のパラメータが追加されます。

  2. colorGamutが存在し、mimeTypeに対して無効な場合、unsupportedを返します。
  3. transferFunctionが存在し、mimeTypeに対して無効な場合、unsupportedを返します。

    ユーザーエージェントは、mimeTypeで指定されたビデオコーデックの仕様を参照し、 colorGamuttransferFunctionの有効値を判断するべきです。

    ここでの検証ステップの相互運用性はどう保証する?[Issue #245]

  4. mimeTypeユーザーエージェントでサポートされていなければ、unsupportedを返します。
  5. supportedを返します。

2.3.5. 暗号化デコードサポートの確認

暗号化デコードサポートの確認を行うには、 MediaDecodingConfiguration configkeySystemConfiguration 存在)が与えられたとき、以下の手順を実行します。返値はMediaKeySystemAccess またはnullです:

  1. keySystemユーザーエージェントがサポートするKey Systemのいずれでもない場合はnullを返します。文字列比較は大文字小文字区別です。
  2. originを呼び出し元コンテキストの Documentオリジンとします。
  3. implementationconfig.keySystemConfiguration.keySystemの実装とします。
  4. emeConfigurationを新しい MediaKeySystemConfiguration とし、以下のように初期化します:
    1. initDataTypes 属性にconfig.keySystemConfiguration.initDataTypeのみを含むシーケンスを設定します。
    2. distinctiveIdentifier 属性にconfig.keySystemConfiguration.distinctiveIdentifierを設定します。
    3. persistentState 属性にconfig.keySystemConfiguration.peristentStateを設定します。
    4. sessionTypes 属性にconfig.keySystemConfiguration.sessionTypesを設定します。
    5. audioconfig存在する場合、 audioCapabilities 属性に、以下のように初期化された MediaKeySystemMediaCapability を1つだけ含むシーケンスを設定します:
      1. contentType 属性にconfig.audio.contentTypeを設定します。
      2. config.keySystemConfiguration.audio存在する場合:
        1. config.keySystemConfiguration.audio.robustness存在nullでない場合、 robustness 属性にconfig.keySystemConfiguration.audio.robustnessを設定します。
        2. encryptionScheme 属性にconfig.keySystemConfiguration.audio.encryptionSchemeを設定します。
    6. videoconfig存在する場合、 videoCapabilities属性に、以下のように初期化された MediaKeySystemMediaCapability を1つだけ含むシーケンスを設定します:
      1. contentType 属性にconfig.video.contentTypeを設定します。
      2. config.keySystemConfiguration.video存在する場合:
        1. config.keySystemConfiguration.video.robustness存在nullでない場合、 robustness 属性にconfig.keySystemConfiguration.video.robustnessを設定します。
        2. encryptionScheme 属性にconfig.keySystemConfiguration.video.encryptionSchemeを設定します。
  5. supported configurationに、Get Supported Configurationアルゴリズム [ENCRYPTED-MEDIA]implementationemeConfigurationoriginで実行した結果を設定します。
  6. supported configurationNotSupportedの場合、nullを返します。
  7. accessを新しいMediaKeySystemAccess オブジェクトとして作成し、以下で初期化します:
    1. keySystem 属性にemeConfiguration.keySystemを設定します。
    2. configuration値にsupported configurationを設定します。
    3. cdm implementation値にimplementationを設定します。
  8. accessを返します。
[Exposed=Window]
partial interface Navigator {
  [SameObject] readonly attribute MediaCapabilities mediaCapabilities;
};
[Exposed=Worker]
partial interface WorkerNavigator {
  [SameObject] readonly attribute MediaCapabilities mediaCapabilities;
};

2.5. MediaCapabilities インターフェース

[Exposed=(Window, Worker)]
interface MediaCapabilities {
  [NewObject] Promise<MediaCapabilitiesDecodingInfo> decodingInfo(
      MediaDecodingConfiguration configuration);
  [NewObject] Promise<MediaCapabilitiesEncodingInfo> encodingInfo(
      MediaEncodingConfiguration configuration);
};

2.5.1. MediaCapabilities タスクソース

この仕様で言及されているタスクの task source は、media capabilities task source です。

アルゴリズムが メディア機能タスクをキューする T の場合、 ユーザーエージェントは グローバルタスクをキュー Tmedia capabilities task source 上の グローバルオブジェクトcurrent realm record)を使って実行しなければなりません。

2.5.2. decodingInfo() メソッド

decodingInfo() メソッドは以下の手順を実行しなければなりません:

  1. configuration有効な MediaDecodingConfiguration でない場合、 新規作成した TypeError で reject された Promise を返します。
  2. configuration.keySystemConfiguration存在する場合、以下のサブステップを実行します:
    1. グローバルオブジェクトWorkerGlobalScope 型の場合、 DOMException (name が InvalidStateError)で reject された Promise を返します。
    2. グローバルオブジェクト関連設定オブジェクト非セキュアコンテキスト の場合、 DOMException (name が SecurityError)で reject された Promise を返します。
  3. p を新しい Promise とします。
  4. 以下の手順を 並列で実行します:
    1. MediaCapabilitiesDecodingInfoの作成アルゴリズムを configurationで実行します。
    2. Media Capabilities タスクをキューし、 その結果で p を resolve します。
  5. p を返します。

注: decodingInfo()keySystemConfiguration が存在する場合、ユーザーに可視な影響(ユーザー同意要求など)が発生する場合があります。 著者は、本当に MediaKeys オブジェクトを作成し使用する場合のみ、この呼び出しを行うべきです。

2.5.3. encodingInfo() メソッド

encodingInfo() メソッドは以下の手順を実行しなければなりません:

  1. configuration有効な MediaConfiguration でない場合、 新規作成した TypeError で reject された Promise を返します。
  2. p を新しい Promise とします。
  3. 以下の手順を 並列で実行します:
    1. MediaCapabilitiesEncodingInfoの作成 アルゴリズムを configuration で実行します。
    2. Media Capabilities タスクをキューし、 その結果で p を resolve します。
  4. p を返します。

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

本仕様はセキュリティに敏感な情報やAPIを導入するものではありませんが、ユーザーのフィンガープリントに利用可能な情報へのアクセスを容易にします。

3.1. 機能モデル

本仕様は MediaDecodingType の値 filemedia-sourcewebrtc および MediaEncodingType の値 recordwebrtc をサポートします。

[webrtc] がサポートするリアルタイム通信では、メディアはピア間で伝送されます。 サイトは両ユーザーエージェント間で共通のメディアパラメータをネゴシエートするための情報交換は行いますが、通常メディアの伝送・エンコード・デコードには関与しません。 1対1通話では、ユーザーエージェント同士が送受信するメディアの交渉を行います。

会議シナリオでは、ユーザーエージェントが数十人、時には数百人の受信者へメディアを送信することができます。スケーラビリティ向上のため、アプリケーションは外部サーバ(選択的フォワーディングユニットや会議ブリッジ等)を利用します。 これらサーバは参加者とメディアパラメータを交渉し、送信者と受信者間で一貫性を確保します。これはユーザーエージェント同士でN*(N-1)交渉が必要となる場合よりもスケーラブルです。 通常送信者は単一コーデックでエンコードし、会議サーバはトランスコーディングをサポートしないため、ユーザーエージェントが「好みのものを選ぶ」ことはできません。

3.2. デコード/エンコードとフィンガープリント

デコード/エンコード機能で公開される情報は、既に実験によって取得可能ですが、APIはより正確かつ一貫した情報を提供する可能性があります。 この情報は既にウェブページが取得できる他の情報と高い相関があると考えられており、同じカテゴリのデバイスは非常に類似したデコード/エンコード機能を持つと予想されます。 つまり、特定の年の高性能デバイスはある種の動画をデコードでき、古いデバイスはそうでない場合があります。 したがって、このAPIによるエントロピーの増加は有意ではないものと考えられます。

HDR検出はより微妙です。colorGamuttransferFunctionhdrMetadataType の追加は有意なエントロピーを生む可能性があります。しかし、UAのデコーダがソフトウェアで実装されており、機能がデバイス間で固定されている場合、この機能は実質的にエントロピーを増やしません。 また、多くの場合デバイスは大きなカテゴリに分かれ、その中では機能が似通っているため、実質的なエントロピーは最小化されます。

利用可能なメディアフォーマットをサイトが公開し、ブラウザが機能と照合して選ばれたフォーマットだけ返すという代替設計も検討されました。 しかしこの場合も、サイトはAPIを繰り返し呼び出すことで完全な機能セットを取得できるため、プライバシー上の利点にはなりません。 APIの厳格なレート制限は、複数の再生アイテムへの投機的な準備など、通常のサイト動作に支障をきたす恐れがあります。

実装が本仕様のフィンガープリント耐性バージョンを提供したい場合、常に「はい」や「いいえ」を返すのではなく、1080p VP9までデコード可能等、一定の機能セットを偽装することが推奨されます。 後者はユーザー体験を大幅に損なう可能性があるためです。もう一つの緩和策は、これらのWeb APIをトップレベルの閲覧コンテキストに限定することです。 さらに、プライバシーバジェットを利用してAPI呼び出しを閾値以上で制限・遮断する方法もあります。 また、ブラウザはサイトが検出した機能を実際に利用するかどうかを判断し、利用しない場合はより厳格な制御を適用することも検討できます。

4.

4.1. Media Source Extensions decodingInfo() で再生機能を照会する例

次の例は decodingInfo() を使って Media Source Extensions [media-source] 利用時にメディア再生機能を照会する方法を示しています。

<script>
  const contentType = 'video/mp4;codecs=avc1.640028';

  const configuration = {
    type: 'media-source',
    video: {
      contentType: contentType,
      width: 640,
      height: 360,
      bitrate: 2000,
      framerate: 29.97
    }
  };

  navigator.mediaCapabilities.decodingInfo(configuration)
    .then((result) => {
      console.log('Decoding of ' + contentType + ' is'
        + (result.supported ? '' : ' NOT') + ' supported,'
        + (result.smooth ? '' : ' NOT') + ' smooth and'
        + (result.powerEfficient ? '' : ' NOT') + ' power efficient');
    })
    .catch((err) => {
      console.error(err, ' caused decodingInfo to reject');
    });
</script>

次の例は decodingInfo() を使って WebRTC受信機能 [webrtc] を照会する方法を示しています。

<script>
  const contentType = 'video/VP8';

  const configuration = {
    type: 'webrtc',
    video: {
      contentType: contentType,
      width: 640,
      height: 360,
      bitrate: 2000,
      framerate: 25
    }
  };

  navigator.mediaCapabilities.decodingInfo(configuration)
    .then((result) => {
      console.log('Decoding of ' + contentType + ' is'
        + (result.supported ? '' : ' NOT') + ' supported,'
        + (result.smooth ? '' : ' NOT') + ' smooth and'
        + (result.powerEfficient ? '' : ' NOT') + ' power efficient');
    })
    .catch((err) => {
      console.error(err, ' caused decodingInfo to reject');
    });
</script>
<script>
  const contentType = 'video/H264;level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f';

  const configuration = {
    type: 'webrtc',
    video: {
      contentType: contentType,
      width: 640,
      height: 360,
      bitrate: 2000,
      framerate: 25
    }
  };

  navigator.mediaCapabilities.decodingInfo(configuration)
    .then((result) => {
      console.log('Decoding of ' + contentType + ' is'
        + (result.supported ? '' : ' NOT') + ' supported,'
        + (result.smooth ? '' : ' NOT') + ' smooth and'
        + (result.powerEfficient ? '' : ' NOT') + ' power efficient');
    })
    .catch((err) => {
      console.error(err, ' caused decodingInfo to reject');
    });
</script>

4.2. WebRTC送信機能を encodingInfo() で照会する例

次の例は encodingInfo() を使って WebRTC送信機能 [webrtc] を オプションフィールド scalabilityMode を含めて照会する方法を示しています。
<script>
  const contentType = 'video/VP9';

  const configuration = {
    type: 'webrtc',
    video: {
      contentType: contentType,
      width: 640,
      height: 480,
      bitrate: 10000,
      framerate: 29.97,
      scalabilityMode: "L3T3_KEY"
    }
  };

  navigator.mediaCapabilities.encodingInfo(configuration)
    .then((result) => {
      console.log(contentType + ' is:'
        + (result.supported ? '' : ' NOT') + ' supported,'
        + (result.smooth ? '' : ' NOT') + ' smooth and'
        + (result.powerEfficient ? '' : ' NOT') + ' power efficient');
    })
    .catch((err) => {
      console.error(err, ' caused encodingInfo to reject');
    });
</script>
次の例は このCodepenでも最小限の修正で見つけることができます。
<script>
  const contentType = 'video/webm;codecs=vp8';

  const configuration = {
    type: 'record',
    video: {
      contentType: contentType,
      width: 640,
      height: 480,
      bitrate: 10000,
      framerate: 29.97
    }
  };

  navigator.mediaCapabilities.encodingInfo(configuration)
    .then((result) => {
      console.log(contentType + ' is:'
        + (result.supported ? '' : ' NOT') + ' supported,'
        + (result.smooth ? '' : ' NOT') + ' smooth and'
        + (result.powerEfficient ? '' : ' NOT') + ' power efficient');
    })
    .catch((err) => {
      console.error(err, ' caused encodingInfo to reject');
    });
</script>

適合性

文書の慣例

適合性要件は、記述的な断定とRFC 2119の用語の組み合わせで表現されています。 規範的な部分で使われる “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL” などのキーワードは、RFC 2119 で定義された通りに解釈されます。 ただし、読みやすさのため、本仕様書ではこれらの単語はすべて大文字で表記されていません。

本仕様のすべての文は規範的です。 ただし、明示的に非規範的と記載されたセクション、例、および注記は除きます。 [RFC2119]

本仕様の例は、“for example”(例えば)という語で導入されるか、 規範的な文からclass="example"で区別されます。 例えば、次のようになります:

これは参考用の例です。

参考用の注記は “Note” という語で始まり、 規範的な文から class="note" で区別されます。 例えば、次のようになります:

注:これは参考用の注記です。

適合するアルゴリズム

アルゴリズムの一部として命令形で表現される要件 (例えば「先頭の空白文字をすべて除去する」や「falseを返してこれらの手順を中止する」など)は、 アルゴリズム導入時に使われたキーワード ("must", "should", "may"など)の意味で解釈されます。

アルゴリズムや特定の手順として表現された適合性要件は、 結果が同等である限り、どのような方法でも実装可能です。 特に本仕様で定義されたアルゴリズムは理解しやすさを重視しており、 性能を意図したものではありません。 実装者は最適化を推奨します。

索引

本仕様で定義された用語

参照によって定義された用語

参考文献

規範的参考文献

[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript Language Specification. URL: https://tc39.es/ecma262/multipage/
[ENCRYPTED-MEDIA]
Joey Parrish; Greg Freedman. Encrypted Media Extensions. 2025年4月4日. WD. URL: https://www.w3.org/TR/encrypted-media-2/
[ENCRYPTED-MEDIA-DRAFT]
Encrypted Media Extensions. 2019年12月13日. URL: https://w3c.github.io/encrypted-media
[HTML]
Anne van Kesteren; 他. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[MEDIA-SOURCE]
Jean-Yves Avenard; Mark Watson. Media Source Extensions™. 2025年4月17日. WD. URL: https://www.w3.org/TR/media-source-2/
[MIMESNIFF]
Gordon P. Hemsley. MIME Sniffing Standard. Living Standard. URL: https://mimesniff.spec.whatwg.org/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SMPTE-ST-2084]
High Dynamic Range Electro-Optical Transfer Function of Mastering Reference Displays. 2014年. URL: https://ieeexplore.ieee.org/document/7291452
[SMPTE-ST-2086]
Mastering Display Color Volume Metadata Supporting High Luminance and Wide Color Gamut Images. 2014年. URL: https://ieeexplore.ieee.org/document/7291707
[SMPTE-ST-2094]
Dynamic Metadata for Color Volume Transform Core Components. 2016年. URL: https://ieeexplore.ieee.org/document/7513361
[sRGB]
Multimedia systems and equipment - Colour measurement and management - Part 2-1: Colour management - Default RGB colour space - sRGB. URL: https://webstore.iec.ch/publication/6169
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/
[WEBRTC]
Cullen Jennings; 他. WebRTC: Real-Time Communication in Browsers. 2025年3月13日. REC. URL: https://www.w3.org/TR/webrtc/

参考情報

[IANA-MEDIA-TYPES]
Media Types. URL: https://www.iana.org/assignments/media-types/
[MEDIASTREAM-RECORDING]
Miguel Casas-sanchez. MediaStream Recording. 2025年4月17日. WD. URL: https://www.w3.org/TR/mediastream-recording/
[RFC6838]
N. Freed; J. Klensin; T. Hansen. Media Type Specifications and Registration Procedures. 2013年1月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc6838
[RFC9110]
R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed.. HTTP Semantics. 2022年6月. Internet Standard. URL: https://httpwg.org/specs/rfc9110.html
[WEBRTC-SVC]
Bernard Aboba. Scalable Video Coding (SVC) Extension for WebRTC. 2024年8月17日. WD. URL: https://www.w3.org/TR/webrtc-svc/

IDL索引

dictionary MediaConfiguration {
  VideoConfiguration video;
  AudioConfiguration audio;
};

dictionary MediaDecodingConfiguration : MediaConfiguration {
  required MediaDecodingType type;
  MediaCapabilitiesKeySystemConfiguration keySystemConfiguration;
};

dictionary MediaEncodingConfiguration : MediaConfiguration {
  required MediaEncodingType type;
};

enum MediaDecodingType {
  "file",
  "media-source",
  "webrtc"
};

enum MediaEncodingType {
  "record",
  "webrtc"
};

dictionary VideoConfiguration {
  required DOMString contentType;
  required unsigned long width;
  required unsigned long height;
  required unsigned long long bitrate;
  required double framerate;
  boolean hasAlphaChannel;
  HdrMetadataType hdrMetadataType;
  ColorGamut colorGamut;
  TransferFunction transferFunction;
  DOMString scalabilityMode;
  boolean spatialScalability;
};

enum HdrMetadataType {
  "smpteSt2086",
  "smpteSt2094-10",
  "smpteSt2094-40"
};

enum ColorGamut {
  "srgb",
  "p3",
  "rec2020"
};

enum TransferFunction {
  "srgb",
  "pq",
  "hlg"
};

dictionary AudioConfiguration {
  required DOMString contentType;
  DOMString channels;
  unsigned long long bitrate;
  unsigned long samplerate;
  boolean spatialRendering;
};

dictionary MediaCapabilitiesKeySystemConfiguration {
  required DOMString keySystem;
  DOMString initDataType = "";
  MediaKeysRequirement distinctiveIdentifier = "optional";
  MediaKeysRequirement persistentState = "optional";
  sequence<DOMString> sessionTypes;
  KeySystemTrackConfiguration audio;
  KeySystemTrackConfiguration video;
};

dictionary KeySystemTrackConfiguration {
  DOMString robustness = "";
  DOMString? encryptionScheme = null;
};

dictionary MediaCapabilitiesInfo {
  required boolean supported;
  required boolean smooth;
  required boolean powerEfficient;
};

dictionary MediaCapabilitiesDecodingInfo : MediaCapabilitiesInfo {
  required MediaKeySystemAccess? keySystemAccess;
  required MediaDecodingConfiguration configuration;
};

dictionary MediaCapabilitiesEncodingInfo : MediaCapabilitiesInfo {
  required MediaEncodingConfiguration configuration;
};

[Exposed=Window]
partial interface Navigator {
  [SameObject] readonly attribute MediaCapabilities mediaCapabilities;
};

[Exposed=Worker]
partial interface WorkerNavigator {
  [SameObject] readonly attribute MediaCapabilities mediaCapabilities;
};

[Exposed=(Window, Worker)]
interface MediaCapabilities {
  [NewObject] Promise<MediaCapabilitiesDecodingInfo> decodingInfo(
      MediaDecodingConfiguration configuration);
  [NewObject] Promise<MediaCapabilitiesEncodingInfo> encodingInfo(
      MediaEncodingConfiguration configuration);
};

課題索引

channelsdouble(2.1、4.1、5.1など)、unsigned short(チャンネル数)、またはenum値として定義する必要があります。現在の定義はプレースホルダーです。
単一メディアコーデックのみが記載されていることがなぜ重要か? [Issue #235]
このロジックはwebrtcにも適用されるか? [Issue #238]
ここでの検証ステップの相互運用性はどう保証する? [Issue #245]