오디오 출력 장치 API

W3C 후보 권고안 초안

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2025/CRD-audio-output-20251009/
최신 공개 버전:
https://www.w3.org/TR/audio-output/
최신 편집자 초안:
https://w3c.github.io/mediacapture-output/
기록:
https://www.w3.org/standards/history/audio-output/
커밋 기록
구현 보고서:
https://wpt.fyi/audio-output
편집자:
Guido Urdaneta (Google)
Youenn Fablet (Apple)
이전 편집자:
Justin Uberti (Google) - 까지
피드백:
GitHub w3c/mediacapture-output (풀 리퀘스트, 새 이슈, 열린 이슈)
public-webrtc@w3.org 제목 줄에 [audio-output] … 메시지 주제 … 사용 (아카이브)
참여
메일링 리스트

초록

이 문서는 웹 애플리케이션이 사용자의 오디오 출력 장치에서 오디오가 렌더링되는 방식을 관리할 수 있게 하는 JavaScript API 집합을 정의합니다.

이 문서의 상태

이 섹션은 이 문서가 공개된 시점의 상태를 설명합니다. 현재 W3C 공개 문서와 이 기술 보고서의 최신 개정판 목록은 W3C 표준 및 초안 색인에서 확인할 수 있습니다.

WebRTC 및 Device and Sensors Working Group은 이 명세를 곧 후보 권고안으로 공개할 예정입니다. 따라서 이 문서는 폭넓은 검토 요청입니다.

이 문서는 Web Real-Time Communications Working Group에서 권고안 트랙을 사용하여 후보 권고안 초안으로 공개했습니다.

후보 권고안으로 공개된다는 것은 W3C 및 그 회원의 지지를 의미하지 않습니다. 후보 권고안 초안은 작업 그룹이 이후 후보 권고안 스냅샷에 포함하려는, 이전 후보 권고안으로부터의 변경 사항을 통합합니다.

이 문서는 초안 문서이며 언제든지 다른 문서로 갱신, 대체 또는 폐기될 수 있습니다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 적절하지 않습니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성했습니다. W3C는 이 그룹의 산출물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 유지합니다. 해당 페이지에는 특허 공개를 위한 지침도 포함되어 있습니다. 자신이 실제로 알고 있는 특허가 필수 청구항을 포함한다고 믿는 개인은 W3C 특허 정책의 섹션 6에 따라 정보를 공개해야 합니다.

이 문서는 2025년 8월 18일 W3C 프로세스 문서의 적용을 받습니다.

1. 소개

이 섹션은 비규범입니다.

이 제안은 JavaScript가 미디어 요소의 오디오 출력을 시스템 또는 사용자 에이전트 기본값이 아닌 허용된 장치로 보낼 수 있게 합니다. 이는 다양한 실시간 통신 시나리오뿐만 아니라 일반적인 미디어 애플리케이션에서도 유용할 수 있습니다. 예를 들어 애플리케이션은 이 API를 사용하여 Bluetooth 헤드셋이나 스피커폰 같은 장치로 출력을 프로그래밍 방식으로 보낼 수 있습니다.

2. HTMLMediaElement 확장

이 섹션은 Audio Output Devices API가 지원될 때 HTMLMediaElement [HTML]에 대한 추가 사항을 명시합니다.

HTMLMediaElement 생성자가 호출될 때, 사용자 에이전트는 다음 초기화 단계를 추가해야 MUST 합니다:

  1. 요소가 [[SinkId]] 내부 슬롯을 갖게 하고, 이를 ""로 초기화합니다.

WebIDLpartial interface HTMLMediaElement {
  [SecureContext] readonly attribute DOMString sinkId;
  [SecureContext] Promise<undefined> setSinkId (DOMString sinkId);
};

속성

sinkId, 타입은 DOMString, 읽기 전용

이 속성은 오디오 출력이 전달되고 있는 오디오 장치의 ID를 포함하거나, 출력이 사용자 에이전트 기본 장치를 통해 전달되는 경우 빈 문자열을 포함합니다. 비어 있지 않으면 이 ID는 enumerateDevices()에서 반환된 MediaDeviceInfo 값 중 하나의 deviceId 속성과 같아야 합니다.

