Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
HTMLMediaElement
[HTML]을 확장하여
JavaScript가 재생을 위한 미디어 스트림을 생성할 수 있도록 합니다. JavaScript로 스트림을 생성할 수 있게 되면 적응형 스트리밍, 라이브 스트림의 타임시프트 등 다양한 사용 사례를
지원할 수 있습니다.
이 섹션은 이 문서가 공개될 당시의 상태를 설명합니다. 현재 W3C 출판물 목록과 이 기술 보고서의 최신 개정판은 W3C 표준 및 초안 인덱스에서 확인할 수 있습니다.
편집상의 업데이트 외에도, W3C 권고안으로 2016년 11월에 공개된 이후 실질적인 변경 사항은 다음과 같습니다:
changeType() 메서드가 추가되어 코덱
또는 바이트스트림 간 전환이 가능해졌습니다.
MediaSource 객체를 생성 및 사용할 수 있는
가능성createObjectURL()
확장 기능이 File API에 통합됨에 따라 URL 객체에서 제거됨 [FILEAPI]
ManagedMediaSource, ManagedSourceBuffer, 그리고
BufferedChangeEvent
인터페이스가 추가되어 사용자 에이전트가 효율적으로 스트리밍하고, 미디어 버퍼를 적극적으로 정리할 수 있도록 지원합니다.
이전 버전 이후 변경된 전체 목록은 커밋 내역을 참고하세요.
작업 그룹은 편집자가 아직 해결하지 않은 모든 버그 리포트 목록을 관리합니다.
구현자는 이 명세가 안정적이지 않다는 점을 인지해야 합니다. 논의에 참여하지 않는 구현자는 명세가 호환되지 않는 방식으로 변경될 수 있으니 주의해야 합니다. 이 명세가 최종적으로 후보 권고안 단계에 도달하기 전에 구현을 원하는 벤더는 GitHub 저장소를 추적하고 논의에 참여해야 합니다.
이 문서는 미디어 워킹 그룹에서 권고안 경로를 따라 워킹 드래프트로 공개되었습니다.
워킹 드래프트로 공개되었다고 해서 W3C 및 회원사의 보증을 의미하지는 않습니다.
이 문서는 초안 문서이며 언제든지 업데이트, 대체 또는 폐기될 수 있습니다. 진행 중인 작업 외의 문서로 인용하는 것은 적절하지 않습니다.
이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성되었습니다. W3C는 공개 특허 공개 목록을 관리하며, 해당 그룹의 결과물과 관련해 특허 공개 방법도 안내합니다. 어떤 개인이 필수적 청구를 포함한다고 믿는 특허를 실제로 알고 있다면, W3C 특허 정책 6항에 따라 정보를 공개해야 합니다.
이 문서는 2025년 8월 18일 W3C 프로세스 문서의 적용을 받습니다.
이 섹션은 규범적이지 않습니다.
이 명세는 JavaScript가 <audio>와 <video>를 위한 미디어 스트림을 동적으로 구성할 수 있도록 합니다. HTMLMediaElement에 미디어 데이터를
공급할 수 있는 MediaSource 객체를 정의합니다. MediaSource 객체는 하나 이상의
SourceBuffer 객체를 가집니다. 애플리케이션은 SourceBuffer
객체에 데이터 세그먼트를 추가하고, 시스템 성능 및 기타 요소에 따라 추가되는 데이터의 품질을 조정할 수 있습니다. SourceBuffer 객체의 데이터는 오디오, 비디오, 텍스트 데이터의 트랙 버퍼로 관리되어
디코딩 후 재생됩니다. 이러한 확장에 사용되는 바이트 스트림 명세는 바이트 스트림 포맷 레지스트리 [MSE-REGISTRY]에서 확인할 수 있습니다.
이 명세는 다음 목표를 염두에 두고 설계되었습니다:
이 명세는 다음을 정의합니다:
트랙 버퍼는 enabled된
audioTracks,
selected된
videoTracks,
그리고
"showing"
또는
"hidden"인
textTracks에
코드화된 프레임을 제공합니다.
이러한 모든 트랙은
activeSourceBuffers
목록에 있는 SourceBuffer 객체와 연결되어
있습니다.
추가하는 동안 코드화된 프레임을 필터링하는 데 사용되는 프레젠테이션
타임스탬프 범위입니다.
추가 윈도우는 하나의 시작 시간과
종료 시간을 갖는 하나의 연속된 시간 범위를 나타냅니다. 이 범위 내의 프레젠테이션
타임스탬프를 가진 코드화된 프레임은
SourceBuffer에 추가될 수 있으며, 이 범위 밖의 코드화된 프레임은
필터링됩니다. 추가 윈도우의 시작 및 종료 시간은 각각
appendWindowStart 및 appendWindowEnd 속성으로
제어됩니다.
프레젠테이션 타임스탬프, 디코드 타임스탬프, 그리고 코드화된 프레임 지속 시간을 갖는 미디어 데이터 단위입니다.
코드화된 프레임의 지속 시간입니다. 비디오와 텍스트의 경우 지속 시간은 비디오 프레임 또는 텍스트가 표시되어야 하는 시간을 나타냅니다. 오디오의 경우 지속 시간은 코드화된 프레임에 포함된 모든 샘플의 합을 나타냅니다. 예를 들어 오디오 프레임에 44100Hz에서 441개의 샘플이 포함되어 있다면 프레임 지속 시간은 10밀리초가 됩니다.
코드화된 프레임의 프레젠테이션 타임스탬프와 해당 코드화된 프레임 지속 시간의 합입니다. 이는 코드화된 프레임 바로 다음의 프레젠테이션 타임스탬프를 나타냅니다.
서로 인접하며 간격 없이 단조 증가하는
디코드 타임스탬프를 갖는 코드화된 프레임의 그룹입니다.
코드화된 프레임 처리
알고리즘에서 감지된 불연속성과 abort()
호출은 새로운
코드화된 프레임 그룹의 시작을 트리거합니다.
디코드 타임스탬프는 이 프레임과 이에 종속된 모든 프레임의 디코딩 및 렌더링이 즉시 이루어진다고 가정할 때 프레임을 디코딩해야 하는 가장 늦은 시간을 나타냅니다(이는 프레젠테이션 순서에서 이 프레임에 종속된 가장 이른 프레임의 프레젠테이션 타임스탬프와 같습니다). 프레임을 프레젠테이션 순서와 다르게 디코딩할 수 있다면 디코드 타임스탬프는 바이트 스트림에 반드시 존재하거나 바이트 스트림에서 도출할 수 있어야 합니다. 그렇지 않은 경우 사용자 에이전트는 추가 오류 알고리즘을 반드시 실행해야 합니다. 프레임을 프레젠테이션 순서와 다르게 디코딩할 수 없고 디코드 타임스탬프가 바이트 스트림에 존재하지 않는 경우 디코드 타임스탬프는 프레젠테이션 타임스탬프와 같습니다.
일련의 미디어 세그먼트를 디코딩하는 데 필요한 모든 초기화 정보를 포함하는 바이트 시퀀스입니다. 여기에는 코덱 초기화 데이터, 다중화된 세그먼트의 트랙 ID 매핑과 타임스탬프 오프셋(예: 편집 목록)이 포함됩니다.
바이트 스트림 형식 레지스트리의 바이트 스트림 형식 명세 [MSE-REGISTRY]에는 형식별 예제가 포함되어 있습니다.
미디어 타임라인의 일부에 대한 패킷화되고 타임스탬프가 지정된 미디어 데이터를 포함하는 바이트 시퀀스입니다. 미디어 세그먼트는 항상 가장 최근에 추가된 초기화 세그먼트와 연결됩니다.
바이트 스트림 형식 레지스트리의 바이트 스트림 형식 명세 [MSE-REGISTRY]에는 형식별 예제가 포함되어 있습니다.
MediaSource 객체 URL은
createObjectURL()로
생성되는 고유한 blob URL입니다.
이는 MediaSource 객체를
HTMLMediaElement에 연결하는 데 사용됩니다.
이러한 URL은 blob URL과 동일하지만,
해당 기능의 정의에서 File 및 Blob 객체를 참조하는 모든 내용은
여기에서
MediaSource 객체에도 적용되도록 확장됩니다.
MediaSource 객체 URL의 출처는
createObjectURL()
호출 중
this의 관련
설정 객체입니다.
예를 들어 MediaSource 객체 URL의 출처는 미디어 요소가 캔버스에서 사용되는 방식에 영향을 줍니다.
SourceBuffer 객체의 부모 미디어 소스는
해당 객체를 생성한 MediaSource 객체입니다.
프레젠테이션 시작 시간은 프레젠테이션에서 가장 이른 시점이며 초기 재생 위치와 가능한 가장 이른 위치를 지정합니다. 이 명세를 사용하여 생성된 모든 프레젠테이션의 프레젠테이션 시작 시간은 0입니다.
HTMLMediaElement의
buffered에
현재 재생 위치를 포함하는 TimeRanges가
포함되어 있는지 판단하기 위해 구현은 현재 재생 위치가 프레젠테이션 시작 시간 이상이고
첫 번째 TimeRanges보다
이전인 경우에도,
해당
TimeRanges가
프레젠테이션 시작 시간 후 약 1초와 같이 합리적으로 짧은 시간 내에
시작된다면 첫 번째 TimeRanges를
재생하도록 허용할 수 있습니다. 이 허용은 다중화된 스트림의
모든 트랙이 일반적으로 프레젠테이션 시작 시간에 정확히 시작하지 않는 현실을
수용합니다.
구현은 이러한 허용과 관계없이 실제 버퍼링된 범위를 반드시 보고해야 합니다.
코드화된 프레임의 프레젠테이션 구간은 해당 프레임의 프레젠테이션 타임스탬프부터 프레젠테이션 타임스탬프에 코드화된 프레임의 지속 시간을 더한 시점까지의 시간 구간입니다. 예를 들어 코드화된 프레임의 프레젠테이션 타임스탬프가 10초이고 코드화된 프레임 지속 시간이 100 밀리초라면 프레젠테이션 구간은 [10-10.1)이 됩니다. 범위의 시작은 포함되지만 범위의 끝은 포함되지 않는다는 점에 유의하십시오.
프레젠테이션에서 코드화된 프레임이 렌더링되는 순서입니다. 프레젠테이션 순서는 코드화된 프레임을 프레젠테이션 타임스탬프에 따라 단조 증가하는 순서로 정렬하여 결정됩니다.
프레젠테이션의 특정 시간을 참조하는 값입니다. 코드화된 프레임의 프레젠테이션 타임스탬프는 해당 프레임이 언제 렌더링되어야 하는지를 나타냅니다.
세그먼트의 이전 데이터에 의존하지 않고 디코딩과 연속 재생을 시작할 수 있는 미디어 세그먼트 내의 위치입니다. 비디오의 경우 일반적으로 I-프레임의 위치입니다. 오디오의 경우 대부분의 오디오 프레임을 임의 접근 지점으로 취급할 수 있습니다. 비디오 트랙은 일반적으로 임의 접근 지점이 더 드물게 분포하므로, 이러한 지점의 위치가 일반적으로 다중화된 스트림의 임의 접근 지점으로 간주됩니다.
SourceBuffer 인스턴스가 받아들이는 바이트
스트림의 형식을 설명하는 특정 바이트 스트림 형식 명세입니다.
SourceBuffer 객체의
바이트 스트림 형식 명세는 처음에는
객체를 생성한 addSourceBuffer()
호출에 전달된
type을 기반으로 선택되며, 객체에 대한 changeType() 호출로
갱신할 수 있습니다.
SourceBuffer 구성
하나의 MediaSource 인스턴스가 소유한
하나 이상의 SourceBuffer 객체에 분산된 특정 트랙 집합입니다.
구현은 다음 구성을 갖는 MediaSource 객체를 최소 1개 반드시
지원해야 합니다.
MediaSource 객체는 위의 각 구성을 반드시 지원해야 하지만, 한 번에 하나의 구성만 지원하면 됩니다. 여러 구성을 동시에 지원하거나 추가 구성을 지원하는 것은 구현 품질의 문제입니다.
단일 트랙에 대한 트랙 ID, 코덱 구성 및 기타 메타데이터를 제공하는 바이트 스트림 형식별 구조입니다. 하나의 초기화 세그먼트 내의 각 트랙 설명은 고유한 트랙 ID를 가집니다. 트랙 ID가 초기화 세그먼트 내에서 고유하지 않은 경우 사용자 에이전트는 추가 오류 알고리즘을 반드시 실행해야 합니다.
트랙 ID는 바이트 스트림의 특정 부분이 특정 트랙에 속함을 표시하는 바이트 스트림 형식별 식별자입니다. 트랙 설명의 트랙 ID는 미디어 세그먼트의 어느 부분이 해당 트랙에 속하는지를 식별합니다.
MediaSource 인터페이스는
HTMLMediaElement을
위한 미디어 데이터 소스를 나타냅니다.
이 인터페이스는 이 소스의 readyState와
프레젠테이션에 미디어 데이터를 추가하는 데 사용할 수 있는 SourceBuffer 객체 목록을 추적합니다.
MediaSource 객체는 웹 애플리케이션에서 생성된 다음 HTMLMediaElement에 연결됩니다. 애플리케이션은
sourceBuffers에 있는 SourceBuffer 객체를 사용하여 이
소스에 미디어 데이터를 추가합니다. HTMLMediaElement는 재생 중 필요할 때
MediaSource 객체에서 이 미디어 데이터를 가져옵니다.
각 MediaSource 객체에는 정규화된
TimeRanges 객체를 저장하는 [[live
seekable
range]] 내부 슬롯이 있습니다. 이 슬롯은
MediaSource 객체가 생성될 때 비어 있는 TimeRanges 객체로
초기화되며, setLiveSeekableRange()
및
clearLiveSeekableRange()에
의해 유지되고,
10.
HTMLMediaElement 확장에서
HTMLMediaElement의
seekable
동작을 수정하는 데 사용됩니다.
각 MediaSource 객체에는 boolean을 저장하는 [[has ever been
attached]] 내부 슬롯이 있습니다. 이 슬롯은
MediaSource 객체가 생성될 때 false로 초기화되며,
미디어 요소에 연결 알고리즘에 설명된 대로 확장된
HTMLMediaElement의
리소스 가져오기
알고리즘에서 true로 설정됩니다. 확장된
리소스 가져오기
알고리즘은 이 내부
슬롯을 사용하여 HTMLMediaElement의
srcObject
속성에 설정된 MediaSourceHandle을
사용한 MediaSource의
연결을 조건에 따라 실패시킵니다.
WebIDLenum ReadyState {
"closed",
"open",
"ended",
};
closed
open
SourceBuffer 객체에 데이터를 추가할 준비가
되어 있음을 나타냅니다.
MediaSource의 sourceBuffers에서 사용됩니다.
ended
MediaSource의
endOfStream()가 호출된 상태입니다.
WebIDLenum EndOfStreamError {
"network",
"decode",
};
network
재생을 종료하고 네트워크 오류가 발생했음을 신호합니다.
JavaScript 애플리케이션은 네트워크 오류 발생 시 재생을 종료할 때 이 상태 코드를 사용해야 합니다. 예를 들어, 미디어 데이터를 가져오는 중에 네트워크 오류가 발생한 경우입니다.
decode
재생을 종료하고 디코딩 오류가 발생했음을 신호합니다.
JavaScript 애플리케이션은 디코드 오류가 발생할 때 재생을 종료하기 위해 이 상태 코드를 사용해야 합니다. 예를 들어, 외부 미디어 데이터를 처리하는 중 파싱 오류가 발생한 경우입니다.
WebIDL[Exposed=(Window,DedicatedWorker)]
interface MediaSource : EventTarget {
constructor();
[SameObject, Exposed=DedicatedWorker]
readonly attribute MediaSourceHandle handle;
readonly attribute SourceBufferList sourceBuffers;
readonly attribute SourceBufferList activeSourceBuffers;
readonly attribute ReadyState readyState;
attribute unrestricted double duration;
attribute EventHandler onsourceopen;
attribute EventHandler onsourceended;
attribute EventHandler onsourceclose;
static readonly attribute boolean canConstructInDedicatedWorker;
SourceBuffer addSourceBuffer(DOMString type);
undefined removeSourceBuffer(SourceBuffer sourceBuffer);
undefined endOfStream(optional EndOfStreamError error);
undefined setLiveSeekableRange(double start, double end);
undefined clearLiveSeekableRange();
static boolean isTypeSupported(DOMString type);
};
전용 워커에서 MediaSource 객체를
HTMLMediaElement에
srcObject로
연결할 때 유용한 handle을 포함합니다.
이 handle은 해당 MediaSource 객체의 속성 접근 동안 동일한 객체로 유지되지만,
각 MediaSource 객체마다 별개의 객체입니다.
이 명세는 향후 MediaSource
객체의 이 속성을 메인 Window 컨텍스트에서 보이게 할 수 있습니다. 만약 그렇게 된다면,
이 속성에 접근할 때 예외가 발생하는 등 기존과 호환되지 않는 변경을 방지하기 위해 명세의 세심한 관리가 필요합니다.
속성을 얻을 때 다음 단계를 실행합니다:
MediaSource 객체의 handle이 아직 생성되지 않았다면 다음 단계를
실행합니다:
MediaSourceHandle 객체와 관련 리소스를 생성해
내부적으로 이
MediaSource에 연결하는 결과로 합니다.
MediaSourceHandle
객체를 반환합니다.
이 MediaSource에 연결된 SourceBuffer 객체 목록을 포함합니다.
MediaSource의 readyState가 "closed"일 때 이 목록은 비어 있습니다.
readyState가 "open"으로 변경되면
addSourceBuffer()를 사용해
SourceBuffer 객체를 추가할 수 있습니다.
sourceBuffers 중
selected
비디오 트랙, enabled
오디오 트랙(들), 그리고
"showing"
또는
"hidden"
텍스트 트랙(들)을 제공하는 하위 집합을 포함합니다.
이 목록의 SourceBuffer 객체는
sourceBuffers 속성에 나타나는 순서와 동일하게 정렬되어야 합니다;
예를 들어, sourceBuffers[0]과 sourceBuffers[3]만 activeSourceBuffers에 있다면,
activeSourceBuffers[0]은 sourceBuffers[0]과 같아야 하고, activeSourceBuffers[1]은 sourceBuffers[3]과 같아야 합니다.
3.15.5 선택/활성화된 트랙 상태 변경에서 이 속성이 어떻게 갱신되는지 설명합니다.
MediaSource 객체의 현재 상태를 나타냅니다.
MediaSource가 생성될 때
readyState는 "closed"로 설정되어야 합니다.
웹 애플리케이션이 프레젠테이션 지속 시간을 설정할 수 있도록 합니다. 지속 시간은 MediaSource 객체가 생성될 때 처음에
NaN으로 설정됩니다.
값을 가져올 때 다음 단계를 실행합니다.
readyState 속성이 "closed"이면
NaN을 반환하고 이 단계를 중단합니다.
값을 설정할 때 다음 단계를 실행합니다.
TypeError
예외를 발생시키고
이 단계를 중단합니다.
readyState 속성이 "open"이 아니면
InvalidStateError
예외를 발생시키고 이 단계를 중단합니다.
sourceBuffers에 있는
SourceBuffer 중 하나라도
updating 속성이 true와 같으면 InvalidStateError
예외를 발생시키고
이 단계를 중단합니다.
현재 버퍼링된 코드화된 프레임 중 종료 시간이 더 높은 것이 있으면 지속 시간 변경 알고리즘은 new duration을 더 높은 값으로 조정합니다.
appendBuffer()
및 endOfStream()는
특정 상황에서
지속 시간을 갱신할 수 있습니다.
true를 반환합니다.
이 속성은 메인 스레드와 전용 워커에서 MediaSource 객체 생성 및 사용 지원
여부를 감지할 수 있게 해주며,
특히 기능이 지원되지 않는 경우 전용 워커에서 MediaSource 객체 생성 시도와 같은 높은
지연의 폴리필 필요성을 줄여줍니다.
새 SourceBuffer를 sourceBuffers에 추가합니다.
TypeError
예외를 발생시키고
이 단계를 중단합니다.
sourceBuffers에 있는 다른 SourceBuffer 객체에 지정된 유형과 함께
지원되지 않는 MIME 유형이 포함되어 있으면 NotSupportedError
예외를 발생시키고 이
단계를 중단합니다.
QuotaExceededError
예외를 발생시키고 이 단계를 중단합니다.
예를 들어 미디어
요소가 HAVE_METADATA
readyState에 도달한 경우 사용자 에이전트는 QuotaExceededError
예외를 발생시킬 수 있습니다. 이는
사용자 에이전트의 미디어 엔진이 재생 중에 더 많은 트랙을 추가하는 것을 지원하지 않는 경우 발생할 수 있습니다.
readyState 속성이
"open" 상태가
아니면 InvalidStateError
예외를 발생시키고 이 단계를 중단합니다.
ManagedMediaSource이면
buffer를 해당 연결 리소스를 가진 새 ManagedSourceBuffer 인스턴스로 두고,
그렇지 않으면 해당 연결
리소스를 가진 SourceBuffer로 둡니다.
[[generate timestamps flag]]를
type과 연결된
Media Source Extensions™ 바이트
스트림 형식 레지스트리 항목의
"타임스탬프 생성 플래그" 열에 있는 값으로 설정합니다.
[[generate timestamps flag]]가
true이면 buffer의
mode를 "sequence"로 설정합니다. 그렇지 않으면
buffer의
mode를 "segments"로 설정합니다.
sourceBuffers에 추가합니다.
sourceBuffers에서
addsourcebuffer라는 이름의
이벤트를 발생시키도록
작업을 큐에 넣습니다.
SourceBuffer를 sourceBuffers에서 제거합니다.
sourceBuffers에 없는 객체를 지정하면 NotFoundError 예외를 발생시키고
이
단계를 중단합니다.
updating 속성이 true와 같으면
다음
단계를 실행합니다.
updating 속성을 false로 설정합니다.
abort라는
이름의 이벤트를
발생시키도록 작업을
큐에 넣습니다.
updateend라는 이름의 이벤트를 발생시키도록 작업을
큐에 넣습니다.
MediaSource가
Window에서
생성된 경우:
audioTracks가 반환한 AudioTrackList
객체와 같게 둡니다.
audioTracks
속성이 반환한
AudioTrackList
객체와 같게 둡니다.
sourceBuffer
속성을
null로 설정합니다.
이는 AudioTrackList
[HTML] 로직이
SourceBuffer audioTracks
list에서
track
속성이 audio
track으로 초기화된 TrackEvent를
사용하여
removetrack이라는
이름의
이벤트를
발생시키도록 작업을
큐에 넣는 동작을 트리거해야 합니다.
이 제거 단계가 시작될 때 audio track의 enabled
속성이 true였다면, 이는 또한 AudioTrackList
[HTML] 로직이
SourceBuffer audioTracks
list에서
change라는
이름의 이벤트를
발생시키도록
작업을
큐에 넣는 동작도 트리거해야 합니다.
이는 AudioTrackList
[HTML] 로직이
HTMLMediaElement audioTracks
list에서
track
속성이
audio track으로 초기화된
TrackEvent를
사용하여
removetrack이라는
이름의
이벤트를
발생시키도록 작업을
큐에 넣는 동작을 트리거해야 합니다. 이 제거 단계가
시작될 때 audio track의
enabled
속성이 true였다면, 이는 또한
AudioTrackList
[HTML] 로직이 HTMLMediaElement audioTracks
list에서 change라는
이름의 이벤트를
발생시키도록 작업을
큐에 넣는 동작도 트리거해야 합니다.
remove track 메시지를 [[port to main]]에 게시하며, 해당 메시지의
Window의
암시적 처리기는 다음 단계를 실행합니다.
audioTracks
속성이 반환한
AudioTrackList
객체와 같게 둡니다.
이는 AudioTrackList
[HTML] 로직이
HTMLMediaElement audioTracks
list에서
track
속성이
audio track으로 초기화된
TrackEvent를
사용하여
removetrack이라는
이름의
이벤트를
발생시키도록 작업을
큐에 넣는 동작을 트리거해야 합니다. 이 제거 단계가
시작될 때 audio track의
enabled
속성이 true였다면, 이는 또한
AudioTrackList
[HTML] 로직이 HTMLMediaElement audioTracks
list에서 change라는
이름의 이벤트를
발생시키도록 작업을
큐에 넣는 동작도 트리거해야 합니다.
MediaSource가
Window에서
생성된 경우:
videoTracks가 반환한 VideoTrackList
객체와 같게 둡니다.
videoTracks
속성이 반환한
VideoTrackList
객체와 같게 둡니다.
sourceBuffer
속성을
null로 설정합니다.
이는 VideoTrackList
[HTML] 로직이
SourceBuffer videoTracks
list에서
track
속성이 video
track으로 초기화된 TrackEvent를
사용하여
removetrack이라는
이름의
이벤트를
발생시키도록 작업을
큐에 넣는 동작을 트리거해야 합니다.
이 제거 단계가 시작될 때 video track의 selected
속성이 true였다면, 이는 또한 VideoTrackList
[HTML] 로직이
SourceBuffer videoTracks
list에서
change라는
이름의 이벤트를
발생시키도록
작업을
큐에 넣는 동작도 트리거해야 합니다.
이는 VideoTrackList
[HTML] 로직이
HTMLMediaElement videoTracks
list에서
track
속성이
video track으로 초기화된
TrackEvent를
사용하여
removetrack이라는
이름의
이벤트를
발생시키도록 작업을
큐에 넣는 동작을 트리거해야 합니다. 이 제거 단계가
시작될 때 video track의
selected
속성이 true였다면, 이는 또한
VideoTrackList
[HTML] 로직이 HTMLMediaElement videoTracks
list에서 change라는
이름의 이벤트를
발생시키도록 작업을
큐에 넣는 동작도 트리거해야 합니다.
remove track 메시지를 [[port to main]]에 게시하며, 해당 메시지의
Window의
암시적 처리기는 다음 단계를 실행합니다.
videoTracks
속성이 반환한
VideoTrackList
객체와 같게 둡니다.
이는 VideoTrackList
[HTML] 로직이
HTMLMediaElement videoTracks
list에서
track
속성이
video track으로 초기화된
TrackEvent를
사용하여
removetrack이라는
이름의
이벤트를
발생시키도록 작업을
큐에 넣는 동작을 트리거해야 합니다. 이 제거 단계가
시작될 때 video track의
selected
속성이 true였다면, 이는 또한
VideoTrackList
[HTML] 로직이 HTMLMediaElement videoTracks
list에서 change라는
이름의 이벤트를
발생시키도록 작업을
큐에 넣는 동작도 트리거해야 합니다.
MediaSource가
Window에서
생성된 경우:
textTracks가 반환한 TextTrackList
객체와 같게 둡니다.
textTracks
속성이 반환한
TextTrackList
객체와 같게 둡니다.
sourceBuffer
속성을
null로 설정합니다.
이는 TextTrackList
[HTML] 로직이
SourceBuffer textTracks
list에서
track
속성이 text
track으로 초기화된 TrackEvent를
사용하여
removetrack이라는
이름의
이벤트를
발생시키도록 작업을
큐에 넣는 동작을 트리거해야 합니다. 이 제거 단계가 시작될 때
text track의
mode
속성이
"showing"
또는
"hidden"이었다면,
이는 또한 TextTrackList
[HTML] 로직이
SourceBuffer
textTracks list에서
change라는
이름의
이벤트를
발생시키도록 작업을
큐에 넣는 동작도 트리거해야 합니다.
이는 TextTrackList
[HTML] 로직이
HTMLMediaElement textTracks
list에서
track
속성이 text
track으로 초기화된 TrackEvent를
사용하여
removetrack이라는
이름의
이벤트를
발생시키도록 작업을
큐에 넣는 동작을 트리거해야 합니다. 이 제거 단계가
시작될 때 text track의
mode
속성이
"showing"
또는
"hidden"이었다면,
이는 또한 TextTrackList
[HTML] 로직이 HTMLMediaElement textTracks
list에서 change라는
이름의 이벤트를
발생시키도록 작업을
큐에 넣는 동작도 트리거해야 합니다.
remove track 메시지를 [[port to main]]에 게시하며, 해당 메시지의
Window의
암시적 처리기는 다음 단계를 실행합니다.
textTracks
속성이 반환한
TextTrackList
객체와 같게 둡니다.
이는 TextTrackList
[HTML] 로직이
HTMLMediaElement textTracks
list에서
track
속성이 text
track으로 초기화된 TrackEvent를
사용하여
removetrack이라는
이름의
이벤트를
발생시키도록 작업을
큐에 넣는 동작을 트리거해야 합니다. 이 제거 단계가
시작될 때 text track의
mode
속성이
"showing"
또는
"hidden"이었다면,
이는 또한 TextTrackList
[HTML] 로직이 HTMLMediaElement textTracks
list에서 change라는
이름의 이벤트를
발생시키도록 작업을
큐에 넣는 동작도 트리거해야 합니다.
activeSourceBuffers에 있으면
sourceBuffer를
activeSourceBuffers에서 제거하고,
activeSourceBuffers가 반환한
SourceBufferList에서
removesourcebuffer라는
이름의
이벤트를 발생시키도록
작업을 큐에 넣습니다.
sourceBuffers에서 제거하고,
sourceBuffers가 반환한
SourceBufferList에서
removesourcebuffer라는
이름의
이벤트를 발생시키도록
작업을 큐에 넣습니다.
스트림의 종료를 신호합니다.
readyState 속성이
"open" 상태가
아니면 InvalidStateError
예외를 발생시키고 이 단계를 중단합니다.
sourceBuffers에 있는
SourceBuffer 중 하나라도
updating 속성이 true와 같으면 InvalidStateError
예외를 발생시키고
이 단계를 중단합니다.
[[live seekable range]]
값을 갱신하며,
이는 10.
HTMLMediaElement 확장에서 HTMLMediaElement의
seekable
동작을 수정하는 데 사용됩니다.
이 메서드가 호출되면, 사용자 에이전트는 다음 단계를 실행해야 합니다:
readyState 속성이 "open"이 아니면
InvalidStateError 예외를
던지고 단계를 중단합니다.
TypeError 예외를 던지고
단계를 중단합니다.
[[live seekable range]] 값을,
시작 위치가 start이고 종료 위치가 end인 단일 범위를 가진 새로운
정규화된
TimeRanges 객체로 설정합니다.
[[live seekable range]]
값을 갱신하며,
이는 10.
HTMLMediaElement 확장에서 HTMLMediaElement의
seekable
동작을 수정하는 데 사용됩니다.
이 메서드가 호출되면, 사용자 에이전트는 다음 단계를 실행해야 합니다:
readyState 속성이 "open"이 아니면
InvalidStateError 예외를
던지고 단계를 중단합니다.
[[live seekable range]]가 범위를 포함하면,
[[live seekable range]] 값을 새로운 빈 TimeRanges
객체로 설정합니다.
지정된 MIME type에 대해 MediaSource가 SourceBuffer
객체를 생성할 수 있는지 확인합니다.
이 메서드에서 true가 반환되더라도, 이는 MediaSource
구현이 지정된 MIME type에 대해 SourceBuffer 객체를 생성할 수 있음을
나타낼 뿐입니다.
새 SourceBuffer 추가를 지원할 충분한 리소스가 없으면
addSourceBuffer()
호출은 여전히 실패해야 합니다.
이 메서드가 true를 반환한다는 것은 HTMLMediaElement의
canPlayType()
가 "maybe" 또는 "probably"를 반환한다는 것을 의미합니다. 왜냐하면 MediaSource가
HTMLMediaElement가 재생할 수 없음을 알고 있는 type을 지원하는 것은
의미가 없기 때문입니다.
이 메서드가 호출되면, user agent는 다음 단계를 수행해야 합니다:
| 이벤트 이름 | 인터페이스 | 언제 디스패치되는지... |
|---|---|---|
| sourceopen |
Event
|
MediaSource의 readyState가
"closed"에서
"open" 또는 "ended"에서 "open"로 변경될 때 디스패치됩니다.
|
| sourceended |
Event
|
MediaSource의 readyState가
"open"에서
"ended"로 변경될 때 디스패치됩니다.
|
| sourceclose |
Event
|
MediaSource의 readyState가
"open"에서
"closed" 또는 "ended"에서 "closed"로 변경될 때 디스패치됩니다.
|
Window
HTMLMediaElement
가 DedicatedWorkerGlobalScope
MediaSource에 연결되면, 각 context는
다른 쪽의 정보에 의존하는 알고리즘을 갖습니다.
HTMLMediaElement
는 Window
context에만 노출되지만, 이 사양에서 정의하는 MediaSource 및 관련 객체는
Window와
DedicatedWorkerGlobalScope
context에서 노출됩니다. 이를 통해 애플리케이션은 두 종류의 context 중 어느 쪽에서든
MediaSource 객체를 생성하고,
HTMLMediaElement
객체에, Window
context에서, MediaSource object URL 또는
MediaSourceHandle을
사용하여
이 사양의 attaching to a media
element 알고리즘에 설명된 대로 연결할 수 있습니다. MediaSource 객체는 Transferable이
아니며;
생성된 context에서만 보입니다.
이 절의 나머지는 Window
media element가 DedicatedWorkerGlobalScope
MediaSource에 연결될 때의 정보 지연을 제한하기 위한 모델을 설명합니다.
이 모델은 message passing을 사용한 communication을 설명하지만,
구현은 shared memory와 locks를 사용하는 등 더 빠른 방식으로 통신할 MAY 있습니다.
Window
MediaSource에 대한 연결은
context 간 통신 없이 이미 정보를 동기적으로 가지고 있습니다.
MediaSource가
DedicatedWorkerGlobalScope
에서 생성된 경우, 연결 시 설정되고 분리 시 null로 되는
[[port to main]] internal slot을
가집니다.
Window
[[port to main]]은 항상 null입니다.
이 사양으로 확장되고 DedicatedWorkerGlobalScope
MediaSource에 연결된
HTMLMediaElement
역시 [[port to worker]] internal slot을
가지며,
이는 MessagePort를
저장하고,
[[channel with worker]]
internal slot은 MessageChannel을
저장합니다.
둘 다 연결 시 설정되고 분리 시 null로 됩니다.
[[port to worker]]와
[[channel with worker]]
는 DedicatedWorkerGlobalScope
MediaSource에 연결되어 있지 않으면 null입니다.
이 사양의 알고리즘 중 Window
HTMLMediaElement에서
연결된 DedicatedWorkerGlobalScope
MediaSource로, 또는 그 반대로
정보를 전달해야 하는 알고리즘은 이러한 internal port를 암묵적으로 사용하여 대응하는 쪽에 message를 보내며,
message의 암시적 handler가 해당 알고리즘에 설명된 단계를 실행합니다.
MediaSource를 미디어 요소에 연결하는 메커니즘은
해당 MediaSource 객체가
Window에서
생성되었는지
또는
DedicatedWorkerGlobalScope에서
생성되었는지에 따라 달라집니다:
Window에서
생성된 MediaSource를 연결하는
방법은,
해당 MediaSource에 대한
MediaSource 객체 URL을
미디어 요소의 src
특성이나 미디어 요소 내부의 <source>의 src 특성에 할당하는 것입니다.
MediaSource 객체 URL은
MediaSource 객체를 createObjectURL()에
전달하여 생성됩니다.
구현체가 해당 워커에서 생성된
MediaSource에 대해
DedicatedWorkerGlobalScope에서
MediaSource 객체 URL 생성을 허용할 수도 있지만,
그러한 MediaSource 객체 URL을 사용하여
미디어 요소의 src
특성이나
미디어 요소 내부 <source>의 src 특성로 연결을 시도하는 것은,
아래에 확장된 대로 미디어 요소의
리소스
가져오기 알고리즘에서
반드시 실패해야 합니다.
객체 URL 연결 메커니즘을 워커의 MediaSource 객체 URL까지 확장하면, srcObject 사용에 비해 덜 선호되는 관용구를 더욱 확산시키게 되며, 사용자 에이전트 간 상호운용성 위험과 구현 복잡성을 불필요하게 증가시킬 수 있습니다.
MediaSource가
DedicatedWorkerGlobalScope에서
생성된 경우에는,
handle을 통해 핸들을 얻고,
해당 MediaSourceHandle을
Window
컨텍스트로 전달하여 미디어 요소의
srcObject
특성에 할당하는 방법으로만 연결할 수 있습니다.
이 명세를 HTMLMediaElement의
리소스 로딩 및 가져오기 알고리즘과 정렬하기 위해,
하부의 DedicatedWorkerGlobalScope
MediaSource가 그곳에서 언급되는 MediaSource 객체이며,
MediaSourceHandle
객체가 미디어 제공자 객체입니다.
리소스 가져오기
알고리즘이
미디어 제공자 객체로
MediaSource 객체, MediaSourceHandle 객체,
또는 객체가 MediaSource인 URL 레코드로 호출된 경우,
모드를 local로 설정하고
(그렇지 않으면 모드를 remote로 설정할 수 있는)
리소스 가져오기
알고리즘의
첫 번째 단계를 건너뛴 뒤 알고리즘 실행을 계속합니다.
리소스
가져오기 알고리즘의
첫 단계는, 객체가 미디어 제공자 객체인 URL 레코드에 대해 로컬 모드를 선택하는 방향으로
결국 일치되도록 조정될 것으로 예상됩니다.
의도는 HTMLMediaElement의
src
특성이나 선택된 자식
source의
src
특성이, 해당 src 특성이 마지막으로 변경되었을 때
MediaSource 객체 URL과 일치하는 blob:
URL이라면,
MediaSource 객체가
리소스
가져오기 알고리즘의
로컬 모드 로직에서 미디어 제공자 객체이자 현재 미디어 리소스로 사용된다는 것입니다.
이는 MediaSource 객체가 연결된 경우, preload 특성 준수를 포함하는 원격 모드 로직이
건너뛰어진다는 의미이기도 합니다.
설령 [HTML]에 그러한 향후 변경이 이루어지더라도,
현재 미디어 리소스가 MediaSource 객체인 경우에는
로컬 모드 로직 시작 시 아래 단계들의 실행이 여전히 필요합니다.
리소스 가져오기 알고리즘의 “그 외(모드가 로컬)” 섹션 시작 시, 아래의 추가 단계를 실행합니다.
미디어 요소의 리소스 선택 알고리즘을 트리거한 동작에 비추어 보면, 이 단계들은 비동기적입니다. 리소스 가져오기 알고리즘은 리소스 선택 알고리즘을 호출한 작업이 계속 진행되어 안정 상태에 도달한 뒤에 실행됩니다. 구현체는 아래 “그 외” 절의 단계를 MediaSource 객체가 사용할 준비가 될 때까지 지연할 수 있습니다.
MediaSource 객체, MediaSourceHandle
객체 또는 객체가 MediaSource 객체인 URL
레코드인
미디어 제공자 객체와 함께 호출된 경우:
DedicatedWorkerGlobalScope에서
생성된 MediaSource를
객체로 갖는 URL 레코드인 경우,
예를 들어
DedicatedWorkerGlobalScope
MediaSource의
MediaSource 객체 URL을
사용하려고 할 때와 같은 경우
MediaSource의 handle을
DedicatedWorker에서 Window 컨텍스트로 전송하고 이를 미디어 요소의
srcObject
속성에 할당하는 것이 이러한
MediaSource를 연결하는 유일한 방법입니다.
[[Detached]]
내부 슬롯이 true인 MediaSourceHandle인 경우
MediaSource의
[[has ever been attached]]
내부 슬롯이
true인 MediaSourceHandle인 경우
MediaSource를
MediaSourceHandle을
사용하여
한 번보다 많이 로드하는 것을 방지합니다.
MediaSource가
Window에서
생성되었고 이전에 MediaSource 객체
URL을 사용하여 로드된 경우에도
마찬가지입니다.
다만 이는 Window
MediaSource에 대해 이후에
MediaSource 객체
URL을 사용하는 것이 성공하는 것을
막지는 않습니다.
readyState가
"closed"로 설정되어 있지 않은 경우
MediaSource의 [[has ever been attached]]
내부 슬롯을 true로 설정합니다.
MediaSource가
DedicatedWorkerGlobalScope에서
생성된 경우, 워커 연결
통신을 설정하고 MediaSource를 엽니다.
[[channel with worker]]를
새로운
MessageChannel로
설정합니다.
[[port to worker]]를
[[channel with worker]]의
port1
값으로 설정합니다.
[[channel with worker]]의
port2를
값이자 transferList의 유일한 멤버로 하여
StructuredSerializeWithTransfer를
실행하고, 그 결과를 serialized
port2로 둡니다.
MediaSource의
DedicatedWorkerGlobalScope에서
다음을 수행하는 작업을
큐에 넣습니다.
DedicatedWorkerGlobalScope의
realm을
사용하여
StructuredDeserializeWithTransfer를
실행하고, [[port to main]]을
[[channel with worker]]의
전송된 port2
값에 대해 역직렬화된 복제본으로
설정합니다.
readyState
속성을
"open"으로
설정합니다.
MediaSource에서
sourceopen이라는
이름의
이벤트를
발생시키도록 작업을
큐에 넣습니다.
MediaSource는
Window에서
생성되었습니다.
[[channel with worker]]를
null로 설정합니다.
[[port to worker]]를
null로 설정합니다.
[[port to main]]을
null로 설정합니다.
readyState
속성을
"open"으로
설정합니다.
MediaSource에서
sourceopen이라는
이름의
이벤트를
발생시키도록 작업을
큐에 넣습니다.
appendBuffer()를
통해 전달된 데이터를 의미합니다.
MediaSource가
연결되어 있을 때 HTMLMediaElement가 HTTP를 통해 미디어 데이터를 가져오지 않으므로
적용되지 않습니다.
연결된 MediaSource는 리소스 가져오기 알고리즘의 원격 모드 단계를 사용하지 않으므로, 미디어 요소는 "suspend" 이벤트를 발생시키지 않습니다. 향후 이 명세의 버전에서는 MediaSource가 연결된 미디어 요소에서 "progress" 및 "stalled" 이벤트도 제거될 가능성이 높지만, 이 버전에 부합하는 사용자 에이전트는 이 명세 구현이 안정화된 이후 [HTML] 참조가 변경되었기 때문에 여전히 이 두 이벤트를 발생시킬 수 있습니다.
다음 단계는 미디어 요소가
NETWORK_EMPTY로
전환하고, 미디어 요소에서
작업을 큐에 추가하여
이벤트를 발생시키는데
이름이
emptied인 경우에
항상 실행됩니다. 이러한 단계는 전환 직전에 실행되는 것이 권장됩니다.
MediaSource가
DedicatedWorkerGlobalScope에서
생성된 경우:
detach 메시지를
[[port to worker]]에 게시하여
MediaSource에 알립니다.
[[port to worker]]를 null로
설정합니다.
[[channel with worker]]를
null로 설정합니다.
detach 알림에 대한 암묵적 메시지 핸들러는
나머지 단계들을
DedicatedWorkerGlobalScope의
MediaSource에서 실행합니다.
MediaSource가
Window에서
생성된 경우:
Window의
MediaSource에서
계속 실행합니다.
[[port to main]]을 null로
설정합니다.
readyState 특성을
"closed"로 설정합니다.
ManagedMediaSource인 경우,
streaming
특성을 false로 설정합니다.
duration을 NaN으로 업데이트합니다.
SourceBuffer 객체를 모두
activeSourceBuffers에서
제거합니다.
removesourcebuffer이며,
대상은
activeSourceBuffers입니다.
SourceBuffer 객체를 모두
sourceBuffers에서 제거합니다.
removesourcebuffer이며,
대상은
sourceBuffers입니다.
sourceclose이며, 대상은
MediaSource입니다.
앞으로, 이 알고리즘은 외부에서 호출되어, 연결된
MediaSource(있는 경우)를
미디어 요소에서 분리해야 하는 모든 경우에 실행되도록 의도되었습니다.
이는 HTMLMediaElement [HTML]의
load() 같은 동작이나
리소스
가져오기 알고리즘의
실패 시에도(또는 이에 대신하여) 호출될 수 있습니다. 이는 미디어 요소가
NETWORK_EMPTY로
전환할 때뿐만 아니라 적용됩니다. 리소스 가져오기 알고리즘 실패란 리소스 가져오기 알고리즘 또는 리소스 선택 알고리즘을 중단시키는 실패를 의미하되,
[HTML]의 “Final step”은 분리를 유발하는 실패로 간주되지 않습니다.
다음 단계를 탐색 알고리즘의 “사용자 에이전트가 새 재생 위치의 미디어 데이터가 사용 가능한지 여부를 파악하고, 사용 가능하다면 해당 위치를 재생할 만큼 충분한 데이터를 디코딩할 때까지 기다린다” 단계의 일부로 실행합니다:
미디어 요소는
SourceBuffer의
각 객체(대상:
activeSourceBuffers)에서,
media segments 중
new playback position을 포함하는 것을 찾습니다.
현재 HTMLMediaElement의
buffered
특성 값의
TimeRanges
내 임의의 위치는
해당 위치에 필요한 모든 미디어 세그먼트가 버퍼링되어 있습니다.
TimeRanges
중
어느 것에도 포함되어 있지 않은 경우(대상:
HTMLMediaElement의
buffered)
HTMLMediaElement의
readyState 특성이
HAVE_METADATA보다
크면,
HTMLMediaElement의
readyState 특성을
HAVE_METADATA로
설정합니다.
HTMLMediaElement ready states
[HTML] 로직에 따라,
HTMLMediaElement의
readyState 변경은
HTMLMediaElement에서 이벤트를 트리거할 수 있습니다.
appendBuffer()
호출이
coded frame
processing 알고리즘을 통해
HTMLMediaElement의
readyState 특성을
HAVE_METADATA보다
큰 값으로 설정할 때까지 대기합니다.
웹 애플리케이션은
buffered와
HTMLMediaElement의
buffered를
사용하여 재생 재개에 필요한 것이 무엇인지 판단할 수 있습니다.
readyState 특성이
"ended"이고,
new playback position이 현재
TimeRanges
중 하나에 포함되어
HTMLMediaElement의
buffered에
나타나 있다면,
현재 선택 또는 활성화된 트랙 버퍼 중 하나 이상의 최대 범위 종료 타임스탬프가
new playback position보다 작더라도,
탐색 동작은 여기서 완료될 때까지 계속되어야 합니다. 이 조건은
buffered의 로직이
readyState가
"ended"일 때 발생시키는 경우에만
나타나야 합니다.
다음 단계는 재생 중 주기적으로 실행되어,
SourceBuffer 객체들이
activeSourceBuffers 내에서
중단 없는 재생을 보장할 만큼 충분한 데이터를 보유하는지 확인합니다.
또한 activeSourceBuffers의 변경은
상태 전환을 트리거하는 조건에 영향을 미치므로, 이러한 단계의 실행을 유발합니다.
중단 없는 재생을 보장할 만큼 충분한
데이터가 있다는 것은,
사용자 에이전트가 현재 의미 있는 시간 동안 정지 없이 프레젠테이션을 재생할 수 있을 만큼
충분한 데이터가 있다고 판단하는 구현별 조건입니다. 이 조건은 미디어 요소를
HAVE_ENOUGH_DATA
준비 상태로 들어가거나 빠져나가게 할 시점을 결정하기 위해 지속적으로 평가됩니다.
이러한 전환은 사용자 에이전트가 충분한 데이터가 버퍼링되었다고 믿는지,
아니면 더 많은 데이터가 필요한지를 각각 나타냅니다.
구현은 버퍼링된 바이트 수, 버퍼링된 시간, append 속도 또는 적절하다고 판단하는 다른 지표를 사용하여
충분한 데이터가 있는 시점을 판단할 수 있습니다.
사용되는 지표는 재생 중 변경될 수 있으므로,
웹 애플리케이션은 더 많은 데이터가 필요한지 여부를 판단하기 위해
HTMLMediaElement의
readyState 값에만 의존하는 것이 권장됩니다.
미디어 요소에 더 많은 데이터가 필요할 때, 사용자 에이전트는 웹 애플리케이션이 중단 없이 대응할 수 있도록 충분히 이른 시점에
HAVE_ENOUGH_DATA에서
HAVE_FUTURE_DATA로
전환하는 것이 권장됩니다.
예를 들어, 현재 재생 위치가 버퍼링된 데이터의 끝보다 500ms 앞설 때 전환하면,
애플리케이션은 재생이 중단되기 전에 대략 500ms 동안 더 많은 데이터를 append할 수 있습니다.
HTMLMediaElement의
readyState 특성이
HAVE_NOTHING인
경우:
HTMLMediaElement의
buffered가
현재 재생 위치를 포함하는
TimeRanges를
포함하지 않는 경우:
HTMLMediaElement의
readyState 특성을
HAVE_METADATA로
설정합니다.
HTMLMediaElement ready states
[HTML] 로직에 따라,
HTMLMediaElement의
readyState 변경은
HTMLMediaElement에서 이벤트를 트리거할 수 있습니다.
HTMLMediaElement의
buffered가
현재 재생 위치를 포함하고, 또한
중단 없는 재생을 보장할 만큼 충분한 데이터가 있는
TimeRanges를
포함하는 경우:
HTMLMediaElement의
readyState 특성을
HAVE_ENOUGH_DATA로
설정합니다.
HTMLMediaElement ready states
[HTML] 로직에 따라,
HTMLMediaElement의
readyState 변경은
HTMLMediaElement에서 이벤트를 트리거할 수 있습니다.
HAVE_CURRENT_DATA로
전환하면서 재생이 일시 중단되었다면, 이 시점에 재생이 재개될 수 있습니다.
HTMLMediaElement의
buffered가
현재 재생 위치를 포함하고, 현재 위치 이후의 일부 시간도 포함하는
TimeRanges를
포함하는 경우, 다음 단계를 실행합니다:
HTMLMediaElement의
readyState 특성을
HAVE_FUTURE_DATA로
설정합니다.
HTMLMediaElement ready states
[HTML] 로직에 따라,
HTMLMediaElement의
readyState 변경은
HTMLMediaElement에서 이벤트를 트리거할 수 있습니다.
HAVE_CURRENT_DATA로
전환하여 재생이 일시 중단되었다면, 이 시점에 재생이 재개될 수 있습니다.
HTMLMediaElement의
buffered가
현재 재생 위치에서 끝나고, 현재 위치 직후를 덮는 범위가 없는
TimeRanges를
포함하는 경우:
HTMLMediaElement의
readyState 특성을
HAVE_CURRENT_DATA로
설정합니다.
HTMLMediaElement ready states
[HTML] 로직에 따라,
HTMLMediaElement의
readyState 변경은
HTMLMediaElement에서 이벤트를 트리거할 수 있습니다.
재생 중에는 activeSourceBuffers를 갱신해야
합니다.
이는
selected
video track, enabled
audio track, 또는
text track의 mode가
변경될 때 필요합니다. 이러한 변경 중 하나 이상이 발생하면 다음 단계를 따라야 합니다.
AudioTrack,
VideoTrack
및
TextTrack
객체와 그들의 AudioTrackList,
VideoTrackList
및
TextTrackList는
오직 Window
HTMLMediaElement에서만
노출되므로, 이러한 변경은 항상 Window
context에서 발생합니다. MediaSource가
DedicatedWorkerGlobalScope에서
생성된 경우, 각 변경은
DedicatedWorkerGlobalScope로
내부 update track state 메시지를 [[port to worker]]에
post하여 전달해야 하며, 그 암시적 핸들러는 해당 영향을 받은 track을 생성한
SourceBuffer에 대해 다음 단계를 수행합니다.
MediaSource가
Window에서
생성된 경우에는 다음 단계가 직접 실행됩니다.
SourceBuffer가
다른 enabled track들과도 연관되어 있지 않다면, 다음 단계를 수행합니다:
SourceBuffer를 activeSourceBuffers에서
제거합니다.
removesourcebuffer라는
이름의 이벤트를
activeSourceBuffers에서
발생시킵니다.
SourceBuffer가
이미 activeSourceBuffers에
있지 않다면, 다음 단계를 수행합니다:
SourceBuffer를 activeSourceBuffers에
추가합니다.
addsourcebuffer라는 이름의
이벤트를
activeSourceBuffers에서
발생시킵니다.
SourceBuffer가 다른 enabled 또는 selected
track과도 연관되어 있지 않다면,
다음 단계를 수행합니다:
SourceBuffer를
activeSourceBuffers에서
제거합니다.
removesourcebuffer라는 이름의 이벤트를
activeSourceBuffers에서
발생시킵니다.
SourceBuffer가 이미 activeSourceBuffers에
있지 않다면, 다음 단계를 수행합니다:
SourceBuffer를
activeSourceBuffers에
추가합니다.
addsourcebuffer라는 이름의 이벤트를
activeSourceBuffers에서
발생시킵니다.
mode가
"disabled"가
되고,
이 track과 연관된 SourceBuffer가
다른 enabled 또는 selected track과도 연관되어 있지 않다면, 다음 단계를 수행합니다:
SourceBuffer를
activeSourceBuffers에서
제거합니다.
removesourcebuffer라는 이름의 이벤트를
activeSourceBuffers에서
발생시킵니다.
mode가
"showing"
또는
"hidden"가
되고,
이 track과 연관된 SourceBuffer가
이미 activeSourceBuffers에
있지 않다면, 다음 단계를 수행합니다:
SourceBuffer를
activeSourceBuffers에
추가합니다.
addsourcebuffer라는 이름의 이벤트를
activeSourceBuffers에서
발생시킵니다.
duration을 new
duration으로 변경해야 할 때 다음 단계를 따릅니다.
duration의 현재 값이
new duration과 같으면
반환합니다.
sourceBuffers에 있는 모든 SourceBuffer 객체의 버퍼링된 모든 코드화된 프레임 중 가장 높은 프레젠테이션 타임스탬프보다 작으면
InvalidStateError
예외를 발생시키고
이 단계를 중단합니다.
sourceBuffers에 있는 모든 SourceBuffer 객체의 모든 트랙 버퍼에 걸쳐 가장 큰 트랙 버퍼
범위
종료 시간으로 둡니다.
이 조건은 코드화된 프레임 제거 알고리즘이 제거 범위의 시작보다 먼저 시작하는 코드화된 프레임을 보존하기 때문에 발생할 수 있습니다.
duration을 new
duration으로 갱신합니다.
Window에서
다음 단계를 실행합니다.
duration을
new duration으로 갱신합니다.
이 알고리즘은 애플리케이션이
endOfStream() 호출을 통해
스트림의 끝을 알리거나
알고리즘에서 디코드 오류를 알려야 할 때 호출됩니다. 이
알고리즘은 오류가
표시될지 여부를 나타내는 error 매개변수를 받습니다.
readyState 속성 값을
"ended"로 변경합니다.
MediaSource에서 sourceended라는 이름의 이벤트를
발생시키도록 작업을 큐에 넣습니다.
sourceBuffers에
있는 모든
SourceBuffer 객체의 모든
트랙 버퍼에 걸쳐 가장 큰
트랙 버퍼 범위 종료 시간으로
설정하여
지속 시간 변경
알고리즘을 실행합니다.
이를 통해 지속 시간이 추가된 미디어 세그먼트의 끝을 올바르게 반영할 수 있습니다. 예를 들어 지속 시간이 명시적으로 10초로 설정되어 있고 endOfStream()이 호출되기 전에 0초부터 5초까지의 미디어 세그먼트만 추가되었다면 지속 시간은 5초로 갱신됩니다.
network"로 설정된 경우
Window에서
다음 단계를 실행합니다.
HTMLMediaElement의
readyState 속성이
HAVE_NOTHING과
같은 경우
HTMLMediaElement의
readyState 속성이
HAVE_NOTHING보다
큰 경우
decode"로 설정된 경우
Window에서
다음 단계를 실행합니다.
HTMLMediaElement의
readyState 속성이
HAVE_NOTHING과
같은 경우
HTMLMediaElement의
readyState 속성이
HAVE_NOTHING보다
큰 경우
이 알고리즘은 Window에서
MediaSource가
동일한 Window
또는
DedicatedWorkerGlobalScope에서
연결된 경우, 보통 연결된
HTMLMediaElement의
state를 업데이트하기 위해 Window에서
단계를 실행하는 데 사용됩니다.
이 알고리즘은 Window에서
실행할 단계를 나열하는 steps parameter를 받습니다.
MediaSource가
DedicatedWorkerGlobalScope에서
생성된 경우:
[[port to main]]에
내부 mirror on window 메시지를 post하며, Window의
암시적 핸들러가 steps를 실행합니다.
해당 핸들러가 메시지를 수신할 때까지 기다리지 않고 호출자에게 제어를 반환합니다.
Window
task의 실행 중간에 어딘가에서 발생하는 것이 아니라,
Window
위의 자체 task로서 비동기적으로 실행된다는 점, 그리고
DedicatedWorkerGlobalScope에서
이 알고리즘의 동기적 실행과 반환을 막지 않고 실행된다는 점입니다.
MediaSourceHandle 인터페이스는
MediaSource 객체의 프록시를 나타내며,
DedicatedWorkerGlobalScope
MediaSource를
Window
HTMLMediaElement에
srcObject를
사용하여
연결할 때 유용합니다. 이는 attaching to a media element
알고리즘에 설명되어 있습니다.
이 별도의 객체는 cross-context MediaSource를 media
element에 연결하는 데 필요합니다. 왜냐하면 MediaSource 객체 자체는
event target이므로 transferable이 아니기 때문입니다.
각 MediaSourceHandle 객체는
[[has ever
been assigned as srcobject]] 내부 슬롯을 가지며,
boolean 값을 저장합니다.
이 값은 MediaSourceHandle 객체 생성 시 false로 초기화되며,
HTMLMediaElement의
srcObject
setter에서 true로 설정됩니다.
(자세한 내용은 10.
HTMLMediaElement 확장 참고.) 이 값이 true이면,
MediaSourceHandle의 성공적인 전송이
4.1
Transfer에서 설명된 대로 방지됩니다.
MediaSourceHandle 객체는
Transferable이며,
각 객체는 [[Detached]] 내부 슬롯을 가지며,
이 슬롯은 핸들 객체 인스턴스가 한 번 전송된 이후 다시 전송할 수 없음을 보장하는 데 사용됩니다.
WebIDL[Transferable, Exposed=(Window,DedicatedWorker)]
interface MediaSourceHandle {};
MediaSourceHandle의 transfer steps
와 transfer-receiving
steps는 구현이
기반이 되는 MediaSource를 참조하는 암시적 internal slot을 유지하여,
srcObject를
사용한 attaching to a media element와
그에 따른 attachment의 cross-context communication
model 설정을
가능하게 해야 합니다.
구현자는
Transferable이
암시하는 "이동" 의미론에 대한 가정이
항상 현실과 일치하는 것은 아니라는 점에 유의해야 합니다. 예를 들어 브로드캐스트를 사용하는 postMessage의 확장 기능 또는 내부
구현으로 인해 전송된 MediaSourceHandle을
의도치 않게 여러 수신자가
받게 될 수 있습니다.
이러한 이유로 구현에서는 기반 MediaSource 객체에 대한 핸들 중 하나가
미디어 요소의 리소스 선택 알고리즘의 비동기 부분에서 사용되기 전까지는, 전송된 MediaSourceHandle의 잠재적 복제본 중 어느 것이 여전히
연결에 유효한지 결정하지 않도록 권고됩니다.
이는 쉽게 복제할 수 있는 MediaSource 객체 URL을 통한 기존 연결 동작과
유사하며,
이러한 URL은 잠재적으로 많은 복제본 전체에 걸쳐 최대 한 번의 연결 시작에만 유효합니다.
구현은 srcObject를
통한
연결(로드)을 MediaSourceHandle의 기반
MediaSource 객체에 대해
최대 한 번만 반드시 지원해야 하며, 이는
Transferable의
다양한 구현으로 인해
MediaSourceHandle이 잠재적으로
복제될 수 있는지 여부와 관계없습니다.
이것이 미디어 요소의 resource selection algorithm의 비동기 부분에서 어떻게 강제되는지는 attaching to a media element를 참조하십시오.
MediaSourceHandle은
Window와
DedicatedWorkerGlobalScope
context에서만 노출되며, 서로 다른 agent
clusters [ECMASCRIPT] 간에는 성공적으로 transfer될 수 없습니다.
MediaSourceHandle 객체의 transfer는
동일한 agent
cluster 내부에서만 성공할 수 있습니다.
예를 들어, MediaSourceHandle 객체를
Window
또는
DedicatedWorkerGlobalScope에서
SharedWorker나 ServiceWorker로 transfer하는 것은 성공하지 않습니다.
개발자는 이것이 여러 방식으로 전달될 수 있는 MediaSource object URLs과는 다르다는 점을
유의해야 합니다.
그럼에도 attaching to a media
element에서
MediaSource object URL을 사용하는 경우에도,
이는 MediaSource가
Window
context에서 생성된 경우에만 성공할 수 있습니다.
또한 Web Application APIs에 대해 agent와
agent
cluster 형식 체계가 통합되는 방식은, dedicated
worker agents와 같은 관련 개념이 정의되는
[HTML]을 참조하십시오.
Transfer
steps는
MediaSourceHandle 객체에 대해
다음 단계를 MUST 포함해야 합니다:
MediaSourceHandle의
[[has ever been assigned as srcobject]]
internal slot이 true이면, transfer
steps는 DataCloneError 예외를 던져
실패해야 합니다.
WebIDLenum AppendMode {
"segments",
"sequence",
};
segments
sequence
timestampOffset 속성은
새로운 미디어 세그먼트가 이전 세그먼트와 인접하도록 새로운 offset이 필요할 때 업데이트됩니다.
"sequence" 모드에서
timestampOffset을 설정하면,
미디어 세그먼트 내 타임스탬프를 몰라도 타임라인의 특정 위치에 배치할 수 있습니다.
WebIDL[Exposed=(Window,DedicatedWorker)]
interface SourceBuffer : EventTarget {
attribute AppendMode mode;
readonly attribute boolean updating;
readonly attribute TimeRanges buffered;
attribute double timestampOffset;
[Exposed=Window] readonly attribute AudioTrackList audioTracks;
[Exposed=Window] readonly attribute VideoTrackList videoTracks;
[Exposed=Window] readonly attribute TextTrackList textTracks;
attribute double appendWindowStart;
attribute unrestricted double appendWindowEnd;
attribute EventHandler onupdatestart;
attribute EventHandler onupdate;
attribute EventHandler onupdateend;
attribute EventHandler onerror;
attribute EventHandler onabort;
undefined appendBuffer(BufferSource data);
undefined abort();
undefined changeType(DOMString type);
undefined remove(double start, unrestricted double end);
};
audioTracks, videoTracks 및
textTracks 속성은 오직
Window
context에만 노출됩니다. SourceBuffer가
DedicatedWorkerGlobalScope에서
사용될 때에는, 그 tracks는 대신 연결된 Window
HTMLMediaElement에서
생성되고 소유되며, 이는 initialization segment
received 알고리즘에 설명되어 있습니다.
mode의
타입은 AppendMode입니다.
미디어 세그먼트 시퀀스가 처리되는 방식을 제어합니다. 이
속성은 객체가 생성된 후
addSourceBuffer()에
의해
처음 설정되며,
changeType() 또는
이 속성을 설정하여 갱신할 수 있습니다.
값을 가져올 때 초기값 또는 마지막으로 성공적으로 설정된 값을 반환합니다.
값을 설정할 때 다음 단계를 실행합니다.
sourceBuffers 속성에서
제거된 경우 InvalidStateError
예외를 발생시키고
이 단계를 중단합니다.
updating 속성이
true와 같으면
InvalidStateError
예외를 발생시키고 이 단계를 중단합니다.
[[generate timestamps flag]]가
true와 같고 new mode가
"segments"와 같으면 TypeError
예외를 발생시키고
이 단계를 중단합니다.
부모 미디어 소스의
readyState 속성이
"ended" 상태이면 다음
단계를 실행합니다.
readyState 속성을
"open"으로 설정합니다.
sourceopen이라는
이름의
이벤트를
발생시키도록
작업을
큐에 넣습니다.
[[append state]]가
PARSING_MEDIA_SEGMENT와 같으면
InvalidStateError를
발생시키고 이 단계를 중단합니다.
sequence"와 같으면
[[group start timestamp]]를
[[group end timestamp]]로 설정합니다.
updating의 타입은 boolean이며,
읽기 전용입니다.
appendBuffer()
또는 remove() 작업의 비동기 연속 처리가
아직 진행 중인지 여부를 나타냅니다. 이 속성은
객체가 생성될 때 처음에 false로 설정됩니다.
buffered의 타입은 TimeRanges이며,
읽기 전용입니다.
SourceBuffer에 어떤
TimeRanges가
버퍼링되어 있는지를 나타냅니다. 이
속성은 객체가 생성될 때 처음에 비어 있는 TimeRanges
객체로 설정됩니다.
속성을 읽을 때 다음 단계가 반드시 수행되어야 합니다.
sourceBuffers 속성에서
제거된 경우 InvalidStateError
예외를 발생시키고
이 단계를 중단합니다.
SourceBuffer 객체가 관리하는 모든 트랙 버퍼에 걸쳐 가장 큰 트랙 버퍼
범위 종료 시간으로
둡니다.
TimeRanges
객체와 같게 둡니다.
SourceBuffer가 관리하는
각 오디오 및 비디오 트랙 버퍼에 대해
다음 단계를 실행합니다.
텍스트 트랙 버퍼는 위의 highest end time 계산에는 포함되지만, 여기의 버퍼링된 범위 계산에서는 제외됩니다. 텍스트 트랙 버퍼는 반드시 연속적일 필요가 없으며, 동일한 시간 범위에서 다른 미디어 트랙이 연속적인 경우 텍스트 트랙 버퍼 내의 불연속성이 재생 중단을 일으켜서도 안 됩니다.
readyState가 "ended"이면
track ranges의 마지막 범위의 종료
시간을 highest end time으로 설정합니다.
timestampOffset의 타입은 double입니다.
이 SourceBuffer에 이후 추가되는 미디어
세그먼트 내부의 타임스탬프에 적용되는 오프셋을
제어합니다. timestampOffset은
처음에 0으로 설정되며, 이는 오프셋이 적용되지 않음을 나타냅니다.
값을 가져올 때 초기값 또는 마지막으로 성공적으로 설정된 값을 반환합니다.
값을 설정할 때 다음 단계를 실행합니다.
sourceBuffers 속성에서
제거된 경우 InvalidStateError
예외를 발생시키고
이 단계를 중단합니다.
updating 속성이
true와 같으면
InvalidStateError
예외를 발생시키고 이 단계를 중단합니다.
부모 미디어 소스의
readyState 속성이
"ended" 상태이면 다음
단계를 실행합니다.
readyState 속성을
"open"으로 설정합니다.
sourceopen이라는
이름의
이벤트를
발생시키도록
작업을
큐에 넣습니다.
[[append state]]가
PARSING_MEDIA_SEGMENT와 같으면
InvalidStateError를
발생시키고 이 단계를 중단합니다.
mode 속성이 "sequence"와 같으면
[[group start timestamp]]를
new timestamp offset으로 설정합니다.
audioTracks의 타입은 AudioTrackList이며,
읽기 전용입니다.
AudioTrack
객체 목록입니다. 이 속성은
Window
컨텍스트에만 노출되며, SourceBuffer가
DedicatedWorkerGlobalScope에서
생성된 경우에는 사용할 수 없습니다.
videoTracks의 타입은 VideoTrackList이며,
읽기 전용입니다.
VideoTrack
객체 목록입니다. 이 속성은
Window
컨텍스트에만 노출되며, SourceBuffer가
DedicatedWorkerGlobalScope에서
생성된 경우에는 사용할 수 없습니다.
textTracks의 타입은 TextTrackList이며,
읽기 전용입니다.
TextTrack
객체 목록입니다. 이 속성은
Window
컨텍스트에만 노출되며, SourceBuffer가
DedicatedWorkerGlobalScope에서
생성된 경우에는 사용할 수 없습니다.
appendWindowStart의 타입은 double입니다.
추가 윈도우 시작의 프레젠테이션 타임스탬프입니다. 이 속성은 처음에 프레젠테이션 시작 시간으로 설정됩니다.
값을 가져올 때 초기값 또는 마지막으로 성공적으로 설정된 값을 반환합니다.
값을 설정할 때 다음 단계를 실행합니다.
sourceBuffers 속성에서
제거된 경우 InvalidStateError
예외를 발생시키고
이 단계를 중단합니다.
updating 속성이
true와 같으면
InvalidStateError
예외를 발생시키고 이 단계를 중단합니다.
appendWindowEnd보다 크거나
같으면
TypeError
예외를 발생시키고 이
단계를 중단합니다.
appendWindowEnd의 타입은 unrestricted double입니다.
추가 윈도우 종료의 프레젠테이션 타임스탬프입니다. 이 속성은 처음에 양의 Infinity로 설정됩니다.
값을 가져올 때 초기값 또는 마지막으로 성공적으로 설정된 값을 반환합니다.
값을 설정할 때 다음 단계를 실행합니다.
sourceBuffers 속성에서
제거된 경우 InvalidStateError
예외를 발생시키고
이 단계를 중단합니다.
updating 속성이
true와 같으면
InvalidStateError
예외를 발생시키고 이 단계를 중단합니다.
TypeError를
발생시키고 이 단계를 중단합니다.
appendWindowStart보다
작거나 같으면
TypeError
예외를 발생시키고 이 단계를 중단합니다.
onupdatestart의 타입은 EventHandler입니다.
updatestart 이벤트의 이벤트 처리기입니다.
onupdate의 타입은 EventHandler입니다.
update 이벤트의 이벤트 처리기입니다.
onupdateend의 타입은 EventHandler입니다.
updateend 이벤트의 이벤트 처리기입니다.
onerror의 타입은 EventHandler입니다.
error 이벤트의 이벤트 처리기입니다.
onabort의 타입은 EventHandler입니다.
abort 이벤트의 이벤트 처리기입니다.
appendBuffer
BufferSource[WEBIDL]에 있는 세그먼트 데이터를
SourceBuffer에 추가합니다.
이 메서드가 호출되면 사용자 에이전트는 다음 단계를 반드시 실행해야 합니다.
[[input buffer]]의 끝에 추가합니다.
updating 속성을 true로 설정합니다.
SourceBuffer 객체에서 updatestart라는 이름의 이벤트를
발생시키도록 작업을
큐에 넣습니다.
abort
현재 세그먼트를 중단하고 세그먼트 파서를 재설정합니다.
이 메서드가 호출되면 사용자 에이전트는 다음 단계를 반드시 실행해야 합니다.
sourceBuffers 속성에서
제거된 경우 InvalidStateError
예외를 발생시키고
이 단계를 중단합니다.
readyState 속성이
"open" 상태가 아니면 InvalidStateError
예외를 발생시키고
이 단계를 중단합니다.
InvalidStateError
예외를 발생시키고 이 단계를 중단합니다.
updating 속성이
true와 같으면 다음
단계를 실행합니다.
updating 속성을
false로 설정합니다.
SourceBuffer 객체에서
abort라는 이름의 이벤트를 발생시키도록 작업을
큐에 넣습니다.
SourceBuffer 객체에서
updateend라는
이름의
이벤트를
발생시키도록 작업을
큐에 넣습니다.
appendWindowStart를
프레젠테이션 시작 시간으로 설정합니다.
appendWindowEnd를
양의 Infinity로 설정합니다.
changeType
이 객체와 연결된 MIME 유형을 변경합니다. 이후의
appendBuffer()
호출에서는 새로 추가된 바이트가
새로운 유형을 준수해야 합니다.
이 메서드가 호출되면 사용자 에이전트는 다음 단계를 반드시 실행해야 합니다.
TypeError
예외를 발생시키고
이 단계를 중단합니다.
sourceBuffers 속성에서
제거된 경우 InvalidStateError
예외를 발생시키고
이 단계를 중단합니다.
updating 속성이
true와 같으면
InvalidStateError
예외를 발생시키고 이 단계를 중단합니다.
sourceBuffers 속성에 있는
SourceBuffer 객체에 현재 또는 이전에 지정된 유형과 함께
지원되지 않는 MIME 유형이 포함되어 있으면 NotSupportedError
예외를 발생시키고 이
단계를 중단합니다.
부모 미디어 소스의
readyState 속성이
"ended" 상태이면 다음
단계를 실행합니다.
readyState 속성을
"open"으로 설정합니다.
sourceopen이라는
이름의
이벤트를
발생시키도록 작업을
큐에 넣습니다.
SourceBuffer
객체의 [[generate timestamps flag]]를
바이트 스트림 형식 레지스트리 [MSE-REGISTRY]에서
type과 연결된 항목의 "타임스탬프 생성 플래그" 열에 있는 값으로 갱신합니다.
[[generate timestamps flag]]가
true와 같은 경우:
SourceBuffer 객체의
mode 속성을
"sequence"로 설정하며,
해당 속성을 설정할 때 관련된 단계도
함께 실행합니다.
SourceBuffer 객체의 mode
속성의 이전 값을 유지하며,
해당 속성을 설정할 때 관련된 단계는 실행하지
않습니다.
SourceBuffer
객체의 [[pending initialization segment for changeType flag]]를
true로 설정합니다.
remove
특정 시간 범위의 미디어를 제거합니다. 제거 범위의 start는 프레젠테이션 시작 시간부터 초 단위로 측정됩니다. 제거 범위의 end는 프레젠테이션 시작 시간부터 초 단위로 측정됩니다.
이 메서드가 호출되면 사용자 에이전트는 다음 단계를 반드시 실행해야 합니다.
sourceBuffers 속성에서
제거된 경우 InvalidStateError
예외를 발생시키고
이 단계를 중단합니다.
updating 속성이
true와 같으면
InvalidStateError
예외를 발생시키고 이 단계를 중단합니다.
duration이 NaN과 같으면
TypeError
예외를 발생시키고
이 단계를 중단합니다.
duration보다 크면
TypeError
예외를 발생시키고 이 단계를 중단합니다.
TypeError
예외를 발생시키고 이 단계를 중단합니다.
부모 미디어 소스의
readyState 속성이
"ended" 상태이면 다음
단계를 실행합니다.
readyState 속성을
"open"으로 설정합니다.
sourceopen이라는
이름의
이벤트를
발생시키도록 작업을
큐에 넣습니다.
track buffer는 개별 track에 대한 track
descriptions와 coded frames를 저장합니다. track buffer는
initialization segments와
media segments가 SourceBuffer에 추가될 때 업데이트됩니다.
각 track buffer는 current coded frame group에 추가된 마지막 coded frame의 decode timestamp를 저장하는 last decode timestamp variable을 가집니다. 이 variable은 처음에 unset되어 있어 아직 coded frames가 추가되지 않았음을 나타냅니다.
각 track buffer는 current coded frame group에 추가된 마지막 coded frame의 coded frame duration를 저장하는 last frame duration variable을 가집니다. 이 variable은 처음에 unset되어 있어 아직 coded frames가 추가되지 않았음을 나타냅니다.
각 track buffer는 current coded frame group의 모든 coded frames 중 가장 큰 coded frame end timestamp를 저장하는 highest end timestamp variable을 가집니다. 이 variable은 처음에 unset되어 있어 아직 coded frames가 추가되지 않았음을 나타냅니다.
각 track buffer는 track buffer가 random access point coded frame을 기다리고 있는지 추적하는 need random access point flag variable을 가집니다. 이 variable은 처음에 true로 설정되어 있어, 아무것도 random access point coded frame가 오기 전에는 track buffer에 추가될 수 없음을 나타냅니다.
각 track buffer는 track buffer ranges variable을 가지며, 이는 track buffer에 현재 저장된 coded frames가 차지하는 presentation time range를 나타냅니다.
track buffer ranges의 경우, 이러한 presentation time ranges는
presentation timestamps,
frame durations, 그리고 muxed SourceBuffer의 track
buffers 전반에 걸친
coded frame group들의 잠재적 coded frame group start times를 기반으로 합니다.
specification 목적상, 이 정보는 normalized
TimeRanges object에 저장된 것처럼 취급됩니다.
교차된 track buffer ranges는
HTMLMediaElement의
buffered를
보고하는 데 사용되며, 따라서 HTMLMediaElement의
buffered의
각 range 내에서 uninterrupted playback을 지원해야 MUST 합니다.
이러한 코드화된 프레임 그룹 시작 시간은 코드화된 프레임 처리 알고리즘에서 언급된 것과 약간
다른데, 불연속 이후
모든 트랙 버퍼에 걸쳐 가장 이른 프레젠테이션 타임스탬프이기 때문입니다.
불연속은
코드화된 프레임 처리 알고리즘 내에서 발생하거나,
코드화된 프레임 제거
알고리즘의 결과로 발생할 수 있으며, 이는 mode와 관계없습니다. 트랙 버퍼 범위의 분리 여부를 판단하는 임계값은 구현별로 다릅니다. 예를
들어 예상치 못한 재생 중단을 줄이기 위해 구현은 지금까지 이
트랙 버퍼에 버퍼링된 최대 프레임 지속 시간의 2배보다 작은 간격으로
분리된 인접 범위를 병합하여 코드화된 프레임 처리 알고리즘의 불연속
감지 로직을 근사할 수 있습니다. 구현은 또한
다중화된 SourceBuffer의 트랙 버퍼 전체에서 코드화된 프레임 그룹 시작 시간을
범위 시작 시간으로 사용하여 예상치 못한 재생 중단을 더욱 줄일 수 있습니다.
| Event name | Interface | Dispatched when... |
|---|---|---|
| updatestart |
Event
|
SourceBuffer의 updating이
false에서 true로 전환될 때 발생합니다.
|
| update |
Event
|
SourceBuffer의
append 또는 remove가 성공적으로 완료될 때 발생합니다.
SourceBuffer의
updating은
true에서 false로 전환됩니다.
|
| updateend |
Event
|
SourceBuffer의 append 또는 remove가 종료될 때
발생합니다.
|
| error |
Event
|
SourceBuffer에 append하는 도중 오류가 발생했을 때
발생합니다.
updating은
true에서 false로 전환됩니다.
|
| abort |
Event
|
SourceBuffer의
append가 abort() 호출로 중단될 때
발생합니다.
updating은
true에서 false로 전환됩니다.
|
각 SourceBuffer 객체에는 상위 수준의 세그먼트 구문 분석 상태를 추적하는
[[append
state]] 내부 슬롯이 있습니다.
이 슬롯은 처음에 WAITING_FOR_SEGMENT로
설정되며
데이터가 추가됨에 따라 다음
상태로 전환될 수 있습니다.
| 추가 상태 이름 | 설명 |
|---|---|
| WAITING_FOR_SEGMENT | 초기화 세그먼트 또는 미디어 세그먼트의 시작 부분이 추가되기를 기다립니다. |
| PARSING_INIT_SEGMENT | 현재 초기화 세그먼트를 구문 분석하고 있습니다. |
| PARSING_MEDIA_SEGMENT | 현재 미디어 세그먼트를 구문 분석하고 있습니다. |
각 SourceBuffer 객체에는 구문 분석되지 않은 바이트를
appendBuffer() 호출 간에
유지하는 바이트 버퍼인 [[input
buffer]] 내부 슬롯이 있습니다.
SourceBuffer
객체가 생성될 때 버퍼는 비어 있습니다.
각 SourceBuffer 객체에는 appendBuffer()가
더 많은 바이트를 받아들일 수 있는지를 추적하는 [[buffer
full
flag]] 내부 슬롯이 있습니다. 이 슬롯은 SourceBuffer 객체가
생성될 때 false로 설정되며 데이터가 추가되고 제거됨에 따라 갱신됩니다.
각 SourceBuffer 객체에는 이 SourceBuffer 객체에 대해 AudioTrack이
이미 생성되었는지를
추적하는 [[audio track
added flag]] 내부 슬롯이 있습니다. 이 슬롯은
SourceBuffer 객체가 생성될 때 false로 설정되며,
새로 생성된 AudioTrack이
기본적으로
enabled되는지를
결정하기 위해
초기화 세그먼트
수신 알고리즘에서 사용됩니다.
각 SourceBuffer 객체에는 이 SourceBuffer 객체에 대해 VideoTrack이
이미 생성되었는지를
추적하는 [[video track
added flag]] 내부 슬롯이 있습니다. 이 슬롯은
SourceBuffer 객체가 생성될 때 false로 설정되며,
새로 생성된 VideoTrack이
기본적으로
selected되는지를
결정하기 위해
초기화 세그먼트
수신 알고리즘에서 사용됩니다.
각 SourceBuffer 객체에는 "sequence" 모드에서 새로운
코드화된 프레임 그룹의 시작 타임스탬프를 추적하는 [[group start
timestamp]] 내부 슬롯이 있습니다. SourceBuffer 객체가 생성될 때는 설정되지 않으며,
mode
속성이 "sequence"와 같고 timestampOffset
속성이 설정되거나, 코드화된 프레임 처리
알고리즘이 실행될 때 갱신됩니다.
각 SourceBuffer 객체에는 현재 코드화된 프레임 그룹의 모든 코드화된 프레임에 걸쳐 가장
높은 코드화된 프레임 종료 타임스탬프를
저장하는 [[group end
timestamp]] 내부 슬롯이 있습니다. SourceBuffer 객체가 생성될 때 0으로 설정되며
코드화된 프레임 처리
알고리즘에 의해 갱신됩니다.
[[group end timestamp]]는
SourceBuffer의 모든 트랙 버퍼에 걸쳐 가장 높은 코드화된 프레임 종료
타임스탬프를 저장합니다. 따라서 트랙 간에 타임스탬프가 정렬되지 않은 다중화된
세그먼트를 추가할 때는 mode 속성을
설정할 때 주의해야
합니다.
각 SourceBuffer 객체에는
코드화된 프레임 처리 알고리즘에 전달되는 코드화된 프레임에 대해
타임스탬프를 생성해야 하는지를 추적하는 불리언 값인 [[generate timestamps
flag]] 내부 슬롯이 있습니다. 이 플래그는
addSourceBuffer()에
의해
SourceBuffer 객체가 생성될 때 설정되며
changeType()에 의해 갱신됩니다.
세그먼트 파서 루프 알고리즘이 호출되면 다음 단계를 실행합니다.
[[input buffer]]가 비어
있으면 아래의
더 많은 데이터 필요 단계로 이동합니다.
[[input buffer]]에
SourceBuffer 바이트 스트림
형식 명세를 위반하는 바이트가 포함되어 있으면, 추가
오류
알고리즘을 실행하고 이 알고리즘을 중단합니다.
[[input buffer]]의 시작
부분에서 제거합니다.
[[append state]]가
WAITING_FOR_SEGMENT와 같으면
다음 단계를 실행합니다.
[[input buffer]]의 시작 부분이
초기화
세그먼트의 시작을 나타내면 [[append state]]를
PARSING_INIT_SEGMENT로 설정합니다.
[[input buffer]]의 시작 부분이
미디어 세그먼트의 시작을 나타내면 [[append state]]를
PARSING_MEDIA_SEGMENT로 설정합니다.
[[append state]]가
PARSING_INIT_SEGMENT와 같으면
다음 단계를 실행합니다.
[[input buffer]]에 아직 완전한
초기화
세그먼트가 포함되어 있지 않으면 아래의 더 많은 데이터 필요 단계로 이동합니다.
[[input buffer]]의 시작 부분에서 제거합니다.
[[append state]]를 WAITING_FOR_SEGMENT로 설정합니다.
[[append state]]가
PARSING_MEDIA_SEGMENT와 같으면
다음 단계를 실행합니다.
[[first initialization segment received flag]]가
false이거나
[[pending initialization segment for changeType flag]]가
true이면 추가 오류 알고리즘을 실행하고
이 알고리즘을 중단합니다.
[[input buffer]]에 하나 이상의
완전한 코드화된 프레임이 포함되어 있으면
코드화된 프레임
처리 알고리즘을 실행합니다.
코드화된 프레임 처리 알고리즘이 실행되는 빈도는 구현에 따라 다릅니다. 코드화된 프레임 처리 알고리즘은 입력 버퍼에 완전한 미디어 세그먼트가 포함되어 있을 때 호출될 수도 있으며, 완전한 코드화된 프레임이 입력 버퍼에 추가될 때마다 여러 번 호출될 수도 있습니다.
SourceBuffer가
가득 차서 더 이상의 미디어 데이터를 받아들일 수 없으면
[[buffer full flag]]를 true로
설정합니다.
[[input buffer]]에
완전한 미디어 세그먼트가 포함되어 있지 않으면
아래의 더 많은 데이터 필요 단계로 이동합니다.
[[input buffer]]의 시작 부분에서 제거합니다.
[[append state]]를 WAITING_FOR_SEGMENT로 설정합니다.
파서 상태를 재설정해야 할 때, 다음 단계를 실행합니다:
[[append state]]
가 PARSING_MEDIA_SEGMENT와 같고,
[[input buffer]]
에 완전한 코딩된 프레임이 있다면,
코딩된 프레임 처리 알고리즘을
모든 완전한 코딩된 프레임이 처리될 때까지 실행합니다.
mode 속성이 "sequence"이면,
[[group start timestamp]] 값을
[[group end timestamp]]로 설정합니다.
[[input buffer]]의 모든
바이트를 제거합니다.
[[append state]]를 WAITING_FOR_SEGMENT로
설정합니다.
추가 작업 중 오류가 발생하면 이 알고리즘이 호출됩니다.
updating attribute를 false로 설정합니다.
SourceBuffer
object에서 error라는 이름의 event를 발생시킵니다.
SourceBuffer
object에서 updateend라는 이름의 event를
발생시킵니다.
decode"로 설정하여 실행합니다.
append operation이 시작될 때, 다음 단계가 실행되어
SourceBuffer를 검증하고 준비합니다.
SourceBuffer가
sourceBuffers
attribute에서 parent media source로부터
제거되었다면 InvalidStateError
exception을 던지고
이러한 단계를 중단합니다.
updating attribute가 true이면,
InvalidStateError
exception을 던지고 이러한 단계를 중단합니다.
MediaSource가
Window
에서 생성된 경우
HTMLMediaElement의
error attribute가 null이 아니면 true로,
그 attribute가 null이면 false로 둡니다.
Window
case의 단계를 수행한 결과값으로 두되,
Window
HTMLMediaElement에서
그 error attribute가 변경될 때마다
[[port to worker]] implicit
messages를
사용하여 전달된 결과를 반영합니다. 그러한 message가 아직 수신되지 않았다면
recent element error를 false로 둡니다.
InvalidStateError
exception을 던지고 이러한 단계를 중단합니다.
readyState attribute가
parent media source에서
"ended" 상태라면 다음 단계를 실행합니다:
readyState attribute를
parent media source의
"open"으로 설정합니다.
sourceopen이라는
이름의 이벤트를 parent media source에
발생시킵니다.
[[buffer full flag]]가 true이면,
QuotaExceededError
exception을 던지고 이러한 단계를 중단합니다.
이는 implementation이 append를 수용할 만큼 충분한 data를 evict하지 못했거나,
append 자체가 너무 크다는 신호입니다. web application은 공간을 명시적으로 확보하고/하거나
append 크기를 줄이기 위해 remove()를
사용해야 SHOULD 합니다.
appendBuffer()가
호출되면, 다음 단계를 실행하여 추가된 데이터를 처리합니다.
updating attribute를 false로 설정합니다.
SourceBuffer
object에서 update라는 이름의 event를 발생시킵니다.
SourceBuffer
object에서 updateend라는 이름의 event를
발생시킵니다.
호출자가 다른 SourceBuffer 업데이트를 차단하는 JavaScript 표시 범위 제거 작업을 시작해야 할 때 다음 단계를 따릅니다:
updating attribute를 true로 설정합니다.
SourceBuffer object에서
updatestart라는 이름의 event를 발생시킵니다.
updating attribute를 false로 설정합니다.
SourceBuffer object에서
update라는 이름의 event를 발생시킵니다.
SourceBuffer object에서
updateend라는 이름의 event를
발생시킵니다.
세그먼트 파서 루프가 완전한 초기화 세그먼트를 성공적으로 파싱했을 때 다음 단계를 실행합니다:
각 SourceBuffer 객체에는 이 알고리즘에 의해 첫 초기화 세그먼트가 추가되어 수신되었는지를 추적하는 [[first initialization segment received flag]] 내부 슬롯이 있습니다. 이 플래그는 SourceBuffer가 생성될 때 false로 설정되며 아래 알고리즘에 의해 업데이트됩니다.
각 SourceBuffer 객체에는 가장 최근
changeType() 이후
초기화 세그먼트가 필요한지 여부를 추적하는
[[pending
initialization segment for changeType flag]] 내부 슬롯이 있습니다. 이 플래그는 SourceBuffer가
생성될 때 false로 설정되고, changeType()에 의해 true로
설정되며,
아래 알고리즘에 의해 다시 false로 재설정됩니다.
duration 속성이 현재
NaN과 같으면 갱신합니다.
[[first initialization segment received flag]]가
true이면,
다음 단계를 실행합니다.
사용자 에이전트는 원래라면 지원되는 코덱이라도, 해당 코덱이 type
매개변수에 지정되지 않은 경우 여기에서 "지원되지
않음"으로 간주할 수 있습니다. 이 매개변수는 (a) 이 SourceBuffer
객체에서 가장 최근에 성공한
changeType()에
전달되었거나, (b) 이 객체에서 아직 성공한
changeType()가
발생하지 않았다면,
이 SourceBuffer
객체를 생성한 addSourceBuffer()에
전달되었습니다. 예를 들어 가장 최근에 성공한
changeType()가
'video/webm' 또는
'video/webm; codecs="vp8"'로 호출되었고, vp9이 포함된 비디오 트랙이
초기화 세그먼트에 나타나면, 사용자 에이전트는 위의 다른 두 속성에 대한 검사를
통과하더라도 이 단계를 사용하여 디코딩 오류를
발생시킬 수 있습니다. 구현에서는 코덱이 실제로 지원되지 않거나 다른 두 속성에 대한
검사가 실패한 경우에만 이러한 오류를 발생시키는 것이 권장됩니다.
웹 작성자는 사용자 에이전트의 지원 여부를 더 적극적으로 감지하기 위해 정확한 코덱 매개변수와 함께 changeType(),
addSourceBuffer()
및 isTypeSupported()를
사용하는 것이 권장됩니다. SourceBuffer
객체의 바이트스트림 형식이 변경되는 경우 changeType()가
필요합니다.
[[first initialization segment received flag]]가
false이면,
다음 단계를 실행합니다.
사용자 에이전트는 원래라면 지원되는 코덱이라도, 해당 코덱이 type 매개변수에
지정되지 않은 경우 여기에서 "지원되지
않음"으로 간주할 수 있습니다. 이 매개변수는 (a) 가장 최근에 성공한
changeType()
호출(
즉,
이 SourceBuffer 객체에서 수행된 호출)에 전달되었거나,
(b) 이 객체에서 아직 성공한
changeType()가
발생하지 않았다면, 이
SourceBuffer 객체를 생성한
addSourceBuffer()에
전달되었습니다.
예를 들어
MediaSource.isTypeSupported('video/webm;codecs="vp8,vorbis"')가
true를 반환할 수 있지만, addSourceBuffer()가
'video/webm;codecs="vp8"'로 호출되고 Vorbis 트랙이 초기화 세그먼트에
나타나면,
사용자 에이전트는 이 단계를 사용하여 디코딩 오류를 발생시킬 수 있습니다.
구현에서는 코덱이 실제로 지원되지 않는 경우에만 이러한 오류를 발생시키는 것이 권장됩니다.
웹 작성자는 사용자 에이전트의 지원 여부를 더
적극적으로 감지하기 위해 정확한 코덱 매개변수와 함께
changeType(),
addSourceBuffer()
및
isTypeSupported()를
사용하는 것이 권장됩니다. changeType()는
SourceBuffer 객체의
바이트스트림 형식이 변경되는 경우
필요합니다.
초기화 세그먼트의 각 오디오 트랙에 대해 다음 단계를 실행합니다.
SourceBuffer
객체의 [[audio track added flag]]
내부 슬롯이 false이면 다음 단계를 실행합니다.
SourceBuffer
객체의 [[audio track added flag]]
내부 슬롯을 true로 설정합니다.
Window
HTMLMediaElement에
AudioTrack을
생성하며,
Window에서
다음 단계를 실행합니다.
Window에서
생성된 경우:
AudioTrack
객체로 둡니다.
id
속성에 할당합니다.
language,
label
및
kind
속성에 할당합니다.
enabled
속성을 true로 설정합니다.
SourceBuffer
객체의
audioTracks
속성에 추가합니다.
이는 AudioTrackList
[HTML]
로직이 이 SourceBuffer
객체의
audioTracks
속성이 참조하는 AudioTrackList
객체에서,
track
속성이
new audio
track으로 초기화된
TrackEvent를
사용하여
addtrack이라는
이름의
이벤트를
발생시키도록
작업을
큐에 넣는
동작을 트리거해야 합니다.
SourceBuffer
객체의 부모 미디어
소스가 연결된 미디어 요소로
둡니다.
audioTracks
속성에 추가합니다.
이는 AudioTrackList
[HTML]
로직이
media
element의
audioTracks
속성이 참조하는 AudioTrackList
객체에서,
track
속성이
new audio
track으로 초기화된
TrackEvent를
사용하여
addtrack이라는
이름의
이벤트를
발생시키도록
작업을
큐에 넣는
동작을 트리거해야 합니다.
create track 메시지를
[[port to main]]에
게시하며, 해당 메시지의 Window의
암시적 처리기는
다음 단계를 실행합니다.
AudioTrack
객체로 둡니다.
id
속성에 할당합니다.
language,
label
및
kind
속성에 할당합니다.
enabled
속성을 true로 설정합니다.
SourceBuffer
객체의 부모 미디어
소스가 연결된 미디어 요소로
둡니다.
audioTracks
속성에 추가합니다.
이는 AudioTrackList
[HTML]
로직이
media
element의
audioTracks
속성이 참조하는 AudioTrackList
객체에서,
track
속성이
new audio
track으로 초기화된
TrackEvent를
사용하여
addtrack이라는
이름의
이벤트를
발생시키도록
작업을
큐에 넣는
동작을 트리거해야 합니다.
초기화 세그먼트의 각 비디오 트랙에 대해 다음 단계를 실행합니다.
SourceBuffer
객체의 [[video track added flag]]
내부 슬롯이 false이면 다음 단계를 실행합니다.
SourceBuffer
객체의 [[video track added flag]]
내부 슬롯을 true로 설정합니다.
Window
HTMLMediaElement에
VideoTrack을
생성하며,
Window에서
다음 단계를 실행합니다.
Window에서
생성된 경우:
VideoTrack
객체로 둡니다.
id
속성에 할당합니다.
language,
label
및
kind
속성에 할당합니다.
selected
속성을 true로 설정합니다.
SourceBuffer
객체의
videoTracks
속성에 추가합니다.
이는 VideoTrackList
[HTML]
로직이 이 SourceBuffer
객체의
videoTracks
속성이 참조하는 VideoTrackList
객체에서,
track
속성이
new video
track으로 초기화된
TrackEvent를
사용하여
addtrack이라는
이름의
이벤트를
발생시키도록
작업을
큐에 넣는
동작을 트리거해야 합니다.
SourceBuffer
객체의 부모 미디어
소스가 연결된 미디어 요소로
둡니다.
videoTracks
속성에 추가합니다.
이는 VideoTrackList
[HTML]
로직이
media
element의 videoTracks
속성이 참조하는 VideoTrackList
객체에서,
track
속성이
new video
track으로 초기화된
TrackEvent를
사용하여
addtrack이라는
이름의
이벤트를
발생시키도록
작업을
큐에 넣는
동작을 트리거해야 합니다.
create track 메시지를
[[port to main]]에
게시하며, 해당 메시지의 Window의
암시적 처리기는
다음 단계를 실행합니다.
VideoTrack
객체로 둡니다.
id
속성에 할당합니다.
language,
label
및
kind
속성에 할당합니다.
selected
속성을 true로 설정합니다.
SourceBuffer
객체의 부모 미디어
소스가 연결된 미디어 요소로
둡니다.
videoTracks
속성에 추가합니다.
이는 VideoTrackList
[HTML]
로직이
media
element의 videoTracks
속성이 참조하는 VideoTrackList
객체에서,
track
속성이
new video
track으로 초기화된
TrackEvent를
사용하여
addtrack이라는
이름의
이벤트를
발생시키도록
작업을
큐에 넣는
동작을 트리거해야 합니다.
초기화 세그먼트의 각 텍스트 트랙에 대해 다음 단계를 실행합니다.
mode
값으로 둡니다.
"showing"
또는
"hidden"과
같으면 active track flag를
true로 설정합니다.
Window
HTMLMediaElement에
TextTrack을
생성하며,
Window에서
다음 단계를 실행합니다.
Window에서
생성된 경우:
TextTrack
객체로 둡니다.
id
속성에 할당합니다.
language,
label
및
kind
속성에 할당합니다.
mode
속성을 text
track mode로 설정하고, new text
track의 나머지 속성을 이 트랙에 대한
초기화
세그먼트에서 결정된 적절한 정보로 채웁니다.
SourceBuffer
객체의 textTracks
속성에 추가합니다.
이는 TextTrackList
[HTML]
로직이 이 SourceBuffer
객체의
textTracks
속성이 참조하는 TextTrackList
객체에서,
track
속성이
new text
track으로
초기화된
TrackEvent를
사용하여
addtrack이라는
이름의
이벤트를
발생시키도록
작업을
큐에 넣는
동작을 트리거해야 합니다.
SourceBuffer
객체의 부모 미디어
소스가 연결된 미디어 요소로
둡니다.
textTracks
속성에 추가합니다.
이는 TextTrackList
[HTML]
로직이
media
element의 textTracks
속성이 참조하는 TextTrackList
객체에서,
track
속성이
new text
track으로
초기화된
TrackEvent를
사용하여
addtrack이라는
이름의
이벤트를
발생시키도록
작업을
큐에 넣는
동작을 트리거해야 합니다.
create track 메시지를
[[port to main]]에
게시하며, 해당 메시지의 Window의
암시적 처리기는
다음 단계를 실행합니다.
TextTrack
객체로 둡니다.
id
속성에 할당합니다.
language,
label
및
kind
속성에 할당합니다.
mode
속성을 text
track mode로 설정하고, new text
track의 나머지 속성을 이 트랙에 대한
초기화
세그먼트에서 결정된 적절한 정보로 채웁니다.
SourceBuffer
객체의 부모 미디어
소스가 연결된 미디어 요소로
둡니다.
textTracks
속성에 추가합니다.
이는 TextTrackList
[HTML]
로직이
media
element의 textTracks
속성이 참조하는 TextTrackList
객체에서,
track
속성이
new text
track으로
초기화된
TrackEvent를
사용하여
addtrack이라는
이름의
이벤트를
발생시키도록
작업을
큐에 넣는
동작을 트리거해야 합니다.
SourceBuffer를 activeSourceBuffers에
추가합니다.
activeSourceBuffers에서
addsourcebuffer라는 이름의
이벤트를 발생시키도록
작업을
큐에 넣습니다.
[[first initialization segment received flag]]를
true로 설정합니다.
[[pending initialization segment for changeType flag]]를
false로
설정합니다.
Window에서
다음 단계를 실행합니다.
HTMLMediaElement의
readyState 속성이
HAVE_CURRENT_DATA보다
크면,
HTMLMediaElement의
readyState 속성을
HAVE_METADATA로
설정합니다.
HTMLMediaElement ready states
[HTML] 로직에 따르면, HTMLMediaElement의
readyState 변경은
HTMLMediaElement에서 이벤트를
발생시킬 수 있습니다.
sourceBuffers에 있는 각 객체의
[[first initialization segment received flag]]가
true와 같으면,
부모 미디어 소스의 필요한 경우 미러링 알고리즘을 사용하여
Window에서
다음
단계를 실행합니다.
HTMLMediaElement의
readyState 속성이
HAVE_NOTHING이면,
HTMLMediaElement의
readyState 속성을 HAVE_METADATA로
설정합니다.
HTMLMediaElement ready states
[HTML] 로직에 따르면, HTMLMediaElement의
readyState 변경은
HTMLMediaElement에서 이벤트를 발생시킬 수 있습니다. HAVE_NOTHING에서
HAVE_METADATA로의
전환이 발생하면, HTMLMediaElement
로직이 미디어 요소에서
loadedmetadata라는
이름의
이벤트를 발생시키도록
작업을
큐에 넣는 동작을 트리거해야 합니다.
세그먼트 파서 루프에 의해 완전한 코딩된 프레임이 파싱되면 다음 단계를 실행합니다:
미디어 세그먼트의 각 코딩된 프레임에 대해 다음 단계를 실행한다:
[[generate timestamps flag]]
가 true와 같으면:
시간 지정 텍스트 프레임의 프레젠테이션 및 디코드 타임스탬프를 결정하려면 특수한 처리가 필요할 수 있다. 이 정보는 기본 형식에 명시적으로 존재하지 않거나 프레임 순서에 따라 달라질 수 있기 때문이다. MPEG2-TS PSI 데이터와 같은 일부 메타데이터 텍스트 트랙에는 암시된 타임스탬프만 있을 수 있다. 이러한 상황에 대한 형식별 규칙은 바이트 스트림 형식 명세 또는 별도의 확장 명세에 포함하는 것이 좋다.
구현은 내부적으로 타임스탬프를 배정밀도 부동 소수점 표현으로 저장할 필요가 없다. 이 표현은 HTML 명세의 타임스탬프에 사용되는 표현이므로 여기에서 사용한다. 여기서의 목적은 timestampOffset을 추가할 때 바이트 스트림 형식에서 사용하는 기본 타임스탬프 표현에 타임스탬프 롤오버가 발생할 수 있다는 사실을 처리하기 위해 알고리즘에 불필요한 복잡성을 추가하지 않고도 동작을 명확히 하는 것이다. 구현은 원하는 어떤 내부 타임스탬프 표현도 사용할 수 있지만, timestampOffset의 추가는 배정밀도 부동 소수점 표현을 사용했을 때 발생하는 것과 유사한 방식으로 동작하는 것이 좋다.
mode가 "sequence"와 같고
[[group start timestamp]]
가 설정되어 있으면 다음 단계를 실행한다:
timestampOffset
을 [[group start timestamp]]
에서 presentation timestamp를 뺀 값과 같게 설정한다.
[[group end timestamp]]
를
[[group start timestamp]]와
같게 설정한다.
[[group start timestamp]]의
설정을 해제한다.
timestampOffset
이 0이 아니면 다음 단계를 실행한다:
timestampOffset
을 더한다.
timestampOffset
을 더한다.
mode
가 "segments"와
같은 경우:
[[group end timestamp]]
를 presentation
timestamp로 설정한다.
mode
가 "sequence"와
같은 경우:
[[group start timestamp]]
를
[[group end timestamp]]와
같게 설정한다.
appendWindowStart보다
작으면
랜덤 액세스 포인트 필요 플래그
를 true로 설정하고, 코딩된 프레임을 삭제한 다음
루프의 시작으로 이동하여 다음 코딩된 프레임의 처리를 시작한다.
일부 구현은 presentation timestamp가 appendWindowStart보다
작은
코딩된 프레임 일부를 수집하고
프레젠테이션
타임스탬프가 appendWindowStart보다
크거나 같은 첫 번째 코딩된 프레임에서,
해당 프레임이 랜덤 액세스 포인트가 아니더라도
이를 사용하여 스플라이스를 생성하도록 선택할 수 있다. 이를 지원하려면 여러
디코더 또는 실시간보다 빠른 디코딩이 필요하므로 현재로서는 이 동작이
규범적 요구사항이 되지 않는다.
appendWindowEnd보다
크면
랜덤 액세스 포인트 필요 플래그를 true로 설정하고,
코딩된 프레임을 삭제한 다음
루프의 시작으로 이동하여 다음 코딩된 프레임의 처리를 시작한다.
일부 구현은 presentation
timestamp가 appendWindowEnd보다
작고
frame end timestamp가
appendWindowEnd보다
큰 코딩된 프레임을
수집하도록 선택할 수 있다. 그런 다음 수집 시점의 추가 창 내에 있는
수집된 코딩된 프레임의 부분과, 나중에 처리된 프레임 중
수집된 코딩된 프레임의 끝부분과 일부만 겹치는 시작 부분에 걸쳐 스플라이스를
생성하는 데 이를 사용할 수 있다. 이를 지원하려면 여러 디코더 또는
실시간보다 빠른 디코딩이 필요하므로 현재로서는 이
동작이 규범적 요구사항이 되지 않는다. appendWindowStart에
걸쳐 있는
코딩된 프레임을 수집하는 것과 함께 사용하면 구현은
끊김 없는 오디오 스플라이싱을 지원할 수 있다.
이는 배정밀도 부동 소수점 수와 유리수 사이를 상호 변환할 때 나타날 수 있는 프레임 타임스탬프 계산의 작은 오차를 보정하기 위한 것이다. 이 허용 오차는 프레임이 기존 프레임의 시작 시간으로부터 1마이크로초 이내에 있는 한 기존 프레임을 대체할 수 있도록 한다. 기존 프레임보다 약간 앞에 오는 프레임은 아래의 제거 단계에서 처리한다.
다음 랜덤 액세스 포인트까지 모든 코딩된 프레임을 제거하는 것은, 제거된 프레임과 다음 랜덤 액세스 포인트 사이의 모든 프레임이 제거된 프레임에 의존했다고 가정하므로 디코딩 의존성을 보수적으로 추정하는 것이다.
코딩된 프레임 간의 양방향 예측으로 인해 디코드 타임스탬프는 단조 증가하더라도 presentation timestamp가 단조 증가하지 않을 수 있으므로 초과 여부 검사가 필요하다.
[[group end timestamp]]보다
크면,
[[group end timestamp]]
를 frame
end timestamp와 같게 설정한다.
[[generate timestamps flag]]
가 true와 같으면
timestampOffset
을 frame end timestamp와 같게 설정한다.
HTMLMediaElement의
readyState 속성이
HAVE_METADATA
이고 새 코딩된 프레임으로 인해
HTMLMediaElement의
buffered
가 현재 재생 위치에 대한 TimeRanges
를
갖게 되면, HTMLMediaElement의
readyState 속성을
HAVE_CURRENT_DATA로
설정한다.
HTMLMediaElement 준비 상태
[HTML] 로직에 따르면, HTMLMediaElement의
readyState 변경은
HTMLMediaElement에서 이벤트를 발생시킬 수 있다.
HTMLMediaElement의
readyState 속성이
HAVE_CURRENT_DATA
이고 새 코딩된 프레임으로 인해
HTMLMediaElement의
buffered
가 현재 재생 위치와 현재 재생
위치 이후의 일정 시간을 포함하는 TimeRanges
를
갖게 되면, HTMLMediaElement의
readyState
속성을 HAVE_FUTURE_DATA로
설정한다.
HTMLMediaElement 준비 상태
[HTML] 로직에 따르면, HTMLMediaElement의
readyState 변경은
HTMLMediaElement에서 이벤트를 발생시킬 수 있다.
HTMLMediaElement의
readyState 속성이
HAVE_FUTURE_DATA
이고 새 코딩된 프레임으로 인해
HTMLMediaElement의
buffered
가 현재 재생 위치와 중단 없는 재생을 보장하기에
충분한 데이터를 포함하는 TimeRanges
를 갖게 되면, HTMLMediaElement의
readyState
속성을 HAVE_ENOUGH_DATA로
설정한다.
HTMLMediaElement 준비 상태
[HTML] 로직에 따르면, HTMLMediaElement의
readyState 변경은
HTMLMediaElement에서 이벤트를 발생시킬 수 있다.
duration을 넘어서는 데이터가 포함되어 있으면,
new duration을 현재 지속 시간과 [[group end timestamp]] 중 최댓값으로 설정하여
지속 시간 변경 알고리즘을 실행한다.
특정 시간 범위의 코딩된 프레임을 SourceBuffer에서 제거해야 할 때 다음 단계를 따르세요:
이 SourceBuffer의 각
트랙 버퍼에 대해 다음
단계를 실행한다:
duration의 현재 값으로 한다.
이 트랙 버퍼에 end보다 크거나 같은 랜덤 액세스 포인트 타임스탬프가 있으면, remove end timestamp를 해당 랜덤 액세스 포인트 타임스탬프로 갱신한다.
한 트랙 내의 코딩된 프레임 간의 의존성은 일반적으로 다른 트랙의 의존성과 다르므로 랜덤 액세스 포인트 타임스탬프는 트랙마다 다를 수 있다.
제거된 각 프레임에 대해, 프레임의 디코드 타임스탬프가 해당 프레임 트랙의 마지막 디코드 타임스탬프와 같으면 다음 단계를 실행한다:
mode가
"segments"와
같은 경우:
[[group end timestamp]]
를 프레젠테이션
타임스탬프로 설정한다.
mode가
"sequence"와
같은 경우:
[[group start timestamp]]
를
[[group end timestamp]]와
같게 설정한다.
다음 랜덤 액세스 포인트까지 모든 코딩된 프레임을 제거하는 것은, 제거된 프레임과 다음 랜덤 액세스 포인트 사이의 모든 프레임이 제거된 프레임에 의존했다고 가정하므로 디코딩 의존성을 보수적으로 추정하는 것이다.
이 객체가 activeSourceBuffers에
있고,
현재
재생 위치가 start보다 크거나 같고
remove end timestamp보다 작으며, HTMLMediaElement의
readyState가
HAVE_METADATA보다
크면,
HTMLMediaElement의
readyState 속성을 HAVE_METADATA로
설정하고
재생을 중단한다.
HTMLMediaElement 준비 상태
[HTML] 로직에 따르면, HTMLMediaElement의
readyState 변경은
HTMLMediaElement에서 이벤트를
발생시킬 수 있다.
이 전환은 현재 위치의 미디어 데이터가 제거되었기 때문에 발생한다. 현재 재생 위치의 미디어가 추가되거나 3.15.5 선택된/활성화된 트랙 상태 변경이 발생할 때까지 재생을 진행할 수 없다.
[[buffer full flag]]가 true와 같고
이 객체가 더 많은 바이트를
받아들일 준비가 되어 있으면, [[buffer full flag]]를 false로 설정한다.
이 알고리즘은 새 데이터가 추가될 때 이 SourceBuffer의 공간을 확보하기 위해
실행된다.
여기에서 구현이 기존의 [[input buffer]] 내 바이트에
new data를 추가로 처리하면
SourceBuffer의 용량을
초과할 것으로 예측하는 경우, 이 시점에서
[[buffer full flag]]를 true로
설정하기로 결정할 수 있음을 인정하는 단계가 필요하다. 이러한 단계는
예를 들어 리소스를 초과하게 될 new data를 받아들이기 전에 구현이 더
선제적으로 푸시백할 수 있도록 한다. 실제로 적어도 하나의 구현은 이미
이렇게 하고 있다.
[[buffer full flag]]가 false와 같으면
이 단계를 중단한다.
구현은 removal ranges를 선택하는 데 서로 다른 방법을
사용할 수 있으므로 웹
애플리케이션은 특정 동작에 의존해서는 안 된다. 웹
애플리케이션은
buffered 속성을 사용하여
버퍼링된 데이터의 일부가 제거되었는지
관찰할 수 있다.
코딩된 프레임 처리 알고리즘이 두 오버랩된 오디오 코딩된 프레임에 대해 스플라이스 프레임을 생성해야 할 때 다음 단계를 따르세요:
floor(x * sample_rate + 0.5) / sample_rate).
예를 들어 다음 값이 주어졌다고 하자:
10.01255가 10 + 101/8000 (10.012625)보다 10 + 100/8000 (10.0125)에 더 가까우므로 presentation timestamp와 decode timestamp는 10.0125로 갱신된다.
일부 구현은 전환이 덜 갑작스럽게 느껴지도록 삽입된 무음의 양쪽에 있는 코딩된 프레임과 무음 사이에 페이드 인/아웃을 적용할 수 있다.
이는 처음부터 overlapped frame이 track buffer에 없었던 것처럼 new coded frame을 track buffer에 추가할 수 있도록 하기 위한 것이다.
new coded frame의 지속 시간이 5밀리초보다 짧으면 스플라이스를 올바르게 렌더링하기 위해 new coded frame 뒤에 추가되는 코딩된 프레임이 필요하다.
이 스플라이스 프레임이 렌더링되는 방법에 대한 자세한 내용은 오디오 스플라이스 렌더링 알고리즘을 참조한다.
audio splice frame 알고리즘이 생성한 스플라이스 프레임을 미디어 요소가 렌더링해야 할 때 다음 단계를 실행합니다:
이 알고리즘의 그래픽 표현입니다.
코딩된 프레임 처리 알고리즘이 두 오버랩된 타임드 텍스트 코딩된 프레임에 대해 스플라이스 프레임을 생성해야 할 때 다음 단계를 따르세요:
이는 new coded frame이 처음부터 track buffer에 오버랩된 프레임이 없었던 것처럼 추가될 수 있도록 의도되었습니다.
SourceBufferList는
SourceBuffer 객체들을 담는 단순 컨테이너 객체입니다.
읽기 전용 배열 접근을 제공하며, 리스트가 수정될 때 이벤트를 발생시킵니다.
WebIDL[Exposed=(Window,DedicatedWorker)]
interface SourceBufferList : EventTarget {
readonly attribute unsigned long length;
attribute EventHandler onaddsourcebuffer;
attribute EventHandler onremovesourcebuffer;
getter SourceBuffer (unsigned long index);
};
length (unsigned long 타입, 읽기
전용)
리스트에 있는 SourceBuffer 객체의 개수를
나타냅니다.
onaddsourcebuffer (EventHandler
타입)
addsourcebuffer 이벤트의
이벤트 핸들러입니다.
onremovesourcebuffer (EventHandler
타입)
removesourcebuffer 이벤트의 이벤트 핸들러입니다.
리스트의 SourceBuffer 객체를 배열 연산자([])로 접근할 수 있게 합니다.
이 메서드가 호출되면, 사용자 에이전트는 다음 단계를 실행해야 합니다:
length 속성보다 크거나 같으면
undefined를 반환하고 이 단계를 중단합니다.
SourceBuffer 객체를 반환합니다.
| 이벤트 이름 | 인터페이스 | 언제 디스패치되는지... |
|---|---|---|
| addsourcebuffer |
Event
|
SourceBuffer가 리스트에 추가될 때.
|
| removesourcebuffer |
Event
|
SourceBuffer가 리스트에서 제거될 때.
|
ManagedMediaSource는 메모리 콘텐츠를 능동적으로 관리하는 MediaSource이다.
MediaSource와 달리, 사용자
에이전트는 어떤
이유로든 메모리 정리 알고리즘을 통해 sourceBuffers
(ManagedSourceBuffer로 채워짐)의 콘텐츠를 제거할
수 있다.
WebIDL[Exposed=(Window,DedicatedWorker)]
interface ManagedMediaSource : MediaSource {
constructor();
readonly attribute boolean streaming;
attribute EventHandler onstartstreaming;
attribute EventHandler onendstreaming;
};
streaming
가져올 때:
| 이벤트 이름 | 인터페이스 | 언제 디스패치되는지... |
|---|---|---|
| startstreaming |
Event
|
ManagedMediaSource의 streaming 속성이
false에서 true로 변경될 때.
|
| endstreaming |
Event
|
ManagedMediaSource의 streaming 속성이
true에서 false로 변경될 때.
|
SourceBuffer Monitoring 알고리즘이 주기적으로 실행될 때 다음 단계를 실행합니다.
중단 없는 재생을 보장할 만큼 충분한 관리 데이터가 있는 상태란
사용자 에이전트가 프레젠테이션을 의미 있는 시간 동안 멈추지 않고 재생할 수 있을 만큼 데이터를 충분히 가지고 있다고 판단하는 구현체 정의 조건입니다.
이 조건은 streaming 값 전환 시점을
항상 평가하는 기준이 됩니다. 이러한 전환은 사용자 에이전트가 충분히 버퍼링되었다고 판단하거나, 반대로 더 많은 데이터가 필요하다고 판단하는 시점을 나타냅니다.
데이터를 효율적으로 가져오고 버퍼링할 수 있는 상태란 사용자 에이전트가 원하는 메모리 사용량을 달성하면서 에너지 효율적으로 새 데이터를 가져올 수 있다고 판단하는 구현체 정의 조건입니다.
MediaSource의 SourceBuffer Monitoring 알고리즘을 실행합니다.
buffered
속성이
현재 재생 위치를 포함하고, 중단 없는 재생을 보장할 만큼 충분한
관리 데이터가 있으며,
데이터를 효율적으로 가져오고 버퍼링할
수 있는 상태일 때 true로 둡니다.
streaming과 다르면,
요소
작업 큐에 추가하여
미디어 요소에서
다음 단계를 실행합니다:
streaming
속성을 can play
uninterrupted and efficiently로 설정합니다.
startstreaming이며,
ManagedMediaSource에서
발생합니다.
endstreaming이며,
ManagedMediaSource에서
발생합니다.
sourceBuffers의 각 buffer에 대해:
WebIDL[Exposed=(Window,DedicatedWorker)]
interface BufferedChangeEvent : Event {
constructor(DOMString type, optional BufferedChangeEventInit eventInitDict = {});
[SameObject] readonly attribute TimeRanges addedRanges;
[SameObject] readonly attribute TimeRanges removedRanges;
};
dictionary BufferedChangeEventInit : EventInit {
TimeRanges addedRanges;
TimeRanges removedRanges;
};
addedRanges
updatestart 이벤트와 updateend 이벤트 사이에 추가된 시간 구간입니다
(이는 마지막으로 코딩된 프레임 처리 알고리즘이 실행되는 동안 발생합니다).
removedRanges
updatestart와 updateend 이벤트 사이에 제거된 시간 구간입니다
(이는 마지막으로 코딩된 프레임 제거 또는
코딩된 프레임 축출 알고리즘이 실행되었거나,
사용자 에이전트가 메모리 정리에 응답하여 콘텐츠를 축출한 경우에 해당합니다).
WebIDL[Exposed=(Window,DedicatedWorker)]
interface ManagedSourceBuffer : SourceBuffer {
attribute EventHandler onbufferedchange;
};
onbufferedchange
이벤트
핸들러 IDL 속성으로서,
해당 이벤트
핸들러 이벤트 타입은
bufferedchange입니다.
| 이벤트 이름 | 인터페이스 | 언제 디스패치되는지... |
|---|---|---|
| bufferedchange |
BufferedChangeEvent
|
ManagedSourceBuffer의 buffered
범위가
appendBuffer(),
remove(),
endOfStream()
호출 이후에 변경되었거나,
사용자 에이전트가 메모리 정리 알고리즘을 실행한 결과로 변경되었을 때
디스패치됩니다.
|
ManagedSourceBuffer
buffer에 대해
buffer의
buffered가 변경되게 만드는 모든 작업이 완료되었을 때
(즉, appendBuffer(),
remove() 또는
메모리 정리 알고리즘이 완료된 직후) 다음 단계를 실행합니다.
buffered 속성 값으로 둡니다.
buffered
TimeRanges로
둡니다.
BufferedChangeEventInit
딕셔너리로 두되,
addedRanges는
added로,
removedRanges는
removed로 초기화합니다.
bufferedchange이고,
buffer에서
BufferedChangeEvent 인터페이스로,
eventInitDict로 초기화하여 발생시킵니다.
ManagedMediaSource 부모의
activeSourceBuffers에
포함되어 있지 않다면:
currentTime부터
끊김 없는 재생을 보장하기 위해 프레젠테이션에서 축출할 수 있는 프리젠테이션 시간 구간들의 목록으로 둡니다.
구현체는 removal ranges를 선택하는 데 서로 다른 전략을 사용할 수
있으므로,
웹 애플리케이션은 특정 동작에 의존하지 않아야 합니다. 웹 애플리케이션은
bufferedchange 이벤트를 수신하여
버퍼된 데이터의 일부가 축출되었는지 관찰할 수 있습니다.
본 섹션은, 요소에 MediaSource가 연결되었을 때
기존의 HTMLMediaElement의
seekable 및
HTMLMediaElement의
buffered
속성이 반드시 반환해야 하는 값과,
기존의 HTMLMediaElement의
srcObject
속성이 MediaSourceHandle 객체로 설정될 때
반드시 수행해야 하는 동작을 명시합니다.
HTMLMediaElement의
seekable
HTMLMediaElement의
seekable
속성은 아래 단계에 따라 생성된 새로운 정적
표준화된 TimeRanges
객체를 반환합니다:
MediaSource가 종료되었거나 닫히는 중인 DedicatedWorkerGlobalScope에서
생성된 경우 빈 TimeRanges
객체를 반환하고 이
단계를 중단한다.
이 경우는 종료된
terminate()에
의해
또는 사용자 에이전트가 MediaSource의 DedicatedWorkerGlobalScope에 대해 워커
종료를 실행하여 종료된
DedicatedWorkerGlobalScope에서 생성된 MediaSource의 버퍼링되었거나 탐색 가능한 미디어에 관한
이전 정보를 더 이상 유지하지 않을 수 있는 구현을 처리하기 위한 것이다. 예를 들어 이는 결국
close()
실행의 결과일 수 있다.
연결된 워커의 MediaSource 컨텍스트가 파괴된 경우 미디어 요소가 (결국) 오류 상태로 전환되어야 하는가? 실험적인 Chromium 워커 MSE 구현은 해당 컨텍스트가 파괴되기 전과 동일하게 요소의 readyState, networkState 및 error를 유지하지만, seekable 및 buffered 속성은 각각 빈 TimeRange를 보고한다.
duration 및
[[live seekable range]]의 최근 값으로 하며, 다음과
같이
결정한다:
MediaSource가
Window에서
생성된 경우
duration으로 설정하고 recent
live seekable
range를 [[live seekable range]]로 설정한다.
duration 및 [[live seekable range]]의 최근 값으로
설정한다. 이 값은
MediaSource가
duration
또는
[[live seekable range]]가 변경될 때마다
[[port to main]]에
게시하는
암시적 메시지를 처리하여 갱신된다.
TimeRanges
객체를 반환한다.
HTMLMediaElement의
buffered
속성의 합집합으로 한다.
HTMLMediaElement의
buffered
속성이
빈 TimeRanges
객체를 반환하면, 빈 TimeRanges
객체를 반환하고
이 단계를 중단한다.
HTMLMediaElement의
buffered
속성이 보고한 가장 늦은 끝 시간과 같은 단일 범위를 반환한다.
HTMLMediaElement의
buffered
HTMLMediaElement의
buffered
속성은 아래 단계에 기반한 정적인
표준화된 TimeRanges
객체를 반환합니다.
MediaSource가 종료되었거나 닫히는 중인 DedicatedWorkerGlobalScope에서
생성된 경우 빈 TimeRanges
객체를 반환하고 이
단계를 중단한다.
이 경우는
terminate()에
의해
종료되었거나, 예를 들어
close()
실행의 최종 결과로 사용자 에이전트가 MediaSource의
DedicatedWorkerGlobalScope에 대해 워커
종료를 실행하여 종료된 DedicatedWorkerGlobalScope에서 생성된
MediaSource의 버퍼링되었거나 탐색 가능한 미디어에 관한 이전 정보를 더 이상 유지하지 않을 수 있는
구현을 처리하기 위한 것이다.
연결된 워커의 MediaSource 컨텍스트가 파괴된 경우 미디어 요소가 (결국) 오류 상태로 전환되어야 하는가? 실험적인 Chromium 워커 MSE 구현은 해당 컨텍스트가 파괴되기 전과 동일하게 요소의 readyState, networkState 및 error를 유지하지만, seekable 및 buffered 속성은 각각 빈 TimeRange를 보고한다.
MediaSource가
Window에서
생성된 경우
TimeRanges
객체와 같게 한다.
activeSourceBuffers.length
가 0과 같지 않으면
다음 단계를 실행한다:
activeSourceBuffers에
있는
각 SourceBuffer 객체에 대해
buffered가 반환한
범위로 한다.
TimeRanges
객체와 같게 한다.
activeSourceBuffers에
있는
각 SourceBuffer 객체에 대해
다음 단계를 실행한다:
SourceBuffer의
buffered
속성이 반환한 범위와 같게 한다.
readyState
가 "ended"이면,
source ranges의 마지막 범위에서
종료 시간을 highest end time으로
설정한다.
Window
경우의 단계를 실행하여 얻은 TimeRanges로
하되, MediaSource와
그 SourceBuffer
객체를 해당 DedicatedWorkerGlobalScope에서
사용하여 실행하고,
activeSourceBuffers,
readyState 또는
activeSourceBuffers의
각
buffered 속성 값 중 하나를 변경하는
버퍼링 상태가 갱신될 때마다
[[port to main]]
암시적 메시지를 사용하여 통신한다.
recent intersection ranges를 이렇게 자주 다시 계산하고 통신하는 데 드는 오버헤드는 컨텍스트 간 통신 모델에서 언급한 공유 메모리와 잠금 같은 다른 메커니즘을 사용하여 필요할 때 이 정보를 조회할 수 있도록 구현에 유연성을 허용하는 이유 중 하나이다.
HTMLMediaElement의
srcObject
HTMLMediaElement의
srcObject
속성이 MediaSourceHandle로 할당되면,
요소의 로드 알고리즘을 호출하기 전에 수행되는 확장된
HTMLMediaElement의
srcObject
세터의 동기 단계의 일부로,
해당 MediaSourceHandle의
[[has ever been assigned as srcobject]]를
true로 설정합니다.
이는 해당 MediaSourceHandle 객체를
이후에 다시 전송하는 것을 방지하여,
그러한 시도가 있을 경우 명확한 동기 예외를 가능하게 합니다.
MediaSourceHandle을
HTMLMediaElement의
MediaProvider IDL typedef 및 관련 미디어 공급자 객체 텍스트에 추가할 필요가 있습니다.
본 섹션은 [HTML]의 AudioTrack
정의에 대한 확장을 명시합니다.
WebIDL[Exposed=Window]
partial interface AudioTrack {
readonly attribute SourceBuffer? sourceBuffer;
};
sourceBuffer의 형식은 SourceBuffer이며,
읽기 전용, nullable
가져올 때 다음 단계를 실행한다:
SourceBuffer에
의해 생성되었고, 해당
SourceBuffer가
그
상위 미디어 소스의
sourceBuffers
속성에서 제거되지 않은 경우:
SourceBuffer를
반환한다.
MediaSource가
DedicatedWorkerGlobalScope에서
생성된 경우,
이 트랙은 내부 create track 처리기에 의해 Window
HTMLMediaElement에
생성되는 반면, 이를 생성한
SourceBuffer는
DedicatedWorkerGlobalScope에
존재한다.
이들은 동일한 realm에
있지 않으므로 이 속성은
null을 반환한다.
본 섹션은 [HTML]의 VideoTrack
정의에 대한 확장을 명시합니다.
WebIDL[Exposed=Window]
partial interface VideoTrack {
readonly attribute SourceBuffer? sourceBuffer;
};
sourceBuffer의 형식은 SourceBuffer이며,
읽기 전용, nullable
가져올 때 다음 단계를 실행한다:
SourceBuffer에
의해 생성되었고,
해당 SourceBuffer가
그
상위 미디어 소스의
sourceBuffers
속성에서 제거되지 않은 경우:
SourceBuffer를
반환한다.
MediaSource가
DedicatedWorkerGlobalScope에서
생성된 경우,
이 트랙은 내부 create track 처리기에 의해 Window
HTMLMediaElement에
생성되는 반면, 이를 생성한
SourceBuffer는
DedicatedWorkerGlobalScope에
존재한다.
이들은 동일한 realm에
있지 않으므로 이 속성은
null을 반환한다.
본 섹션은 [HTML]의 TextTrack
정의에 대한 확장을 명시합니다.
WebIDL[Exposed=Window]
partial interface TextTrack {
readonly attribute SourceBuffer? sourceBuffer;
};
sourceBuffer의 형식은 SourceBuffer이며,
읽기 전용, nullable
가져올 때 다음 단계를 실행한다:
SourceBuffer에
의해 생성되었고,
해당 SourceBuffer가
그
상위 미디어 소스의
sourceBuffers
속성에서 제거되지 않은 경우:
SourceBuffer를
반환한다.
MediaSource가
DedicatedWorkerGlobalScope에서
생성된 경우,
이 트랙은 내부 create track 처리기에 의해 Window
HTMLMediaElement에
생성되는 반면, 이를 생성한
SourceBuffer는
DedicatedWorkerGlobalScope에
존재한다.
이들은 동일한 realm에
있지 않으므로 이 속성은
null을 반환한다.
appendBuffer()를 통해 SourceBuffer에 제공된 바이트는
논리적 바이트 스트림을 형성한다. 이러한 바이트 스트림의 형식과 의미 체계는 바이트 스트림 형식 명세에 정의되어 있다. 바이트 스트림
형식
레지스트리 [MSE-REGISTRY]는
addSourceBuffer(), isTypeSupported() 또는
changeType()에 전달할 수 있는 MIME
형식과,
새로 추가된 데이터를 구문 분석할 때 해당 MIME 형식을 사용하는 SourceBuffer가
예상하는 바이트 스트림 형식 간의 매핑을 제공한다. 상호 운용성을 향상시키기 위해 구현은
자신이 지원하는 바이트 스트림 형식의 매핑을 등록하도록 권장된다.
바이트 스트림 형식 레지스트리 [MSE-REGISTRY]는 이러한
매핑에 대한 권위 있는 출처이다. 구현이 레지스트리에 나열된 MIME 형식을 지원한다고 주장하는 경우, 해당
SourceBuffer 구현은 레지스트리 항목에 나열된 바이트 스트림
형식 명세를 준수해야 한다.
레지스트리의 바이트 스트림 형식 명세는 새로운 저장 형식을 정의하기 위한 것이 아니다. 이는 이 명세의 구현이 허용할 기존 저장 형식 구조의 하위 집합을 간략히 설명할 뿐이다.
바이트 스트림 형식의 구문 분석 및 유효성 검사는 세그먼트 파서 루프 알고리즘에서 구현된다.
이 절에서는 모든 바이트 스트림 형식 명세에 대한 일반적인 요구사항을 제공한다:
AudioTrack,
VideoTrack 및
TextTrack
속성 값을 초기화 세그먼트의 데이터에서 가져오기 위한 참조를
제공하는 것이 좋다.
바이트 스트림 형식이 인밴드 트랙 명세 [INBANDTRACKS]에서 다루는 것과 유사한 형식을 다루는 경우, 미디어 소스 확장을 사용하는 재생과 미디어 소스 확장을 사용하지 않는 재생이 동일한 트랙 정보를 제공하도록 동일한 속성 매핑을 사용하도록 해야 한다.
트랙의 수와 유형이 일관되지 않는다.
초기화 세그먼트 간에 지원되지 않는 코덱 변경이 발생한다.
코덱 변경에 대한 자세한 내용과 예는 초기화 세그먼트
수신 알고리즘,
addSourceBuffer()
및 changeType()을
참조한다.
비디오 프레임 크기 변경. 사용자 에이전트는 끊김 없는 재생을 지원해야 한다.
웹 애플리케이션이 CSS 또는 HTML 속성(width/height)을 사용하여 요소 크기를 제한하지 않으면 <video> 표시 영역의 크기가 변경된다.
오디오 채널 수 변경. 사용자 에이전트는 이를 끊김 없이 지원할 수 있으며, 다운믹싱을 트리거할 수도 있다.
채널 수를 변경하면 오디오 장치, 리샘플러 및 채널 믹서를 다시 초기화해야 할 수 있고, 이는 소리로 느껴지는 경향이 있으므로 구현 품질에 관한 문제이다.
예를 들어 I1이 M1, M2, M3과 연관되어 있다면 위 조건은 I1+M1, I1+M2, I1+M1+M2, I1+M2+M3 등의 모든 조합에 대해 충족되어야 한다.
바이트 스트림 명세는 최소한 위 요구사항이 충족되도록 보장하는 제약 조건을 정의해야 한다. 예를 들어 구현을 단순화하기 위해 추가 제약 조건을 정의할 수 있다.
비규범으로 표시된 섹션뿐만 아니라, 이 명세의 모든 제작 지침, 도표, 예제, 그리고 주석은 비규범적입니다. 이 명세의 나머지 모든 내용은 규범적입니다.
이 문서에서 MAY, MUST, MUST NOT, SHOULD, SHOULD NOT 키워드는, 여기에 표시된 것처럼 모두 대문자로 나타날 때에만 BCP 14 [RFC2119] [RFC8174]에 따라 해석되어야 합니다.
<video id="v" autoplay></video>
<script>
const video = document.getElementById("v");
const mediaSource = new MediaSource();
mediaSource.addEventListener("sourceopen", onSourceOpen);
video.src = window.URL.createObjectURL(mediaSource);
async function onSourceOpen(e) {
const mediaSource = e.target;
if (mediaSource.sourceBuffers.length > 0) return;
const sourceBuffer = mediaSource.addSourceBuffer(
'video/webm; codecs="vorbis,vp8"',
);
video.addEventListener("seeking", (e) => onSeeking(mediaSource, e.target));
video.addEventListener("progress", () =>
appendNextMediaSegment(mediaSource),
);
try {
const initSegment = await getInitializationSegment();
if (initSegment == null) {
// Error fetching the initialization segment. Signal end of stream with an error.
mediaSource.endOfStream("network");
return;
}
// Append the initialization segment.
sourceBuffer.addEventListener("updateend", function firstAppendHandler() {
sourceBuffer.removeEventListener("updateend", firstAppendHandler);
// Append some initial media data.
appendNextMediaSegment(mediaSource);
});
sourceBuffer.appendBuffer(initSegment);
} catch (error) {
// Handle errors that might occur during initialization segment fetching.
console.error("Error fetching initialization segment:", error);
mediaSource.endOfStream("network");
}
}
async function appendNextMediaSegment(mediaSource) {
if (
mediaSource.readyState === "closed" ||
mediaSource.sourceBuffers[0].updating
)
return;
// If we have run out of stream data, then signal end of stream.
if (!haveMoreMediaSegments()) {
mediaSource.endOfStream();
return;
}
try {
const mediaSegment = await getNextMediaSegment();
// NOTE: If mediaSource.readyState == "ended", this appendBuffer() call will
// cause mediaSource.readyState to transition to "open". The web application
// should be prepared to handle multiple "sourceopen" events.
mediaSource.sourceBuffers[0].appendBuffer(mediaSegment);
}
catch (error) {
// Handle errors that might occur during media segment fetching.
console.error("Error fetching media segment:", error);
mediaSource.endOfStream("network");
}
}
function onSeeking(mediaSource, video) {
if (mediaSource.readyState === "open") {
// Abort current segment append.
mediaSource.sourceBuffers[0].abort();
}
// Notify the media segment loading code to start fetching data at the
// new playback position.
seekToMediaSegmentAt(video.currentTime);
// Append a media segment from the new playback position.
appendNextMediaSegment(mediaSource);
}
function onProgress(mediaSource, e) {
appendNextMediaSegment(mediaSource);
}
// Example of async function for getting initialization segment
async function getInitializationSegment() {
// Implement fetching of the initialization segment
// This is just a placeholder function
}
// Example function for checking if there are more media segments
function haveMoreMediaSegments() {
// Implement logic to determine if there are more media segments
// This is just a placeholder function
}
// Example function for getting the next media segment
async function getNextMediaSegment() {
// Implement fetching of the next media segment
// This is just a placeholder function
}
// Example function for seeking to a specific media segment
function seekToMediaSegmentAt(currentTime) {
// Implement seeking logic
// This is just a placeholder function
}
</script>
<script>
async function setUpVideoStream() {
// Specific video format and codec
const mediaType = 'video/mp4; codecs="mp4a.40.2,avc1.4d4015"';
// Check if the type of video format / codec is supported.
if (!window.ManagedMediaSource?.isTypeSupported(mediaType)) {
return; // Not supported, do something else.
}
// Set up video and its managed source.
const video = document.createElement("video");
const source = new ManagedMediaSource();
video.controls = true;
await new Promise((resolve) => {
video.src = URL.createObjectURL(source);
source.addEventListener("sourceopen", resolve, { once: true });
document.body.appendChild(video);
});
const sourceBuffer = source.addSourceBuffer(mediaType);
// Set up the event handlers
sourceBuffer.onbufferedchange = (e) => {
console.log("onbufferedchange event fired.");
console.log(`Added Ranges: ${timeRangesToString(e.addedRanges)}`);
console.log(`Removed Ranges: ${timeRangesToString(e.removedRanges)}`);
};
source.onstartstreaming = async () => {
const response = await fetch("./videos/bipbop.mp4");
const buffer = await response.arrayBuffer();
await new Promise((resolve) => {
sourceBuffer.addEventListener("updateend", resolve, { once: true });
sourceBuffer.appendBuffer(buffer);
});
};
source.onendstreaming = async () => {
// Stop fetching new segments here
};
}
// Helper function...
function timeRangesToString(timeRanges) {
const ranges = [];
for (let i = 0; i < timeRanges.length; i++) {
ranges.push([timeRanges.start(i), timeRanges.end(i)]);
}
return "[" + ranges.map(([start, end]) => `[${start}, ${end})` ) + "]";
}
</script>
<body onload="setUpVideoStream()"></body>
편집자들은 이 명세에 기여해주신 Alex Giladi, Bob Lund, Chris Needham, Chris Poole, Chris Wilson, Cyril Concolato, Dale Curtis, David Dorwin, David Singer, Duncan Rowden, François Daoust, Frank Galligan, Glenn Adams, Jer Noble, Joe Steele, John Simmons, Kagami Sascha Rosylight, Kevin Streeter, Marcos Cáceres, Mark Vickers, Matt Ward, Matthew Gregan, Michael(tm) Smith, Michael Thornburgh, Mounir Lamouri, Paul Adenot, Philip Jägenstedt, Philippe Le Hegaret, Pierre Lemieux, Ralph Giles, Steven Robertson, 그리고 Tatsuya Igarashi께 감사드립니다.
본 섹션은 비규범적입니다.
이전 개정판(예: 권고안 후보의 섹션 5와 10)에 설명된
비디오 재생 품질 메트릭은
이제 [MEDIA-PLAYBACK-QUALITY]의 일부로 개발되고 있습니다.
일부 구현체는 이전 초안의 VideoPlaybackQuality 객체와
HTMLVideoElement
확장 메서드 getVideoPlaybackQuality()를
구현했을 수 있습니다.
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:
Referenced in: