미디어 기능

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 이슈를 통해 명세에 대한 논의를 하는 것이 우선적으로 권장됩니다. 또는 Media Working Group의 메일링 리스트 public-media-wg@w3.org (아카이브)로 의견을 보낼 수 있습니다. 이 드래프트에는 워킹 그룹에서 논의가 필요한 보류 중인 이슈들이 강조되어 있습니다. 이 이슈들의 결과에 대해서는 아직 어떠한 결정도 내려지지 않았으며, 유효성 여부도 확정되지 않았습니다.

이 문서는 Media Working Group에서 권고안 트랙을 사용하여 워킹 드래프트로 발행되었습니다. 이 문서는 W3C 권고안이 되는 것을 목표로 합니다.

워킹 드래프트로 출판된 것은 W3C와 그 회원들의 지지를 의미하지 않습니다.

이 문서는 초안 문서로, 언제든지 업데이트되거나 대체되거나 폐기될 수 있습니다. 진행 중인 작업 외의 문서로 인용하는 것은 적절하지 않습니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에 의해 작성되었습니다. W3C공개 특허 공개 목록을 유지 관리하며, 해당 페이지에는 특허 공개 방법에 대한 안내도 포함되어 있습니다. 개별적으로 Essential Claim(필수 청구권)이 포함된 특허를 알고 있는 경우, W3C 특허 정책 섹션 6에 따라 정보를 공개해야 합니다.

이 문서는 2025년 8월 18일 W3C 프로세스 문서에 따라 관리됩니다.

1. 소개

이 섹션은 규범적이지 않습니다

이 명세는 사용자 에이전트의 오디오 및 비디오 디코딩/인코딩 기능을 질의하는 API를 정의합니다. API는 미디어의 코덱, 프로필, 해상도, 비트레이트 등과 같은 정보를 기반으로 동작합니다. API는 해당 구성(configuration)이 지원되는지, 그리고 재생이 부드럽거나/또는 전력 효율적일 것으로 예상되는지 여부를 나타냅니다.

이 명세는 인코딩 및 디코딩 기능에 중점을 두고 있습니다. 디스플레이의 색 영역이나 다이나믹 레인지 지원과 같은 디스플레이 속성 정보를 제공하는 다른 웹 API와 함께 사용할 것으로 예상되며, 이를 통해 웹 애플리케이션은 디스플레이에 적합한 콘텐츠를 선택할 수 있고 예를 들어 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 은 세 가지 타입이 있습니다:

2.1.3. MediaEncodingType

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

MediaEncodingConfiguration 은 두 가지 타입 중 하나를 가질 수 있습니다:

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유효한 비디오 구성인지 확인하려면 다음 단계를 실행해야 합니다:

  1. framerate 값이 유한하지 않거나 0보다 작거나 같으면 false를 반환하고 단계를 종료합니다.
  2. MediaDecodingType 또는 MediaEncodingType 에 적용되지 않는 선택적 멤버가 지정된 경우, false를 반환하고 단계를 종료합니다. 적용 가능성 규칙은 아래 멤버 정의를 참조하세요.
  3. mimeTypeconfigurationcontentType을 사용하여 MIME 타입 파싱을 실행한 결과로 설정합니다.
  4. mimeTypefailure이면 false를 반환합니다.
  5. mimeTypevideo를 사용하여 MIME 타입 유효성 검사를 실행한 결과를 반환합니다.

widthheight 멤버는 각각 인코딩된 비디오 프레임의 가시적인 가로 및 세로 픽셀 수를 나타냅니다.

bitrate 멤버는 비디오 트랙의 비트레이트(초당 비트 단위)를 나타냅니다. 고정 비트레이트(CBR)로 인코딩된 경우 비디오 트랙의 평균 비트레이트를 나타냅니다. 가변 비트레이트(VBR)의 경우, 이 값은 비디오 트랙의 최대 비트레이트를 나타냅니다.

framerate 멤버는 비디오 트랙의 프레임률을 나타냅니다. 프레임률은 1초 동안 사용되는 프레임 수(초당 프레임)로, double로 표현됩니다.

hasAlphaChannel 멤버는 비디오 트랙에 알파 채널 정보가 포함되어 있는지 나타냅니다. true면 디코딩 시 인코딩된 비디오 스트림에서 픽셀 단위 알파 채널 정보를 생성할 수 있습니다. false면 생성할 수 없습니다. undefined면 UA가 contentType에 따라 알파 채널 정보를 추정해야 하며, 불가능하면 알파 채널 정보를 생성할 수 없다고 간주해야 합니다.

hdrMetadataType 멤버가 있으면 비디오 트랙에 특정 HDR 메타데이터 타입이 포함되어 있음을 나타냅니다. UA는 HDR 콘텐츠를 출력 장치의 색상 볼륨과 휘도에 맞게 톤 매핑할 수 있도록 해당 HDR 타입을 해석할 수 있어야 합니다. 유효한 입력값은 HdrMetadataType에 정의됩니다. hdrMetadataType은 MediaDecodingConfiguration에서 media-source 또는 file 타입에만 적용됩니다.

colorGamut 멤버가 있으면 비디오 트랙이 지정된 색 영역으로 제공됨을 나타냅니다. 색 영역은 콘텐츠가 표시될 색상 집합을 설명합니다. 출력 장치가 해당 색상을 지원하면 UA는 적절한 색상을 출력 장치에 렌더링할 수 있어야 하며, 지원하지 않으면 UA가 출력 장치가 지원하는 색으로 매핑할 수 있어야 합니다. 유효한 입력값은 ColorGamut에 정의됩니다. colorGamut은 MediaDecodingConfiguration에서 media-source 또는 file 타입에만 적용됩니다.

transferFunction 멤버가 있으면 비디오 트랙이 UA가 해석해야 하는 특정 전달 함수(transfer function)가 필요함을 나타냅니다. 전달 함수는 디스플레이와 관계없이, 미디어의 소스 색상을 디코딩 후 출력할 색상으로 매핑하는 사용자 에이전트의 렌더링 기능에서 지원하는 전기-광학 알고리즘을 설명합니다. 유효한 입력값은 TransferFunction에 정의됩니다. transferFunction은 MediaDecodingConfiguration에서 media-source 또는 file 타입에만 적용됩니다.

scalabilityMode 멤버가 있으면 [webrtc-svc]에 정의된 확장성 모드를 나타냅니다. 없으면 이 contentType에 대해 구현자 정의 기본 모드가 적용됩니다(즉, setParameters()로 명시하지 않은 경우의 모드). scalabilityMode는 MediaEncodingConfiguration에서 webrtc 타입에만 적용됩니다.

scalabilityMode가 여러 공간 계층(spatial layers)이 있음을 나타내는 경우, widthheight 값은 VideoConfiguration에서 인코딩된 가장 큰 공간 계층에 해당합니다.

spatialScalability 멤버가 있으면 해상도가 다른 프레임을 의존성으로 사용하는 공간 예측 기능을 나타냅니다. 없으면 spatialScalability의 기본값은 false입니다. spatialScalabilitytrue면, 디코더는 인코더가 해당 코덱에 대해 인코딩할 수 있는 모든 scalabilityMode를 디코딩할 수 있습니다. spatialScalabilityfalse면, 디코더는 공간 확장성 모드를 디코딩할 수 없지만, 인코더가 인코딩할 수 있는 다른 모든 scalabilityMode 값은 디코딩할 수 있습니다. spatialScalabilityMediaDecodingConfiguration에서 media-source, file, webrtc 타입에만 적용됩니다.

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] 컬러 가뭇(gamut)을 나타냅니다.
  • p3, DCI P3 색상 공간 컬러 가뭇을 나타냅니다. 이 컬러 가뭇은 srgb 가뭇을 포함합니다.
  • rec2020, ITU-R Recommendation BT.2020 컬러 가뭇을 나타냅니다. 이 컬러 가뭇은 p3 가뭇을 포함합니다.

2.1.7. TransferFunction

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

VideoConfiguration 은 아래 타입 중 하나를 포함할 수 있습니다:

  • srgb, [sRGB]에 의해 정의된 트랜스퍼 함수(transfer function)를 나타냅니다.
  • 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유효한 오디오 구성인지 확인하려면, 다음 단계를 반드시 실행해야 합니다:

  1. mimeTypeMIME 타입 파싱configurationcontentType 값으로 실행하여 얻습니다.
  2. mimeTypefailure라면 false를 반환합니다.
  3. MIME 타입 유효성 검사mimeTypeaudio로 실행한 결과를 반환합니다.

channels 멤버는 오디오 트랙에서 사용되는 오디오 채널을 나타냅니다. channels는 디코딩 타입 media-source, file, webrtc 그리고 인코딩 타입 webrtc 에만 적용됩니다.

channelsdouble(2.1, 4.1, 5.1, ...), unsigned short(채널 개수) 또는 enum 값으로 정의되어야 합니다. 현재 정의는 임시입니다.

bitrate 멤버는 오디오 트랙의 평균 비트레이트를 나타냅니다. 비트레이트는 오디오 트랙 1초를 인코딩하는 데 사용되는 비트 수입니다.

samplerate 멤버는 오디오 트랙의 샘플레이트를 나타냅니다. 샘플레이트는 1초당 전달되는 오디오 샘플의 수입니다. samplerate는 디코딩 타입 media-source, file, webrtc 그리고 인코딩 타입 webrtc 에만 적용됩니다.

samplerateHz(즉, 초당 오디오 샘플 수) 단위로 표현됩니다. 때때로 samplerate 값은 kHz 단위로 표현되기도 하며, 이는 초당 수천 개의 오디오 샘플을 나타냅니다.
44100 Hz는 44.1 kHz와 동일합니다.

spatialRendering 멤버는 오디오가 공간적으로 렌더링되어야 함을 나타냅니다. 공간 렌더링의 세부 사항은 contentType 에서 추론되어야 합니다. 만약 존재하지 않는다면, UA는 공간 렌더링이 필요하지 않다고 가정해야 합니다. true일 때, 사용자 에이전트는 오디오 출력 장치에서 공간 렌더링을 실패 없이 지원할 수 있을 때에만 이 구성을 지원됨 으로 보고해야 하며, 공간적 믹스가 아닌 스트림으로 폴백하지 않아야 합니다. spatialRenderingMediaDecodingConfigurationmedia-sourcefile 타입에만 적용됩니다.

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 멤버는 keySystem 이름을 나타내며, [ENCRYPTED-MEDIA]에 설명되어 있습니다.

initDataType 멤버는 initDataTypes 시퀀스에서 단일 값을 나타냅니다. [ENCRYPTED-MEDIA]에 설명되어 있습니다.

distinctiveIdentifier 멤버는 distinctiveIdentifier 요구조건을 나타내며, [ENCRYPTED-MEDIA]에 설명되어 있습니다.

persistentState 멤버는 persistentState 요구조건을 나타내며, [ENCRYPTED-MEDIA]에 설명되어 있습니다.

sessionTypes 멤버는 sessionTypes 에 설명된 필수 시퀀스를 나타냅니다. [ENCRYPTED-MEDIA]를 참고하세요.

audio 멤버는 KeySystemTrackConfiguration 과 연결된 AudioConfiguration 을 나타냅니다.

video 멤버는 KeySystemTrackConfiguration 과 연결된 VideoConfiguration 을 나타냅니다.

2.1.10. KeySystemTrackConfiguration

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

robustness 멤버는 robustness 수준을 나타내며, [ENCRYPTED-MEDIA]에서 설명됩니다.

encryptionScheme 멤버는 encryptionScheme 를 나타내며, [ENCRYPTED-MEDIA-DRAFT]에서 설명됩니다.

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;
};

MediaCapabilitiesInfosupported, smooth, powerEfficient 필드를 가지며, 이들은 불리언 값입니다.

인코딩 또는 디코딩이 전력 효율적이라고 간주되는 경우는 전력 소비가 최적일 때입니다. 인코딩 또는 디코딩의 최적 전력 소비 정의는 사용자 에이전트에 맡깁니다. 하지만 일반적인 구현 전략은 하드웨어 사용을 최적 전력 소비의 지표로 간주하는 것입니다. 사용자 에이전트는 하드웨어 인코딩 또는 디코딩을 기본적으로 전력 효율적이라고 표시해서는 안 됩니다. 하드웨어 가속이 아닌 코덱도 특히 저해상도 영상에서는 충분히 효율적일 수 있기 때문입니다. 사용자 에이전트는 인코딩 전력 효율성을 판단할 때 기기의 전원 공급원을 고려해서는 안 되며, 단 전원 공급원이 인코딩 또는 디코딩 모듈을 변경시키는 등 부수 효과가 있을 경우에는 고려해야 합니다.

MediaCapabilitiesDecodingInfokeySystemAccess 를 가지며, MediaKeySystemAccess 또는 null일 수 있습니다.

암호화된 디코딩 구성이 지원되는 경우, 반환되는 MediaCapabilitiesInfo 에는 MediaKeySystemAccess 가 포함됩니다. 저자는 이를 사용하여 MediaKeys 를 생성하고 암호화된 재생을 설정할 수 있습니다.

MediaCapabilitiesDecodingInfoconfiguration을 가지며, 이는 MediaCapabilitiesDecodingInfo 를 생성하는 데 사용된 디코딩 구성 속성입니다.

MediaCapabilitiesEncodingInfoconfiguration을 가지며, 이는 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. videoMimeTypeMIME 타입 파싱configurationcontentType으로 실행한 결과로 한다.
    2. videoSupportedMIME 타입 지원 여부 확인videoMimeTypeconfigurationtype으로 실행한 결과로 한다.
  5. audioSupportedunknown으로 한다.
  6. audioconfiguration에 존재하면, 다음 단계를 실행한다:
    1. audioMimeTypeMIME 타입 파싱configurationcontentType으로 실행한 결과로 한다.
    2. audioSupportedMIME 타입 지원 여부 확인audioMimeTypeconfigurationtype으로 실행한 결과로 한다.
  7. videoSupported 또는 audioSupportedunsupported인 경우 supportedfalse, smoothfalse, powerEfficientfalse로 설정하고 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이면 supportedfalse, smoothfalse, powerEfficientfalse로 설정하고 info를 반환한다.
    3. 그렇지 않으면 supportedtrue로 설정하고 6단계로 진행한다.
  4. 그 외의 경우 다음 단계를 실행한다:
    1. keySystemAccessnull로 설정한다.
    2. videoSupportedunknown으로 한다.
    3. videoconfiguration에 존재하면, 다음 단계를 실행한다:
      1. videoMimeTypeMIME 타입 파싱configurationcontentType으로 실행한 결과로 한다.
      2. videoSupportedMIME 타입 지원 여부 확인videoMimeType, configurationtype, configurationcolorGamut, configurationtransferFunction으로 실행한 결과로 한다.
    4. audioSupportedunknown으로 한다.
    5. audioconfiguration에 존재하면, 다음 단계를 실행한다:
      1. audioMimeTypeMIME 타입 파싱configurationcontentType으로 실행한 결과로 한다.
      2. audioSupportedMIME 타입 지원 여부 확인audioMimeTypeconfigurationtype으로 실행한 결과로 한다.
    6. videoSupported 또는 audioSupportedunsupported인 경우 supportedfalse, smoothfalse, powerEfficientfalse로 설정하고 info를 반환한다.
  5. supportedtrue로 설정한다.
  6. 사용자 에이전트가 configuration이 나타내는 미디어를 지정된 프레임레이트로 프레임 드롭 없이 디코딩할 수 있다면 smoothtrue로 설정한다. 그렇지 않으면 false로 설정한다.
  7. 사용자 에이전트가 configuration이 나타내는 미디어를 전력 효율적으로 디코딩할 수 있다면 powerEfficienttrue로 설정한다. 그렇지 않으면 false로 설정한다.
  8. info를 반환한다.

2.3.3. MIME 타입 유효성 검사

MIME 타입 유효성 검사를 위해 MIME 타입 레코드 mimeType과 문자열 media가 주어졌을 때 다음 단계를 실행한다:

  1. [RFC9110] 기준에서 mimeType의 타입이 media 또는 application이 아니면 false를 반환한다.
  2. mimeTypetypesubtype 멤버가 단일 미디어 코덱을 허용하고 parameters 멤버가 비어 있지 않으면 false를 반환한다.
  3. mimeTypetypesubtype 멤버가 다중 미디어 코덱을 허용한다면 다음 단계를 실행한다:
    1. mimeTypeparameters 멤버에 "codecs"라는 단일 키가 없으면 false를 반환한다.

      단일 미디어 코덱이 나열되는 것이 왜 중요한가? [Issue #235]

    2. mimeType.parameters["codecs"] 값이 단일 미디어 코덱을 설명하지 않으면 false를 반환한다.
  4. true를 반환한다.

이 논리가 webrtc에도 적용되는가? [Issue #238]

2.3.4. MIME 타입 지원 여부 확인

MIME 타입 지원 여부 확인을 실행하려면, MIME type record mimeType, MediaEncodingType 또는 MediaDecodingType encodingOrDecodingType, 선택적 colorGamut (colorGamut), 그리고 선택적 transferFunction (transferFunction) 이 주어질 때, 다음 단계를 수행한다. MIME 타입이 사용자 에이전트에 의해 지원된다면 supported를, 지원되지 않으면 unsupported를 반환한다:

  1. encodingOrDecodingTypewebrtc (MediaEncodingType) 또는 webrtc (MediaDecodingType) 이고, mimeType이 RTP에서 사용하는 타입이 아니면 ([IANA-MEDIA-TYPES] [RFC6838] 참고), unsupported를 반환한다.

    코덱 이름은 보통 subtype에 명시되며, 코덱에 따라 0개 이상의 파라미터가 있을 수 있다.

  2. colorGamut이 있고, mimeType에 올바르지 않으면 unsupported를 반환한다.
  3. transferFunction이 있고, mimeType에 올바르지 않으면 unsupported를 반환한다.

    사용자 에이전트는 mimeType에서 명명된 비디오 코덱의 명세를 참고하여 colorGamuttransferFunction의 올바른 값을 결정해야 한다.

    여기의 검증 단계에서 상호운용성을 어떻게 보장할 수 있을까? [Issue #245]

  4. mimeType사용자 에이전트에 의해 지원되지 않으면 unsupported를 반환한다.
  5. supported를 반환한다.

2.3.5. 암호화된 디코딩 지원 확인

암호화된 디코딩 지원 확인을 실행하려면 MediaDecodingConfiguration config가 주어지고, keySystemConfiguration존재하면, 다음 단계를 수행한다. 결과는 MediaKeySystemAccess 또는 null이다:

  1. keySystem 멤버가 config.keySystemConfiguration에 있고, Key Systems 중 사용자 에이전트가 지원하는 시스템이 아니면 null을 반환한다. 문자열 비교는 대소문자 구분.
  2. origin을 호출 컨텍스트의 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. 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. 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 configurationGet Supported Configuration 알고리즘([ENCRYPTED-MEDIA])을 implementation, emeConfiguration, origin에 대해 실행한 결과로 한다.
  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. 미디어 기능 인터페이스

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

2.5.1. 미디어 기능 작업 소스

이 명세에서 언급된 작업의 작업 소스미디어 기능 작업 소스입니다.

알고리즘이 미디어 기능 작업을 큐에 추가할 때 T, 사용자 에이전트는 글로벌 작업을 큐에 추가 T미디어 기능 작업 소스에, 글로벌 객체현재 realm 레코드를 사용하여 추가해야 합니다.

2.5.2. decodingInfo() 메서드

decodingInfo() 메서드는 다음 단계들을 반드시 실행해야 합니다:

  1. configuration유효한 MediaDecodingConfiguration이 아니면, 새로 생성된 TypeError로 reject된 Promise를 반환합니다.
  2. configuration.keySystemConfiguration존재한다면, 다음 하위 단계를 실행합니다:
    1. 글로벌 객체WorkerGlobalScope 타입인 경우, 새로 생성된 DOMException의 이름이 InvalidStateError인 Promise를 반환합니다.
    2. 글로벌 객체의 관련 설정 객체비보안 컨텍스트라면, 새로 생성된 DOMException의 이름이 SecurityError인 Promise를 반환합니다.
  3. p를 새 Promise로 할당합니다.
  4. 다음 단계들을 병렬로 실행합니다:
    1. Create a MediaCapabilitiesDecodingInfo 알고리즘을 configuration을 사용하여 실행합니다.
    2. 미디어 기능 작업을 큐에 추가하여 p를 결과값으로 resolve합니다.
  5. p를 반환합니다.

참고: decodingInfo()를 호출할 때 keySystemConfiguration이 존재하면 사용자의 동의 요청 등 사용자에게 보이는 효과가 나타날 수 있습니다. 이러한 호출은 작성자가 제공된 설정으로 MediaKeys 객체를 생성하고 사용하려는 경우에만 해야 합니다.

2.5.3. encodingInfo() 메서드

encodingInfo() 메서드는 다음 단계들을 반드시 실행해야 합니다:

  1. configuration유효한 MediaConfiguration이 아니면, 새로 생성된 TypeError로 reject된 Promise를 반환합니다.
  2. p를 새 Promise로 할당합니다.
  3. 다음 단계들을 병렬로 실행합니다:
    1. Create a MediaCapabilitiesEncodingInfo 알고리즘을 configuration을 사용하여 실행합니다.
    2. 미디어 기능 작업을 큐에 추가하여 p를 결과값으로 resolve합니다.
  4. p를 반환합니다.

3. 보안 및 개인정보 보호 고려사항

이 명세는 보안에 민감한 정보 또는 API를 도입하지 않지만, 사용자 지문 채취에 사용할 수 있는 일부 정보에 더 쉽게 접근할 수 있도록 합니다.

3.1. 기능 모델

이 명세는 MediaDecodingTypefile, media-source 또는 webrtc를 지원하며, MediaEncodingTyperecordwebrtc도 지원합니다.

[webrtc]에서 지원되는 실시간 통신에서는 미디어가 피어 간에 전송됩니다. 사이트는 일반적으로 두 사용자 에이전트가 공통으로 사용할 수 있는 미디어 매개변수를 협상하는 데 필요한 정보를 교환할 책임이 있지만, 실제 미디어의 전송, 인코딩, 디코딩에는 관여하지 않습니다. 1:1 통화의 경우 사용자 에이전트가 송수신할 미디어를 협상합니다.

컨퍼런스 시나리오에서는 사용자 에이전트가 수십 또는 수백 명의 수신자에게 미디어를 보낼 수 있습니다. 확장성을 개선하기 위해 애플리케이션은 외부 서버(예: 선택적 포워딩 유닛 또는 컨퍼런스 브리지)를 사용합니다. 이러한 서버는 참가자들과 미디어 매개변수를 협상하여 송신자와 수신자 간의 일관성을 보장합니다. 이는 사용자 에이전트 간 협상(N * (N -1)번 필요)보다 더 확장성이 높습니다. 일반적으로 송신자는 하나의 코덱으로 인코딩하고, 컨퍼런스 서버는 트랜스코딩을 지원하지 않으므로 사용자 에이전트가 "좋아하는 것"을 간편하게 선택할 수 없습니다.

3.2. 디코딩/인코딩과 지문 채취

디코딩/인코딩 기능으로 노출되는 정보는 이미 실험을 통해 알아낼 수 있으며, API는 더 정확하고 일관된 정보를 제공할 가능성이 있습니다. 이 정보는 웹페이지에서 이미 접근 가능한 다른 정보와 높은 상관관계를 가질 것으로 예상됩니다. 특정 기기군은 매우 유사한 디코딩/인코딩 능력을 가질 것으로 기대되기 때문입니다. 즉, 특정 연도의 고급 기기는 특정 유형의 비디오를 디코드할 수 있고, 오래된 기기는 그렇지 않을 수 있습니다. 따라서 이 API로 인해 추가되는 엔트로피가 크지 않을 것으로 예상됩니다.

HDR 감지는 더 미묘합니다. colorGamut, transferFunction, 그리고 hdrMetadataType 추가는 상당한 엔트로피를 유발할 수 있습니다. 하지만, 디코더가 소프트웨어로 구현되어 기기 간 기능이 고정된 UA의 경우 효과적인 엔트로피가 추가되지 않습니다. 또한 대부분의 경우, 기기들이 큰 카테고리로 나뉘고 그 안에서 기능이 유사하므로 실제 엔트로피는 최소화됩니다.

사이트가 사용 가능한 미디어 포맷을 노출하고 브라우저가 해당 기능과 비교하여 선택된 포맷만 반환하는 대안 디자인도 고려되었습니다. 그러나 사이트가 API를 반복적으로 호출해 전체 기능 세트를 얻을 수 있기 때문에 실제로 개인정보 보호에는 도움이 되지 않습니다. API에 강력한 호출 제한을 두면 여러 재생 항목에 대한 추측적 준비처럼 정상적인 사이트 동작을 방해할 수 있습니다.

만약 구현체가 지문 채취 방지 버전을 적용하고 싶다면, 항상 예/아니오만 반환하기보다는(후자는 사용자 경험 저하), 특정 기능 세트(예: 1080p VP9까지 디코드 가능 등)를 임의로 반환하는 것이 권장됩니다. 또 다른 완화책은 이러한 웹 API를 최상위 브라우징 컨텍스트로 제한하는 것입니다. 추가로, 프라이버시 예산을 사용해 API 호출을 일정 임계치 이상에서 차단하거나 제한할 수 있습니다. 또한 브라우저는 사이트가 실제로 감지한 기능을 사용하는지 여부를 고려할 수 있으며, 사용하지 않는 것으로 관찰되는 사이트에 더 강력한 제어를 적용할 수 있습니다.

4. 예시

4.1. 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. 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)는 “Note”라는 단어로 시작하며, class="note" 와 같이 규범적 텍스트와 구분되어 있습니다:

Note, 이것은 정보성 참고입니다.

적합한 알고리즘

알고리즘의 일부로 명령문 형태로 표현된 요구사항 (예: "선행 공백 문자를 모두 제거한다" 또는 "거짓을 반환하고 이 단계들을 중단한다") 는 알고리즘을 소개하는 데 사용된 주요 단어 ("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; et al. 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; et al. 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]