가져올 때, 이 속성은 [[SinkId]] 슬롯의 값을 반환해야 MUST 합니다.

메서드

setSinkId

애플리케이션이 주어진 장치로 재생할 수 있도록 허용된 경우, 오디오 출력이 렌더링되어야 하는 오디오 장치의 ID를 설정합니다.

이 메서드가 호출될 때, 사용자 에이전트는 다음 단계를 실행해야 합니다:

  1. globalObject 현재 설정 객체 관련 전역 객체로 둡니다.

  2. documentglobalObject 연결된 Document로 둡니다.

  3. document 사용할 수 있는 기능 중 "speaker-selection"으로 식별되는 기능을 사용할 수 없는 경우, 이름이 NotAllowedError인 새 DOMException으로 거부된 promise를 반환합니다.

  4. globalObject일시적 활성화가 없는 경우, 사용자 에이전트는 name 속성 값이 InvalidStateErrorDOMException 객체로 거부된 promise를 반환할 수 MAY 있습니다.

  5. element를 이 메서드가 호출된 HTMLMediaElement 객체로 둡니다.

  6. sinkId를 메서드의 첫 번째 인수로 둡니다.

  7. sinkIdelement[[SinkId]]와 같으면, undefined로 해결된 promise를 반환합니다.

  8. p를 새 promise로 둡니다.

  9. 다음 하위 단계를 병렬로 실행합니다:

    1. sinkId가 빈 문자열이 아니고 enumerateDevices()가 제공할 결과에 의해 식별되는 어떤 오디오 출력 장치와도 일치하지 않으면, 이름이 NotFoundError인 새 DOMException으로 p를 거부하고 이 하위 단계를 중단합니다.

    2. sinkId가 빈 문자열이 아니고, sinkId로 식별되는 장치가 현재 사용자 에이전트 기본 장치가 아니었다면 애플리케이션이 해당 장치를 통해 오디오를 재생하도록 허용되지 않았을 경우, 이름이 NotAllowedError인 새 DOMException으로 p를 거부하고 이 하위 단계를 중단합니다.

    3. element의 기반 오디오 출력 장치를 sinkId로 식별되는 오디오 장치로 전환합니다.

      참고

      이 하위 단계가 성공하고 미디어 요소의 paused 속성이 false인 경우, 오디오는 요소의 sinkId 속성이 나타내는 장치에서 재생되는 것을 중지해야 MUST 하며, sinkId로 식별되는 장치에서 재생되기 시작합니다.

    4. 앞의 하위 단계가 실패한 경우, 이름이 AbortError인 새 DOMException으로 p를 거부하고 이 하위 단계를 중단합니다.

    5. 다음 단계를 실행하는 태스크를 큐에 넣습니다:

      1. element[[SinkId]]sinkId로 설정합니다.

      2. p를 해결합니다.

  10. p를 반환합니다.

2.1 알고리즘

2.1.1 싱크를 더 이상 사용할 수 없음

미디어 요소의 sinkId 속성으로 식별되는 오디오 장치는, 예를 들어 플러그가 뽑히는 경우 사용할 수 없게 될 수 있습니다.

sinkId 속성으로 식별되는 오디오 장치를 더 이상 사용할 수 없게 되면, 사용자 에이전트는 아무 조치도 취하지 않아야 합니다. 예를 들어 sinkId로 식별되는 장치를 더 이상 사용할 수 없게 되었을 때 미디어 요소의 paused 속성이 false이면, 재생은 평소처럼 계속됩니다. 이 경우 미디어 요소가 연결된 장치를 사용할 수 없으므로 오디오는 렌더링되지 않습니다.

다음 단락은 비규범입니다.

애플리케이션이 장치 변경에 반응하려는 경우, 애플리케이션은 devicechange 이벤트를 수신하고 갱신된 장치 목록을 얻기 위해 enumerateDevices()를 질의할 수 있습니다. 미디어 요소의 sinkId 속성 값이 반환된 MediaDeviceInfo들의 목록에서 deviceId 속성으로 더 이상 존재하지 않는다면, 그 장치는 더 이상 사용할 수 없으며 애플리케이션은 이에 따라 반응하도록 선택할 수 있습니다.

2.1.2 새 싱크 사용 가능

새 오디오 장치를 사용자 에이전트에서 사용할 수 있게 되거나, 예를 들어 플러그가 뽑혔다가 나중에 다시 꽂히는 경우처럼, 이전에 사용할 수 없게 된 오디오 장치(미디어 요소의 sinkId 속성으로 식별됨)를 다시 사용할 수 있게 될 수 있습니다.

이 시나리오에서, 사용자 에이전트는 다음 단계를 실행해야 합니다:

  1. sinkId를 새로 사용 가능해진 장치의 식별자로 둡니다.

  2. sinkId 속성이 sinkId와 같은 각 미디어 요소에 대해:

    1. 미디어 요소의 paused 속성이 false이면, 이 객체의 오디오를 sinkId 속성이 나타내는 장치에서 렌더링하기 시작합니다.

다음 단락은 비규범입니다.

애플리케이션이 장치 변경에 반응하려는 경우, 애플리케이션은 devicechange 이벤트를 수신하고 갱신된 장치 목록을 얻기 위해 enumerateDevices()를 질의할 수 있습니다.

3. MediaDevices 확장

이 섹션은 Audio Output Devices API가 지원될 때 MediaDevices에 대한 추가 사항을 명시합니다.

WebIDLpartial interface MediaDevices {
  Promise<MediaDeviceInfo> selectAudioOutput(optional AudioOutputOptions options = {});
};

메서드

selectAudioOutput

사용자에게 특정 오디오 출력 장치를 선택하도록 요청합니다.

selectAudioOutput 메서드가 호출될 때, 사용자 에이전트는 다음 단계를 실행해야 MUST 합니다:

  1. this관련 전역 객체일시적 활성화가 없는 경우, name 속성 값이 InvalidStateErrorDOMException 객체로 거부된 promise를 반환합니다.

  2. options를 메서드의 첫 번째 인수로 둡니다.

  3. deviceIdoptions.deviceId로 둡니다.

  4. mediaDevicesthis로 둡니다.

  5. p를 새 promise로 둡니다.

  6. 다음 단계를 병렬로 실행합니다:

    1. descriptorPermissionDescriptor로 두고, 그 name을 "speaker-selection"으로 설정합니다.

    2. descriptor권한 상태가 "denied"이면, name 속성 값이 NotAllowedError인 새 DOMException으로 p를 거부하고 이 단계를 중단합니다.

    3. 사용 가능한 오디오 출력 장치에 대해 사용자 에이전트를 탐색합니다.

    4. 오디오 출력 장치가 없으면, name 속성 값이 NotFoundError인 새 DOMException으로 p를 거부하고 이 단계를 중단합니다.

    5. deviceId""가 아니면 다음 하위 단계를 실행합니다:

      1. deviceId가 이 탐색 세션 또는 이전 탐색 세션에서 selectAudioOutput에 의해 이전에 노출된 장치 ID와 일치하거나, 이 탐색 세션 또는 이전 탐색 세션에서 getUserMedia()에 의해 이전에 노출된 오디오 입력 장치와 동일한 groupId를 가진 오디오 출력 장치의 장치 ID와 일치하는 경우, 사용자 에이전트는 이 출처 집합에 대해 이 ID를 지속할지 여부에 대한 이전 결정에 기반하여 다음 하위 단계를 실행하기로 결정할 수 MAY 있습니다:

        1. device를 사용 가능한 경우 deviceId로 식별되는 장치로 둡니다.

        2. device를 사용할 수 있으면, pdeviceId 또는 device에 대해 새로 회전된 장치 ID로 해결하고, 병렬 단계를 중단합니다.

    6. descriptor와 함께 오디오 출력 장치를 사용자가 선택하도록 요청합니다.

    7. 요청의 결과가 "denied"이면, name 속성 값이 NotAllowedError인 새 DOMException으로 p를 거부하고 이 단계를 중단합니다.

    8. selectedDevice를 사용자가 선택한 오디오 출력 장치로 둡니다.

    9. deviceInfoselectedDevice를 나타내도록 장치 정보 객체를 생성한 결과로 두며, mediaDevices를 사용합니다.

    10. deviceInfo.deviceId[[explicitlyGrantedAudioOutputDevices]]에 추가합니다.

    11. pdeviceInfo로 해결합니다.

  7. p를 반환합니다.

selectAudioOutput 호출 후 장치가 한 번 노출되면, 해당 장치는 현재 탐색 컨텍스트에서 enumerateDevices()에 의해 나열되어야 MUST 합니다.

selectAudioOutput가 반환한 promise가 해결되면, 사용자 에이전트는 문서가 추가적인 사용자 제스처 없이도 HTMLMediaElement에서 미디어를 즉시 재생할 수 있도록 허용되고, 또한 AudioContext를 즉시 시작할 수 있도록 허용되도록 보장해야 MUST 합니다.

참고

이는 현재 브라우저의 자동 재생에 대한 표준화가 부족하기 때문에 부정확합니다.

AudioOutputOptions 딕셔너리

이 딕셔너리는 오디오 출력 장치에 대한 접근 권한을 얻는 데 사용할 수 있는 옵션을 설명합니다.

WebIDLdictionary AudioOutputOptions {
  DOMString deviceId = "";
};

딕셔너리 AudioOutputOptions 멤버

deviceId, 타입은 DOMString, 기본값은 ""

이 딕셔너리 멤버의 값이 ""가 아니고, selectAudioOutput에 의해 이전에 노출된 ID와 일치하거나, 이 세션 또는 이전 세션에서 getUserMedia()에 의해 이전에 노출된 오디오 입력 장치와 동일한 groupId를 가진 오디오 출력 장치의 장치 ID와 일치하는 경우, 사용자 에이전트는 해당 장치가 현재 사용 가능하다고 가정하고, 사용자에게 요청하는 대신 이 ID 또는 같은 장치에 대한 새 회전 ID로 해결하도록 선택할 수 MAY 있습니다.

참고

지속된 장치 ID를 지원하는 사용자 에이전트에 의존하려는 애플리케이션은 setSinkId와 함께 작동하기 전에, 이 ID들을 selectAudioOutput에 성공적으로 전달해야 합니다. 그 이유는 이것이 핑거프린팅 정보를 노출하기 때문입니다. 다만 장치를 사용할 수 없거나 사용자 에이전트가 장치 ID를 존중하지 않기로 결정하면 사용자에게 요청할 위험이 있습니다.

4. 개인정보 보호 고려 사항

4.3 권한 통합

Audio Output Devices API는 강력한 기능이며, name "speaker-selection"으로 식별됩니다.

이는 다음 타입과 알고리즘을 정의합니다:

권한 설명자 타입

권한은 기본 장치가 아닌 스피커 출력 장치 하나 이상에 대한 접근을 포함합니다.

설명자의 의미는 기본 장치가 아닌 모든 스피커 출력 장치에 대한 접근을 질의한다는 것입니다. 따라서 "speaker-selection" 강력한 기능에 대한 질의가 "granted"를 반환하면, 클라이언트는 이전에 공유받은 deviceId 중 하나 이상을 권한 요청을 발생시키지 않고 selectAudioOutput에 전달할 수 있음을 알 수 있습니다. 그리고 "denied"가 반환되면, 오디오 출력 장치에 대한 어떤 selectAudioOutput 요청도 성공하지 않을 것임을 알 수 있습니다.

사용자 에이전트가 일부 오디오 출력 장치에는 권한이 부여되었지만 전부는 아니라고 간주하는 경우, 질의는 "granted"를 반환합니다.

사용자 에이전트가 모든 오디오 출력 장치에 대해 권한이 거부되었다고 간주하는 경우, 질의는 "denied"를 반환합니다.

4.4 권한 정책 통합

이 명세는 문자열 "speaker-selection"으로 식별되는 하나의 정책 제어 기능을 정의합니다. 이는 "self"기본 허용 목록을 갖습니다.

참고

문서권한 정책은 해당 문서의 어떤 콘텐츠가 selectAudioOutput사용할 수 있어 사용자에게 오디오 출력 장치를 요청할 수 있는지, 또는 setSinkId사용할 수 있어 오디오 출력이 렌더링되어야 하는 장치를 시스템 기본값이 아닌 사용자 허용 장치로 변경할 수 있는지를 결정합니다. selectAudioOutput의 경우 이는 사용자가 선택하도록 요청하는 알고리즘에 의해 시행됩니다.

5. 적합성

비규범으로 표시된 섹션뿐만 아니라, 이 명세의 모든 작성 지침, 다이어그램, 예제 및 참고는 비규범입니다. 이 명세의 그 밖의 모든 내용은 규범입니다.

이 문서의 키워드 MAYMUST는 여기에 표시된 것처럼 모두 대문자로 나타나는 경우에만 BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석됩니다.

이 명세는 단일 제품에 적용되는 적합성 기준을 정의합니다. 그 제품은 여기에 포함된 인터페이스를 구현하는 사용자 에이전트입니다.

알고리즘 또는 구체적인 단계로 표현된 적합성 요구 사항은 최종 결과가 동등하다면 어떤 방식으로든 구현될 수 있습니다. (특히, 이 명세에 정의된 알고리즘은 따라 하기 쉽게 작성된 것이며, 성능을 의도한 것은 아닙니다.)

이 명세에 정의된 API를 구현하기 위해 ECMAScript를 사용하는 구현은 Web IDL 명세 [WEBIDL]에 정의된 ECMAScript 바인딩과 일관된 방식으로 이를 구현해야 합니다. 이 명세는 해당 명세와 용어를 사용하기 때문입니다.

6. 감사의 말

다음 사람들은 이 명세의 개발에 직접 기여했습니다: Harald Alvestrand, Rick Byers, Dominique Hazael-Massieux(HTML5Apps 프로젝트를 통해), Philip Jägenstedt, Victoria Kirst, Shijun Sun, Martin Thomson, Chris Wilson.

A. 참고 문헌

A.1 규범 참고 문헌

[GETUSERMEDIA]
미디어 캡처 및 스트림. Cullen Jennings; Jan-Ivar Bruaroey; Henrik Boström; youenn fablet. W3C. 2025년 10월 2일. CRD. URL: https://www.w3.org/TR/mediacapture-streams/
[HTML]
HTML 표준. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 살아 있는 표준. URL: https://html.spec.whatwg.org/multipage/
[permissions]
권한. Marcos Caceres; Mike Taylor. W3C. 2025년 10월 6일. W3C 작업 초안. URL: https://www.w3.org/TR/permissions/
[permissions-policy]
권한 정책. Ian Clelland. W3C. 2025년 10월 6일. W3C 작업 초안. URL: https://www.w3.org/TR/permissions-policy-1/
[RFC2119]
RFC에서 요구 수준을 나타내기 위해 사용하는 키워드. S. Bradner. IETF. 1997년 3월. 현재 모범 사례. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
RFC 2119 키워드에서 대문자와 소문자의 모호성. B. Leiba. IETF. 2017년 5월. 현재 모범 사례. URL: https://www.rfc-editor.org/rfc/rfc8174
[WEBAUDIO]
Web Audio API. Paul Adenot; Hongchan Choi. W3C. 2021년 6월 17일. W3C 권고안. URL: https://www.w3.org/TR/webaudio-1.0/
[WEBIDL]
Web IDL 표준. Edgar Chen; Timothy Gu. WHATWG. 현행 표준. URL: https://webidl.spec.whatwg.org/

A.2 정보 참고 문헌

[dom]
DOM 표준. Anne van Kesteren. WHATWG. 현행 표준. URL: https://dom.spec.whatwg.org/