Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
HTMLMediaElement
[HTML] を拡張し、
JavaScriptが再生用のメディアストリームを生成できるようにします。JavaScriptによるストリーム生成を許可することで、
アダプティブストリーミングやライブストリームのタイムシフトなど、さまざまな
ユースケースが容易になります。
この節では、公開時点におけるこの 文書の位置付けについて説明します。現在のW3C 公開文書の一覧およびこの技術報告書の最新版は、 W3C標準および草案 索引で確認できます。
編集上の更新に加えて、2016年11月にW3C勧告として公開されて以降の 実質的な変更点は次のとおりです:
changeType()メソッドの追加
MediaSourceオブジェクトを作成して使用できる
ようになったこと
URLオブジェクトに対するcreateObjectURL()
拡張の削除
ManagedMediaSource、ManagedSourceBuffer、および
BufferedChangeEvent
インターフェイスの追加
以前のバージョン以降に行われた変更の完全な一覧については、コミットを参照してください。
ワーキンググループは、編集者がまだ対応を試みていない すべてのバグ報告の一覧を管理しています。
実装者は、この仕様が安定していないことに注意する必要があります。議論に 参加していない実装者は、仕様が互換性のない形で 足元から変更される可能性があります。この仕様が最終的に候補勧告段階へ 到達する前に実装することに関心のあるベンダーは、GitHubリポジトリを追跡し、 議論に参加する必要があります。
この文書は、Mediaワーキンググループによって、 勧告 トラックを使用した作業草案として公開されました。
作業草案として 公開されたことは、W3Cおよびそのメンバーによる 承認を意味するものではありません。
これは草案文書であり、いつでも他の文書によって更新、置換、または廃止される 可能性があります。この文書を進行中の作業以外のものとして 引用することは不適切です。
この文書は、 W3C 特許 ポリシーの下で運営されるグループによって作成されました。 W3Cは、グループの成果物に関連して行われた 特許開示の公開一覧を管理しています。 そのページには、特許を開示するための 手順も含まれています。個人が、 必須クレームを含むと考える特許を 実際に知っている場合は、 W3C特許ポリシーの第6節に従って、その情報を開示しなければなりません。
この文書には、 2025年8月18日付W3Cプロセス文書が適用されます。
この節は非規範的です。
この仕様により、JavaScriptは<audio>および<video>用のメディアストリームを動的に
構築できます。この仕様は、HTMLMediaElementのメディアデータソースとして機能できるMediaSourceオブジェクトを
定義します。MediaSourceオブジェクトには、1つ以上の
SourceBufferオブジェクトがあります。アプリケーションは、データセグメントを
SourceBuffer
オブジェクトに追加し、システム性能やその他の
要因に基づいて、追加するデータの品質を調整できます。SourceBufferオブジェクトのデータは、デコードおよび再生される
音声、映像、テキストデータの
トラックバッファとして管理されます。これらの拡張機能で使用されるバイトストリーム仕様は、
バイトストリーム形式レジストリ[MSE-REGISTRY]で確認できます。
この仕様は、次の目的を念頭に置いて設計されています:
この仕様は、次の事項を定義します:
enabledである
audioTracks、
selectedである
videoTracks、
および
"showing"
または
"hidden"である
textTracksに
符号化フレームを提供するトラックバッファです。これらすべてのトラックは、
activeSourceBuffers
リスト内のSourceBufferオブジェクトに
関連付けられています。
追加中に符号化フレームを除外するために使用される、プレゼンテーションタイムスタンプの範囲です。
追加ウィンドウは、単一の開始時刻と
終了時刻を持つ、1つの連続した時間範囲を表します。この範囲内のプレゼンテーションタイムスタンプを持つ符号化フレームは、
SourceBufferに追加できますが、この範囲外の符号化フレームは
除外されます。追加ウィンドウの開始時刻と終了時刻は、それぞれ
appendWindowStart属性およびappendWindowEnd属性によって
制御されます。
プレゼンテーションタイムスタンプ、デコードタイムスタンプ、および 符号化フレームの継続時間を持つメディアデータの単位です。
符号化フレームの継続時間です。映像とテキストの場合、この継続時間は、 映像フレームまたはテキストを表示すべき時間の長さを示します。音声の場合、この継続時間は 符号化フレーム内に含まれるすべてのサンプルの合計を 表します。たとえば、音声フレームに441 samples @44100Hzが含まれている場合、フレームの継続時間は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のオリジンは、 メディア要素がcanvasによって 使用される方法に影響します。
SourceBufferオブジェクトの親メディアソースは、
そのオブジェクトを作成したMediaSourceオブジェクトです。
プレゼンテーション開始時刻は、プレゼンテーション内で最も早い時点であり、 初期再生 位置および可能な最も早い 位置を指定します。この仕様を使用して作成されるすべてのプレゼンテーションの 開始時刻は0です。
HTMLMediaElementの
bufferedに、
現在の再生位置を含むTimeRangesが
含まれているかどうかを判断する目的では、実装は、
プレゼンテーション開始時刻以降かつ最初の
TimeRangesより前にある現在の再生位置について、
その最初のTimeRangesが
プレゼンテーション開始時刻から1秒などの妥当に短い時間内に
開始する場合、その最初の
TimeRangesを
再生できるようにすることを選択してもよいものとします。この許容は、
多重化されたストリームでは通常、すべてのトラックが
プレゼンテーション開始時刻に正確に開始するわけではないという現実に対応するものです。
この許容に関係なく、実装は実際のバッファ済み範囲を報告しなければなりません。
符号化フレームのプレゼンテーション区間は、 そのプレゼンテーションタイムスタンプから、 プレゼンテーションタイムスタンプに符号化フレームの継続時間を加えた時刻までの時間区間です。 たとえば、符号化フレームのプレゼンテーション タイムスタンプが10秒で、符号化フレームの継続時間が100 ミリ秒である場合、 プレゼンテーション区間は[10-10.1)になります。範囲の開始は 含まれますが、範囲の終了は含まれないことに注意してください。
プレゼンテーション内で符号化フレームがレンダリングされる順序です。 プレゼンテーション 順序は、符号化フレームを、その プレゼンテーションタイムスタンプの単調増加 順に並べることで実現されます。
プレゼンテーション内の特定の時刻への参照です。 符号化フレーム内のプレゼンテーションタイムスタンプは、フレームをいつレンダリング すべきかを示します。
セグメント内の以前のデータに依存せずに、デコードと連続再生を 開始できるメディアセグメント内の位置です。映像の場合、これは Iフレームの位置である傾向があります。音声の場合、ほとんどの音声フレームを ランダムアクセスポイントとして扱えます。映像トラックでは通常、ランダムアクセスポイントの 分布がより疎であるため、これらのポイントの位置が、多重化ストリームの ランダムアクセスポイントと見なされます。
SourceBufferインスタンスが受け入れるバイト
ストリームの形式を記述する、特定のバイトストリーム形式仕様です。
SourceBufferオブジェクトのバイトストリーム形式仕様は、最初に、そのオブジェクトを
作成したaddSourceBuffer()呼び出しに渡された
typeに基づいて選択され、そのオブジェクトに対する
changeType()呼び出しによって
更新できます。
SourceBufferの構成
単一のMediaSourceインスタンスが所有する、
1つ以上のSourceBufferオブジェクトに分散された特定のトラックの組です。
実装は、次の構成を持つMediaSourceオブジェクトを少なくとも1つ
サポートしなければなりません:
MediaSourceオブジェクトは、上記の各構成をサポートしなければなりませんが、 一度にサポートする必要があるのは1つの構成だけです。複数の構成を 同時にサポートすること、または追加の構成をサポートすることは、実装品質の問題です。
単一のトラックについて、トラック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
MediaSourceの
sourceBuffers内の
SourceBufferオブジェクトへデータを追加できる状態です。
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オブジェクトを、
srcObjectを介して
HTMLMediaElementへ接続する際に
役立つハンドルが含まれます。この
MediaSourceオブジェクトでは、この属性へアクセスするたびに
ハンドルは同一のオブジェクトのままですが、
MediaSourceオブジェクトごとに異なります。
この仕様では、将来的にメインのWindowコンテキストにあるMediaSource
オブジェクトからも、この属性を参照できるようになる可能性があります。その場合、この属性へのアクセス時に
例外がスローされる場合など、後方互換性のない変更が生じる可能性を防ぐため、
仕様上の注意が必要になります。
取得時には、次の手順を実行します:
MediaSourceオブジェクトのハンドルがまだ
作成されていない場合は、
次の手順を実行します:
MediaSourceHandleオブジェクトと
関連リソースを作成し、この
MediaSourceへ内部的にリンクした結果とします。
MediaSourceHandle
オブジェクトを返します。
このMediaSourceに関連付けられた
SourceBufferオブジェクトのリストが
含まれます。MediaSourceのreadyStateが「closed」の場合、このリストは
空になります。readyStateが「open」へ移行すると、
addSourceBuffer()を使用して、
SourceBufferオブジェクトをこのリストへ追加できます。
selectedである
映像トラック、enabledである
音声トラック、および
"showing"
または
"hidden"である
テキスト
トラックを提供しているsourceBuffersのサブセットが含まれます。
このリスト内の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オブジェクトの作成を試みるなどの、
遅延が大きい検出用polyfillの必要性を軽減します。
新しいSourceBufferをsourceBuffersへ追加します。
TypeError
例外をスローし、
これらの手順を中止します。
sourceBuffers内の他のSourceBufferオブジェクトに指定されたタイプとの組み合わせで
サポートされていないMIMEタイプが含まれる場合は、NotSupportedError
例外をスローし、これらの
手順を中止します。
QuotaExceededError
例外をスローし、これらの手順を中止します。
たとえば、メディア要素がHAVE_METADATA
readyStateへ到達している場合、ユーザーエージェントはQuotaExceededError
例外をスローしてもよいものとします。これは、
ユーザーエージェントのメディアエンジンが再生中のトラック追加をサポートしていない場合に
発生する可能性があります。
readyState属性が
「open」状態でない場合は、
InvalidStateError
例外をスローし、これらの手順を中止します。
ManagedMediaSourceである場合は、
bufferを新しいManagedSourceBufferのインスタンスとし、
それ以外の場合は新しいSourceBufferのインスタンスとし、それぞれの
関連リソースも作成します。
[[generate timestamps flag]]を、
typeに関連付けられたメディアソース拡張™バイト
ストリーム形式レジストリのエントリにある
「Generate Timestamps Flag」列の値へ設定します。
[[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内で構築された場合:
AudioTrackList
オブジェクト、すなわちsourceBuffer.audioTracksが返す値とします。
AudioTrackList
オブジェクト、すなわちmedia elementの
audioTracks
属性が返す値とします。
sourceBuffer
属性を
nullに設定します。
これにより、AudioTrackList
[HTML]のロジックが、
SourceBuffer audioTracks
listを対象として、
TrackEventを使用し、
track
属性をaudio
trackで初期化して、
removetrackという名前の
イベントを
発火するためのタスクを
キューに入れる処理が起動されるはずです。
この削除手順の開始時に、audio trackの
enabled
属性がtrueであった場合は、
AudioTrackList
[HTML]のロジックが、
SourceBuffer audioTracks
listを対象として、
changeという名前のイベントを
発火するためのタスクを
キューに入れる処理も起動されるはずです。
これにより、AudioTrackList
[HTML]のロジックが、
HTMLMediaElement audioTracks
listを対象として、
TrackEventを使用し、
track
属性を
audio trackで初期化して、
removetrackという名前の
イベントを
発火するためのタスクを
キューに入れる処理が起動されるはずです。この
削除手順の開始時に、audio trackの
enabled
属性がtrueであった場合は、
AudioTrackList
[HTML]のロジックが、
HTMLMediaElement audioTracks
listを対象として、
changeという名前のイベントを
発火するためのタスクを
キューに入れる処理も起動されるはずです。
[[port to main]]へ内部remove trackメッセージを送信します。
Window内の
暗黙的ハンドラーは、次の手順を実行します:
AudioTrackList
オブジェクト、すなわちmedia elementの
audioTracks
属性が返す値とします。
これにより、AudioTrackList
[HTML]のロジックが、
HTMLMediaElement audioTracks
listを対象として、
TrackEventを使用し、
track
属性を
audio trackで初期化して、
removetrackという名前の
イベントを
発火するためのタスクを
キューに入れる処理が起動されるはずです。この
削除手順の開始時に、audio trackの
enabled
属性がtrueであった場合は、
AudioTrackList
[HTML]のロジックが、
HTMLMediaElement audioTracks
listを対象として、
changeという名前のイベントを
発火するためのタスクを
キューに入れる処理も起動されるはずです。
MediaSourceが
Window内で構築された場合:
VideoTrackList
オブジェクト、すなわちsourceBuffer.videoTracksが返す値とします。
VideoTrackList
オブジェクト、すなわちmedia elementの
videoTracks
属性が返す値とします。
sourceBuffer
属性を
nullに設定します。
これにより、VideoTrackList
[HTML]のロジックが、
SourceBuffer videoTracks
listを対象として、
TrackEventを使用し、
track
属性をvideo
trackで初期化して、
removetrackという名前の
イベントを
発火するためのタスクを
キューに入れる処理が起動されるはずです。
この削除手順の開始時に、video trackの
selected
属性がtrueであった場合は、
VideoTrackList
[HTML]のロジックが、
SourceBuffer videoTracks
listを対象として、
changeという名前のイベントを
発火するためのタスクを
キューに入れる処理も起動されるはずです。
これにより、VideoTrackList
[HTML]のロジックが、
HTMLMediaElement videoTracks
listを対象として、
TrackEventを使用し、
track
属性を
video trackで初期化して、
removetrackという名前の
イベントを
発火するためのタスクを
キューに入れる処理が起動されるはずです。この
削除手順の開始時に、video trackの
selected
属性がtrueであった場合は、
VideoTrackList
[HTML]のロジックが、
HTMLMediaElement videoTracks
listを対象として、
changeという名前のイベントを
発火するためのタスクを
キューに入れる処理も起動されるはずです。
[[port to main]]へ内部remove trackメッセージを送信します。
Window内の
暗黙的ハンドラーは、次の手順を実行します:
VideoTrackList
オブジェクト、すなわちmedia elementの
videoTracks
属性が返す値とします。
これにより、VideoTrackList
[HTML]のロジックが、
HTMLMediaElement videoTracks
listを対象として、
TrackEventを使用し、
track
属性を
video trackで初期化して、
removetrackという名前の
イベントを
発火するためのタスクを
キューに入れる処理が起動されるはずです。この
削除手順の開始時に、video trackの
selected
属性がtrueであった場合は、
VideoTrackList
[HTML]のロジックが、
HTMLMediaElement videoTracks
listを対象として、
changeという名前のイベントを
発火するためのタスクを
キューに入れる処理も起動されるはずです。
MediaSourceが
Window内で構築された場合:
TextTrackList
オブジェクト、すなわちsourceBuffer.textTracksが返す値とします。
TextTrackList
オブジェクト、すなわちmedia elementの
textTracks
属性が返す値とします。
sourceBuffer
属性を
nullに設定します。
これにより、TextTrackList
[HTML]のロジックが、
SourceBuffer
textTracks listを対象として、
TrackEventを使用し、
track
属性をtext
trackで初期化して、
removetrackという名前の
イベントを
発火するためのタスクを
キューに入れる処理が起動されるはずです。
この削除手順の開始時に、text trackの
mode
属性が
"showing"
または
"hidden"
であった場合は、
TextTrackList
[HTML]のロジックが、
SourceBuffer
textTracks listを対象として、
changeという名前の
イベントを
発火するためのタスクを
キューに入れる処理も起動されるはずです。
これにより、TextTrackList
[HTML]のロジックが、
HTMLMediaElement textTracks
listを対象として、
TrackEventを使用し、
track
属性をtext
trackで初期化して、
removetrackという名前の
イベントを
発火するためのタスクを
キューに入れる処理が起動されるはずです。
この削除手順の開始時に、text trackの
mode
属性が
"showing"
または
"hidden"
であった場合は、
TextTrackList
[HTML]のロジックが、
HTMLMediaElement textTracks
listを対象として、
changeという名前のイベントを
発火するためのタスクを
キューに入れる処理も起動されるはずです。
[[port to main]]へ内部remove trackメッセージを送信します。
Window内の
暗黙的ハンドラーは、次の手順を実行します:
TextTrackList
オブジェクト、すなわちmedia elementの
textTracks
属性が返す値とします。
これにより、TextTrackList
[HTML]のロジックが、
HTMLMediaElement textTracks
listを対象として、
TrackEventを使用し、
track
属性をtext
trackで初期化して、
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
例外をスローし、
これらの手順を中止します。
第
10.
HTMLMediaElementの拡張節で、HTMLMediaElementの
seekableの
動作を変更するために使用される[[live seekable range]]を
更新します。
このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければなりません:
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
オブジェクトに設定します。
MediaSourceが、指定されたMIMEタイプ用の
SourceBuffer
オブジェクトを作成できるかどうかを確認します。
このメソッドがtrueを返した場合、それはMediaSourceの
実装が、指定されたMIMEタイプ用のSourceBufferオブジェクトを作成できることだけを
示します。
新しいSourceBufferの追加をサポートするために十分なリソースを
利用できない場合、addSourceBuffer()の
呼び出しは、それでも失敗すべきです。
このメソッドがtrueを返す場合、HTMLMediaElementの
canPlayType()は、
"maybe"または"probably"を返すことになります。HTMLMediaElementが再生できないと認識している
タイプをMediaSourceが
サポートすることに意味はないためです。
このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければなりません:
| イベント名 | インターフェイス | ディスパッチされる条件... |
|---|---|---|
| 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へ接続されている場合、各コンテキストには、
もう一方のコンテキストの情報に依存するアルゴリズムがあります。
HTMLMediaElementは、
Window
コンテキストにのみ公開されますが、MediaSourceおよび
この仕様で定義される関連オブジェクトは、Window
コンテキストと
DedicatedWorkerGlobalScope
コンテキストに公開されます。これにより、アプリケーションは、
これらのいずれかの種類のコンテキストでMediaSourceオブジェクトを構築し、
メディア要素への
接続アルゴリズムで説明されているように、
MediaSourceオブジェクトURLまたは
MediaSourceHandleを使用して、
Window
コンテキスト内のHTMLMediaElement
オブジェクトへ接続できます。
MediaSourceオブジェクトはTransferableではなく、
作成されたコンテキスト内でのみ
参照できます。
この節の残りでは、Windowの
メディア要素をDedicatedWorkerGlobalScopeの
MediaSourceへ接続する際の、情報遅延の上限を定めるモデルについて説明します。
このモデルではメッセージの受け渡しを使用した
通信を説明していますが、実装は、共有メモリやロックを
使用するなど、より高速になり得る方法で通信することを選択してもよいものとします。
Windowの
MediaSourceへの同期的な接続では、
コンテキスト間で情報を通信しなくても、その情報をすでに利用できます。
DedicatedWorkerGlobalScope内で構築された
MediaSourceには、
接続時に設定され、切り離し時にnullへ設定される
MessagePortを
格納する[[port to main]]内部スロットがあります。
Windowの
[[port to main]]は、常にnullです。
この仕様によって拡張され、
DedicatedWorkerGlobalScopeの
MediaSourceへ接続されたHTMLMediaElementにも同様に、
MessagePortを格納する[[port to worker]]内部スロットと、
MessageChannelを格納する
[[channel with worker]]
内部スロットがあり、
どちらも接続時に設定され、切り離し時に
nullへ設定されます。[[port to worker]]と[[channel with worker]]は、
DedicatedWorkerGlobalScopeの
MediaSourceへ接続されていない限り、どちらもnullです。
この仕様のアルゴリズムが、Windowの
HTMLMediaElementから、
接続されたDedicatedWorkerGlobalScopeの
MediaSourceへ、または
その逆方向へ情報を伝達する必要がある場合、これらの内部ポートを暗黙的に使用して
対応する相手へメッセージを送信し、メッセージの暗黙的なハンドラーが、
アルゴリズムに記述された手順を実行します。
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の使用よりも望ましくないこの慣用法がさらに広まり、 ユーザーエージェントの相互運用性に関するリスクと 実装の複雑さが不必要に増加します。
DedicatedWorkerGlobalScope内で
構築されたMediaSourceは、
handleを使用してハンドルを取得し、その
MediaSourceHandleを
Window
コンテキストへ転送して、メディア要素のsrcObject
属性へ代入することによってのみ接続できます。
この仕様をHTMLMediaElementの
リソース
読み込みおよび取得アルゴリズムと整合させる目的では、基礎となるDedicatedWorkerGlobalScopeの
MediaSourceが、そこで言及されるMediaSourceオブジェクトであり、
MediaSourceHandle
オブジェクトがメディアプロバイダーオブジェクトです。
メディアプロバイダーオブジェクトが
MediaSourceオブジェクト、MediaSourceHandleオブジェクト、または
オブジェクトがMediaSourceオブジェクトであるURLレコードの場合に、
リソース
取得アルゴリズムが呼び出された場合は、modeをlocalとし、
リソース
取得アルゴリズムの最初の手順(この手順では、それ以外の場合にmodeをremoteへ設定することがあります)をスキップし、
リソース
取得アルゴリズムの実行を継続します。
リソース
取得アルゴリズムの最初の手順は、最終的に、オブジェクトがメディアプロバイダーオブジェクトである
URLレコードにlocal modeを選択する処理と整合することが想定されています。
HTMLMediaElementの
src
属性、または選択された子
sourceの
src
属性が、それぞれのsrc属性が最後に変更された時点で
MediaSourceオブジェクトURLと一致するblob:
URLである場合、
そのMediaSourceオブジェクトを、
リソース
取得アルゴリズムのlocal modeのロジックにおけるメディアプロバイダーオブジェクトおよび現在のメディア
リソースとして使用することが意図されています。これは、MediaSourceオブジェクトが接続されている場合、
preload属性の監視を含むremote modeのロジックがスキップされることも
意味します。[HTML]にその最終的な変更が加えられた後でも、
現在のメディアリソースがMediaSourceオブジェクトである場合は、
local modeのロジックの先頭で次の手順を実行する必要があります。
リソース 取得アルゴリズムの「それ以外の場合(modeはlocal)」節の先頭で、以下の追加手順を 実行します。
メディア要素のリソース選択 アルゴリズムを起動したアクションに対して、これらの手順は非同期です。 リソース選択アルゴリズムを呼び出したタスクの続行が許可され、安定状態へ 到達した後に、リソース 取得アルゴリズムが実行されます。実装は、MediaSourceオブジェクトを使用できる状態になるまで、以下の 「それ以外の場合」句の手順を遅延させてもかまいません。
MediaSourceオブジェクト、MediaSourceHandle
オブジェクト、またはオブジェクトがMediaSourceオブジェクトであるURLレコードの場合に、
リソース
取得アルゴリズムが呼び出された場合:
DedicatedWorkerGlobalScope内で構築された
MediaSourceをオブジェクトとして持つURLレコードである場合、たとえば、
DedicatedWorkerGlobalScopeの
MediaSourceの
MediaSourceオブジェクトURLを
使用しようとした場合
MediaSourceのhandleを
転送し、メディア要素の
srcObject
属性へ代入することが、このような
MediaSourceを接続する唯一の方法です。
MediaSourceHandleであり、その
[[Detached]]
内部スロットがtrueである場合
MediaSourceHandleであり、その基礎となる
MediaSourceの
[[has ever been attached]]
内部スロットが
trueである場合
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の
レルムを使用して、
StructuredDeserializeWithTransferを実行し、
[[port to main]]を、
転送されたport2
の値をデシリアライズした結果の複製、すなわち[[channel with worker]]の値に
設定します。
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は、リソース 取得アルゴリズムのremote modeの手順を使用しないため、メディア要素は"suspend"イベントを発火しません。 この仕様の将来のバージョンでは、MediaSourceが接続されたメディア要素から "progress"イベントと"stalled"イベントが削除される可能性がありますが、このバージョンの 仕様に適合するユーザーエージェントは、これらの[HTML]参照が この仕様の実装が安定した後に 変更されたため、これら2つのイベントを引き続き発火する可能性があります。
次の手順は、メディア要素が
NETWORK_EMPTYへ
移行し、メディア要素を対象として
emptiedという
名前のイベントを発火するための
タスクをキューに入れる
すべての場合に実行されます。これらの手順は、移行の直前に実行
すべきです。
MediaSourceが
DedicatedWorkerGlobalScope内で構築された場合:
[[port to worker]]へ
内部detachメッセージを送信して、
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に更新します。
activeSourceBuffersから、
すべてのSourceBufferオブジェクトを
削除します。
activeSourceBuffersを対象として、
removesourcebufferという名前の
イベントを
発火するためのタスクをキューに入れます。
sourceBuffersから、
すべてのSourceBufferオブジェクトを
削除します。
sourceBuffersを対象として、
removesourcebufferという名前の
イベントを
発火するためのタスクをキューに入れます。
MediaSourceを対象として、
sourcecloseという名前の
イベントを
発火するためのタスクをキューに入れます。
今後、このアルゴリズムは外部から呼び出され、接続されている
MediaSourceが存在する場合に、
それをメディア要素から切り離す必要があるすべての場合に実行されることが意図されています。
このアルゴリズムは、メディア要素が
NETWORK_EMPTYへ
移行するときに加えて、またはその代わりに、HTMLMediaElement [HTML]の
load()などの操作や、リソース
取得アルゴリズムの失敗時に呼び出されることもあります。
リソース取得アルゴリズムの失敗とは、
リソース取得アルゴリズムまたはリソース選択アルゴリズムのいずれかを中止するものです。
ただし、「最終手順」[HTML]は、切り離しを起動する
失敗とは見なされません。
シークアルゴリズムの 「新しい再生位置のメディアデータを利用できるかどうかをユーザーエージェントが確定するまで待機し、 利用できる場合は、その位置を再生するために十分なデータを デコードするまで待機する」手順の一部として、次の手順を実行します:
メディア要素は、
activeSourceBuffers内の
各SourceBufferオブジェクトで、
new playback
positionを含むメディア
セグメントを探します。
HTMLMediaElementの
buffered
属性の現在値に含まれる
TimeRanges内の
すべての位置では、その位置に必要なすべてのメディアセグメントがバッファされています。
HTMLMediaElementの
bufferedに含まれるいずれの
TimeRanges内にも存在しない場合
HTMLMediaElementの
readyState属性が
HAVE_METADATAより大きい場合は、
HTMLMediaElementの
readyState属性を
HAVE_METADATAに設定します。
HTMLMediaElementの準備状態
[HTML]のロジックに従い、
HTMLMediaElementの
readyStateの変更により、
HTMLMediaElement上でイベントが起動される場合があります。
appendBuffer()の
呼び出しによって、符号化フレーム処理
アルゴリズムが、
HTMLMediaElementの
readyState属性を
HAVE_METADATAより大きい値に
設定するまで待機します。
ウェブアプリケーションは、buffered
および
HTMLMediaElementの
bufferedを使用して、
メディア要素が再生を再開するために必要なものを
判断できます。
readyState
属性が「ended」で、
new playback positionが、
TimeRangesのうち、現在
HTMLMediaElementの
buffered内にあるものの範囲内である場合、
現在選択または有効化されている1つ以上のトラックバッファの最大範囲終了タイムスタンプが
new
playback
positionより小さい場合でも、シーク操作は
ここで完了まで続行しなければなりません。この条件は、
readyStateが
「ended」の場合のbufferedのロジックによってのみ
発生するはずです。
次の手順は、activeSourceBuffers内の
すべてのSourceBufferオブジェクトに、
途切れない再生を保証するのに十分なデータがあることを確認するため、
再生中に定期的に実行されます。activeSourceBuffersへの変更も、
状態遷移を起動する条件に影響するため、
これらの手順を実行させます。
途切れない再生を
保証するのに十分なデータがあるとは、
プレゼンテーションを意味のある期間にわたって停止させずに再生できる
十分なデータが現在あるとユーザーエージェントが判断する、実装固有の条件です。
この条件は、メディア要素を
HAVE_ENOUGH_DATA
準備状態へ移行させる時点、およびそこから移行させる時点を決定するため、継続的に評価されます。
これらの遷移は、それぞれ、十分なデータがバッファされているとユーザーエージェントが判断した時点、
またはより多くのデータが必要だと判断した時点を示します。
実装は、十分なデータがある時点を判断するために、バッファされたバイト数、バッファされた時間、
追加速度、または適切と判断するその他の指標を使用することを
選択してもよいものとします。使用される指標は再生中に
変更される場合があるため、ウェブアプリケーションは、
さらにデータが必要かどうかを判断する際に、
HTMLMediaElementの
readyStateの値だけに依存
すべきです。
メディア要素がさらにデータを必要とするとき、ユーザーエージェントは、
ウェブアプリケーションが再生を中断させずに対応できるほど十分に早く、
HAVE_ENOUGH_DATAから
HAVE_FUTURE_DATAへ
移行すべきです。
たとえば、現在の再生位置がバッファ済みデータの終端より500ms前にある時点で移行すれば、
再生が停止するまでに、アプリケーションがさらにデータを追加するための
約500msが与えられます。
HTMLMediaElementの
readyState属性が
HAVE_NOTHINGと等しい場合:
HTMLMediaElementの
bufferedに、
現在の再生位置を含む
TimeRangesが
存在しない場合:
HTMLMediaElementの
readyState属性を
HAVE_METADATAに設定します。
HTMLMediaElementの準備状態
[HTML]のロジックに従い、
HTMLMediaElementの
readyStateの変更により、
HTMLMediaElement上でイベントが
起動される場合があります。
HTMLMediaElementの
bufferedに、
現在の再生位置と途切れない再生を保証する
のに十分なデータを含むTimeRangesが
存在する場合:
HTMLMediaElementの
readyState属性を
HAVE_ENOUGH_DATAに設定します。
HTMLMediaElementの準備状態
[HTML]のロジックに従い、
HTMLMediaElementの
readyStateの変更により、
HTMLMediaElement上でイベントが
起動される場合があります。
HAVE_CURRENT_DATAへの
移行によって再生が一時停止されていた場合は、この時点で再開されることがあります。
HTMLMediaElementの
bufferedに、
現在の再生位置と、その位置より後の一定時間を含むTimeRangesが
存在する場合は、次の手順を実行します:
HTMLMediaElementの
readyState属性を
HAVE_FUTURE_DATAに設定します。
HTMLMediaElementの準備状態
[HTML]のロジックに従い、
HTMLMediaElementの
readyStateの変更により、
HTMLMediaElement上でイベントが
起動される場合があります。
HAVE_CURRENT_DATAへの
移行によって再生が一時停止されていた場合は、この時点で再開されることがあります。
HTMLMediaElementの
bufferedに、
現在の再生位置で終了し、現在位置の直後の時間を
覆う範囲を持たないTimeRangesが
存在する場合:
HTMLMediaElementの
readyState属性を
HAVE_CURRENT_DATAに設定します。
HTMLMediaElementの準備状態
[HTML]のロジックに従い、
HTMLMediaElementの
readyStateの変更により、
HTMLMediaElement上でイベントが
起動される場合があります。
再生中に、selectedである
映像トラック、enabledである
音声トラック、またはテキストトラックの
modeが
変更された場合は、activeSourceBuffersを
更新する必要があります。これらの変更が1つ以上発生した場合は、
次の手順に従う必要があります。AudioTrack、
VideoTrack、
TextTrack
オブジェクト、およびそれぞれのAudioTrackList、
VideoTrackList、
TextTrackListは、
Windowの
HTMLMediaElement上でのみ公開されるため、
これらの変更は常に
Window
コンテキストで発生します。MediaSourceが
DedicatedWorkerGlobalScope内で構築された場合、
このような各変更は、[[port to worker]]へ
内部update track stateメッセージを送信することで、
DedicatedWorkerGlobalScopeへ
通知されなければなりません。その暗黙的なハンドラーは、
影響を受けるトラックを作成したSourceBufferについて、
次の手順を実行します。MediaSourceがWindow内で構築された場合、
次の手順は直接実行されます。
SourceBufferが、
他の有効化済みトラックに関連付けられていない場合は、次の手順を実行します:
activeSourceBuffersから、
SourceBufferを削除します。
activeSourceBuffersを対象として、
removesourcebufferという名前の
イベントを発火するための
タスクを
キューに入れます
SourceBufferが、
activeSourceBuffersに
まだ存在しない場合は、次の手順を実行します:
SourceBufferを
activeSourceBuffersへ追加します。
activeSourceBuffersを対象として、
addsourcebufferという名前の
イベントを発火するための
タスクを
キューに入れます
SourceBufferが、
他の有効化済みまたは選択済みのトラックに関連付けられていない場合は、
次の手順を実行します:
SourceBufferを、
activeSourceBuffersから削除します
activeSourceBuffersを対象として、
removesourcebufferという名前の
イベントを発火するための
タスクを
キューに入れます
SourceBufferが、
activeSourceBuffersにまだ存在しない場合は、
次の手順を実行します:
SourceBufferを、
activeSourceBuffersへ追加します
activeSourceBuffersを対象として、
addsourcebufferという名前の
イベントを発火するための
タスクを
キューに入れます
modeが
"disabled"になり、
このトラックに関連付けられたSourceBufferが、
他の有効化済みまたは選択済みのトラックに関連付けられていない場合は、
次の手順を実行します:
SourceBufferを、
activeSourceBuffersから削除します
activeSourceBuffersを対象として、
removesourcebufferという名前の
イベントを発火するための
タスクを
キューに入れます
modeが
"showing"
または
"hidden"になり、
このトラックに関連付けられたSourceBufferが
activeSourceBuffersにまだ存在しない場合は、
次の
手順を実行します:
SourceBufferを、
activeSourceBuffersへ追加します
activeSourceBuffersを対象として、
addsourcebufferという名前の
イベントを発火するための
タスクを
キューに入れます
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、
またはDedicatedWorkerGlobalScopeの
いずれかから接続されたMediaSourceから、
Window上で
手順を実行するために使用されます。通常は、接続された
HTMLMediaElementの状態を
更新するために使用されます。このアルゴリズムは、
Window上で実行する手順を列挙する
stepsパラメーターを取ります。
MediaSourceがDedicatedWorkerGlobalScope内で構築された場合:
[[port to main]]へ内部mirror on windowメッセージを送信します。
Window内の
暗黙的なハンドラーがstepsを実行します。そのハンドラーがメッセージを受信するのを
待たずに、呼び出し元へ制御を返します。
Windowタスクの
実行途中で何らかの形で実行されるのではなく、
Window上の
独立したタスクとして非同期に実行されます。
DedicatedWorkerGlobalScope上での
このアルゴリズムの同期的な実行と復帰をブロックせずに実行されます。
MediaSourceHandleインターフェイスは、MediaSourceオブジェクトのプロキシを表します。これは、
DedicatedWorkerGlobalScopeの
MediaSourceをWindowの
HTMLMediaElementに、
srcObjectを使用してアタッチする際に有用です。これは、メディア要素へのアタッチ
アルゴリズムで説明されています。
コンテキストをまたぐMediaSourceをメディア要素にアタッチするには、この独立したオブジェクトが必要です。これは、MediaSourceオブジェクト自体はイベントターゲットであるため、
転送可能ではないからです。
各MediaSourceHandleオブジェクトには、booleanを格納する[[has ever
been assigned as srcobject]]内部スロットがあります。これは、MediaSourceHandleオブジェクトの作成時にfalseに初期化され、
HTMLMediaElementの拡張された
srcObject
セッター内で、10.
HTMLMediaElementの拡張節の説明に従ってtrueに設定されます。また、trueである場合、4.1
転送節で説明されているように、MediaSourceHandleの正常な転送を妨げます。
MediaSourceHandleオブジェクトはTransferableであり、それぞれに
[[Detached]]内部スロットがあります。これは、ハンドルオブジェクトのインスタンスが一度転送された後、そのインスタンスを再び転送できないようにするために使用されます。
WebIDL[Transferable, Exposed=(Window,DedicatedWorker)]
interface MediaSourceHandle {};
MediaSourceHandleの転送手順
および転送受信手順では、実装が基礎となる
MediaSourceを参照する暗黙の内部スロットを維持する必要があります。これにより、
srcObjectを使用したメディア要素へのアタッチと、それに続くアタッチメントのコンテキスト間通信モデルの設定が可能になります。
実装者は、Transferableによって暗示される「move」セマンティクスの想定が、必ずしも現実と一致しないことに留意すべきです。たとえば、ブロードキャストを使用するpostMessageの拡張または内部実装により、転送されたMediaSourceHandleに意図しない複数の受信者が生じる可能性があります。
このため実装は、基礎となるMediaSourceオブジェクトのいずれかのハンドルが、メディア要素のリソース選択アルゴリズムの非同期部分で使用されるまでは、また使用されない限り、転送されたMediaSourceHandleの潜在的なクローンのうち、どれがアタッチに対して引き続き有効であるかを確定しないよう案内されています。
これは、容易に複製できる既存のMediaSourceオブジェクトURLを介したアタッチの動作と似ています。そのようなURLは、その潜在的に多数のクローン全体で、最大1回のアタッチ開始に対してのみ有効です。
実装は、MediaSourceHandleの基礎となるMediaSourceオブジェクトについて、MediaSourceHandleがTransferableの実装の違いによって複製される可能性にかかわらず、
srcObjectを介したアタッチ(ロード)を、その存続期間全体で最大1回のみサポートしなければなりません。
メディア要素のリソース選択アルゴリズムの非同期部分でこれがどのように強制されるかについては、メディア要素へのアタッチを参照してください。
MediaSourceHandleは、Window
およびDedicatedWorkerGlobalScopeのコンテキストでのみ公開され、異なるエージェントクラスター間で正常に転送することはできません[ECMASCRIPT]。MediaSourceHandleオブジェクトの転送は、同じエージェントクラスター内でのみ成功できます。
たとえば、Window
またはDedicatedWorkerGlobalScopeのいずれかからSharedWorkerまたはServiceWorkerのいずれかへのMediaSourceHandleオブジェクトの転送は成功しません。開発者は、多様な方法で通信できるDOMStringであるMediaSourceオブジェクトURLとのこの違いに留意すべきです。それでも、MediaSourceオブジェクトURLを使用するメディア要素へのアタッチは、Windowコンテキストで構築されたMediaSourceに対してのみ成功できます。
また、WebアプリケーションAPI向けのエージェント
およびエージェントクラスター形式体系の統合[HTML]も参照してください。そこでは、専用ワーカーエージェントなどの関連概念が定義されています。
MediaSourceHandleオブジェクトの転送手順には、次の手順を含めなければなりません。
MediaSourceHandleの
[[has ever been assigned as srcobject]]
内部スロットがtrueである場合、転送手順は
DataCloneError例外をスローすることによって失敗しなければなりません。
WebIDLenum AppendMode {
"segments",
"sequence",
};
segments
sequence
timestampOffset
属性が更新されます。「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コンテキストにのみ公開されます。
DedicatedWorkerGlobalScopeからSourceBufferを使用する場合、そのトラックは代わりに、アタッチ先のWindowの
HTMLMediaElement上に作成され、その所有となります。これは、初期化セグメント受信アルゴリズムで説明されています。
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]]を、typeに関連付けられたバイトストリーム形式レジストリ[MSE-REGISTRY]のエントリーにある「Generate
Timestamps Flag」列の値に更新します。
[[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という名前のイベントを発火します。
トラックバッファは、個々のトラックのトラック記述および符号化フレームを格納します。トラックバッファは、初期化セグメントおよびメディアセグメントがSourceBufferに追加されるのに伴って更新されます。
各トラックバッファには、現在の符号化フレームグループに最後に追加された符号化フレームのデコードタイムスタンプを格納する最終デコードタイムスタンプ 変数があります。この変数は、まだ 符号化フレームが追加されていないことを示すため、初期状態では未設定です。
各トラックバッファには、現在の符号化フレームグループに最後に追加された符号化フレームの符号化フレーム継続時間を格納する最終フレーム継続時間 変数があります。この変数は、まだ 符号化フレームが追加されていないことを示すため、初期状態では未設定です。
各トラックバッファには、このトラックバッファに追加された現在の符号化フレームグループ内のすべての符号化フレームのうち、最大の符号化フレーム終了タイムスタンプを格納する最大終了タイムスタンプ 変数があります。 この変数は、まだ符号化フレームが追加されていないことを示すため、初期状態では未設定です。
各トラックバッファには、トラックバッファがランダムアクセスポイントの符号化フレームを待っているかどうかを追跡する ランダムアクセスポイント要求フラグ 変数があります。この変数は、トラックバッファに何かを追加できるようになる前に、ランダムアクセスポイントの 符号化フレームが必要であることを示すため、最初にtrueに設定されます。
各トラックバッファには、トラックバッファに現在格納されている符号化フレームが占有するプレゼンテーション時間範囲を表す トラックバッファ範囲 変数があります。
トラックバッファ範囲の場合、これらのプレゼンテーション時間範囲は、プレゼンテーションタイムスタンプ、フレーム継続時間、および多重化されたSourceBuffer内の複数のトラックバッファにまたがる符号化フレームグループについて、場合によってはその開始時刻に基づきます。
仕様上、この情報は
正規化された
TimeRangesオブジェクトに格納されているかのように扱われます。積集合を取ったトラックバッファ範囲は、
HTMLMediaElementの
bufferedを報告するために使用されるため、HTMLMediaElementの
bufferedの各範囲内で、中断のない再生をサポートしなければなりません。
これらの符号化フレームグループ開始時刻は、不連続の後にすべてのトラックバッファにわたって最も早いプレゼンテーションタイムスタンプであるという点で、符号化フレーム処理アルゴリズムで言及されるものとはわずかに異なります。不連続は、modeにかかわらず、
符号化フレーム処理アルゴリズム内で発生することも、符号化フレーム削除アルゴリズムの結果として生じることもあります。トラックバッファ範囲が互いに分離しているかどうかを判定するしきい値は、実装固有です。たとえば、予期しない再生停止を減らすために、実装は、このトラックバッファでそれまでにバッファリングされた最大フレーム継続時間の2倍よりも小さい間隔で区切られた隣接範囲を結合することにより、符号化フレーム処理アルゴリズムの不連続検出ロジックを近似してもよいです。実装は、予期しない再生停止をさらに減らすために、多重化されたSourceBuffer内の複数のトラックバッファにわたって、符号化フレームグループ開始時刻を範囲開始時刻として使用してもよいです。
| イベント名 | インターフェイス | 発行される条件… |
|---|---|---|
| updatestart |
Event
|
SourceBufferのupdatingが
falseからtrueに移行したとき。
|
| update |
Event
|
SourceBufferの
追加または削除が正常に完了し、SourceBufferの
updatingが
trueからfalseに移行したとき。
|
| updateend |
Event
|
SourceBufferの追加または削除が終了したとき。
|
| error |
Event
|
SourceBufferへの追加中にエラーが発生し、updatingが
trueからfalseに移行したとき。
|
| abort |
Event
|
SourceBufferへの追加が
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オブジェクトには、符号化フレームを
符号化フレーム処理アルゴリズムへ渡す際に、タイムスタンプを生成する必要があるかどうかを追跡するbooleanである[[generate timestamps
flag]]内部スロットがあります。このフラグは、
SourceBufferオブジェクトの作成時に
addSourceBuffer()によって設定され、
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]]に1つ以上の完全な符号化フレームが含まれている場合、符号化フレーム処理アルゴリズムを実行します。
符号化フレーム処理アルゴリズムを実行する頻度は実装固有です。符号化フレーム処理アルゴリズムは、入力バッファに完全なメディアセグメントが含まれたときに呼び出してもよく、完全な符号化フレームが入力バッファに追加されるのに伴って複数回呼び出してもよいです。
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属性をfalseに設定します。
SourceBuffer
オブジェクトでerrorという名前のイベントを
発火します。
SourceBuffer
オブジェクトでupdateendという名前のイベントを
発火します。
decode」に設定して、ストリーム終了アルゴリズムを実行します。
追加操作が開始されると、SourceBufferを検証して準備するため、次の手順を実行します。
SourceBufferが
親メディアソースのsourceBuffers
属性から削除されている場合、InvalidStateError例外をスローし、
これらの手順を中止します。
updating属性がtrueである場合、
InvalidStateError例外をスローし、これらの手順を中止します。
MediaSourceが
Window内で構築された場合
HTMLMediaElementの
error属性がnullでない場合、recent element errorをtrueとします。その属性がnullである場合、
recent element errorをfalseとします。
Windowの場合の手順によって得られる値とします。ただし、その手順は、
Windowの
HTMLMediaElementの
error属性が変更されるたびにその要素上で実行され、その結果は
[[port to worker]]の暗黙的なメッセージを使用して伝達されます。そのようなメッセージがまだ受信されていない場合、recent element errorを
falseとします。
InvalidStateError例外をスローし、
これらの手順を中止します。
親メディアソースの
readyState属性が
「ended」状態である場合、次の手順を実行します。
readyState属性を
「open」に設定します。
sourceopenという名前のイベントを発火します。
[[buffer full flag]]がtrueと等しい場合、
QuotaExceededError例外をスローし、これらの手順を中止します。
これは、追加を収容するために十分なデータを実装が追い出せなかったか、追加が大きすぎることを示すシグナルです。Webアプリケーションは、
remove()を使用して明示的に領域を解放するか、追加のサイズを縮小する、またはその両方を行うべきです。
appendBuffer()が呼び出されると、追加されたデータを処理するために次の手順が実行されます。
updating属性をfalseに設定します。
SourceBuffer
オブジェクトでupdateという名前のイベントを
発火します。
SourceBuffer
オブジェクトでupdateendという名前のイベントを
発火します。
呼び出し元が、他のSourceBufferの更新をブロックし、JavaScriptから可視な範囲削除操作を開始する必要がある場合、次の手順に従います。
updating属性をtrueに設定します。
SourceBufferオブジェクトで
updatestartという名前のイベントを
発火します。
updating属性をfalseに設定します。
SourceBuffer
オブジェクトでupdateという名前のイベントを
発火します。
SourceBuffer
オブジェクトでupdateendという名前のイベントを
発火します。
セグメントパーサーループが完全な 初期化セグメントの解析に成功したとき、次の手順を実行します。
各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を含む映像トラックが初期化セグメントに現れた場合、上記の他の2つのプロパティ検査に合格していても、ユーザーエージェントはこの手順を使用してデコードエラーを発生させてもよいです。実装には、コーデックが実際にサポートされていない場合、または他の2つのプロパティ検査が失敗した場合にのみ、このようなエラーを発生させることが推奨されます。Web制作者には、ユーザーエージェントのサポートをより能動的に検出するため、正確なコーデック引数を指定してchangeType()、
addSourceBuffer()およびisTypeSupported()を使用することが推奨されます。SourceBufferオブジェクトのバイトストリーム形式が変更される場合、
changeType()が必要です。
[[first initialization segment received flag]]がfalseである場合、次の手順を実行します。
本来はサポートされるコーデックであっても、次のいずれかに渡されたtype引数で指定されていなかった場合、ユーザーエージェントはここで「サポートされていない」と見なしてもよいです。(a)このSourceBufferオブジェクトで直近に正常終了したchangeType()、または(b)このオブジェクトで正常終了した
changeType()がまだない場合、このSourceBufferオブジェクトを作成した
addSourceBuffer()。
たとえば、
MediaSource.isTypeSupported('video/webm;codecs="vp8,vorbis"')がtrueを返しても、
addSourceBuffer()が
'video/webm;codecs="vp8"'を指定して呼び出され、Vorbisトラックが初期化セグメントに現れた場合、ユーザーエージェントはこの手順を使用してデコードエラーを発生させてもよいです。
実装には、コーデックが実際にサポートされていない場合にのみ、このようなエラーを発生させることが推奨されます。Web制作者には、ユーザーエージェントのサポートをより能動的に検出するため、正確なコーデック引数を指定して
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属性に追加します。
これにより、このSourceBufferオブジェクトの
audioTracks属性が参照する
AudioTrackListオブジェクトで、track属性を
new audio
trackに初期化した
TrackEventを使用して
addtrackという名前のイベントを発火するタスクをキューに入れる
AudioTrackList
[HTML]のロジックが起動されるはずです。
SourceBufferオブジェクトの親メディアソースがアタッチされているメディア要素とします。
audioTracks属性に追加します。
これにより、media
elementの
audioTracks属性が参照する
AudioTrackListオブジェクトで、track属性を
new audio
trackに初期化した
TrackEventを使用して
addtrackという名前のイベントを発火するタスクをキューに入れる
AudioTrackList
[HTML]のロジックが起動されるはずです。
create trackメッセージを
[[port to main]]へ送信します。その
Window内の暗黙的なハンドラーは、次の手順を実行します。
AudioTrackオブジェクトとします。
idプロパティに代入します。
language、
labelおよび
kindプロパティに代入します。
enabledプロパティをtrueに設定します。
SourceBufferオブジェクトの親メディアソースがアタッチされているメディア要素とします。
audioTracks属性に追加します。
これにより、media
elementの
audioTracks属性が参照する
AudioTrackListオブジェクトで、track属性を
new audio
trackに初期化した
TrackEventを使用して
addtrackという名前のイベントを発火するタスクをキューに入れる
AudioTrackList
[HTML]のロジックが起動されるはずです。
初期化セグメント内の各映像トラックについて、次の手順を実行します。
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属性に追加します。
これにより、このSourceBufferオブジェクトの
videoTracks属性が参照する
VideoTrackListオブジェクトで、track属性を
new video
trackに初期化した
TrackEventを使用して
addtrackという名前のイベントを発火するタスクをキューに入れる
VideoTrackList
[HTML]のロジックが起動されるはずです。
SourceBufferオブジェクトの親メディアソースがアタッチされているメディア要素とします。
videoTracks属性に追加します。
これにより、media
elementの
videoTracks属性が参照する
VideoTrackListオブジェクトで、track属性を
new video
trackに初期化した
TrackEventを使用して
addtrackという名前のイベントを発火するタスクをキューに入れる
VideoTrackList
[HTML]のロジックが起動されるはずです。
create trackメッセージを
[[port to main]]へ送信します。その
Window内の暗黙的なハンドラーは、次の手順を実行します。
VideoTrackオブジェクトとします。
idプロパティに代入します。
language、
labelおよび
kindプロパティに代入します。
selectedプロパティをtrueに設定します。
SourceBufferオブジェクトの親メディアソースがアタッチされているメディア要素とします。
videoTracks属性に追加します。
これにより、media
elementの
videoTracks属性が参照する
VideoTrackListオブジェクトで、track属性を
new video
trackに初期化した
TrackEventを使用して
addtrackという名前のイベントを発火するタスクをキューに入れる
VideoTrackList
[HTML]のロジックが起動されるはずです。
初期化セグメント内の各テキストトラックについて、次の手順を実行します。
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属性に追加します。
これにより、このSourceBufferオブジェクトの
textTracks属性が参照する
TextTrackListオブジェクトで、
track属性を
new text
trackに初期化した
TrackEventを使用して
addtrackという名前のイベントを発火するタスクをキューに入れる
TextTrackList
[HTML]のロジックが起動されるはずです。
SourceBufferオブジェクトの親メディアソースがアタッチされているメディア要素とします。
textTracks属性に追加します。
これにより、media
elementの
textTracks属性が参照する
TextTrackListオブジェクトで、
track属性を
new text
trackに初期化した
TrackEventを使用して
addtrackという名前のイベントを発火するタスクをキューに入れる
TextTrackList
[HTML]のロジックが起動されるはずです。
create trackメッセージを
[[port to main]]へ送信します。その
Window内の暗黙的なハンドラーは、次の手順を実行します。
TextTrackオブジェクトとします。
idプロパティに代入します。
language、
labelおよび
kindプロパティに代入します。
modeプロパティをtext
track modeに設定し、new text
trackの残りのプロパティに、このトラックの
初期化セグメントから決定された適切な情報を設定します。
SourceBufferオブジェクトの親メディアソースがアタッチされているメディア要素とします。
textTracks属性に追加します。
これにより、media
elementの
textTracks属性が参照する
TextTrackListオブジェクトで、
track属性を
new text
trackに初期化した
TrackEventを使用して
addtrackという名前のイベントを発火するタスクをキューに入れる
TextTrackList
[HTML]のロジックが起動されるはずです。
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の準備状態
[HTML]のロジックに従い、HTMLMediaElementの
readyStateの変更によって、
HTMLMediaElement上でイベントが発生する可能性があります。
sourceBuffers内の各オブジェクトについて、
[[first initialization segment received flag]]がtrueと等しい場合、
親メディアソースの必要に応じてミラーリングアルゴリズムを使用し、
Window内で次の手順を実行します。
HTMLMediaElementの
readyState属性が
HAVE_NOTHINGである場合、
HTMLMediaElementの
readyState属性をHAVE_METADATAに設定します。
HTMLMediaElementの準備状態
[HTML]のロジックに従い、HTMLMediaElementの
readyStateの変更によって、
HTMLMediaElement上でイベントが発生する可能性があります。HAVE_NOTHINGから
HAVE_METADATAへの遷移が発生した場合、メディア要素で
loadedmetadataという名前のイベントを発火するタスクをキューに入れる
HTMLMediaElementのロジックが起動されるはずです。
完全な符号化フレームがセグメントパーサーループによって解析されたとき、次の手順を実行します。
メディアセグメント内の各符号化フレームについて、次の手順を実行します。
[[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を
presentation timestampに加算します。
timestampOffsetを
decode timestampに加算します。
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を受け入れる前に、実装がより能動的にプッシュバックできるようになります。実際には、少なくとも1つの実装がすでにこれを行っています。
[[buffer full flag]]がfalseと等しい場合、これらの手順を中止します。
実装は、removal rangesの選択に異なる方法を使用してもよいため、Webアプリケーションは特定の動作に依存すべきではありません。Webアプリケーションは、
buffered属性を使用して、バッファリングされたデータの一部が追い出されたかどうかを確認できます。
符号化フレーム処理アルゴリズムが、重なり合う2つの音声符号化フレームに対してスプライスフレームを生成する必要がある場合、次の手順に従います。
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の後に追加される符号化フレームが必要となります。
このスプライスフレームがどのようにレンダリングされるかの詳細については、音声スプライスレンダリングアルゴリズムを参照してください。
音声スプライスフレームアルゴリズムによって生成されたスプライス済みフレームを、メディア要素がレンダリングする必要がある場合、次の手順を実行します。
このアルゴリズムを図で表すと次のようになります。
符号化フレーム処理アルゴリズムが、重なり合う2つの時間指定テキスト符号化フレームに対してスプライスフレームを生成する必要がある場合、次の手順に従います。
これは、new coded frameが最初からtrack buffer内のどのフレームとも重なっていなかったかのように、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の監視アルゴリズムが実行されるよう スケジュールされるたびに、定期的に実行されます。
途切れない再生を保証するのに十分な管理対象データが
あることは、ユーザーエージェントが、意味のある一定期間にわたり停止することなく
プレゼンテーションを再生するのに十分なデータを現在保持していると判断する、実装定義の条件です。
この条件は、streamingの値をいつ遷移させるかを
決定するため、継続的に評価されます。これらの遷移は、ユーザーエージェントが
十分なデータをバッファリングしていると判断したとき、またはさらにデータが必要だと判断したときをそれぞれ示します。
効率的な方法でデータを取得してバッファリング できることは、ユーザーエージェントが、望ましいメモリ使用量を達成しながら エネルギー効率の高い方法で新しいデータを取得できると判断する、実装定義の条件です。
MediaSourceのSourceBufferの監視アルゴリズムを実行します。
buffered
属性にTimeRanges
が含まれ、それが現在の再生位置を含み、途切れない再生を
保証するのに十分な管理対象データがあること、かつ
効率的な方法でデータを
取得してバッファリングできることを満たす場合に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
| イベント名 | インターフェイス | 発火される条件... |
|---|---|---|
| bufferedchange |
BufferedChangeEvent
|
ManagedSourceBufferのバッファー範囲が、
appendBuffer()、
remove()、
endOfStream()の
呼び出し後、またはユーザーエージェントが
メモリのクリーンアップアルゴリズムを
実行した結果として変更されたとき。
|
次の手順は、ManagedSourceBuffer
bufferに対する、そのbufferの
bufferedを変更させるすべての操作が
完了した時点で実行されます。すなわち、appendBuffer()、
remove()またはメモリのクリーンアップアルゴリズムが
完了した時点です。
buffered属性とします。
buffered
TimeRangesとします。
BufferedChangeEventInit
辞書とし、その
addedRangesをaddedで、その
removedRangesを
removedで初期化します。
bufferedchangeという名前の
イベントを
発火します。イベントには
BufferedChangeEventインターフェイスを使用し、
eventInitDictで初期化します。
ManagedMediaSourceの
activeSourceBuffers内にない場合:
currentTime
から、そのプレゼンテーションを再び取得できるようになるまでの途切れない再生を保証するために、
プレゼンテーションから追い出すことができるプレゼンテーション時間範囲のリストとします。
実装は、removal rangesを選択するために異なる戦略を
使用できるため、ウェブアプリケーションは特定の動作に依存すべきではありません。
ウェブアプリケーションは、バッファリングされたデータの一部が追い出されたかどうかを確認するため、
bufferedchangeイベントを監視します。
この節では、既存のHTMLMediaElementの
seekable
属性およびHTMLMediaElementの
buffered
属性が、HTMLMediaElementに
MediaSourceが接続されている場合に返さ
なければならない値と、既存のHTMLMediaElementの
srcObject
属性がMediaSourceHandleオブジェクトに
設定された場合に追加で実行しなければならない処理を規定します。
HTMLMediaElementの
seekable
HTMLMediaElementの
seekable
属性は、次の手順に基づいて作成された新しい静的な
正規化された
TimeRangesオブジェクトを返します:
MediaSourceが、終了済みまたは終了処理中のDedicatedWorkerGlobalScope
で構築された場合は、空のTimeRanges
オブジェクトを返し、これらの手順を中止します。
この場合は、terminate()
によって、またはユーザーエージェントがMediaSourceのDedicatedWorkerGlobalScopeに対して
ワーカーを
終了する処理を実行したことによって終了したDedicatedWorkerGlobalScope内で
構築されたMediaSourceについて、バッファリング可能またはシーク可能なメディアに関する
以前の情報を実装が保持しなくなる可能性がある場合を処理することを意図しています。
たとえば、これは
close()
の実行による最終的な結果として生じる場合があります。
接続されたワーカーのMediaSourceのコンテキストが破棄された場合、メディア要素を (最終的に)何らかのエラー状態へ遷移させるべきでしょうか?ワーカーMSEに関する Chromiumの試験的実装では、seekable属性とbuffered属性がそれぞれ空のTimeRangeを 報告するものの、要素のreadyState、networkState、errorはコンテキスト破棄前と 同じ状態に維持されます。
durationおよび
[[live seekable range]]の最近の値とし、
次のように決定します:
MediaSourceが
Window
で構築された場合
durationに設定し、recent
live seekable
rangeを[[live seekable range]]に設定します。
durationおよび[[live seekable range]]の
最近の値に設定します。これらの値は、
MediaSourceが
[[port to main]]へ、
duration
または
[[live seekable range]]が
変更されるたびに送信する暗黙のメッセージを処理することで更新されます。
TimeRanges
オブジェクトを返します。
HTMLMediaElementの
buffered
属性との和集合とします。
HTMLMediaElementの
buffered
属性が空のTimeRanges
オブジェクトを返す場合は、空のTimeRanges
オブジェクトを返し、
これらの手順を中止します。
HTMLMediaElementの
buffered
属性によって報告される最も遅い終了時刻に等しい単一の範囲を返します。
HTMLMediaElementの
buffered
HTMLMediaElementの
buffered
属性は、次の手順に基づく静的な
正規化された
TimeRangesオブジェクトを返します。
MediaSourceが、終了済みまたは終了処理中のDedicatedWorkerGlobalScope
で構築された場合は、空のTimeRanges
オブジェクトを返し、これらの手順を中止します。
この場合は、terminate()
によって、またはユーザーエージェントがMediaSourceのDedicatedWorkerGlobalScopeに対して
ワーカーを
終了する処理を実行したことによって終了したDedicatedWorkerGlobalScope内で
構築されたMediaSourceについて、バッファリング可能またはシーク可能なメディアに関する
以前の情報を実装が保持しなくなる可能性がある場合を処理することを意図しています。
たとえば、これは
close()
の実行による最終的な結果として生じる場合があります。
接続されたワーカーのMediaSourceのコンテキストが破棄された場合、メディア要素を (最終的に)何らかのエラー状態へ遷移させるべきでしょうか?ワーカーMSEに関する Chromiumの試験的実装では、seekable属性とbuffered属性がそれぞれ空のTimeRangeを 報告するものの、要素のreadyState、networkState、errorはコンテキスト破棄前と 同じ状態に維持されます。
MediaSourceが
Window
で構築された場合
TimeRanges
オブジェクトとします。
activeSourceBuffers.length
が0と等しくない場合は、次の手順を実行します:
bufferedによって
SourceBufferオブジェクトごとに
返される範囲とします。各オブジェクトは
activeSourceBuffers内に
あります。
TimeRanges
オブジェクトとします。
SourceBufferオブジェクトごとに、
activeSourceBuffers内で
次の手順を実行します:
SourceBufferの
buffered
属性によって返される範囲とします。
readyState
が「ended」
である場合は、source ranges内の
最後の範囲の終了時刻をhighest end
timeに設定します。
TimeRanges
オブジェクトとします。このオブジェクトは、
Window
の場合の手順から得られるものですが、MediaSourceおよびその
SourceBuffer
オブジェクトをそれらのDedicatedWorkerGlobalScope
内で使用して実行されます。また、
[[port to main]]を
使用し、activeSourceBuffers、
readyState、または
activeSourceBuffersの
各buffered属性のいずれかの値を
変更するバッファリング状態が更新されるたびに、暗黙のメッセージで伝達されます。
recent intersection rangesをこれほど 頻繁に再計算して伝達するオーバーヘッドは、コンテキスト間通信 モデルで言及されている共有メモリやロックなど、ほかの仕組みを使用して この情報をオンデマンドで照会する実装上の柔軟性を認める理由の一つです。
HTMLMediaElementの
srcObject
HTMLMediaElementの
srcObject
属性に
MediaSourceHandleが割り当てられた場合は、その[[has ever been assigned as srcobject]]
をtrueに設定します。この設定は、そのMediaSourceHandleについて、
拡張されたHTMLMediaElementの
srcObject
setterにおける、要素の読み込みアルゴリズムを呼び出す前に行われる同期的な手順の一部として実行します。
これにより、その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
内に存在します。両者は同じレルム上にないため、
この属性は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
内に存在します。両者は同じレルム上にないため、
この属性は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
内に存在します。両者は同じレルム上にないため、
この属性はnullを返します。
SourceBufferに対してappendBuffer()を通じて
提供されるバイトは、論理バイトストリームを形成します。これらのバイトストリームの形式と意味論は、バイトストリーム形式仕様で定義されます。バイトストリーム
形式レジストリ[MSE-REGISTRY]は、
addSourceBuffer()、
isTypeSupported()または
changeType()へ渡すことができる
MIMEタイプと、そのMIMEタイプを使用するSourceBufferが、新しく追加されたデータの解析時に
想定するバイトストリーム形式との対応関係を提供します。相互運用性を促進するため、実装には、
サポートするバイトストリーム形式の対応関係を登録することが推奨されます。バイトストリーム形式レジストリ
[MSE-REGISTRY]は、これらの
対応関係に関する権威ある情報源です。実装がレジストリに掲載されているMIMEタイプをサポートすると主張する場合、
そのSourceBuffer実装は、レジストリエントリーに掲載されている
バイトストリーム形式仕様に
適合しなければなりません。
レジストリ内のバイトストリーム形式仕様は、新しい保存形式を定義することを意図していません。 これらは、この仕様の実装が受け入れる既存の保存形式構造のサブセットを示すだけです。
バイトストリーム形式の解析と検証は、セグメント パーサーループアルゴリズムで実装されます。
この節では、すべてのバイトストリーム形式仕様に関する一般要件を示します:
AudioTrack、
VideoTrack、および
TextTrackの
属性値を初期化セグメント内のデータから
取得するための参照を提供すべきです。
バイトストリーム形式が、帯域内トラック仕様[INBANDTRACKS]で 扱われる形式と同様の形式を扱う場合、メディアソース拡張による再生とメディアソース拡張を使用しない再生で 同じトラック情報が提供されるように、同じ属性の対応関係を使用するよう試みる べきです。
トラックの数と種類が一貫していません。
初期化セグメント間で、 サポートされていないコーデックの変更が発生します。
コーデック変更の詳細と例については、初期化セグメント
受信アルゴリズム、
addSourceBuffer()
およびchangeType()を
参照してください。
動画フレームサイズの変更。ユーザーエージェントは、シームレスな再生をサポート しなければなりません。
ウェブアプリケーションがCSSまたはHTML属性(width/height)を使用して要素サイズを 制約していない場合、これによって<video>の表示領域のサイズが変化します。
音声チャンネル数の変更。ユーザーエージェントはこれをシームレスにサポート してもよく、ダウンミキシングを発生させる可能性があります。
チャンネル数の変更には音声デバイス、リサンプラー、チャンネルミキサーの再初期化が 必要になる場合があり、これは聞き取れる傾向があるため、実装品質に関する問題です。
buffered属性に反映
してはなりません。
これは、エンコーディング間でフレーム境界が必ずしも一致しない音声ストリーム (例:Vorbis)間の切り替えを簡素化することを意図しています。
たとえば、I1がM1、M2、M3に関連付けられている場合、上記の要件はI1+M1、I1+M2、 I1+M1+M2、I1+M2+M3など、すべての組み合わせについて成立 しなければなりません。
バイトストリーム仕様は、少なくとも上記の要件が成立することを保証する制約を定義 しなければなりません。たとえば実装を簡素化するために、追加の制約を 定義してもよい。
非規範的と明示された節に加え、この仕様に含まれるすべての著者向けガイドライン、図、例、注記は 非規範的です。この仕様のそれ以外のすべての内容は規範的です。
この文書におけるキーワードしてもよい、しなければならない、 してはならない、すべき、および すべきではないは、原文において、ここに示すようにすべて大文字で 表記されている場合に限り、 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) {
// 初期化セグメントの取得中にエラーが発生しました。エラーとともにストリームの終了を通知します。
mediaSource.endOfStream("network");
return;
}
// 初期化セグメントを追加します。
sourceBuffer.addEventListener("updateend", function firstAppendHandler() {
sourceBuffer.removeEventListener("updateend", firstAppendHandler);
// 初期メディアデータを追加します。
appendNextMediaSegment(mediaSource);
});
sourceBuffer.appendBuffer(initSegment);
} catch (error) {
// 初期化セグメントの取得中に発生する可能性があるエラーを処理します。
console.error("Error fetching initialization segment:", error);
mediaSource.endOfStream("network");
}
}
async function appendNextMediaSegment(mediaSource) {
if (
mediaSource.readyState === "closed" ||
mediaSource.sourceBuffers[0].updating
)
return;
// ストリームデータを使い果たした場合は、ストリームの終了を通知します。
if (!haveMoreMediaSegments()) {
mediaSource.endOfStream();
return;
}
try {
const mediaSegment = await getNextMediaSegment();
// 注記:mediaSource.readyState == "ended"の場合、このappendBuffer()呼び出しによって
// mediaSource.readyStateは"open"へ遷移します。ウェブアプリケーションは
// 複数の"sourceopen"イベントを処理できるよう準備する必要があります。
mediaSource.sourceBuffers[0].appendBuffer(mediaSegment);
}
catch (error) {
// メディアセグメントの取得中に発生する可能性があるエラーを処理します。
console.error("Error fetching media segment:", error);
mediaSource.endOfStream("network");
}
}
function onSeeking(mediaSource, video) {
if (mediaSource.readyState === "open") {
// 現在のセグメント追加を中止します。
mediaSource.sourceBuffers[0].abort();
}
// メディアセグメント読み込みコードに、新しい再生位置でデータの取得を
// 開始するよう通知します。
seekToMediaSegmentAt(video.currentTime);
// 新しい再生位置からメディアセグメントを追加します。
appendNextMediaSegment(mediaSource);
}
function onProgress(mediaSource, e) {
appendNextMediaSegment(mediaSource);
}
// 初期化セグメントを取得する非同期関数の例
async function getInitializationSegment() {
// 初期化セグメントの取得を実装します
// これは単なるプレースホルダー関数です
}
// さらにメディアセグメントがあるかを確認する関数の例
function haveMoreMediaSegments() {
// さらにメディアセグメントがあるかを判断するロジックを実装します
// これは単なるプレースホルダー関数です
}
// 次のメディアセグメントを取得する関数の例
async function getNextMediaSegment() {
// 次のメディアセグメントの取得を実装します
// これは単なるプレースホルダー関数です
}
// 特定のメディアセグメントへシークする関数の例
function seekToMediaSegmentAt(currentTime) {
// シーク処理を実装します
// これは単なるプレースホルダー関数です
}
</script>
<script>
async function setUpVideoStream() {
// 特定の動画形式とコーデック
const mediaType = 'video/mp4; codecs="mp4a.40.2,avc1.4d4015"';
// 動画形式/コーデックの種類がサポートされているか確認します。
if (!window.ManagedMediaSource?.isTypeSupported(mediaType)) {
return; // サポートされていないため、別の処理を行います。
}
// 動画とその管理対象ソースを設定します。
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);
// イベントハンドラーを設定します
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 () => {
// ここで新しいセグメントの取得を停止します
};
}
// ヘルパー関数...
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: