メディアソース拡張™

W3C作業草案

この文書の詳細
このバージョン:
https://www.w3.org/TR/2026/WD-media-source-2-20260807/
最新の公開バージョン:
https://www.w3.org/TR/media-source-2/
最新の編集者草案:
https://w3c.github.io/media-source/
履歴:
https://www.w3.org/standards/history/media-source-2/
コミット履歴
最新の勧告:
https://www.w3.org/TR/2016/REC-media-source-20161117/
編集者:
(Apple Inc.)
Mark Watson (Netflix Inc.)
以前の編集者:
(W3C招待専門家) - まで
Jerry Smith (Microsoft Corporation) - まで
Aaron Colwell (Google Inc.) - まで
Adrian Bateman (Microsoft Corporation) - まで
フィードバック:
GitHub w3c/media-source (プルリクエスト, 新しいイシュー, 未解決のイシュー)
public-media-wg@w3.org 宛てに、件名を [media-source-2] … メッセージのトピック … として送信 (アーカイブ)
ブラウザー対応:
caniuse.com

要約

この仕様は、HTMLMediaElement [HTML] を拡張し、 JavaScriptが再生用のメディアストリームを生成できるようにします。JavaScriptによるストリーム生成を許可することで、 アダプティブストリーミングやライブストリームのタイムシフトなど、さまざまな ユースケースが容易になります。

この文書の位置付け

この節では、公開時点におけるこの 文書の位置付けについて説明します。現在のW3C 公開文書の一覧およびこの技術報告書の最新版は、 W3C標準および草案 索引で確認できます。

編集上の更新に加えて、2016年11月W3C勧告として公開されて以降の 実質的な変更点は次のとおりです:

以前のバージョン以降に行われた変更の完全な一覧については、コミットを参照してください。

ワーキンググループは、編集者がまだ対応を試みていない すべてのバグ報告の一覧を管理しています。

実装者は、この仕様が安定していないことに注意する必要があります。議論に 参加していない実装者は、仕様が互換性のない形で 足元から変更される可能性があります。この仕様が最終的に候補勧告段階へ 到達する前に実装することに関心のあるベンダーは、GitHubリポジトリを追跡し、 議論に参加する必要があります。

この文書は、Mediaワーキンググループによって、 勧告 トラックを使用した作業草案として公開されました。

作業草案として 公開されたことは、W3Cおよびそのメンバーによる 承認を意味するものではありません。

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

この文書は、 W3C 特許 ポリシーの下で運営されるグループによって作成されました。 W3Cは、グループの成果物に関連して行われた 特許開示の公開一覧を管理しています。 そのページには、特許を開示するための 手順も含まれています。個人が、 必須クレームを含むと考える特許を 実際に知っている場合は、 W3C特許ポリシーの第6節に従って、その情報を開示しなければなりません。

この文書には、 2025年8月18日付W3Cプロセス文書が適用されます。

1. はじめに

この節は非規範的です。

この仕様により、JavaScriptは<audio>および<video>用のメディアストリームを動的に 構築できます。この仕様は、HTMLMediaElementのメディアデータソースとして機能できるMediaSourceオブジェクトを 定義します。MediaSourceオブジェクトには、1つ以上の SourceBufferオブジェクトがあります。アプリケーションは、データセグメントを SourceBuffer オブジェクトに追加し、システム性能やその他の 要因に基づいて、追加するデータの品質を調整できます。SourceBufferオブジェクトのデータは、デコードおよび再生される 音声、映像、テキストデータの トラックバッファとして管理されます。これらの拡張機能で使用されるバイトストリーム仕様は、 バイトストリーム形式レジストリ[MSE-REGISTRY]で確認できます。

メディアソースパイプラインモデル図
1 メディアソースパイプラインモデル図

1.1 目的

この仕様は、次の目的を念頭に置いて設計されています:

この仕様は、次の事項を定義します:

2. 定義

アクティブトラック バッファ

enabledである audioTracksselectedである videoTracks、 および "showing" または "hidden"である textTracks符号化フレームを提供するトラックバッファです。これらすべてのトラックは、 activeSourceBuffers リスト内のSourceBufferオブジェクトに 関連付けられています。

追加ウィンドウ

追加中に符号化フレームを除外するために使用される、プレゼンテーションタイムスタンプの範囲です。 追加ウィンドウは、単一の開始時刻と 終了時刻を持つ、1つの連続した時間範囲を表します。この範囲内のプレゼンテーションタイムスタンプを持つ符号化フレームは、 SourceBufferに追加できますが、この範囲外の符号化フレームは 除外されます。追加ウィンドウの開始時刻と終了時刻は、それぞれ appendWindowStart属性およびappendWindowEnd属性によって 制御されます。

符号化フレーム

プレゼンテーションタイムスタンプデコードタイムスタンプ、および 符号化フレームの継続時間を持つメディアデータの単位です。

符号化フレームの 継続時間

符号化フレームの継続時間です。映像とテキストの場合、この継続時間は、 映像フレームまたはテキストを表示すべき時間の長さを示します。音声の場合、この継続時間は 符号化フレーム内に含まれるすべてのサンプルの合計を 表します。たとえば、音声フレームに441 samples @44100Hzが含まれている場合、フレームの継続時間は10ミリ秒になります。

符号化 フレーム終了タイムスタンプ

符号化フレームプレゼンテーションタイムスタンプと、その符号化フレームの継続時間の合計です。符号化フレームの直後に続く プレゼンテーションタイムスタンプを 表します。

符号化フレーム グループ

隣接しており、間隔を空けずに単調 増加するデコードタイムスタンプを持つ符号化フレームのグループです。符号化フレーム処理 アルゴリズムによって検出された不連続、およびabort() の呼び出しによって、新しい 符号化フレームグループが開始されます。

デコードタイムスタンプ

デコードタイムスタンプは、このフレームおよび依存するすべてのフレームが即時にデコードおよびレンダリングされると仮定した場合に、 そのフレームをデコードする必要がある最も遅い時刻を示します(これは、このフレームに依存するフレームのうち、プレゼンテーション順序で最も早いフレームのプレゼンテーションタイムスタンプと等しくなります)。フレームを プレゼンテーション順序とは異なる順序でデコードできる場合、デコードタイムスタンプは バイトストリーム内に存在するか、バイトストリームから導出できなければなりません。そうでない場合、ユーザーエージェントは追加エラーアルゴリズムを実行しなければなりません。 フレームをプレゼンテーション 順序とは異なる順序でデコードできず、バイトストリーム内にデコード タイムスタンプが存在しない場合、デコードタイムスタンプは プレゼンテーションタイムスタンプと等しくなります。

初期化セグメント

一連のメディアセグメントをデコードするために必要な すべての初期化情報を含むバイト列です。これには、コーデックの 初期化データ、多重化されたセグメントに対する トラックIDのマッピング、およびタイムスタンプの オフセット(例: 編集 リスト)が含まれます。

注記

バイトストリーム形式レジストリ [MSE-REGISTRY]内のバイトストリーム形式仕様には、 形式固有の例が含まれています。

メディアセグメント

メディアタイムラインの一部に対応する、 パケット化され、タイムスタンプが付与されたメディアデータを含むバイト列です。 メディアセグメントは、常に最後に 追加された初期化セグメントに関連付けられます。

注記

バイトストリーム形式レジストリ [MSE-REGISTRY]内のバイトストリーム形式仕様には、 形式固有の例が含まれています。

MediaSourceオブジェクトURL

MediaSourceオブジェクトURLは、 createObjectURL()によって作成される一意のblob URLです。 これは、MediaSourceオブジェクトを HTMLMediaElementに接続するために使用されます。

これらのURLはblob URLと同じですが、この機能の 定義において FileおよびBlobオブジェクトを参照するすべての記述は、 MediaSourceオブジェクトにも 適用されるように拡張されます。

MediaSourceオブジェクトURLのオリジンは、 createObjectURL()の呼び出し中における this関連する 設定オブジェクトです。

注記

たとえば、MediaSourceオブジェクトURLのオリジンは、 メディア要素がcanvasによって 使用される方法に影響します。

親メディア ソース

SourceBufferオブジェクトの親メディアソースは、 そのオブジェクトを作成したMediaSourceオブジェクトです。

プレゼンテーション 開始時刻

プレゼンテーション開始時刻は、プレゼンテーション内で最も早い時点であり、 初期再生 位置および可能な最も早い 位置を指定します。この仕様を使用して作成されるすべてのプレゼンテーションの 開始時刻は0です。

注記

HTMLMediaElementbufferedに、 現在の再生位置を含むTimeRangesが 含まれているかどうかを判断する目的では、実装は、 プレゼンテーション開始時刻以降かつ最初の TimeRangesより前にある現在の再生位置について、 その最初のTimeRangesプレゼンテーション開始時刻から1秒などの妥当に短い時間内に 開始する場合、その最初の TimeRangesを 再生できるようにすることを選択してもよいものとします。この許容は、 多重化されたストリームでは通常、すべてのトラックが プレゼンテーション開始時刻に正確に開始するわけではないという現実に対応するものです。 この許容に関係なく、実装は実際のバッファ済み範囲を報告しなければなりません

プレゼンテーション 区間

符号化フレームのプレゼンテーション区間は、 そのプレゼンテーションタイムスタンプから、 プレゼンテーションタイムスタンプ符号化フレームの継続時間を加えた時刻までの時間区間です。 たとえば、符号化フレームのプレゼンテーション タイムスタンプが10秒で、符号化フレームの継続時間が100 ミリ秒である場合、 プレゼンテーション区間は[10-10.1)になります。範囲の開始は 含まれますが、範囲の終了は含まれないことに注意してください。

プレゼンテーション 順序

プレゼンテーション内で符号化フレームがレンダリングされる順序です。 プレゼンテーション 順序は、符号化フレームを、その プレゼンテーションタイムスタンプの単調増加 順に並べることで実現されます。

プレゼンテーションタイムスタンプ

プレゼンテーション内の特定の時刻への参照です。 符号化フレーム内のプレゼンテーションタイムスタンプは、フレームをいつレンダリング すべきかを示します。

ランダムアクセスポイント

セグメント内の以前のデータに依存せずに、デコードと連続再生を 開始できるメディアセグメント内の位置です。映像の場合、これは Iフレームの位置である傾向があります。音声の場合、ほとんどの音声フレームを ランダムアクセスポイントとして扱えます。映像トラックでは通常、ランダムアクセスポイントの 分布がより疎であるため、これらのポイントの位置が、多重化ストリームの ランダムアクセスポイントと見なされます。

SourceBufferバイトストリーム形式仕様

SourceBufferインスタンスが受け入れるバイト ストリームの形式を記述する、特定のバイトストリーム形式仕様です。 SourceBufferオブジェクトのバイトストリーム形式仕様は、最初に、そのオブジェクトを 作成したaddSourceBuffer()呼び出しに渡された typeに基づいて選択され、そのオブジェクトに対する changeType()呼び出しによって 更新できます。

SourceBufferの構成

単一のMediaSourceインスタンスが所有する、 1つ以上のSourceBufferオブジェクトに分散された特定のトラックの組です。

実装は、次の構成を持つMediaSourceオブジェクトを少なくとも1つ サポートしなければなりません:

  • 1つの音声トラックおよび/または1つの映像トラックを持つ単一のSourceBuffer。
  • 一方が単一の音声トラックを処理し、もう一方が 単一の映像トラックを処理する2つのSourceBuffer。

MediaSourceオブジェクトは、上記の各構成をサポートしなければなりませんが、 一度にサポートする必要があるのは1つの構成だけです。複数の構成を 同時にサポートすること、または追加の構成をサポートすることは、実装品質の問題です。

トラック記述

単一のトラックについて、トラックID、コーデック 構成、およびその他のメタデータを提供する、バイトストリーム形式固有の構造です。単一の 初期化セグメント内の各トラック記述には、一意のトラックIDがあります。初期化セグメント内でトラックIDが一意でない場合、ユーザーエージェントは 追加エラーアルゴリズムを実行しなければなりません

トラックID

トラックIDは、バイトストリームの各部分が特定のトラックの一部であることを示す、 バイトストリーム形式固有の識別子です。トラック 記述内のトラックIDは、メディアセグメントのどの部分が そのトラックに属するかを識別します。

3. MediaSourceインターフェイス

MediaSourceインターフェイスは、 HTMLMediaElement用の メディアデータソースを表します。このソースのreadyStateと、 プレゼンテーションへメディアデータを追加するために使用できるSourceBufferオブジェクトのリストを 追跡します。MediaSourceオブジェクトはウェブアプリケーションによって作成され、その後 HTMLMediaElementへ接続されます。アプリケーションは、 sourceBuffers内のSourceBufferオブジェクトを使用して、このソースへ メディアデータを追加します。HTMLMediaElementは、再生中に必要となったとき、 MediaSourceオブジェクトからこのメディアデータを 取得します。

MediaSourceオブジェクトには、正規化された TimeRanges オブジェクトを格納する[[live seekable range]]内部スロットがあります。これは、 MediaSourceオブジェクトが作成されたとき、 空のTimeRangesオブジェクトとして 初期化され、setLiveSeekableRange() および clearLiveSeekableRange()によって管理され、 10. HTMLMediaElementの拡張で、 HTMLMediaElementseekableの 動作を変更するために使用されます。

MediaSourceオブジェクトには、 booleanを格納する[[has ever been attached]]内部スロットがあります。これは、 MediaSourceオブジェクトが作成されたときにfalseへ初期化され、 メディア要素への接続アルゴリズムで説明されているように、拡張された HTMLMediaElementリソース取得 アルゴリズム内でtrueに設定されます。拡張された リソース取得 アルゴリズムは、この内部スロットを使用し、 HTMLMediaElementsrcObject 属性に設定されたMediaSourceHandleを使用する MediaSourceの 接続を条件付きで失敗させます。

WebIDLenum ReadyState {
  "closed",
  "open",
  "ended",
};
closed
ソースが現在メディア要素へ接続されていないことを示します。
open
ソースがメディア要素によって開かれており、MediaSourcesourceBuffers内の SourceBufferオブジェクトへデータを追加できる状態です。
ended
ソースはメディア要素へ引き続き接続されていますが、MediaSourceendOfStream()が 呼び出されています。
イシュー276: MSE-in-Workers: 切り離し処理中に発生する新しい`InvalidStateError`例外を説明するため、 "closing" readyStateの追加を検討するmse-in-workers
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);
};

3.1 handle 属性

専用ワーカーのMediaSourceオブジェクトを、 srcObjectを介して HTMLMediaElementへ接続する際に 役立つハンドルが含まれます。この MediaSourceオブジェクトでは、この属性へアクセスするたびに ハンドルは同一のオブジェクトのままですが、 MediaSourceオブジェクトごとに異なります。

注記

この仕様では、将来的にメインのWindowコンテキストにあるMediaSource オブジェクトからも、この属性を参照できるようになる可能性があります。その場合、この属性へのアクセス時に 例外がスローされる場合など、後方互換性のない変更が生じる可能性を防ぐため、 仕様上の注意が必要になります。

取得時には、次の手順を実行します:

  1. このMediaSourceオブジェクトのハンドルがまだ 作成されていない場合は、 次の手順を実行します:
    1. created handleを、新しい MediaSourceHandleオブジェクトと 関連リソースを作成し、この MediaSourceへ内部的にリンクした結果とします。
    2. 属性をcreated handleに更新します。
  2. この属性の値であるMediaSourceHandle オブジェクトを返します。

3.2 sourceBuffers属性

このMediaSourceに関連付けられた SourceBufferオブジェクトのリストが 含まれます。MediaSourcereadyStateが「closed」の場合、このリストは 空になります。readyStateが「open」へ移行すると、 addSourceBuffer()を使用して、 SourceBufferオブジェクトをこのリストへ追加できます。

3.3 activeSourceBuffers属性

selectedである 映像トラック、enabledである 音声トラック、および "showing" または "hidden"である テキスト トラックを提供しているsourceBuffersのサブセットが含まれます。

このリスト内のSourceBufferオブジェクトは、 sourceBuffers属性に現れる順序と同じ順序で 現れなければなりません。たとえば、 sourceBuffers[0]と sourceBuffers[3]だけがactiveSourceBuffersにある場合、 activeSourceBuffers[0]は sourceBuffers[0]と等しくなければならず、activeSourceBuffers[1]は sourceBuffers[3]と等しくなければなりません

注記

3.15.5 選択済み/有効化済みトラックの状態変更節では、この属性がどのように 更新されるかを説明しています。

3.4 readyState属性

MediaSourceオブジェクトの現在の状態を示します。 MediaSourceが 作成されたとき、readyStateは「closed」に設定されなければなりません

3.5 duration属性

ウェブアプリケーションがプレゼンテーションの継続時間を設定できるようにします。 MediaSourceオブジェクトが作成されたとき、継続時間は最初に NaNへ設定されます。

取得時には、次の手順を実行します:

  1. readyState属性が「closed」の場合、 NaNを返して、これらの手順を中止します。
  2. 属性の現在の値を返します。

設定時には、次の手順を実行します:

  1. 設定される値が負またはNaNの場合は、TypeError 例外をスローし、 これらの手順を中止します。
  2. readyState属性が「open」でない場合は、 InvalidStateError 例外をスローし、これらの手順を中止します。
  3. sourceBuffers内のいずれかの SourceBufferで、 updating属性がtrueと等しい場合は、InvalidStateError 例外をスローし、 これらの手順を中止します。
  4. new durationを この属性へ代入される値に設定し、継続時間の変更アルゴリズムを実行します。
    注記

    より遅い終了時刻を持つ符号化フレームが現在バッファされている場合、 継続時間の変更アルゴリズムは、new durationをより大きい値へ 調整します。

    注記

    appendBuffer() およびendOfStream()は、 特定の状況で 継続時間を更新できます。

3.6 canConstructInDedicatedWorker属性

trueを返します。

注記

この属性により、メインスレッドおよび専用ワーカーは、専用ワーカー内で MediaSourceオブジェクトを 作成して使用する機能のサポートを検出できます。また、特にこの機能がサポートされていない場合に、 専用ワーカーからMediaSourceオブジェクトの作成を試みるなどの、 遅延が大きい検出用polyfillの必要性を軽減します。

3.7 addSourceBuffer()メソッド

新しいSourceBuffersourceBuffersへ追加します。

  1. typeが空文字列の場合は、TypeError 例外をスローし、 これらの手順を中止します。
  2. typeに、サポートされていないMIMEタイプ、または sourceBuffers内の他のSourceBufferオブジェクトに指定されたタイプとの組み合わせで サポートされていないMIMEタイプが含まれる場合は、NotSupportedError 例外をスローし、これらの 手順を中止します。
  3. ユーザーエージェントがこれ以上SourceBufferオブジェクトを処理できない場合、または typeに基づいてSourceBufferを作成すると、サポートされていないSourceBuffer構成になる場合は、 QuotaExceededError 例外をスローし、これらの手順を中止します。
    注記

    たとえば、メディア要素がHAVE_METADATA readyStateへ到達している場合、ユーザーエージェントはQuotaExceededError 例外をスローしてもよいものとします。これは、 ユーザーエージェントのメディアエンジンが再生中のトラック追加をサポートしていない場合に 発生する可能性があります。

  4. readyState属性が 「open」状態でない場合は、 InvalidStateError 例外をスローし、これらの手順を中止します。
  5. thisManagedMediaSourceである場合は、 bufferを新しいManagedSourceBufferのインスタンスとし、 それ以外の場合は新しいSourceBufferのインスタンスとし、それぞれの 関連リソースも作成します。
  6. buffer[[generate timestamps flag]]を、 typeに関連付けられたメディアソース拡張™バイト ストリーム形式レジストリのエントリにある 「Generate Timestamps Flag」列の値へ設定します。
  7. buffer[[generate timestamps flag]]が trueの場合は、buffermodeを「sequence」へ設定します。それ以外の場合は、 buffermodeを「segments」へ設定します。
  8. bufferthissourceBuffers追加します
  9. タスクをキューに入れthissourceBuffersを対象として、 addsourcebufferという名前の イベントを発火します
  10. bufferを返します。

3.8 removeSourceBuffer()メソッド

SourceBuffersourceBuffersから削除します。

  1. sourceBufferが、 sourceBuffersに存在しないオブジェクトを指定している場合は、NotFoundError例外を スローし、これらの 手順を中止します。
  2. sourceBuffer.updating属性がtrueと等しい場合は、 次の 手順を実行します:
    1. バッファ追加アルゴリズムが実行中の場合は中止します。
    2. sourceBuffer.updating属性をfalseに設定します。
    3. タスクを キューに入れsourceBufferを対象として、abortという名前のイベントを発火します
    4. タスクを キューに入れsourceBufferを対象として、updateendという名前のイベントを発火します
  3. 次のリストから適切な手順を実行します:
    MediaSourceWindow内で構築された場合:
    1. SourceBuffer audioTracks listを、 AudioTrackList オブジェクト、すなわちsourceBuffer.audioTracksが返す値とします。
    2. media elementを、 sourceBuffer親メディアソースが接続されているメディア要素とします。
    3. HTMLMediaElement audioTracks listを、 AudioTrackList オブジェクト、すなわちmedia elementaudioTracks 属性が返す値とします。
    4. SourceBuffer audioTracks list内の各audio trackについて、次の手順を実行します:
      1. audio tracksourceBuffer 属性を nullに設定します。
      2. SourceBuffer audioTracks listからaudio trackを削除します。
        注記

        これにより、AudioTrackList [HTML]のロジックが、 SourceBuffer audioTracks listを対象として、 TrackEventを使用し、 track 属性をaudio trackで初期化して、 removetrackという名前の イベントを 発火するためのタスクを キューに入れる処理が起動されるはずです。 この削除手順の開始時に、audio trackenabled 属性がtrueであった場合は、 AudioTrackList [HTML]のロジックが、 SourceBuffer audioTracks listを対象として、 changeという名前のイベントを 発火するためのタスクを キューに入れる処理も起動されるはずです。

      3. HTMLMediaElement audioTracks listからaudio trackを削除します。
        注記

        これにより、AudioTrackList [HTML]のロジックが、 HTMLMediaElement audioTracks listを対象として、 TrackEventを使用し、 track 属性を audio trackで初期化して、 removetrackという名前の イベントを 発火するためのタスクを キューに入れる処理が起動されるはずです。この 削除手順の開始時に、audio trackenabled 属性がtrueであった場合は、 AudioTrackList [HTML]のロジックが、 HTMLMediaElement audioTracks listを対象として、 changeという名前のイベントを 発火するためのタスクを キューに入れる処理も起動されるはずです。

    それ以外の場合:
    [[port to main]]へ内部remove trackメッセージを送信します。 Window内の 暗黙的ハンドラーは、次の手順を実行します:
    1. media elementを、 sourceBuffer親メディアソースが接続されているメディア要素とします。
    2. HTMLMediaElement audioTracks listを、 AudioTrackList オブジェクト、すなわちmedia elementaudioTracks 属性が返す値とします。
    3. sourceBufferによって作成された、 HTMLMediaElement audioTracks list内の各audio trackについて、 次の手順を実行します:
      1. HTMLMediaElement audioTracks listからaudio trackを削除します。
        注記

        これにより、AudioTrackList [HTML]のロジックが、 HTMLMediaElement audioTracks listを対象として、 TrackEventを使用し、 track 属性を audio trackで初期化して、 removetrackという名前の イベントを 発火するためのタスクを キューに入れる処理が起動されるはずです。この 削除手順の開始時に、audio trackenabled 属性がtrueであった場合は、 AudioTrackList [HTML]のロジックが、 HTMLMediaElement audioTracks listを対象として、 changeという名前のイベントを 発火するためのタスクを キューに入れる処理も起動されるはずです。

  4. 次のリストから適切な手順を実行します:
    MediaSourceWindow内で構築された場合:
    1. SourceBuffer videoTracks listを、 VideoTrackList オブジェクト、すなわちsourceBuffer.videoTracksが返す値とします。
    2. media elementを、 sourceBuffer親メディアソースが接続されているメディア要素とします。
    3. HTMLMediaElement videoTracks listを、 VideoTrackList オブジェクト、すなわちmedia elementvideoTracks 属性が返す値とします。
    4. SourceBuffer videoTracks list内の各video trackについて、次の手順を実行します:
      1. video tracksourceBuffer 属性を nullに設定します。
      2. SourceBuffer videoTracks listからvideo trackを削除します。
        注記

        これにより、VideoTrackList [HTML]のロジックが、 SourceBuffer videoTracks listを対象として、 TrackEventを使用し、 track 属性をvideo trackで初期化して、 removetrackという名前の イベントを 発火するためのタスクを キューに入れる処理が起動されるはずです。 この削除手順の開始時に、video trackselected 属性がtrueであった場合は、 VideoTrackList [HTML]のロジックが、 SourceBuffer videoTracks listを対象として、 changeという名前のイベントを 発火するためのタスクを キューに入れる処理も起動されるはずです。

      3. HTMLMediaElement videoTracks listからvideo trackを削除します。
        注記

        これにより、VideoTrackList [HTML]のロジックが、 HTMLMediaElement videoTracks listを対象として、 TrackEventを使用し、 track 属性を video trackで初期化して、 removetrackという名前の イベントを 発火するためのタスクを キューに入れる処理が起動されるはずです。この 削除手順の開始時に、video trackselected 属性がtrueであった場合は、 VideoTrackList [HTML]のロジックが、 HTMLMediaElement videoTracks listを対象として、 changeという名前のイベントを 発火するためのタスクを キューに入れる処理も起動されるはずです。

    それ以外の場合:
    [[port to main]]へ内部remove trackメッセージを送信します。 Window内の 暗黙的ハンドラーは、次の手順を実行します:
    1. media elementを、 sourceBuffer親メディアソースが接続されているメディア要素とします。
    2. HTMLMediaElement videoTracks listを、 VideoTrackList オブジェクト、すなわちmedia elementvideoTracks 属性が返す値とします。
    3. sourceBufferによって作成された、 HTMLMediaElement videoTracks list内の各video trackについて、 次の手順を実行します:
      1. HTMLMediaElement videoTracks listからvideo trackを削除します。
        注記

        これにより、VideoTrackList [HTML]のロジックが、 HTMLMediaElement videoTracks listを対象として、 TrackEventを使用し、 track 属性を video trackで初期化して、 removetrackという名前の イベントを 発火するためのタスクを キューに入れる処理が起動されるはずです。この 削除手順の開始時に、video trackselected 属性がtrueであった場合は、 VideoTrackList [HTML]のロジックが、 HTMLMediaElement videoTracks listを対象として、 changeという名前のイベントを 発火するためのタスクを キューに入れる処理も起動されるはずです。

  5. 次のリストから適切な手順を実行します:
    MediaSourceWindow内で構築された場合:
    1. SourceBuffer textTracks listを、 TextTrackList オブジェクト、すなわちsourceBuffer.textTracksが返す値とします。
    2. media elementを、 sourceBuffer親メディアソースが接続されているメディア要素とします。
    3. HTMLMediaElement textTracks listを、 TextTrackList オブジェクト、すなわちmedia elementtextTracks 属性が返す値とします。
    4. SourceBuffer textTracks list内の各text trackについて、 次の手順を実行します:
      1. text tracksourceBuffer 属性を nullに設定します。
      2. SourceBuffer textTracks listからtext trackを削除します。
        注記

        これにより、TextTrackList [HTML]のロジックが、 SourceBuffer textTracks listを対象として、 TrackEventを使用し、 track 属性をtext trackで初期化して、 removetrackという名前の イベントを 発火するためのタスクを キューに入れる処理が起動されるはずです。 この削除手順の開始時に、text trackmode 属性が "showing" または "hidden" であった場合は、 TextTrackList [HTML]のロジックが、 SourceBuffer textTracks listを対象として、 changeという名前の イベントを 発火するためのタスクを キューに入れる処理も起動されるはずです。

      3. HTMLMediaElement textTracks listからtext trackを削除します。
        注記

        これにより、TextTrackList [HTML]のロジックが、 HTMLMediaElement textTracks listを対象として、 TrackEventを使用し、 track 属性をtext trackで初期化して、 removetrackという名前の イベントを 発火するためのタスクを キューに入れる処理が起動されるはずです。 この削除手順の開始時に、text trackmode 属性が "showing" または "hidden" であった場合は、 TextTrackList [HTML]のロジックが、 HTMLMediaElement textTracks listを対象として、 changeという名前のイベントを 発火するためのタスクを キューに入れる処理も起動されるはずです。

    それ以外の場合:
    [[port to main]]へ内部remove trackメッセージを送信します。 Window内の 暗黙的ハンドラーは、次の手順を実行します:
    1. media elementを、 sourceBuffer親メディアソースが接続されているメディア要素とします。
    2. HTMLMediaElement textTracks listを、 TextTrackList オブジェクト、すなわちmedia elementtextTracks 属性が返す値とします。
    3. sourceBufferによって作成された、 HTMLMediaElement textTracks list内の各text trackについて、 次の手順を実行します:
      1. HTMLMediaElement textTracks listからtext trackを削除します。
        注記

        これにより、TextTrackList [HTML]のロジックが、 HTMLMediaElement textTracks listを対象として、 TrackEventを使用し、 track 属性をtext trackで初期化して、 removetrackという名前の イベントを 発火するためのタスクを キューに入れる処理が起動されるはずです。 この削除手順の開始時に、text trackmode 属性が "showing" または "hidden" であった場合は、 TextTrackList [HTML]のロジックが、 HTMLMediaElement textTracks listを対象として、 changeという名前のイベントを 発火するためのタスクを キューに入れる処理も起動されるはずです。

  6. sourceBufferactiveSourceBuffers内にある場合は、 sourceBufferactiveSourceBuffersから削除し、 activeSourceBuffersが返す SourceBufferListを対象として、 removesourcebufferという 名前のイベントを発火するための タスクをキューに入れます
  7. sourceBuffersourceBuffersから削除し、 sourceBuffersが返す SourceBufferListを対象として、 removesourcebufferという 名前のイベントを発火するための タスクをキューに入れます
  8. sourceBufferのすべてのリソースを破棄します。

3.9 endOfStream()メソッド

ストリームの終了を通知します。

  1. readyState属性が 「open」状態でない場合は、 InvalidStateError 例外をスローし、これらの手順を中止します。
  2. sourceBuffers内のいずれかの SourceBufferで、 updating属性がtrueと等しい場合は、InvalidStateError 例外をスローし、 これらの手順を中止します。
  3. errorパラメーターを errorに設定し、ストリームの終了アルゴリズムを実行します。

3.10 setLiveSeekableRange()メソッド

10. HTMLMediaElementの拡張節で、HTMLMediaElementseekableの 動作を変更するために使用される[[live seekable range]]を 更新します。

このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければなりません:

  1. readyState属性が「open」でない場合は、 InvalidStateError 例外をスローし、これらの手順を中止します。
  2. startが負であるか、endより大きい場合は、TypeError 例外をスローし、これらの手順を中止します。
  3. [[live seekable range]]を、 開始位置がstart、終了位置がendである 単一の範囲を含む、新しい正規化された TimeRangesオブジェクトに設定します。

3.11 clearLiveSeekableRange()メソッド

[[live seekable range]]を 更新します。この値は、第 10. HTMLMediaElementの拡張節で、HTMLMediaElementseekableの 動作を変更するために使用されます。

このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければなりません:

  1. readyState属性が「open」でない場合は、 InvalidStateError 例外をスローし、これらの手順を中止します。
  2. [[live seekable range]]に範囲が 含まれている場合は、 [[live seekable range]]を、新しい 空のTimeRanges オブジェクトに設定します。

3.12 isTypeSupported()メソッド

MediaSourceが、指定されたMIMEタイプ用の SourceBuffer オブジェクトを作成できるかどうかを確認します。

注記

このメソッドがtrueを返した場合、それはMediaSourceの 実装が、指定されたMIMEタイプ用のSourceBufferオブジェクトを作成できることだけを 示します。 新しいSourceBufferの追加をサポートするために十分なリソースを 利用できない場合、addSourceBuffer()の 呼び出しは、それでも失敗すべきです

注記

このメソッドがtrueを返す場合、HTMLMediaElementcanPlayType()は、 "maybe"または"probably"を返すことになります。HTMLMediaElementが再生できないと認識している タイプをMediaSourceが サポートすることに意味はないためです。

このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければなりません:

  1. typeが空文字列の場合は、falseを返します。
  2. typeに有効なMIMEタイプ文字列が含まれていない場合は、 falseを返します。
  3. typeにMediaSourceがサポートしていないメディアタイプまたは メディアサブタイプが含まれている場合は、 falseを返します。
  4. typeにMediaSourceがサポートしていないコーデックが含まれている場合は、 falseを返します。
  5. MediaSourceが、指定されたメディアタイプ、メディア サブタイプ、およびコーデックの組み合わせをサポートしていない場合は、falseを返します。
  6. trueを返します。

3.13 イベントの概要

イベント名 インターフェイス ディスパッチされる条件...
sourceopen Event MediaSourcereadyStateが、 「closed」から 「open」へ、または「ended」から「open」へ移行したとき。
sourceended Event MediaSourcereadyStateが、 「open」から 「ended」へ移行したとき。
sourceclose Event MediaSourcereadyStateが、 「open」から 「closed」へ、または「ended」から「closed」へ移行したとき。

3.14 コンテキスト間通信モデル

WindowHTMLMediaElementが、 DedicatedWorkerGlobalScopeMediaSourceへ接続されている場合、各コンテキストには、 もう一方のコンテキストの情報に依存するアルゴリズムがあります。

注記

HTMLMediaElementは、 Window コンテキストにのみ公開されますが、MediaSourceおよび この仕様で定義される関連オブジェクトは、Window コンテキストと DedicatedWorkerGlobalScope コンテキストに公開されます。これにより、アプリケーションは、 これらのいずれかの種類のコンテキストでMediaSourceオブジェクトを構築し、 メディア要素への 接続アルゴリズムで説明されているように、 MediaSourceオブジェクトURLまたは MediaSourceHandleを使用して、 Window コンテキスト内のHTMLMediaElement オブジェクトへ接続できます。 MediaSourceオブジェクトはTransferableではなく、 作成されたコンテキスト内でのみ 参照できます。

この節の残りでは、Windowの メディア要素をDedicatedWorkerGlobalScopeMediaSourceへ接続する際の、情報遅延の上限を定めるモデルについて説明します。 このモデルではメッセージの受け渡しを使用した 通信を説明していますが、実装は、共有メモリやロックを 使用するなど、より高速になり得る方法で通信することを選択してもよいものとしますWindowMediaSourceへの同期的な接続では、 コンテキスト間で情報を通信しなくても、その情報をすでに利用できます。

DedicatedWorkerGlobalScope内で構築された MediaSourceには、 接続時に設定され、切り離し時にnullへ設定される MessagePortを 格納する[[port to main]]内部スロットがあります。 Window[[port to main]]は、常にnullです。

この仕様によって拡張され、 DedicatedWorkerGlobalScopeMediaSourceへ接続されたHTMLMediaElementにも同様に、 MessagePortを格納する[[port to worker]]内部スロットと、 MessageChannelを格納する [[channel with worker]] 内部スロットがあり、 どちらも接続時に設定され、切り離し時に nullへ設定されます。[[port to worker]][[channel with worker]]は、 DedicatedWorkerGlobalScopeMediaSourceへ接続されていない限り、どちらもnullです。

この仕様のアルゴリズムが、WindowHTMLMediaElementから、 接続されたDedicatedWorkerGlobalScopeMediaSourceへ、または その逆方向へ情報を伝達する必要がある場合、これらの内部ポートを暗黙的に使用して 対応する相手へメッセージを送信し、メッセージの暗黙的なハンドラーが、 アルゴリズムに記述された手順を実行します。

3.15 アルゴリズム

3.15.1 メディア要素への接続

MediaSourceをメディア要素へ接続する仕組みは、 MediaSourceオブジェクトが Window内で 構築されたか、 DedicatedWorkerGlobalScope内で 構築されたかによって異なります:

メディアプロバイダーオブジェクトが MediaSourceオブジェクト、MediaSourceHandleオブジェクト、または オブジェクトがMediaSourceオブジェクトであるURLレコードの場合に、 リソース 取得アルゴリズムが呼び出された場合は、modeをlocalとし、 リソース 取得アルゴリズムの最初の手順(この手順では、それ以外の場合にmodeをremoteへ設定することがあります)をスキップし、 リソース 取得アルゴリズムの実行を継続します。

注記

リソース 取得アルゴリズムの最初の手順は、最終的に、オブジェクトがメディアプロバイダーオブジェクトである URLレコードにlocal modeを選択する処理と整合することが想定されています。 HTMLMediaElementsrc 属性、または選択された子 sourcesrc 属性が、それぞれのsrc属性が最後に変更された時点で MediaSourceオブジェクトURLと一致するblob: URLである場合、 そのMediaSourceオブジェクトを、 リソース 取得アルゴリズムのlocal modeのロジックにおけるメディアプロバイダーオブジェクトおよび現在のメディア リソースとして使用することが意図されています。これは、MediaSourceオブジェクトが接続されている場合、 preload属性の監視を含むremote modeのロジックがスキップされることも 意味します。[HTML]にその最終的な変更が加えられた後でも、 現在のメディアリソースがMediaSourceオブジェクトである場合は、 local modeのロジックの先頭で次の手順を実行する必要があります。

リソース 取得アルゴリズムの「それ以外の場合(modeはlocal)」節の先頭で、以下の追加手順を 実行します。

注記

メディア要素のリソース選択 アルゴリズムを起動したアクションに対して、これらの手順は非同期です。 リソース選択アルゴリズムを呼び出したタスクの続行が許可され、安定状態へ 到達した後に、リソース 取得アルゴリズムが実行されます。実装は、MediaSourceオブジェクトを使用できる状態になるまで、以下の 「それ以外の場合」句の手順を遅延させてもかまいません。

  1. メディアプロバイダーオブジェクトが MediaSourceオブジェクト、MediaSourceHandle オブジェクト、またはオブジェクトがMediaSourceオブジェクトであるURLレコードの場合に、 リソース 取得アルゴリズムが呼び出された場合:
    メディアプロバイダーオブジェクトが、 DedicatedWorkerGlobalScope内で構築された MediaSourceをオブジェクトとして持つURLレコードである場合、たとえば、 DedicatedWorkerGlobalScopeMediaSourceMediaSourceオブジェクトURLを 使用しようとした場合
    リソース 取得アルゴリズムメディア データ処理手順リストにあるネットワークエラーが原因でメディアデータをまったく取得できず、 ユーザーエージェントがリソースの取得を断念した場合の手順を 実行します。
    注記
    これにより、DedicatedWorkerのMediaSourceを接続するために MediaSourceオブジェクトURLを使用できなくなります。 DedicatedWorkerからWindowコンテキストへMediaSourcehandleを 転送し、メディア要素の srcObject 属性へ代入することが、このような MediaSourceを接続する唯一の方法です。
    メディアプロバイダーオブジェクトがMediaSourceHandleであり、その [[Detached]] 内部スロットがtrueである場合
    リソース 取得アルゴリズムメディア データ処理手順リストにあるネットワークエラーが原因でメディアデータをまったく取得できず、 ユーザーエージェントがリソースの取得を断念した場合の手順を 実行します。
    メディアプロバイダーオブジェクトがMediaSourceHandleであり、その基礎となる MediaSource[[has ever been attached]] 内部スロットが trueである場合
    リソース 取得アルゴリズムメディア データ処理手順リストにあるネットワークエラーが原因でメディアデータをまったく取得できず、 ユーザーエージェントがリソースの取得を断念した場合の手順を 実行します。
    注記
    これにより、基礎となるMediaSourceを、 MediaSourceHandleを使用して 複数回読み込むことを防ぎます。 MediaSourceWindow上で構築され、 以前にMediaSourceオブジェクトURLを使用して読み込まれていた場合でも同様です。 ただし、WindowMediaSourceについて、 MediaSourceオブジェクトURLをその後使用して 成功することまで妨げるものではありません。
    readyStateが 「closed」に設定されていない場合
    リソース 取得アルゴリズムメディア データ処理手順リストにあるネットワークエラーが原因でメディアデータをまったく取得できず、 ユーザーエージェントがリソースの取得を断念した場合の手順を 実行します。
    それ以外の場合
    1. MediaSource[[has ever been attached]] 内部スロットをtrueに設定します。
    2. メディア要素のloadイベント遅延フラグを falseに 設定します。
    3. MediaSourceDedicatedWorkerGlobalScope内で 構築された場合は、ワーカー接続の 通信を設定してMediaSourceを開きます:
      1. [[channel with worker]]を、 新しい MessageChannelに設定します。
      2. [[port to worker]]を、 [[channel with worker]]port1 の値に設定します。
      3. [[channel with worker]]port2を、 値および transferListの唯一のメンバーの両方として StructuredSerializeWithTransferを 実行し、その結果をserialized port2とします。
      4. MediaSourceDedicatedWorkerGlobalScope上で、 次の処理を行うタスクを キューに入れます
        1. serialized port2およびDedicatedWorkerGlobalScopeレルムを使用して、 StructuredDeserializeWithTransferを実行し、 [[port to main]]を、 転送されたport2 の値をデシリアライズした結果の複製、すなわち[[channel with worker]]の値に 設定します。
        2. readyState 属性を 「open」に設定します。
        3. MediaSourceを 対象として、sourceopenという名前の イベントを 発火するためのタスクを キューに入れます
      それ以外の場合、MediaSourceWindow内で構築されています:
      1. [[channel with worker]]を nullに設定します。
      2. [[port to worker]]を nullに設定します。
      3. [[port to main]]を nullに設定します。
      4. readyState 属性を 「open」に設定します。
      5. MediaSourceを 対象として、sourceopenという名前の イベントを 発火するためのタスクを キューに入れます
    4. リソース 取得アルゴリズムの残りの それ以外の場合(modeはlocal)の手順を、次の要件に従って実行し、 継続します:
      1. リソース 取得アルゴリズムまたはメディア データ処理手順リストにある「ダウンロード」、 「受信したバイト」、または「現在のメディアリソースの新しいデータが 利用可能になるたび」というテキストは、 appendBuffer()を介して渡されるデータを指します。
      2. リソース 取得アルゴリズムおよび メディア データ処理手順リスト内のHTTPへの参照は適用されません。 MediaSourceが 接続されている場合、HTMLMediaElementはHTTP経由でメディアデータを取得しないためです。
注記

接続されたMediaSourceは、リソース 取得アルゴリズムのremote modeの手順を使用しないため、メディア要素は"suspend"イベントを発火しません。 この仕様の将来のバージョンでは、MediaSourceが接続されたメディア要素から "progress"イベントと"stalled"イベントが削除される可能性がありますが、このバージョンの 仕様に適合するユーザーエージェントは、これらの[HTML]参照が この仕様の実装が安定した後に 変更されたため、これら2つのイベントを引き続き発火する可能性があります。

3.15.2 メディア要素 からの切り離し

次の手順は、メディア要素が NETWORK_EMPTYへ 移行し、メディア要素を対象として emptiedという 名前のイベントを発火するための タスクをキューに入れる すべての場合に実行されます。これらの手順は、移行の直前に実行 すべきです

  1. MediaSourceDedicatedWorkerGlobalScope内で構築された場合:
    1. [[port to worker]]へ 内部detachメッセージを送信して、 MediaSourceへ通知します。
    2. [[port to worker]]をnullに設定します。
    3. [[channel with worker]]を nullに設定します。
    4. このdetach通知の暗黙的なメッセージハンドラーが、 DedicatedWorkerGlobalScopeMediaSource内で、 残りの手順を実行します。
    それ以外の場合、MediaSourceWindow内で構築されています:
    WindowMediaSource上で、 残りの手順を続行します。
  2. [[port to main]]をnullに設定します。
  3. readyState属性を「closed」に設定します。
  4. thisManagedMediaSourceである場合は、streaming 属性をfalseに設定します。
  5. durationをNaNに更新します。
  6. activeSourceBuffersから、 すべてのSourceBufferオブジェクトを 削除します。
  7. activeSourceBuffersを対象として、 removesourcebufferという名前の イベントを 発火するためのタスクをキューに入れます
  8. sourceBuffersから、 すべてのSourceBufferオブジェクトを 削除します。
  9. sourceBuffersを対象として、 removesourcebufferという名前の イベントを 発火するためのタスクをキューに入れます
  10. MediaSourceを対象として、 sourcecloseという名前の イベントを 発火するためのタスクをキューに入れます
注記

今後、このアルゴリズムは外部から呼び出され、接続されている MediaSourceが存在する場合に、 それをメディア要素から切り離す必要があるすべての場合に実行されることが意図されています。 このアルゴリズムは、メディア要素が NETWORK_EMPTYへ 移行するときに加えて、またはその代わりに、HTMLMediaElement [HTML]の load()などの操作や、リソース 取得アルゴリズムの失敗時に呼び出されることもあります。 リソース取得アルゴリズムの失敗とは、 リソース取得アルゴリズムまたはリソース選択アルゴリズムのいずれかを中止するものです。 ただし、「最終手順」[HTML]は、切り離しを起動する 失敗とは見なされません。

3.15.3 シーク

シークアルゴリズムの 「新しい再生位置のメディアデータを利用できるかどうかをユーザーエージェントが確定するまで待機し、 利用できる場合は、その位置を再生するために十分なデータを デコードするまで待機する」手順の一部として、次の手順を実行します:

  1. 注記

    メディア要素は、 activeSourceBuffers内の 各SourceBufferオブジェクトで、 new playback positionを含むメディア セグメントを探します。 HTMLMediaElementbuffered 属性の現在値に含まれる TimeRanges内の すべての位置では、その位置に必要なすべてのメディアセグメントがバッファされています。

    new playback positionが、 HTMLMediaElementbufferedに含まれるいずれの TimeRanges内にも存在しない場合
    1. HTMLMediaElementreadyState属性が HAVE_METADATAより大きい場合は、 HTMLMediaElementreadyState属性を HAVE_METADATAに設定します。
      注記

      HTMLMediaElementの準備状態 [HTML]のロジックに従い、 HTMLMediaElementreadyStateの変更により、 HTMLMediaElement上でイベントが起動される場合があります。

    2. メディア要素は、appendBuffer()の 呼び出しによって、符号化フレーム処理 アルゴリズムが、 HTMLMediaElementreadyState属性を HAVE_METADATAより大きい値に 設定するまで待機します。
      注記

      ウェブアプリケーションは、buffered および HTMLMediaElementbufferedを使用して、 メディア要素が再生を再開するために必要なものを 判断できます。

    それ以外の場合
    続行します
    注記

    readyState 属性が「ended」で、 new playback positionが、 TimeRangesのうち、現在 HTMLMediaElementbuffered内にあるものの範囲内である場合、 現在選択または有効化されている1つ以上のトラックバッファの最大範囲終了タイムスタンプが new playback positionより小さい場合でも、シーク操作は ここで完了まで続行しなければなりません。この条件は、 readyStateが 「ended」の場合のbufferedのロジックによってのみ 発生するはずです。

  2. メディア要素は、すべてのデコーダーをリセットし、 適切な初期化セグメントのデータを使用して、それぞれを初期化します。
  3. メディア要素は、new playback positionより前にある最も近いランダム アクセスポイントから開始し、アクティブトラックバッファ符号化フレームを デコーダーへ供給します。
  4. シーク アルゴリズムを「安定状態を待機する」 手順から再開します。

3.15.4 SourceBufferの監視

次の手順は、activeSourceBuffers内の すべてのSourceBufferオブジェクトに、 途切れない再生を保証するのに十分なデータがあることを確認するため、 再生中に定期的に実行されます。activeSourceBuffersへの変更も、 状態遷移を起動する条件に影響するため、 これらの手順を実行させます。

途切れない再生を 保証するのに十分なデータがあるとは、 プレゼンテーションを意味のある期間にわたって停止させずに再生できる 十分なデータが現在あるとユーザーエージェントが判断する、実装固有の条件です。 この条件は、メディア要素を HAVE_ENOUGH_DATA 準備状態へ移行させる時点、およびそこから移行させる時点を決定するため、継続的に評価されます。 これらの遷移は、それぞれ、十分なデータがバッファされているとユーザーエージェントが判断した時点、 またはより多くのデータが必要だと判断した時点を示します。

注記

実装は、十分なデータがある時点を判断するために、バッファされたバイト数、バッファされた時間、 追加速度、または適切と判断するその他の指標を使用することを 選択してもよいものとします。使用される指標は再生中に 変更される場合があるため、ウェブアプリケーションは、 さらにデータが必要かどうかを判断する際に、 HTMLMediaElementreadyStateの値だけに依存 すべきです

注記

メディア要素がさらにデータを必要とするとき、ユーザーエージェントは、 ウェブアプリケーションが再生を中断させずに対応できるほど十分に早く、 HAVE_ENOUGH_DATAから HAVE_FUTURE_DATAへ 移行すべきです。 たとえば、現在の再生位置がバッファ済みデータの終端より500ms前にある時点で移行すれば、 再生が停止するまでに、アプリケーションがさらにデータを追加するための 約500msが与えられます。

HTMLMediaElementreadyState属性が HAVE_NOTHINGと等しい場合:
  1. これらの手順を中止します。
HTMLMediaElementbufferedに、 現在の再生位置を含む TimeRangesが 存在しない場合:
  1. HTMLMediaElementreadyState属性を HAVE_METADATAに設定します。
    注記

    HTMLMediaElementの準備状態 [HTML]のロジックに従い、 HTMLMediaElementreadyStateの変更により、 HTMLMediaElement上でイベントが 起動される場合があります。

  2. これらの手順を中止します。
HTMLMediaElementbufferedに、 現在の再生位置と途切れない再生を保証する のに十分なデータを含むTimeRangesが 存在する場合:
  1. HTMLMediaElementreadyState属性を HAVE_ENOUGH_DATAに設定します。
    注記

    HTMLMediaElementの準備状態 [HTML]のロジックに従い、 HTMLMediaElementreadyStateの変更により、 HTMLMediaElement上でイベントが 起動される場合があります。

  2. 以前にHAVE_CURRENT_DATAへの 移行によって再生が一時停止されていた場合は、この時点で再開されることがあります。
  3. これらの手順を中止します。
HTMLMediaElementbufferedに、 現在の再生位置と、その位置より後の一定時間を含むTimeRangesが 存在する場合は、次の手順を実行します:
  1. HTMLMediaElementreadyState属性を HAVE_FUTURE_DATAに設定します。
    注記

    HTMLMediaElementの準備状態 [HTML]のロジックに従い、 HTMLMediaElementreadyStateの変更により、 HTMLMediaElement上でイベントが 起動される場合があります。

  2. 以前にHAVE_CURRENT_DATAへの 移行によって再生が一時停止されていた場合は、この時点で再開されることがあります。
  3. これらの手順を中止します。
HTMLMediaElementbufferedに、 現在の再生位置で終了し、現在位置の直後の時間を 覆う範囲を持たないTimeRangesが 存在する場合:
  1. HTMLMediaElementreadyState属性を HAVE_CURRENT_DATAに設定します。
    注記

    HTMLMediaElementの準備状態 [HTML]のロジックに従い、 HTMLMediaElementreadyStateの変更により、 HTMLMediaElement上でイベントが 起動される場合があります。

  2. メディア要素にはメディア タイムラインを進めるのに十分なデータがないため、この時点で再生が一時停止されます。
  3. これらの手順を中止します。

3.15.5 選択済み/有効化済みトラックの 状態変更

再生中に、selectedである 映像トラック、enabledである 音声トラック、またはテキストトラックの modeが 変更された場合は、activeSourceBuffersを 更新する必要があります。これらの変更が1つ以上発生した場合は、 次の手順に従う必要があります。AudioTrackVideoTrackTextTrack オブジェクト、およびそれぞれのAudioTrackListVideoTrackListTextTrackListは、 WindowHTMLMediaElement上でのみ公開されるため、 これらの変更は常に Window コンテキストで発生します。MediaSourceDedicatedWorkerGlobalScope内で構築された場合、 このような各変更は、[[port to worker]]へ 内部update track stateメッセージを送信することで、 DedicatedWorkerGlobalScopeへ 通知されなければなりません。その暗黙的なハンドラーは、 影響を受けるトラックを作成したSourceBufferについて、 次の手順を実行します。MediaSourceWindow内で構築された場合、 次の手順は直接実行されます。

選択されている映像トラックが変更された場合は、次の手順を実行します:
  1. 以前に選択されていた映像トラックに関連付けられた SourceBufferが、 他の有効化済みトラックに関連付けられていない場合は、次の手順を実行します:
    1. activeSourceBuffersから、 SourceBufferを削除します。
    2. activeSourceBuffersを対象として、 removesourcebufferという名前の イベントを発火するための タスクを キューに入れます
  2. 新たに選択された映像トラックに関連付けられた SourceBufferが、 activeSourceBuffersに まだ存在しない場合は、次の手順を実行します:
    1. SourceBufferactiveSourceBuffersへ追加します。
    2. activeSourceBuffersを対象として、 addsourcebufferという名前の イベントを発火するための タスクを キューに入れます
音声トラックが無効になり、このトラックに関連付けられたSourceBufferが、 他の有効化済みまたは選択済みのトラックに関連付けられていない場合は、 次の手順を実行します:
  1. 音声トラックに関連付けられたSourceBufferを、 activeSourceBuffersから削除します
  2. activeSourceBuffersを対象として、 removesourcebufferという名前の イベントを発火するための タスクを キューに入れます
音声トラックが有効になり、このトラックに関連付けられたSourceBufferが、 activeSourceBuffersにまだ存在しない場合は、 次の手順を実行します:
  1. 音声トラックに関連付けられたSourceBufferを、 activeSourceBuffersへ追加します
  2. activeSourceBuffersを対象として、 addsourcebufferという名前の イベントを発火するための タスクを キューに入れます
テキストトラックのmode"disabled"になり、 このトラックに関連付けられたSourceBufferが、 他の有効化済みまたは選択済みのトラックに関連付けられていない場合は、 次の手順を実行します:
  1. テキストトラックに関連付けられたSourceBufferを、 activeSourceBuffersから削除します
  2. activeSourceBuffersを対象として、 removesourcebufferという名前の イベントを発火するための タスクを キューに入れます
テキストトラックのmode"showing" または "hidden"になり、 このトラックに関連付けられたSourceBufferactiveSourceBuffersにまだ存在しない場合は、 次の 手順を実行します:
  1. テキストトラックに関連付けられたSourceBufferを、 activeSourceBuffersへ追加します
  2. activeSourceBuffersを対象として、 addsourcebufferという名前の イベントを発火するための タスクを キューに入れます

3.15.6 継続時間の 変更

durationnew durationへ変更する必要がある場合は、次の手順に従います。

  1. durationの 現在値がnew durationと等しい場合は、 戻ります。
  2. new durationが、 sourceBuffers内のすべての SourceBufferオブジェクトについて、 バッファ済みのすべての符号化フレームのうち最も大きいプレゼンテーションタイムスタンプより小さい場合は、 InvalidStateError 例外をスローし、 これらの手順を中止します。
    注記

    現在バッファされているメディアを切り詰めるような継続時間の短縮は許可されません。 切り詰めが必要な場合は、remove()を使用し、 durationを更新する前に、 バッファ済み 範囲を縮小します。

  3. highest end timeを、 sourceBuffers内のすべての SourceBufferオブジェクトに含まれる、 すべてのトラックバッファトラックバッファ範囲の 終了時刻のうち最大のものとします。
  4. new durationhighest end timeより小さい場合:
    注記

    符号化フレームの削除アルゴリズムは、 削除範囲の開始位置より前に開始する符号化フレームを保持するため、 この条件が発生する可能性があります。

    1. new durationhighest end timeと等しくなるように更新します。
  5. durationnew durationへ更新します。
  6. 必要に応じてミラーリングするアルゴリズムを使用し、 メディア要素の継続時間を更新するために、Window内で 次の手順を実行します:
    1. メディア要素のdurationnew durationへ更新します。
    2. HTMLMediaElementの 継続時間変更アルゴリズムを実行します。

3.15.7 ストリームの 終了

このアルゴリズムは、アプリケーションが endOfStream()の呼び出しを介して ストリームの終了を通知した場合、またはアルゴリズムがデコードエラーを通知する必要がある場合に 呼び出されます。この アルゴリズムは、エラーを通知するかどうかを示す errorパラメーターを取ります。

  1. readyState属性の値を 「ended」へ変更します。
  2. MediaSourceを対象として、 sourceendedという名前の イベントを 発火するためのタスクをキューに入れます
  3. errorが設定されていない場合
    1. new durationを、 sourceBuffers内の すべてのSourceBufferオブジェクトに含まれる、 すべてのトラックバッファトラックバッファ範囲の終了時刻のうち 最大のものに設定し、継続時間の変更 アルゴリズムを実行します。
      注記

      これにより、継続時間に、追加されたメディア セグメントの終了が適切に反映されます。たとえば、継続時間が明示的に10秒へ設定され、 endOfStream()が呼び出される前に 0秒から5秒までのメディアセグメントだけが追加されていた場合、 継続時間は5秒へ更新されます。

    2. すべてのメディアデータが揃ったことをメディア要素へ通知します。
    errorが「network」に設定されている場合
    必要に応じてミラーリングする アルゴリズムを使用し、 Window内で次の手順を実行します:
    HTMLMediaElementreadyState属性が HAVE_NOTHINGと 等しい場合
    リソース 取得アルゴリズムメディア データ処理手順リストにあるネットワーク エラーが原因でメディアデータをまったく取得できず、ユーザーエージェントがリソースの 取得を断念した場合の手順を実行します。
    HTMLMediaElementreadyState属性が HAVE_NOTHINGより 大きい場合
    リソース 取得アルゴリズムメディア データ処理手順リストにある「一部のメディアデータを受信した後に接続が 中断され、ユーザーエージェントがリソースの 取得を断念した場合」の 手順を実行します。
    errorが「decode」に設定されている場合
    必要に応じてミラーリングする アルゴリズムを使用し、 Window内で次の手順を実行します:
    HTMLMediaElementreadyState属性が HAVE_NOTHINGと 等しい場合
    リソース 取得アルゴリズムメディア データ処理手順リストにある「メディアデータを取得できるものの、検査によって サポートされていない形式であることが判明した場合、またはその他の理由でまったくレンダリングできない場合」の手順を 実行します。
    HTMLMediaElementreadyState属性が HAVE_NOTHINGより 大きい場合
    メディア データが破損している場合の手順を、リソース 取得アルゴリズムメディア データ処理手順リストから実行します。

3.15.8 必要な 場合のミラーリング

このアルゴリズムは、同じWindow、 またはDedicatedWorkerGlobalScopeの いずれかから接続されたMediaSourceから、 Window上で 手順を実行するために使用されます。通常は、接続された HTMLMediaElementの状態を 更新するために使用されます。このアルゴリズムは、 Window上で実行する手順を列挙する stepsパラメーターを取ります。

MediaSourceDedicatedWorkerGlobalScope内で構築された場合:
[[port to main]]へ内部mirror on windowメッセージを送信します。 Window内の 暗黙的なハンドラーがstepsを実行します。そのハンドラーがメッセージを受信するのを 待たずに、呼び出し元へ制御を返します。
注記
ミラーメッセージ機構の目的は、次のことを保証することです:
  1. stepsは、他のWindowタスクの 実行途中で何らかの形で実行されるのではなく、 Window上の 独立したタスクとして非同期に実行されます。
  2. stepsは、 DedicatedWorkerGlobalScope上での このアルゴリズムの同期的な実行と復帰をブロックせずに実行されます。
それ以外の場合:
stepsを実行します。

4. MediaSourceHandleインターフェイス

MediaSourceHandleインターフェイスは、MediaSourceオブジェクトのプロキシを表します。これは、 DedicatedWorkerGlobalScopeMediaSourceWindowHTMLMediaElementに、 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 {};

4.1 転送

MediaSourceHandle転送手順 および転送受信手順では、実装が基礎となる MediaSourceを参照する暗黙の内部スロットを維持する必要があります。これにより、 srcObjectを使用したメディア要素へのアタッチと、それに続くアタッチメントのコンテキスト間通信モデルの設定が可能になります。

注記

実装者は、Transferableによって暗示される「move」セマンティクスの想定が、必ずしも現実と一致しないことに留意すべきです。たとえば、ブロードキャストを使用するpostMessageの拡張または内部実装により、転送されたMediaSourceHandleに意図しない複数の受信者が生じる可能性があります。 このため実装は、基礎となるMediaSourceオブジェクトのいずれかのハンドルが、メディア要素のリソース選択アルゴリズムの非同期部分で使用されるまでは、また使用されない限り、転送されたMediaSourceHandleの潜在的なクローンのうち、どれがアタッチに対して引き続き有効であるかを確定しないよう案内されています。 これは、容易に複製できる既存のMediaSourceオブジェクトURLを介したアタッチの動作と似ています。そのようなURLは、その潜在的に多数のクローン全体で、最大1回のアタッチ開始に対してのみ有効です。

実装は、MediaSourceHandleの基礎となるMediaSourceオブジェクトについて、MediaSourceHandleTransferableの実装の違いによって複製される可能性にかかわらず、 srcObjectを介したアタッチ(ロード)を、その存続期間全体で最大1回のみサポートしなければなりません

注記

メディア要素のリソース選択アルゴリズムの非同期部分でこれがどのように強制されるかについては、メディア要素へのアタッチを参照してください。

MediaSourceHandleは、Window およびDedicatedWorkerGlobalScopeのコンテキストでのみ公開され、異なるエージェントクラスター間で正常に転送することはできません[ECMASCRIPT]。MediaSourceHandleオブジェクトの転送は、同じエージェントクラスター内でのみ成功できます。

注記

たとえば、Window またはDedicatedWorkerGlobalScopeのいずれかからSharedWorkerまたはServiceWorkerのいずれかへのMediaSourceHandleオブジェクトの転送は成功しません。開発者は、多様な方法で通信できるDOMStringであるMediaSourceオブジェクトURLとのこの違いに留意すべきです。それでも、MediaSourceオブジェクトURLを使用するメディア要素へのアタッチは、Windowコンテキストで構築されたMediaSourceに対してのみ成功できます。 また、WebアプリケーションAPI向けのエージェント およびエージェントクラスター形式体系の統合[HTML]も参照してください。そこでは、専用ワーカーエージェントなどの関連概念が定義されています。

MediaSourceHandleオブジェクトの転送手順には、次の手順を含めなければなりません

  1. MediaSourceHandle[[has ever been assigned as srcobject]] 内部スロットがtrueである場合、転送手順DataCloneError例外をスローすることによって失敗しなければなりません。

5. SourceBufferインターフェイス

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);
};
注記

audioTracksvideoTracksおよび textTracks属性は、Windowコンテキストにのみ公開されます。 DedicatedWorkerGlobalScopeからSourceBufferを使用する場合、そのトラックは代わりに、アタッチ先のWindowHTMLMediaElement上に作成され、その所有となります。これは、初期化セグメント受信アルゴリズムで説明されています。

5.1 属性

mode: 型はAppendMode

一連のメディアセグメントをどのように処理するかを制御します。この属性は、オブジェクトの作成後にaddSourceBuffer()によって初期設定され、 changeType()またはこの属性の設定によって更新できます。

取得時には、初期値または最後に正常に設定された値を返します。

設定時には、次の手順を実行します。

  1. このオブジェクトが親メディアソースsourceBuffers属性から削除されている場合、InvalidStateError例外をスローし、これらの手順を中止します。
  2. updating属性がtrueである場合、InvalidStateError例外をスローし、これらの手順を中止します。
  3. new modeを、この属性に代入される新しい値とします。
  4. [[generate timestamps flag]]がtrueで、かつnew modeが 「segments」である場合、TypeError例外をスローし、これらの手順を中止します。
  5. 親メディアソースreadyState属性が「ended」状態である場合、次の手順を実行します。

    1. 親メディアソースreadyState属性を「open」に設定します。
    2. タスクをキューに入れイベントを発火し親メディアソースsourceopenという名前のイベントを発生させます。
  6. [[append state]]PARSING_MEDIA_SEGMENTと等しい場合、 InvalidStateErrorをスローし、これらの手順を中止します。
  7. new modeが「sequence」と等しい場合、 [[group start timestamp]][[group end timestamp]]に設定します。
  8. 属性をnew modeに更新します。
updating:型はboolean、 読み取り専用

appendBuffer() またはremove()操作の非同期継続が、まだ処理中かどうかを示します。この属性は、オブジェクトの作成時に最初にfalseに設定されます。

buffered:型はTimeRanges、 読み取り専用

SourceBuffer内でバッファリングされているTimeRangesを示します。この属性は、オブジェクトの作成時に空のTimeRangesオブジェクトに初期設定されます。

この属性を読み取るとき、次の手順を実行しなければなりません

  1. このオブジェクトが親メディアソースsourceBuffers属性から削除されている場合、InvalidStateError例外をスローし、これらの手順を中止します。
  2. highest end timeを、このSourceBufferオブジェクトによって管理されるすべてのトラックバッファにわたるトラックバッファ範囲の終了時刻の最大値とします。
  3. intersection rangesを、0からhighest end timeまでの単一の範囲を含むTimeRangesオブジェクトとします。
  4. このSourceBufferによって管理される各音声および映像トラックバッファについて、次の手順を実行します。
    注記

    テキストトラックバッファは、上記のhighest end timeの計算には含まれますが、ここでのバッファ範囲の計算からは除外されます。これらは必ずしも連続しているとは限らず、また他のメディアトラックが同じ時間範囲にわたって連続している場合、それらの内部の不連続によって再生停止が引き起こされるべきでもありません。

    1. track rangesを、現在のトラックバッファトラックバッファ範囲とします。
    2. readyStateが「ended」である場合、track ranges内の最後の範囲の終了時刻をhighest end timeに設定します。
    3. new intersection rangesを、 intersection rangestrack rangesとの積集合とします。
    4. intersection ranges内の範囲をnew intersection rangesで置き換えます。
  5. intersection rangesに、現在のこの属性値とまったく同じ範囲情報が含まれていない場合、この属性の現在値を intersection rangesに更新します。
  6. この属性の現在値を返します。
timestampOffset:型はdouble

このSourceBufferに後から追加されるメディアセグメント内のタイムスタンプに適用されるオフセットを制御します。timestampOffsetは最初に0に設定され、オフセットが適用されていないことを示します。

取得時には、初期値または最後に正常に設定された値を返します。

設定時には、次の手順を実行します。

  1. new timestamp offsetを、この属性に代入される新しい値とします。
  2. このオブジェクトが親メディアソースsourceBuffers属性から削除されている場合、InvalidStateError例外をスローし、これらの手順を中止します。
  3. updating属性がtrueである場合、InvalidStateError例外をスローし、これらの手順を中止します。
  4. 親メディアソースreadyState属性が「ended」状態である場合、次の手順を実行します。

    1. 親メディアソースreadyState属性を「open」に設定します。
    2. タスクをキューに入れイベントを発火し親メディアソースsourceopenという名前のイベントを発生させます。
  5. [[append state]]PARSING_MEDIA_SEGMENTと等しい場合、 InvalidStateErrorをスローし、これらの手順を中止します。
  6. mode属性が「sequence」と等しい場合、 [[group start timestamp]]new timestamp offsetに設定します。
  7. 属性をnew timestamp offsetに更新します。
audioTracks:型はAudioTrackList、 読み取り専用
このオブジェクトによって作成されたAudioTrackオブジェクトのリスト。この属性はWindowコンテキストにのみ公開され、SourceBufferDedicatedWorkerGlobalScopeで作成された場合は利用できません。
videoTracks:型はVideoTrackList、 読み取り専用
このオブジェクトによって作成されたVideoTrackオブジェクトのリスト。この属性はWindowコンテキストにのみ公開され、SourceBufferDedicatedWorkerGlobalScopeで作成された場合は利用できません。
textTracks:型はTextTrackList、 読み取り専用
このオブジェクトによって作成されたTextTrackオブジェクトのリスト。この属性はWindowコンテキストにのみ公開され、SourceBufferDedicatedWorkerGlobalScopeで作成された場合は利用できません。
appendWindowStart:型はdouble

追加ウィンドウの開始位置のプレゼンテーションタイムスタンプ。この属性は最初にプレゼンテーション開始時刻に設定されます。

取得時には、初期値または最後に正常に設定された値を返します。

設定時には、次の手順を実行します。

  1. このオブジェクトが親メディアソースsourceBuffers属性から削除されている場合、InvalidStateError例外をスローし、これらの手順を中止します。
  2. updating属性がtrueである場合、InvalidStateError例外をスローし、これらの手順を中止します。
  3. 新しい値が0未満、またはappendWindowEnd以上である場合、TypeError例外をスローし、これらの手順を中止します。
  4. 属性を新しい値に更新します。
appendWindowEnd:型はunrestricted double

追加ウィンドウの終了位置のプレゼンテーションタイムスタンプ。この属性は最初に正のInfinityに設定されます。

取得時には、初期値または最後に正常に設定された値を返します。

設定時には、次の手順を実行します。

  1. このオブジェクトが親メディアソースsourceBuffers属性から削除されている場合、InvalidStateError例外をスローし、これらの手順を中止します。
  2. updating属性がtrueである場合、InvalidStateError例外をスローし、これらの手順を中止します。
  3. 新しい値がNaNと等しい場合、TypeErrorをスローし、これらの手順を中止します。
  4. 新しい値がappendWindowStart以下である場合、 TypeError例外をスローし、これらの手順を中止します。
  5. 属性を新しい値に更新します。
onupdatestart:型はEventHandler

updatestartイベントのイベントハンドラー。

onupdate:型はEventHandler

updateイベントのイベントハンドラー。

onupdateend:型はEventHandler

updateendイベントのイベントハンドラー。

onerror:型はEventHandler

errorイベントのイベントハンドラー。

onabort:型はEventHandler

abortイベントのイベントハンドラー。

5.2 メソッド

appendBuffer

BufferSourceWEBIDL]内のセグメントデータを SourceBufferに追加します。

このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければなりません。

  1. 追加準備アルゴリズムを実行します。
  2. data[[input buffer]]の末尾に追加します。
  3. updating属性をtrueに設定します。
  4. タスクをキューに入れ、この SourceBufferオブジェクトで updatestartという名前のイベントを発火します
  5. バッファ追加アルゴリズムを非同期に実行します。
abort

現在のセグメントを中止し、セグメントパーサーをリセットします。

このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければなりません。

  1. このオブジェクトが親メディアソースsourceBuffers属性から削除されている場合、InvalidStateError例外をスローし、 これらの手順を中止します。
  2. 親メディアソースreadyState属性が「open」状態でない場合、InvalidStateError例外をスローし、 これらの手順を中止します。
  3. 範囲削除アルゴリズムが実行中である場合、InvalidStateError例外をスローし、これらの手順を中止します。
  4. updating属性がtrueである場合、次の手順を実行します。
    1. バッファ追加アルゴリズムが実行中であれば中止します。
    2. updating属性を falseに設定します。
    3. タスクをキューに入れ、この SourceBufferオブジェクトで abortという名前のイベントを発火します
    4. タスクをキューに入れ、この SourceBufferオブジェクトで updateendという名前のイベントを発火します
  5. パーサー状態のリセット アルゴリズムを実行します。
  6. appendWindowStartプレゼンテーション開始時刻に設定します。
  7. appendWindowEndを 正のInfinityに設定します。
changeType

このオブジェクトに関連付けられたMIMEタイプを変更します。以後の appendBuffer() 呼び出しでは、新たに追加されるバイトが新しいタイプに適合していることが期待されます。

このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければなりません。

  1. typeが空文字列である場合、TypeError例外をスローし、 これらの手順を中止します。
  2. このオブジェクトが親メディアソースsourceBuffers属性から削除されている場合、InvalidStateError例外をスローし、 これらの手順を中止します。
  3. updating属性がtrueである場合、InvalidStateError例外をスローし、これらの手順を中止します。
  4. typeに、サポートされていないMIMEタイプが含まれている場合、または 親メディアソースsourceBuffers属性内にある SourceBufferオブジェクトに現在または以前指定されていたタイプとの組み合わせではサポートされないMIMEタイプが含まれている場合、NotSupportedError例外をスローし、これらの手順を中止します。
  5. 親メディアソースreadyState属性が 「ended」状態である場合、次の手順を実行します。

    1. 親メディアソースreadyState属性を 「open」に設定します。
    2. タスクをキューに入れ親メディアソースsourceopenという名前のイベントを発火します
  6. パーサー状態のリセット アルゴリズムを実行します。
  7. このSourceBuffer オブジェクトの[[generate timestamps flag]]を、typeに関連付けられたバイトストリーム形式レジストリ[MSE-REGISTRY]のエントリーにある「Generate Timestamps Flag」列の値に更新します。
  8. [[generate timestamps flag]]がtrueである場合:
    このSourceBufferオブジェクトの mode属性を 「sequence」に設定し、その属性の設定に関連する手順も実行します。
    それ以外の場合:
    この SourceBufferオブジェクトのmode属性の以前の値を、その属性の設定に関連する手順を一切実行せずに維持します。
  9. このSourceBuffer オブジェクトの[[pending initialization segment for changeType flag]]をtrueに設定します。
remove

特定の時間範囲のメディアを削除します。削除範囲のstartは、 プレゼンテーション開始時刻から測定した秒単位の値です 削除範囲のendは、 プレゼンテーション開始時刻から測定した秒単位の値です。

このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければなりません。

  1. このオブジェクトが親メディアソースsourceBuffers属性から削除されている場合、InvalidStateError例外をスローし、 これらの手順を中止します。
  2. updating属性がtrueである場合、InvalidStateError例外をスローし、これらの手順を中止します。
  3. durationがNaNと等しい場合、TypeError例外をスローし、 これらの手順を中止します。
  4. startが負の値、またはdurationより大きい場合、 TypeError例外をスローし、これらの手順を中止します。
  5. endstart以下であるか、endが NaNと等しい場合、TypeError例外をスローし、これらの手順を中止します。
  6. 親メディアソースreadyState属性が 「ended」状態である場合、次の手順を実行します。

    1. 親メディアソースreadyState属性を 「open」に設定します。
    2. タスクをキューに入れ親メディアソースsourceopenという名前のイベントを発火します
  7. startおよびendを削除範囲の開始および終了として、範囲削除アルゴリズムを実行します。

5.3 トラックバッファ

トラックバッファは、個々のトラックのトラック記述および符号化フレームを格納します。トラックバッファは、初期化セグメントおよびメディアセグメントSourceBufferに追加されるのに伴って更新されます。

トラックバッファには、現在の符号化フレームグループに最後に追加された符号化フレームのデコードタイムスタンプを格納する最終デコードタイムスタンプ 変数があります。この変数は、まだ 符号化フレームが追加されていないことを示すため、初期状態では未設定です。

トラックバッファには、現在の符号化フレームグループに最後に追加された符号化フレーム符号化フレーム継続時間を格納する最終フレーム継続時間 変数があります。この変数は、まだ 符号化フレームが追加されていないことを示すため、初期状態では未設定です。

トラックバッファには、このトラックバッファに追加された現在の符号化フレームグループ内のすべての符号化フレームのうち、最大の符号化フレーム終了タイムスタンプを格納する最大終了タイムスタンプ 変数があります。 この変数は、まだ符号化フレームが追加されていないことを示すため、初期状態では未設定です。

トラックバッファには、トラックバッファがランダムアクセスポイント符号化フレームを待っているかどうかを追跡する ランダムアクセスポイント要求フラグ 変数があります。この変数は、トラックバッファに何かを追加できるようになる前に、ランダムアクセスポイント符号化フレームが必要であることを示すため、最初にtrueに設定されます。

トラックバッファには、トラックバッファに現在格納されている符号化フレームが占有するプレゼンテーション時間範囲を表す トラックバッファ範囲 変数があります。

注記

トラックバッファ範囲の場合、これらのプレゼンテーション時間範囲は、プレゼンテーションタイムスタンプ、フレーム継続時間、および多重化されたSourceBuffer内の複数のトラックバッファにまたがる符号化フレームグループについて、場合によってはその開始時刻に基づきます。

仕様上、この情報は 正規化された TimeRangesオブジェクトに格納されているかのように扱われます。積集合を取ったトラックバッファ範囲は、 HTMLMediaElementbufferedを報告するために使用されるため、HTMLMediaElementbufferedの各範囲内で、中断のない再生をサポートしなければなりません

注記

これらの符号化フレームグループ開始時刻は、不連続の後にすべてのトラックバッファにわたって最も早いプレゼンテーションタイムスタンプであるという点で、符号化フレーム処理アルゴリズムで言及されるものとはわずかに異なります。不連続は、modeにかかわらず、 符号化フレーム処理アルゴリズム内で発生することも、符号化フレーム削除アルゴリズムの結果として生じることもあります。トラックバッファ範囲が互いに分離しているかどうかを判定するしきい値は、実装固有です。たとえば、予期しない再生停止を減らすために、実装は、このトラックバッファでそれまでにバッファリングされた最大フレーム継続時間の2倍よりも小さい間隔で区切られた隣接範囲を結合することにより、符号化フレーム処理アルゴリズムの不連続検出ロジックを近似してもよいです。実装は、予期しない再生停止をさらに減らすために、多重化されたSourceBuffer内の複数のトラックバッファにわたって、符号化フレームグループ開始時刻を範囲開始時刻として使用してもよいです

5.4 イベントの概要

イベント名 インターフェイス 発行される条件…
updatestart Event SourceBufferupdatingが falseからtrueに移行したとき。
update Event SourceBufferの 追加または削除が正常に完了し、SourceBufferupdatingが trueからfalseに移行したとき。
updateend Event SourceBufferの追加または削除が終了したとき。
error Event SourceBufferへの追加中にエラーが発生し、updatingが trueからfalseに移行したとき。
abort Event SourceBufferへの追加が abort()呼び出しによって中止され、 updatingが trueからfalseに移行したとき。

5.5 アルゴリズム

5.5.1 セグメントパーサーループ

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()によって更新されます。

セグメントパーサーループアルゴリズムが呼び出されたとき、次の手順を実行します。

  1. ループ先頭:[[input buffer]]が空である場合、下記の 追加データが必要手順へ移動します。
  2. [[input buffer]]SourceBufferバイトストリーム形式仕様に違反するバイトが含まれている場合、追加エラー アルゴリズムを実行し、このアルゴリズムを中止します。
  3. バイトストリーム形式仕様が無視しなければならないとするバイトを、 [[input buffer]]の先頭からすべて削除します。
  4. [[append state]]WAITING_FOR_SEGMENTと等しい場合、次の手順を実行します。

    1. [[input buffer]]の先頭が 初期化セグメントの開始を示している場合、[[append state]]PARSING_INIT_SEGMENTに設定します。
    2. [[input buffer]]の先頭が メディアセグメントの開始を示している場合、[[append state]]PARSING_MEDIA_SEGMENTに設定します。
    3. 上記のループ先頭手順へ移動します。
  5. [[append state]]PARSING_INIT_SEGMENTと等しい場合、次の手順を実行します。

    1. [[input buffer]]に、完全な 初期化セグメントがまだ含まれていない場合、下記の追加データが必要手順へ移動します。
    2. 初期化セグメント受信アルゴリズムを実行します。
    3. 初期化セグメントのバイトを [[input buffer]]の先頭から削除します。
    4. [[append state]]WAITING_FOR_SEGMENTに設定します。
    5. 上記のループ先頭手順へ移動します。
  6. [[append state]]PARSING_MEDIA_SEGMENTと等しい場合、次の手順を実行します。

    1. [[first initialization segment received flag]]が falseであるか、または[[pending initialization segment for changeType flag]]が trueである場合、追加エラーアルゴリズムを実行し、 このアルゴリズムを中止します。
    2. [[input buffer]]に1つ以上の完全な符号化フレームが含まれている場合、符号化フレーム処理アルゴリズムを実行します。
      注記

      符号化フレーム処理アルゴリズムを実行する頻度は実装固有です。符号化フレーム処理アルゴリズムは、入力バッファに完全なメディアセグメントが含まれたときに呼び出してもよく、完全な符号化フレームが入力バッファに追加されるのに伴って複数回呼び出してもよいです

    3. このSourceBufferが満杯で、これ以上メディアデータを受け入れられない場合、 [[buffer full flag]]をtrueに設定します。
    4. [[input buffer]]に完全なメディアセグメントが含まれていない場合、下記の追加データが必要手順へ移動します。
    5. メディアセグメントのバイトを [[input buffer]]の先頭から削除します。
    6. [[append state]]WAITING_FOR_SEGMENTに設定します。
    7. 上記のループ先頭手順へ移動します。
  7. 追加データが必要:呼び出し元のアルゴリズムに制御を返します。

5.5.2 パーサー状態の リセット

パーサー状態をリセットする必要がある場合、次の手順を実行します。

  1. [[append state]]PARSING_MEDIA_SEGMENTと等しく、かつ [[input buffer]]に完全な符号化フレームが含まれている場合、それらすべての完全な符号化フレームが処理されるまで、 符号化フレーム処理アルゴリズムを実行します。
  2. すべてのトラックバッファ最終デコードタイムスタンプを未設定にします。
  3. すべてのトラックバッファ最終フレーム継続時間を未設定にします。
  4. すべてのトラックバッファ最大終了タイムスタンプを未設定にします。
  5. すべてのトラックバッファランダムアクセスポイント要求フラグをtrueに設定します。
  6. mode属性が「sequence」と等しい場合、 [[group start timestamp]][[group end timestamp]]に設定します。
  7. [[input buffer]]からすべてのバイトを削除します。
  8. [[append state]]WAITING_FOR_SEGMENTに設定します。

5.5.3 追加エラー

このアルゴリズムは、追加中にエラーが発生したときに呼び出されます。

  1. パーサー状態のリセットアルゴリズムを実行します。
  2. updating属性をfalseに設定します。
  3. タスクをキューに入れ、 このSourceBuffer オブジェクトでerrorという名前のイベントを 発火します
  4. タスクをキューに入れ、 このSourceBuffer オブジェクトでupdateendという名前のイベントを 発火します
  5. error引数を「decode」に設定して、ストリーム終了アルゴリズムを実行します。

5.5.4 追加の 準備

追加操作が開始されると、SourceBufferを検証して準備するため、次の手順を実行します。

  1. SourceBuffer親メディアソースsourceBuffers 属性から削除されている場合、InvalidStateError例外をスローし、 これらの手順を中止します。
  2. updating属性がtrueである場合、 InvalidStateError例外をスローし、これらの手順を中止します。
  3. recent element errorを次のように決定します。
    MediaSourceWindow内で構築された場合
    HTMLMediaElementerror属性がnullでない場合、recent element errorをtrueとします。その属性がnullである場合、 recent element errorをfalseとします。
    それ以外の場合
    recent element errorを、 Windowの場合の手順によって得られる値とします。ただし、その手順は、 WindowHTMLMediaElementerror属性が変更されるたびにその要素上で実行され、その結果は [[port to worker]]の暗黙的なメッセージを使用して伝達されます。そのようなメッセージがまだ受信されていない場合、recent element errorを falseとします。
  4. recent element errorがtrueである場合、InvalidStateError例外をスローし、 これらの手順を中止します。
  5. 親メディアソースreadyState属性が 「ended」状態である場合、次の手順を実行します。

    1. 親メディアソースreadyState属性を 「open」に設定します。
    2. タスクを キューに入れ親メディアソースsourceopenという名前のイベントを発火します
  6. 符号化フレームの追い出しアルゴリズムを実行します。
  7. [[buffer full flag]]がtrueと等しい場合、 QuotaExceededError例外をスローし、これらの手順を中止します。

    注記

    これは、追加を収容するために十分なデータを実装が追い出せなかったか、追加が大きすぎることを示すシグナルです。Webアプリケーションは、 remove()を使用して明示的に領域を解放するか、追加のサイズを縮小する、またはその両方を行うべきです

5.5.5 バッファ 追加

appendBuffer()が呼び出されると、追加されたデータを処理するために次の手順が実行されます。

  1. セグメントパーサーループアルゴリズムを実行します。
  2. 直前の手順のセグメントパーサーループアルゴリズムが中止された場合、 このアルゴリズムを中止します。
  3. updating属性をfalseに設定します。
  4. タスクをキューに入れ、 このSourceBuffer オブジェクトでupdateという名前のイベントを 発火します
  5. タスクをキューに入れ、 このSourceBuffer オブジェクトでupdateendという名前のイベントを 発火します

5.5.6 範囲 削除

呼び出し元が、他のSourceBufferの更新をブロックし、JavaScriptから可視な範囲削除操作を開始する必要がある場合、次の手順に従います。

  1. startを、削除範囲の開始プレゼンテーションタイムスタンプとします。これは、プレゼンテーション開始時刻から測定した秒単位の値です。
  2. endを、削除範囲の終了プレゼンテーションタイムスタンプとします。これは、プレゼンテーション開始時刻から測定した秒単位の値です。
  3. updating属性をtrueに設定します。
  4. タスクをキューに入れ、 このSourceBufferオブジェクトで updatestartという名前のイベントを 発火します
  5. 呼び出し元に制御を返し、残りの手順を非同期に実行します。
  6. startおよびendを削除範囲の開始および終了として、符号化フレーム削除アルゴリズムを実行します。
  7. updating属性をfalseに設定します。
  8. タスクをキューに入れ、 このSourceBuffer オブジェクトでupdateという名前のイベントを 発火します
  9. タスクをキューに入れ、 このSourceBuffer オブジェクトでupdateendという名前のイベントを 発火します

5.5.7 初期化セグメント受信

セグメントパーサーループが完全な 初期化セグメントの解析に成功したとき、次の手順を実行します。

各SourceBufferオブジェクトには、最初の 初期化セグメントが追加され、このアルゴリズムによって受信されたかどうかを追跡する[[first initialization segment received flag]]内部スロットがあります。このフラグは、SourceBufferの作成時にfalseに設定され、以下のアルゴリズムによって更新されます。

各SourceBufferオブジェクトには、直近の changeType()以降に 初期化セグメントが必要かどうかを追跡する[[pending initialization segment for changeType flag]]内部スロットがあります。このフラグは、SourceBufferの作成時にfalseに設定され、 changeType()によってtrueに設定され、以下のアルゴリズムによってfalseにリセットされます。

  1. duration属性が現在NaNと等しい場合、次のように更新します。
    初期化セグメントに継続時間が含まれている場合:
    new durationを初期化セグメント内の継続時間に設定して、継続時間変更アルゴリズムを実行します。
    それ以外の場合:
    new durationを正のInfinityに設定して、継続時間変更アルゴリズムを実行します。
  2. 初期化セグメントに音声、映像、テキストのいずれのトラックもない場合、 追加エラーアルゴリズムを実行し、これらの手順を中止します。
  3. [[first initialization segment received flag]]がtrueである場合、次の手順を実行します。
    1. 次のプロパティを検証します。いずれかの検査が失敗した場合、追加エラーアルゴリズムを実行し、これらの手順を中止します。
      • 音声、映像、テキストトラックの数が、最初の 初期化セグメント内の数と一致すること。
      • 単一の種類について複数のトラックが存在する場合(たとえば、2つの音声トラック)、トラックIDが最初の初期化セグメント内のものと一致すること。
      • 各トラックのコーデックがユーザーエージェントによってサポートされていること。
        注記

        本来はサポートされるコーデックであっても、次のいずれかに渡されたtype引数で指定されていなかった場合、ユーザーエージェントはここで「サポートされていない」と見なしてもよいです。(a)このSourceBufferオブジェクトで直近に正常終了した changeType()、または(b)このオブジェクトで正常終了したchangeType()がまだない場合、このSourceBufferオブジェクトを作成した addSourceBuffer()。 たとえば、直近に正常終了した changeType()'video/webm'または 'video/webm; codecs="vp8"'を指定して呼び出され、vp9を含む映像トラックが初期化セグメントに現れた場合、上記の他の2つのプロパティ検査に合格していても、ユーザーエージェントはこの手順を使用してデコードエラーを発生させてもよいです。実装には、コーデックが実際にサポートされていない場合、または他の2つのプロパティ検査が失敗した場合にのみ、このようなエラーを発生させることが推奨されます。Web制作者には、ユーザーエージェントのサポートをより能動的に検出するため、正確なコーデック引数を指定してchangeType()addSourceBuffer()およびisTypeSupported()を使用することが推奨されます。SourceBufferオブジェクトのバイトストリーム形式が変更される場合、 changeType()が必要です。

    2. この初期化セグメントの適切なトラック記述を、それぞれのトラックバッファに追加します。
    3. すべてのトラックバッファのランダムアクセスポイント要求フラグをtrueに設定します。
  4. active track flagをfalseとします。
  5. [[first initialization segment received flag]]がfalseである場合、次の手順を実行します。

    1. 初期化セグメントに、ユーザーエージェントがサポートしていないコーデックを持つトラックが含まれている場合、追加エラーアルゴリズムを実行し、これらの手順を中止します。
      注記

      本来はサポートされるコーデックであっても、次のいずれかに渡された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オブジェクトのバイトストリーム形式が変更される場合に必要です。

    2. 初期化セグメント内の各音声トラックについて、次の手順を実行します。

      1. audio byte stream track IDを、現在処理中のトラックのトラックIDとします。
      2. audio languageを、このトラックについて 初期化セグメントで指定された言語のBCP 47言語タグとします。言語情報が存在しない場合は空文字列とします。
      3. audio languageがBCP 47値'und'と等しい場合、 audio languageに空文字列を代入します。
      4. audio labelを、このトラックについて初期化セグメントで指定されたラベルとします。ラベル情報が存在しない場合は空文字列とします。
      5. audio kindsを、このトラックについて初期化セグメントで指定されたkind文字列のシーケンスとします。kind情報が提供されていない場合は、単一の空文字列要素を含むシーケンスとします。
      6. audio kinds内の各値について、次の手順を実行します。
        1. current audio kindを、このループ反復における audio kindsの値とします。
        2. audio track default enabled flagをfalseとします。
        3. このSourceBufferオブジェクトの[[audio track added flag]]内部スロットがfalseである場合、次の手順を実行します。
          1. audio track default enabled flagをtrueに設定します。
          2. active track flagをtrueに設定します。
        4. このSourceBufferオブジェクトの[[audio track added flag]]内部スロットをtrueに設定します。
        5. WindowHTMLMediaElement上に AudioTrackを作成し、 Window内で次の手順を実行します。

          親メディアソースWindow内で構築された場合:
          1. new audio trackを新しい AudioTrackオブジェクトとします。
          2. 一意のIDを生成し、new audio trackidプロパティに代入します。
          3. audio languageaudio labelおよびcurrent audio kindを、それぞれnew audio tracklanguagelabelおよび kindプロパティに代入します。
          4. audio track default enabled flagがtrueである場合、 new audio trackenabledプロパティをtrueに設定します。
          5. new audio trackを、このSourceBufferオブジェクトの audioTracks属性に追加します。
            注記

            これにより、このSourceBufferオブジェクトの audioTracks属性が参照する AudioTrackListオブジェクトで、track属性を new audio trackに初期化した TrackEventを使用して addtrackという名前のイベントを発火するタスクをキューに入れる AudioTrackListHTML]のロジックが起動されるはずです。

          6. media elementを、このSourceBufferオブジェクトの親メディアソースがアタッチされているメディア要素とします。
          7. new audio trackmedia elementaudioTracks属性に追加します。
            注記

            これにより、media elementaudioTracks属性が参照する AudioTrackListオブジェクトで、track属性を new audio trackに初期化した TrackEventを使用して addtrackという名前のイベントを発火するタスクをキューに入れる AudioTrackListHTML]のロジックが起動されるはずです。

          それ以外の場合:
          内部create trackメッセージを [[port to main]]へ送信します。その Window内の暗黙的なハンドラーは、次の手順を実行します。
          1. new audio trackを新しい AudioTrackオブジェクトとします。
          2. 一意のIDを生成し、new audio trackidプロパティに代入します。
          3. audio languageaudio labelおよびcurrent audio kindを、それぞれnew audio tracklanguagelabelおよび kindプロパティに代入します。
          4. audio track default enabled flagがtrueである場合、 new audio trackenabledプロパティをtrueに設定します。
          5. media elementを、このSourceBufferオブジェクトの親メディアソースがアタッチされているメディア要素とします。
          6. new audio trackmedia elementaudioTracks属性に追加します。
            注記

            これにより、media elementaudioTracks属性が参照する AudioTrackListオブジェクトで、track属性を new audio trackに初期化した TrackEventを使用して addtrackという名前のイベントを発火するタスクをキューに入れる AudioTrackListHTML]のロジックが起動されるはずです。

      7. このトラックの符号化フレームを格納するため、新しいトラックバッファを作成します。
      8. このトラックのトラック記述トラックバッファに追加します。
    3. 初期化セグメント内の各映像トラックについて、次の手順を実行します。

      1. video byte stream track IDを、現在処理中のトラックのトラックIDとします。
      2. video languageを、このトラックについて 初期化セグメントで指定された言語のBCP 47言語タグとします。言語情報が存在しない場合は空文字列とします。
      3. video languageがBCP 47値'und'と等しい場合、 video languageに空文字列を代入します。
      4. video labelを、このトラックについて初期化セグメントで指定されたラベルとします。ラベル情報が存在しない場合は空文字列とします。
      5. video kindsを、このトラックについて初期化セグメントで指定されたkind文字列のシーケンスとします。kind情報が提供されていない場合は、単一の空文字列要素を含むシーケンスとします。
      6. video kinds内の各値について、次の手順を実行します。
        1. current video kindを、このループ反復における video kindsの値とします。
        2. video track default selected flagをfalseとします。
        3. このSourceBufferオブジェクトの[[video track added flag]]内部スロットがfalseである場合、次の手順を実行します。
          1. video track default selected flagをtrueに設定します。
          2. active track flagをtrueに設定します。
        4. このSourceBufferオブジェクトの[[video track added flag]]内部スロットをtrueに設定します。
        5. WindowHTMLMediaElement上に VideoTrackを作成し、 Window内で次の手順を実行します。

          親メディアソースWindow内で構築された場合:
          1. new video trackを新しい VideoTrackオブジェクトとします。
          2. 一意のIDを生成し、new video trackidプロパティに代入します。
          3. video languagevideo labelおよびcurrent video kindを、それぞれnew video tracklanguagelabelおよび kindプロパティに代入します。
          4. video track default selected flagがtrueである場合、 new video trackselectedプロパティをtrueに設定します。
          5. new video trackを、このSourceBufferオブジェクトの videoTracks属性に追加します。
            注記

            これにより、このSourceBufferオブジェクトの videoTracks属性が参照する VideoTrackListオブジェクトで、track属性を new video trackに初期化した TrackEventを使用して addtrackという名前のイベントを発火するタスクをキューに入れる VideoTrackListHTML]のロジックが起動されるはずです。

          6. media elementを、このSourceBufferオブジェクトの親メディアソースがアタッチされているメディア要素とします。
          7. new video trackmedia elementvideoTracks属性に追加します。
            注記

            これにより、media elementvideoTracks属性が参照する VideoTrackListオブジェクトで、track属性を new video trackに初期化した TrackEventを使用して addtrackという名前のイベントを発火するタスクをキューに入れる VideoTrackListHTML]のロジックが起動されるはずです。

          それ以外の場合:
          内部create trackメッセージを [[port to main]]へ送信します。その Window内の暗黙的なハンドラーは、次の手順を実行します。
          1. new video trackを新しい VideoTrackオブジェクトとします。
          2. 一意のIDを生成し、new video trackidプロパティに代入します。
          3. video languagevideo labelおよびcurrent video kindを、それぞれnew video tracklanguagelabelおよび kindプロパティに代入します。
          4. video track default selected flagがtrueである場合、 new video trackselectedプロパティをtrueに設定します。
          5. media elementを、このSourceBufferオブジェクトの親メディアソースがアタッチされているメディア要素とします。
          6. new video trackmedia elementvideoTracks属性に追加します。
            注記

            これにより、media elementvideoTracks属性が参照する VideoTrackListオブジェクトで、track属性を new video trackに初期化した TrackEventを使用して addtrackという名前のイベントを発火するタスクをキューに入れる VideoTrackListHTML]のロジックが起動されるはずです。

      7. このトラックの符号化フレームを格納するため、新しいトラックバッファを作成します。
      8. このトラックのトラック記述トラックバッファに追加します。
    4. 初期化セグメント内の各テキストトラックについて、次の手順を実行します。

      1. text byte stream track IDを、現在処理中のトラックのトラックIDとします。
      2. text languageを、このトラックについて 初期化セグメントで指定された言語のBCP 47言語タグとします。言語情報が存在しない場合は空文字列とします。
      3. text languageがBCP 47値'und'と等しい場合、 text languageに空文字列を代入します。
      4. text labelを、このトラックについて初期化セグメントで指定されたラベルとします。ラベル情報が存在しない場合は空文字列とします。
      5. text kindsを、このトラックについて初期化セグメントで指定されたkind文字列のシーケンスとします。kind情報が提供されていない場合は、単一の空文字列要素を含むシーケンスとします。
      6. text kinds内の各値について、次の手順を実行します。
        1. current text kindを、このループ反復における text kindsの値とします。
        2. text track modeを、このトラックについて 初期化セグメントから決定されたmode値とします。
        3. text track mode"showing" または "hidden"と等しい場合、 active track flagをtrueに設定します。
        4. WindowHTMLMediaElement上に TextTrackを作成し、 Window内で次の手順を実行します。

          親メディアソースWindow内で構築された場合:
          1. new text trackを新しい TextTrackオブジェクトとします。
          2. 一意のIDを生成し、new text trackidプロパティに代入します。
          3. text languagetext labelおよびcurrent text kindを、それぞれ new text tracklanguagelabelおよび kindプロパティに代入します。
          4. new text trackmodeプロパティをtext track modeに設定し、new text trackの残りのプロパティに、このトラックの 初期化セグメントから決定された適切な情報を設定します。
          5. new text trackを、このSourceBufferオブジェクトの textTracks属性に追加します。
            注記

            これにより、このSourceBufferオブジェクトの textTracks属性が参照する TextTrackListオブジェクトで、 track属性を new text trackに初期化した TrackEventを使用して addtrackという名前のイベントを発火するタスクをキューに入れる TextTrackListHTML]のロジックが起動されるはずです。

          6. media elementを、このSourceBufferオブジェクトの親メディアソースがアタッチされているメディア要素とします。
          7. new text trackmedia elementtextTracks属性に追加します。
            注記

            これにより、media elementtextTracks属性が参照する TextTrackListオブジェクトで、 track属性を new text trackに初期化した TrackEventを使用して addtrackという名前のイベントを発火するタスクをキューに入れる TextTrackListHTML]のロジックが起動されるはずです。

          それ以外の場合:
          内部create trackメッセージを [[port to main]]へ送信します。その Window内の暗黙的なハンドラーは、次の手順を実行します。
          1. new text trackを新しい TextTrackオブジェクトとします。
          2. 一意のIDを生成し、new text trackidプロパティに代入します。
          3. text languagetext labelおよびcurrent text kindを、それぞれ new text tracklanguagelabelおよび kindプロパティに代入します。
          4. new text trackmodeプロパティをtext track modeに設定し、new text trackの残りのプロパティに、このトラックの 初期化セグメントから決定された適切な情報を設定します。
          5. media elementを、このSourceBufferオブジェクトの親メディアソースがアタッチされているメディア要素とします。
          6. new text trackmedia elementtextTracks属性に追加します。
            注記

            これにより、media elementtextTracks属性が参照する TextTrackListオブジェクトで、 track属性を new text trackに初期化した TrackEventを使用して addtrackという名前のイベントを発火するタスクをキューに入れる TextTrackListHTML]のロジックが起動されるはずです。

      7. このトラックの符号化フレームを格納するため、新しいトラックバッファを作成します。
      8. このトラックのトラック記述トラックバッファに追加します。
    5. active track flagがtrueと等しい場合、次の手順を実行します。
      1. このSourceBufferactiveSourceBuffersに追加します。
      2. タスクをキューに入れactiveSourceBuffersaddsourcebufferという名前のイベントを発火します
    6. [[first initialization segment received flag]]をtrueに設定します。
  6. [[pending initialization segment for changeType flag]]を falseに設定します。
  7. active track flagがtrueと等しい場合、次の手順を実行します。
  8. 親メディアソース必要に応じてミラーリングアルゴリズムを使用し、 Window内で次の手順を実行します。
    1. HTMLMediaElementreadyState属性が HAVE_CURRENT_DATAより大きい場合、 HTMLMediaElementreadyState属性を HAVE_METADATAに設定します。
      注記

      HTMLMediaElementの準備状態HTML]のロジックに従い、HTMLMediaElementreadyStateの変更によって、 HTMLMediaElement上でイベントが発生する可能性があります。

  9. 親メディアソースsourceBuffers内の各オブジェクトについて、 [[first initialization segment received flag]]がtrueと等しい場合、 親メディアソース必要に応じてミラーリングアルゴリズムを使用し、 Window内で次の手順を実行します。
    1. HTMLMediaElementreadyState属性が HAVE_NOTHINGである場合、 HTMLMediaElementreadyState属性をHAVE_METADATAに設定します。
      注記

      HTMLMediaElementの準備状態HTML]のロジックに従い、HTMLMediaElementreadyStateの変更によって、 HTMLMediaElement上でイベントが発生する可能性があります。HAVE_NOTHINGから HAVE_METADATAへの遷移が発生した場合、メディア要素で loadedmetadataという名前のイベントを発火するタスクをキューに入れる HTMLMediaElementのロジックが起動されるはずです。

5.5.8 符号化フレーム処理

完全な符号化フレームセグメントパーサーループによって解析されたとき、次の手順を実行します。

  1. メディアセグメント内の各符号化フレームについて、次の手順を実行します。

    1. ループ先頭:
      [[generate timestamps flag]]がtrueと等しい場合:
      1. presentation timestampを0とします。
      2. decode timestampを0とします。
      それ以外の場合:
      1. presentation timestampを、符号化フレームの秒単位のプレゼンテーションタイムスタンプの倍精度浮動小数点表現とします。
        注記

        時間指定テキストフレームのプレゼンテーションタイムスタンプおよびデコードタイムスタンプを決定するには、特別な処理が必要となる場合があります。これは、この情報が基礎となる形式に明示的に存在しない可能性、またはフレームの順序に依存する可能性があるためです。MPEG2-TS PSIデータなど、一部のメタデータテキストトラックには、暗黙的なタイムスタンプしかない場合があります。このような状況に対する形式固有の規則は、バイトストリーム形式仕様または別個の拡張仕様に含めるべきです

      2. decode timestampを、符号化フレームの秒単位のデコードタイムスタンプの倍精度浮動小数点表現とします。
        注記

        実装は、内部でタイムスタンプを倍精度浮動小数点表現として格納する必要はありません。ここでこの表現を使用するのは、HTML仕様でタイムスタンプに使用される表現だからです。ここでの意図は、timestampOffsetの加算によって、バイトストリーム形式が使用する基礎となるタイムスタンプ表現でタイムスタンプのラップアラウンドが発生し得るという事実を処理するために、アルゴリズムへ不要な複雑さを加えることなく、動作を明確にすることです。実装は任意の内部タイムスタンプ表現を使用できますが、timestampOffsetの加算は、倍精度浮動小数点表現を使用した場合に起こるものと同様に動作するべきです

    2. frame durationを、符号化フレームの継続時間の秒単位の倍精度浮動小数点表現とします。
    3. modeが「sequence」と等しく、かつ [[group start timestamp]]が設定されている場合、次の手順を実行します。
      1. timestampOffsetを、 [[group start timestamp]]から presentation timestampを引いた値に設定します。
      2. [[group end timestamp]][[group start timestamp]]と等しくなるように設定します。
      3. すべてのトラックバッファランダムアクセスポイント要求フラグをtrueに設定します。
      4. [[group start timestamp]]を未設定にします。
    4. timestampOffsetが0でない場合、次の手順を実行します。

      1. timestampOffsetpresentation timestampに加算します。
      2. timestampOffsetdecode timestampに加算します。
    5. track bufferを、符号化フレームの追加先となるトラックバッファとします。
    6. track buffer最終デコードタイムスタンプが設定されており、decode timestamp最終デコードタイムスタンプ未満である場合:
      または
      track buffer最終デコードタイムスタンプが設定されており、decode timestamp最終デコードタイムスタンプとの差が、 最終フレーム継続時間の2倍より大きい場合:
      1. modeが「segments」と等しい場合:
        [[group end timestamp]]presentation timestampに設定します。
        modeが「sequence」と等しい場合:
        [[group start timestamp]][[group end timestamp]]と等しくなるように設定します。
      2. すべてのトラックバッファ最終デコードタイムスタンプを未設定にします。
      3. すべてのトラックバッファ最終フレーム継続時間を未設定にします。
      4. すべてのトラックバッファ最大終了タイムスタンプを未設定にします。
      5. すべてのトラックバッファランダムアクセスポイント要求フラグをtrueに設定します。
      6. 現在の符号化フレームの処理を再開するため、上記のループ先頭手順へ移動します。
      それ以外の場合:
      続行します。
    7. frame end timestampを、presentation timestampframe durationの合計とします。
    8. presentation timestampappendWindowStart未満である場合、 ランダムアクセスポイント要求フラグをtrueに設定し、符号化フレームを破棄して、次の符号化フレームの処理を開始するためにループの先頭へ移動します。
      注記

      一部の実装は、presentation timestampappendWindowStart未満である符号化フレームの一部を収集し、そのフレームがランダムアクセスポイントでない場合でも、プレゼンテーションタイムスタンプappendWindowStart以上である最初の符号化フレームでスプライスを生成するために使用することを選択してもよいです。これをサポートするには複数のデコーダー、またはリアルタイムより高速なデコードが必要となるため、現時点ではこの動作を規範的要件とはしません。

    9. frame end timestampappendWindowEndより大きい場合、 ランダムアクセスポイント要求フラグをtrueに設定し、符号化フレームを破棄して、次の符号化フレームの処理を開始するためにループの先頭へ移動します。
      注記

      一部の実装は、presentation timestampappendWindowEnd未満であり、かつframe end timestampappendWindowEndより大きい符号化フレームを収集し、収集時に追加ウィンドウ内にある収集済み符号化フレームの部分と、収集済み符号化フレームの末尾と部分的にのみ重なる、後で処理されるフレームの先頭部分との間にスプライスを生成するために使用することを選択してもよいです。これをサポートするには複数のデコーダー、またはリアルタイムより高速なデコードが必要となるため、現時点ではこの動作を規範的要件とはしません。appendWindowStartにまたがる符号化フレームの収集と組み合わせることで、実装はギャップレス音声スプライスをサポートしてもよいです

    10. track bufferランダムアクセスポイント要求フラグがtrueと等しい場合、次の手順を実行します。
      1. 符号化フレームがランダムアクセスポイントでない場合、符号化フレームを破棄し、次の符号化フレームの処理を開始するためにループの先頭へ移動します。
      2. track bufferランダムアクセスポイント要求フラグをfalseに設定します。
    11. spliced audio frameを、音声スプライス情報を保持するための未設定の変数とします。
    12. spliced timed text frameを、時間指定テキストのスプライス情報を保持するための未設定の変数とします。
    13. track buffer最終デコードタイムスタンプが未設定で、presentation timestamptrack buffer内の符号化フレームプレゼンテーション区間内にある場合、次の手順を実行します。
      1. overlapped frameを、上記の条件に一致するtrack buffer内の符号化フレームとします。
      2. track bufferに音声の符号化フレームが含まれている場合:
        音声スプライスフレームアルゴリズムを実行し、スプライスフレームが返された場合は、それをspliced audio frameに代入します。
        track bufferに映像の符号化フレームが含まれている場合:
        1. remove window timestampを、 overlapped frameプレゼンテーションタイムスタンプに1マイクロ秒を加えた値とします。
        2. presentation timestampremove window timestamp未満である場合、overlapped frametrack bufferから削除します。
          注記

          これは、倍精度浮動小数点数と有理数との間を相互変換するときに生じ得る、フレームタイムスタンプ計算の軽微な誤差を補正するためです。この許容差により、既存フレームの開始時刻から1マイクロ秒以内であれば、フレームが既存のフレームを置き換えられます。既存フレームよりわずかに前に来るフレームは、以下の削除手順によって処理されます。

        track bufferに時間指定テキストの符号化フレームが含まれている場合:
        テキストスプライスフレームアルゴリズムを実行し、スプライスフレームが返された場合は、それをspliced timed text frameに代入します。
    14. track buffer内の既存の符号化フレームを削除します。
      track buffer最大終了タイムスタンプが設定されていない場合:
      track bufferから、プレゼンテーションタイムスタンプpresentation timestamp以上かつ frame end timestamp未満であるすべての符号化フレームを削除します。
      track buffer最大終了タイムスタンプが設定されており、presentation timestamp以下である場合:
      track bufferから、プレゼンテーションタイムスタンプ最大終了タイムスタンプ以上かつ frame end timestamp未満であるすべての符号化フレームを削除します。
    15. 直前の2つの手順で削除された符号化フレームに対する考えられるすべてのデコード依存関係を除去するため、直前の2つの手順で削除されたそれらのフレームと、それらの削除済みフレームの後にある次のランダムアクセスポイントとの間にあるすべての符号化フレームtrack bufferから削除します。
      注記

      次のランダムアクセスポイントまでのすべての符号化フレームを削除することは、削除されたフレームと次のランダムアクセスポイントとの間にあるすべてのフレームが、削除されたフレームに依存していたと仮定するため、デコード依存関係の保守的な推定となります。

    16. spliced audio frameが設定されている場合:
      spliced audio frametrack bufferに追加します。
      spliced timed text frameが設定されている場合:
      spliced timed text frametrack bufferに追加します。
      それ以外の場合:
      presentation timestampdecode timestampおよびframe durationを持つ符号化フレームtrack bufferに追加します。
    17. track buffer最終デコードタイムスタンプdecode timestampに設定します。
    18. track buffer最終フレーム継続時間frame durationに設定します。
    19. track buffer最大終了タイムスタンプが未設定であるか、frame end timestamp最大終了タイムスタンプより大きい場合、track buffer最大終了タイムスタンプframe end timestampに設定します。
      注記

      符号化フレーム間の双方向予測により、デコードタイムスタンプが単調増加していても、presentation timestampが単調増加しない場合があるため、この「より大きい」という検査が必要です。

    20. frame end timestamp[[group end timestamp]]より大きい場合、 [[group end timestamp]]frame end timestampと等しくなるように設定します。
    21. [[generate timestamps flag]]がtrueと等しい場合、 timestampOffsetframe end timestampと等しくなるように設定します。
  2. HTMLMediaElementreadyState属性が HAVE_METADATAであり、新しい符号化フレームによって HTMLMediaElementbufferedが、現在の再生位置に対応する TimeRangesを持つようになった場合、 HTMLMediaElementreadyState属性を HAVE_CURRENT_DATAに設定します。

    注記

    HTMLMediaElementの準備状態HTML]のロジックに従い、HTMLMediaElementreadyStateの変更によって、 HTMLMediaElement上でイベントが発生する可能性があります。

  3. HTMLMediaElementreadyState属性が HAVE_CURRENT_DATAであり、新しい符号化フレームによって HTMLMediaElementbufferedが、現在の再生位置および現在の再生位置より先の時間を含む TimeRangesを持つようになった場合、 HTMLMediaElementreadyState 属性をHAVE_FUTURE_DATAに設定します。

    注記

    HTMLMediaElementの準備状態HTML]のロジックに従い、HTMLMediaElementreadyStateの変更によって、 HTMLMediaElement上でイベントが発生する可能性があります。

  4. HTMLMediaElementreadyState属性が HAVE_FUTURE_DATAであり、新しい符号化フレームによって HTMLMediaElementbufferedが、現在の再生位置および中断のない再生を保証するのに十分なデータを含む TimeRangesを持つようになった場合、 HTMLMediaElementreadyState 属性をHAVE_ENOUGH_DATAに設定します。

    注記

    HTMLMediaElementの準備状態HTML]のロジックに従い、HTMLMediaElementreadyStateの変更によって、 HTMLMediaElement上でイベントが発生する可能性があります。

  5. メディアセグメントに現在のdurationを超えるデータが含まれている場合、 new durationを現在の継続時間と[[group end timestamp]]の最大値に設定して、継続時間変更アルゴリズムを実行します。

5.5.9 符号化 フレーム削除

特定の時間範囲の符号化フレームを SourceBufferから削除する必要がある場合、次の手順に従います。

  1. startを、削除範囲の開始プレゼンテーションタイムスタンプとします。
  2. endを、削除範囲の終了プレゼンテーションタイムスタンプとします。
  3. このSourceBuffer内の各トラックバッファについて、次の手順を実行します。

    1. remove end timestampを、 durationの現在値とします。
    2. このトラックバッファに、end以上のランダムアクセスポイントのタイムスタンプがある場合、 remove end timestampをそのランダムアクセスポイントのタイムスタンプに更新します。

      注記

      トラック内の符号化フレーム間の依存関係は、通常、別のトラック内の依存関係とは異なるため、ランダムアクセスポイントのタイムスタンプはトラックごとに異なる場合があります。

    3. このトラックバッファから、開始タイムスタンプがstart以上かつ remove end timestamp未満であるすべてのメディアデータを削除します。
      1. 削除された各フレームについて、そのフレームのデコードタイムスタンプが、そのフレームのトラックの最終デコードタイムスタンプと等しい場合、次の手順を実行します。

        modeが 「segments」と等しい場合:
        [[group end timestamp]]プレゼンテーションタイムスタンプに設定します。
        modeが 「sequence」と等しい場合:
        [[group start timestamp]][[group end timestamp]]と等しくなるように設定します。
      2. すべてのトラックバッファ最終デコードタイムスタンプを未設定にします。
      3. すべてのトラックバッファ最終フレーム継続時間を未設定にします。
      4. すべてのトラックバッファ最大終了タイムスタンプを未設定にします。
      5. すべてのトラックバッファランダムアクセスポイント要求フラグをtrueに設定します。
    4. 直前の手順で削除された符号化フレームに対する考えられるすべてのデコード依存関係を除去するため、直前の手順で削除されたそれらのフレームと、それらの削除済みフレームの後にある次のランダムアクセスポイントとの間にあるすべての符号化フレームを、このトラックバッファから削除します。
      注記

      次のランダムアクセスポイントまでのすべての符号化フレームを削除することは、削除されたフレームと次のランダムアクセスポイントとの間にあるすべてのフレームが、削除されたフレームに依存していたと仮定するため、デコード依存関係の保守的な推定となります。

    5. このオブジェクトがactiveSourceBuffers内にあり、 現在の再生位置start以上かつ remove end timestamp未満であり、かつHTMLMediaElementreadyStateHAVE_METADATAより大きい場合、 HTMLMediaElementreadyState属性をHAVE_METADATAに設定し、再生を停止させます。

      注記

      HTMLMediaElementの準備状態HTML]のロジックに従い、HTMLMediaElementreadyStateの変更によって、 HTMLMediaElement上でイベントが発生する可能性があります。

      注記

      この遷移は、現在位置のメディアデータが削除されたために発生します。現在の再生位置に対応するメディアが追加されるか、 3.15.5 選択済み/有効化済みトラック状態の変更が行われるまで、再生を進めることはできません。

  4. [[buffer full flag]]がtrueと等しく、このオブジェクトがさらにバイトを受け入れられる状態である場合、[[buffer full flag]]をfalseに設定します。

5.5.10 符号化 フレームの追い出し

このアルゴリズムは、新しいデータが追加されるとき、このSourceBuffer内の領域を解放するために実行されます。

  1. new dataを、このSourceBufferにこれから追加されるデータとします。
    課題289:編集上の問題? 符号化フレーム追い出しアルゴリズムでは、「buffer full flag」が|new data|に基づいて直ちに更新される可能性があることを記載する必要がある

    既存の[[input buffer]]内のバイトに加えて new dataを処理すると SourceBufferの容量を超えると予測した場合、実装がここで [[buffer full flag]]をtrueに設定することを選択してもよいと認識する手順が、ここに必要です。このような手順により、たとえばリソースをオーバーフローさせるnew dataを受け入れる前に、実装がより能動的にプッシュバックできるようになります。実際には、少なくとも1つの実装がすでにこれを行っています。

  2. [[buffer full flag]]がfalseと等しい場合、これらの手順を中止します。
  3. removal rangesを、new dataのための領域を確保する目的で、プレゼンテーションから追い出すことができるプレゼンテーション時間範囲のリストとします。
    注記

    実装は、removal rangesの選択に異なる方法を使用してもよいため、Webアプリケーションは特定の動作に依存すべきではありません。Webアプリケーションは、 buffered属性を使用して、バッファリングされたデータの一部が追い出されたかどうかを確認できます。

  4. removal ranges内の各範囲について、 startおよびendをそれぞれ削除範囲の開始タイムスタンプおよび終了タイムスタンプと等しくして、符号化フレーム削除アルゴリズムを実行します。

5.5.11 音声 スプライスフレーム

符号化フレーム処理アルゴリズムが、重なり合う2つの音声符号化フレームに対してスプライスフレームを生成する必要がある場合、次の手順に従います。

  1. track bufferを、スプライスを格納するトラックバッファとします。
  2. new coded frameを、track bufferに追加される新しい符号化フレームであり、スプライスの必要性を生じさせたものとします。
  3. presentation timestampを、new coded frameプレゼンテーションタイムスタンプとします。
  4. decode timestampを、new coded frameのデコードタイムスタンプとします。
  5. frame durationを、new coded frame符号化フレーム継続時間とします。
  6. overlapped frameを、presentation timestampを含むプレゼンテーション区間を持つ、track buffer内の符号化フレームとします。
  7. presentation timestampおよびdecode timestampを、overlapped frame内の音声のサンプルレートに基づいて、最も近い音声サンプルのタイムスタンプに更新します。タイムスタンプが2つの音声サンプルのタイムスタンプから等距離にある場合は、大きい方のタイムスタンプを使用します(例: floor(x * sample_rate + 0.5) / sample_rate)。
    注記

    たとえば、次の値が与えられているとします。

    • overlapped frameプレゼンテーションタイムスタンプは10と等しい。
    • overlapped frameのサンプルレートは8000 Hzと等しい。
    • presentation timestampは10.01255と等しい。
    • decode timestampは10.01255と等しい。

    10.01255は10 + 101/8000(10.012625)よりも10 + 100/8000(10..0125)に近いため、 presentation timestampおよびdecode timestampは10.0125に更新されます。

  8. ユーザーエージェントがクロスフェードをサポートしていない場合、次の手順を実行します。
    1. overlapped frametrack bufferから削除します。
    2. 次のプロパティを持つ無音フレームをtrack bufferに追加します。
      注記

      一部の実装は、遷移時の違和感を軽減するため、挿入した無音の両側にある符号化フレームに対して、無音へのフェードまたは無音からのフェードを適用してもよいです

    3. スプライスフレームを提供せず、呼び出し元へ戻ります。
      注記

      これは、overlapped frameが最初からtrack buffer内になかったかのように、 new coded frametrack bufferへ追加できるようにすることを意図しています。

  9. frame end timestampを、presentation timestampframe durationの合計とします。
  10. splice end timestampを、presentation timestampと5ミリ秒のスプライス継続時間の合計とします。
  11. fade out coded framesを、overlapped frameと、 presentation timestampより大きく、splice end timestamp未満のプレゼンテーションタイムスタンプを持つtrack buffer内の追加フレームとします。
  12. fade out coded framesに含まれるすべてのフレームをtrack bufferから削除します。
  13. 次のプロパティを持つスプライスフレームを返します。
    注記

    このスプライスフレームがどのようにレンダリングされるかの詳細については、音声スプライスレンダリングアルゴリズムを参照してください。

5.5.12 音声スプライスレンダリング

音声スプライスフレームアルゴリズムによって生成されたスプライス済みフレームを、メディア要素がレンダリングする必要がある場合、次の手順を実行します。

  1. fade out coded framesを、スプライス中にフェードアウトされる符号化フレームとします。
  2. fade in coded framesを、スプライス中にフェードインされる符号化フレームとします。
  3. presentation timestampを、 fade out coded frames内の最初の符号化フレームのプレゼンテーションタイムスタンプとします。
  4. end timestampを、 fade in coded frames内の最後のフレームのプレゼンテーションタイムスタンプ符号化フレーム継続時間の合計とします。
  5. splice timestampを、スプライスが開始するプレゼンテーションタイムスタンプとします。これは、 fade in coded frames内の最初のフレームのプレゼンテーションタイムスタンプに対応します。
  6. splice end timestampを、splice timestampに5ミリ秒を加えた値とします。
  7. fade out samplesを、fade out coded framesのデコードによって生成されるサンプルとします。
  8. fade out samplesをトリミングし、presentation timestampsplice end timestampの間のサンプルだけが含まれるようにします。
  9. fade in samplesを、fade in coded framesのデコードによって生成されるサンプルとします。
  10. fade out samplesfade in samplesに共通のサンプルレートおよびチャンネルレイアウトがない場合、 fade out samplesfade in samplesを共通のサンプルレートおよびチャンネルレイアウトに変換します。
  11. output samplesを、出力サンプルを保持するバッファとします。
  12. fade out samples内のsplice timestampsplice end timestampの間のサンプルに、開始ゲインが1、終了ゲインが0の線形ゲインフェードアウトを適用します。
  13. fade in samples内のsplice timestampsplice end timestampの間のサンプルに、開始ゲインが0、終了ゲインが1の線形ゲインフェードインを適用します。
  14. fade out samplesから、presentation timestampsplice timestampの間のサンプルを output samplesへコピーします。
  15. splice timestampsplice end timestampの間の各サンプルについて、 fade out samplesのサンプルとfade in samples内の対応するサンプルとの合計を計算し、その結果をoutput samplesに格納します。
  16. fade in samplesから、splice end timestampend timestampの間のサンプルをoutput samplesへコピーします。
  17. output samplesをレンダリングします。
注記

このアルゴリズムを図で表すと次のようになります。

音声スプライス図

5.5.13 テキスト スプライスフレーム

符号化フレーム処理アルゴリズムが、重なり合う2つの時間指定テキスト符号化フレームに対してスプライスフレームを生成する必要がある場合、次の手順に従います。

  1. track bufferを、スプライスを格納するトラックバッファとします。
  2. new coded frameを、track bufferに追加される新しい符号化フレームであり、スプライスの必要性を生じさせたものとします。
  3. presentation timestampを、new coded frameプレゼンテーションタイムスタンプとします。
  4. decode timestampを、new coded frameのデコードタイムスタンプとします。
  5. frame durationを、new coded frame符号化フレーム継続時間とします。
  6. frame end timestampを、presentation timestampframe durationの合計とします。
  7. first overlapped frameを、presentation timestampを含むプレゼンテーション区間を持つ、track buffer内の符号化フレームとします。
  8. overlapped presentation timestampを、 first overlapped frameプレゼンテーションタイムスタンプとします。
  9. overlapped framesを、first overlapped frameと、 presentation timestampより大きく、frame end timestamp未満のプレゼンテーションタイムスタンプを持つtrack buffer内の追加フレームとします。
  10. overlapped framesに含まれるすべてのフレームをtrack bufferから削除します。
  11. first overlapped frame符号化フレーム継続時間を、 presentation timestampからoverlapped presentation timestampを引いた値に更新します。
  12. first overlapped frametrack bufferに追加します。
  13. スプライスフレームを提供せず、呼び出し元へ戻ります。
    注記

    これは、new coded frameが最初からtrack buffer内のどのフレームとも重なっていなかったかのように、track bufferへ追加できるようにすることを意図しています。

6. SourceBufferListインターフェイス

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

6.1 属性

lengthの型はunsigned longで、 読み取り専用

リスト内のSourceBufferオブジェクトの 数を示します。

onaddsourcebufferの型はEventHandler

addsourcebufferイベントのイベントハンドラーです。

onremovesourcebufferの型はEventHandler

removesourcebufferイベントのイベントハンドラーです。

6.2 メソッド

getter

リスト内のSourceBufferオブジェクトへ配列演算子 (すなわち、[])を使用してアクセスできるようにします。

このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければなりません:

  1. indexlength属性以上の場合は、 undefinedを返し、これらの手順を中止します。
  2. リスト内のindex番目のSourceBufferオブジェクトを返します。

6.3 イベントの概要

イベント名 インターフェイス 発火される条件...
addsourcebuffer Event SourceBufferが リストに追加されたとき。
removesourcebuffer Event SourceBufferが リストから削除されたとき。

7. ManagedMediaSourceインターフェイス

ManagedMediaSourceは、メモリ内のコンテンツを能動的に管理するMediaSourceです。 MediaSourceとは異なり、ユーザーエージェントは、理由を問わず メモリのクリーンアップアルゴリズムを通じて、そのsourceBuffersManagedSourceBufferが 格納されます)からコンテンツを追い出すことができます。

注記:追い出しの 理由
WebIDL[Exposed=(Window,DedicatedWorker)]
interface ManagedMediaSource : MediaSource {
  constructor();
  readonly attribute boolean streaming;
  attribute EventHandler onstartstreaming;
  attribute EventHandler onendstreaming;
};

7.1 属性

streaming

取得時:

  1. 属性の現在の値を返します。

7.2 イベントの概要

イベント名 インターフェイス 発火される条件...
startstreaming Event ManagedMediaSourcestreaming属性が falseからtrueへ変更されたとき。
endstreaming Event ManagedMediaSourcestreaming属性が trueからfalseへ変更されたとき。

7.3 アルゴリズム

7.3.1 ManagedSourceBufferの監視

次の手順は、SourceBufferの監視アルゴリズムが実行されるよう スケジュールされるたびに、定期的に実行されます。

途切れない再生を保証するのに十分な管理対象データが あることは、ユーザーエージェントが、意味のある一定期間にわたり停止することなく プレゼンテーションを再生するのに十分なデータを現在保持していると判断する、実装定義の条件です。 この条件は、streamingの値をいつ遷移させるかを 決定するため、継続的に評価されます。これらの遷移は、ユーザーエージェントが 十分なデータをバッファリングしていると判断したとき、またはさらにデータが必要だと判断したときをそれぞれ示します。

効率的な方法でデータを取得してバッファリング できることは、ユーザーエージェントが、望ましいメモリ使用量を達成しながら エネルギー効率の高い方法で新しいデータを取得できると判断する、実装定義の条件です。

  1. MediaSourceSourceBufferの監視アルゴリズムを実行します。
  2. can play uninterrupted and efficientlyを、 buffered 属性にTimeRanges が含まれ、それが現在の再生位置を含み、途切れない再生を 保証するのに十分な管理対象データがあること、かつ 効率的な方法でデータを 取得してバッファリングできることを満たす場合にtrueとなるフラグとします
    can play uninterrupted and efficientlystreamingと等しくない場合は、要素タスクを キューに入れます。このタスクはメディア 要素上で次の手順を実行します:
    1. thisstreaming 属性をcan play uninterrupted and efficientlyに設定します。
    2. can play uninterrupted and efficientlyがfalseの場合は、イベントを発火します。 このイベントは startstreamingと呼ばれ、ManagedMediaSourceを対象とします。
    3. それ以外の場合は、イベントを発火します。 このイベントはendstreamingと呼ばれ、 ManagedMediaSourceを対象とします。

7.3.2 メモリのクリーンアップ

  1. thissourceBuffers内の 各bufferについて:
    1. bufferメモリのクリーンアップ アルゴリズムを実行します。

8. BufferedChangeEventインターフェイス

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

8.1 属性

addedRanges
最後のupdatestartイベントとupdateendイベントの間に追加された時間範囲です(これらのイベントは、 符号化フレーム処理アルゴリズムの前回の実行中に 発生したものです)。
removedRanges
最後のupdatestartイベントとupdateendイベントの間に削除された時間範囲です (これらのイベントは、符号化 フレーム削除アルゴリズムまたは符号化フレームの追い出しアルゴリズムの 前回の実行中、あるいはユーザーエージェントが メモリのクリーンアップに応じてコンテンツを追い出した場合に 発生したものです)。

9. ManagedSourceBufferインターフェイス

WebIDL[Exposed=(Window,DedicatedWorker)]
interface ManagedSourceBuffer : SourceBuffer {
  attribute EventHandler onbufferedchange;
};

9.1 属性

onbufferedchange

イベント ハンドラーIDL属性であり、そのイベント ハンドラーのイベント型bufferedchangeです。

9.2 イベントの概要

イベント名 インターフェイス 発火される条件...
bufferedchange BufferedChangeEvent ManagedSourceBufferのバッファー範囲が、 appendBuffer()remove()endOfStream()の 呼び出し後、またはユーザーエージェントが メモリのクリーンアップアルゴリズムを 実行した結果として変更されたとき。

9.3 アルゴリズム

9.3.1 バッファーの変更

次の手順は、ManagedSourceBuffer bufferに対する、そのbufferbufferedを変更させるすべての操作が 完了した時点で実行されます。すなわち、appendBuffer()remove()またはメモリのクリーンアップアルゴリズムが 完了した時点です。

  1. previous buffered rangesを、変更が発生する前の buffered属性とします。
  2. new buffered rangesを、新しいbuffered TimeRangesとします。
  3. addedを、previous buffered rangesnew buffered rangesから減算した結果とします。
  4. removedを、new buffered rangesprevious buffered rangesから減算した結果とします。
  5. eventInitDictを、新しいBufferedChangeEventInit 辞書とし、その addedRangesaddedで、その removedRangesremovedで初期化します。
  6. タスクをキューに入れbufferを対象として、bufferedchangeという名前の イベントを 発火します。イベントには BufferedChangeEventインターフェイスを使用し、 eventInitDictで初期化します。

9.3.2 メモリのクリーンアップ

  1. thisが、 thisの親であるManagedMediaSourceactiveSourceBuffers内にない場合:
    1. 符号化フレーム 削除アルゴリズムを、startを0、endを positive infinityに設定して実行し、これらの手順を中止します。
  2. removal rangesを、 currentTime から、そのプレゼンテーションを再び取得できるようになるまでの途切れない再生を保証するために、 プレゼンテーションから追い出すことができるプレゼンテーション時間範囲のリストとします。
    注記

    実装は、removal rangesを選択するために異なる戦略を 使用できるため、ウェブアプリケーションは特定の動作に依存すべきではありません。 ウェブアプリケーションは、バッファリングされたデータの一部が追い出されたかどうかを確認するため、 bufferedchangeイベントを監視します。

  3. removal ranges内の各範囲について、符号化フレーム削除アルゴリズムを、 startendをそれぞれ 削除範囲の開始タイムスタンプと終了タイムスタンプに設定して実行します。

10. HTMLMediaElementの拡張

この節では、既存のHTMLMediaElementseekable 属性およびHTMLMediaElementbuffered 属性が、HTMLMediaElementMediaSourceが接続されている場合に返さ なければならない値と、既存のHTMLMediaElementsrcObject 属性がMediaSourceHandleオブジェクトに 設定された場合に追加で実行しなければならない処理を規定します。

HTMLMediaElementseekable 属性は、次の手順に基づいて作成された新しい静的な 正規化された TimeRangesオブジェクトを返します:

  1. MediaSourceが、終了済みまたは終了処理中のDedicatedWorkerGlobalScope で構築された場合は、空のTimeRanges オブジェクトを返し、これらの手順を中止します。
    注記

    この場合は、terminate() によって、またはユーザーエージェントがMediaSourceのDedicatedWorkerGlobalScopeに対して ワーカーを 終了する処理を実行したことによって終了したDedicatedWorkerGlobalScope内で 構築されたMediaSourceについて、バッファリング可能またはシーク可能なメディアに関する 以前の情報を実装が保持しなくなる可能性がある場合を処理することを意図しています。 たとえば、これは close() の実行による最終的な結果として生じる場合があります。

    課題 277:MSE-in-Workers:MediaSourceのワーカー終了時に、 接続された要素を(最終的に)エラーへ遷移させることを検討/メディア要素は 何をすべきか? mse-in-workers

    接続されたワーカーのMediaSourceのコンテキストが破棄された場合、メディア要素を (最終的に)何らかのエラー状態へ遷移させるべきでしょうか?ワーカーMSEに関する Chromiumの試験的実装では、seekable属性とbuffered属性がそれぞれ空のTimeRangeを 報告するものの、要素のreadyState、networkState、errorはコンテキスト破棄前と 同じ状態に維持されます。

  2. recent durationおよびrecent live seekable rangeを、それぞれdurationおよび [[live seekable range]]の最近の値とし、 次のように決定します:
    MediaSourceWindow で構築された場合
    recent durationdurationに設定し、recent live seekable range[[live seekable range]]に設定します。
    それ以外の場合:
    recent durationおよびrecent live seekable rangeを、それぞれ durationおよび[[live seekable range]]の 最近の値に設定します。これらの値は、 MediaSource[[port to main]]へ、 duration または [[live seekable range]]が 変更されるたびに送信する暗黙のメッセージを処理することで更新されます。
  3. recent durationがNaNに等しい場合:
    空のTimeRanges オブジェクトを返します。
    recent durationがpositive Infinityに等しい場合:
    1. recent live seekable rangeが空でない場合:
      1. union rangesを、recent live seekable rangeHTMLMediaElementbuffered 属性との和集合とします。
      2. 開始時刻がunion ranges内の 最も早い開始時刻に等しく、終了時刻がunion ranges内の最も遅い終了時刻に等しい単一の範囲を返し、 これらの手順を中止します。
    2. HTMLMediaElementbuffered 属性が空のTimeRanges オブジェクトを返す場合は、空のTimeRanges オブジェクトを返し、 これらの手順を中止します。
    3. 開始時刻が0で、終了時刻がHTMLMediaElementbuffered 属性によって報告される最も遅い終了時刻に等しい単一の範囲を返します。
    それ以外の場合:
    開始時刻が0で、終了時刻がrecent durationに等しい単一の範囲を返します。

HTMLMediaElementbuffered 属性は、次の手順に基づく静的な 正規化された TimeRangesオブジェクトを返します。

  1. MediaSourceが、終了済みまたは終了処理中のDedicatedWorkerGlobalScope で構築された場合は、空のTimeRanges オブジェクトを返し、これらの手順を中止します。
    注記

    この場合は、terminate() によって、またはユーザーエージェントがMediaSourceのDedicatedWorkerGlobalScopeに対して ワーカーを 終了する処理を実行したことによって終了したDedicatedWorkerGlobalScope内で 構築されたMediaSourceについて、バッファリング可能またはシーク可能なメディアに関する 以前の情報を実装が保持しなくなる可能性がある場合を処理することを意図しています。 たとえば、これは close() の実行による最終的な結果として生じる場合があります。

    課題 277:MSE-in-Workers:MediaSourceのワーカー終了時に、 接続された要素を(最終的に)エラーへ遷移させることを検討/メディア要素は 何をすべきか? mse-in-workers

    接続されたワーカーのMediaSourceのコンテキストが破棄された場合、メディア要素を (最終的に)何らかのエラー状態へ遷移させるべきでしょうか?ワーカーMSEに関する Chromiumの試験的実装では、seekable属性とbuffered属性がそれぞれ空のTimeRangeを 報告するものの、要素のreadyState、networkState、errorはコンテキスト破棄前と 同じ状態に維持されます。

  2. recent intersection rangesを次のように決定します:
    MediaSourceWindow で構築された場合
    1. recent intersection rangesを空の TimeRanges オブジェクトとします。
    2. activeSourceBuffers.length が0と等しくない場合は、次の手順を実行します:
      1. active rangesを、 bufferedによって SourceBufferオブジェクトごとに 返される範囲とします。各オブジェクトは activeSourceBuffers内に あります。
      2. highest end timeを、 active ranges内で最も大きい範囲終了時刻とします。
      3. recent intersection rangesを、 0からhighest end timeまでの 単一の範囲を含む TimeRanges オブジェクトとします。
      4. SourceBufferオブジェクトごとに、 activeSourceBuffers内で 次の手順を実行します:
        1. source rangesを、 現在の SourceBufferbuffered 属性によって返される範囲とします。
        2. readyState が「ended」 である場合は、source ranges内の 最後の範囲の終了時刻をhighest end timeに設定します。
        3. new intersection rangesを、recent intersection rangessource rangesの共通部分とします。
        4. recent intersection ranges内の範囲をnew intersection rangesで置き換えます。
    それ以外の場合:
    recent intersection rangesを、TimeRanges オブジェクトとします。このオブジェクトは、 Window の場合の手順から得られるものですが、MediaSourceおよびその SourceBuffer オブジェクトをそれらのDedicatedWorkerGlobalScope 内で使用して実行されます。また、 [[port to main]]を 使用し、activeSourceBuffersreadyState、または activeSourceBuffersの 各buffered属性のいずれかの値を 変更するバッファリング状態が更新されるたびに、暗黙のメッセージで伝達されます。
    注記

    recent intersection rangesをこれほど 頻繁に再計算して伝達するオーバーヘッドは、コンテキスト間通信 モデルで言及されている共有メモリやロックなど、ほかの仕組みを使用して この情報をオンデマンドで照会する実装上の柔軟性を認める理由の一つです。

  3. この属性の現在の値がこのアルゴリズムによってまだ設定されていない場合、またはrecent intersection rangesがこの属性の現在の値と完全に同じ範囲情報を含んでいない場合は、 この属性の現在の値をrecent intersection rangesに更新します。
  4. この属性の現在の値を返します。

HTMLMediaElementsrcObject 属性に MediaSourceHandleが割り当てられた場合は、その[[has ever been assigned as srcobject]] をtrueに設定します。この設定は、そのMediaSourceHandleについて、 拡張されたHTMLMediaElementsrcObject setterにおける、要素の読み込みアルゴリズムを呼び出す前に行われる同期的な手順の一部として実行します。

注記

これにより、そのMediaSourceHandleオブジェクトを 再び転送できなくなり、転送が試みられた場合に明確な同期例外を発生させることができます。

課題

MediaSourceHandleを、 HTMLMediaElementの MediaProvider IDL typedef、およびメディアプロバイダーオブジェクトに関する関連テキストへ 追加する必要があります。

11. AudioTrackの拡張

この節では、[HTML]のAudioTrack 定義に対する拡張を規定します。

WebIDL[Exposed=Window]
partial interface AudioTrack {
  readonly attribute SourceBuffer? sourceBuffer;
};

属性

sourceBufferの型はSourceBufferで、 読み取り専用、nullable

取得時に、次の手順を実行します:

このトラックが、このトラックと同じ レルム 上で作成されたSourceBufferによって作成され、かつ、そのSourceBufferが、その親メディアソースsourceBuffers 属性から削除されていない場合:
このトラックを作成したSourceBufferを返します。
それ以外の場合:
nullを返します。
注記
たとえば、MediaSourceDedicatedWorkerGlobalScope で構築された場合、このトラックは内部のcreate trackハンドラーによって WindowHTMLMediaElement 上で作成されますが、このトラックを作成した SourceBufferDedicatedWorkerGlobalScope 内に存在します。両者は同じレルム上にないため、 この属性はnullを返します。

12. VideoTrackの拡張

この節では、[HTML]のVideoTrack 定義に対する拡張を規定します。

WebIDL[Exposed=Window]
partial interface VideoTrack {
  readonly attribute SourceBuffer? sourceBuffer;
};

属性

sourceBufferの型はSourceBufferで、 読み取り専用、nullable

取得時に、次の手順を実行します:

このトラックが、このトラックと同じ レルム 上で作成されたSourceBufferによって作成され、かつ、そのSourceBufferが、その親メディアソースsourceBuffers 属性から削除されていない場合:
このトラックを作成したSourceBufferを返します。
それ以外の場合:
nullを返します。
注記
たとえば、MediaSourceDedicatedWorkerGlobalScope で構築された場合、このトラックは内部のcreate trackハンドラーによって WindowHTMLMediaElement 上で作成されますが、このトラックを作成した SourceBufferDedicatedWorkerGlobalScope 内に存在します。両者は同じレルム上にないため、 この属性はnullを返します。

13. TextTrackの拡張

この節では、[HTML]のTextTrack 定義に対する拡張を規定します。

WebIDL[Exposed=Window]
partial interface TextTrack {
  readonly attribute SourceBuffer? sourceBuffer;
};

属性

sourceBufferの型はSourceBufferで、 読み取り専用、nullable

取得時に、次の手順を実行します:

このトラックが、このトラックと同じ レルム 上で作成されたSourceBufferによって作成され、かつ、そのSourceBufferが、その親メディアソースsourceBuffers 属性から削除されていない場合:
このトラックを作成したSourceBufferを返します。
それ以外の場合:
nullを返します。
注記
たとえば、MediaSourceDedicatedWorkerGlobalScope で構築された場合、このトラックは内部のcreate trackハンドラーによって WindowHTMLMediaElement 上で作成されますが、このトラックを作成した SourceBufferDedicatedWorkerGlobalScope 内に存在します。両者は同じレルム上にないため、 この属性はnullを返します。

14. バイトストリーム形式

SourceBufferに対してappendBuffer()を通じて 提供されるバイトは、論理バイトストリームを形成します。これらのバイトストリームの形式と意味論は、バイトストリーム形式仕様で定義されます。バイトストリーム 形式レジストリ[MSE-REGISTRY]は、 addSourceBuffer()isTypeSupported()または changeType()へ渡すことができる MIMEタイプと、そのMIMEタイプを使用するSourceBufferが、新しく追加されたデータの解析時に 想定するバイトストリーム形式との対応関係を提供します。相互運用性を促進するため、実装には、 サポートするバイトストリーム形式の対応関係を登録することが推奨されます。バイトストリーム形式レジストリ [MSE-REGISTRY]は、これらの 対応関係に関する権威ある情報源です。実装がレジストリに掲載されているMIMEタイプをサポートすると主張する場合、 そのSourceBuffer実装は、レジストリエントリーに掲載されている バイトストリーム形式仕様適合しなければなりません

注記

レジストリ内のバイトストリーム形式仕様は、新しい保存形式を定義することを意図していません。 これらは、この仕様の実装が受け入れる既存の保存形式構造のサブセットを示すだけです。

注記

バイトストリーム形式の解析と検証は、セグメント パーサーループアルゴリズムで実装されます。

この節では、すべてのバイトストリーム形式仕様に関する一般要件を示します:

バイトストリーム仕様は、少なくとも上記の要件が成立することを保証する制約を定義 しなければなりません。たとえば実装を簡素化するために、追加の制約を 定義してもよい

15. 適合性

非規範的と明示された節に加え、この仕様に含まれるすべての著者向けガイドライン、図、例、注記は 非規範的です。この仕様のそれ以外のすべての内容は規範的です。

この文書におけるキーワードしてもよいしなければならないしてはならないすべき、および すべきではないは、原文において、ここに示すようにすべて大文字で 表記されている場合に限り、 BCP 14 [RFC2119] [RFC8174]に記載されている とおりに解釈されるものとします。

16.

16.1 メディアソース拡張の使用

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

16.2 管理対象メディアソースの使用

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

17. 謝辞

編集者は、この仕様への貢献について、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に 感謝します。

A. VideoPlaybackQuality

この節は非規範的です。

この仕様の以前の改訂版で説明されていた動画再生品質指標 (例:勧告候補の第5節および第10節)は、 現在、[MEDIA-PLAYBACK-QUALITY]の一部として開発されています。 一部の実装では、以前の草案に記載されたVideoPlaybackQualityオブジェクトと、 HTMLVideoElementの 拡張メソッドgetVideoPlaybackQuality()を 実装している場合があります。

B. 課題の概要

C. 参考文献

C.1 規範的参考文献

[dom]
DOM標準。Anne van Kesteren。WHATWG。 リビングスタンダード。URL:https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript言語仕様。 Ecma International。URL:https://tc39.es/ecma262/multipage/
[FILEAPI]
File API。Marijn Kruisselbrink。W3C。 2026年6月4日。W3C作業草案。URL:https://www.w3.org/TR/FileAPI/
[HTML]
HTML標準。Anne van Kesteren; Domenic Denicola;Dominic Farolino;Ian Hickson;Philip Jägenstedt;Simon Pieters。WHATWG。 リビングスタンダード。URL:https://html.spec.whatwg.org/multipage/
[infra]
Infra標準。Anne van Kesteren;Domenic Denicola。WHATWG。リビングスタンダード。URL:https://infra.spec.whatwg.org/
[MSE-REGISTRY]
メディアソース拡張™バイト ストリーム形式レジストリ。Matthew Wolenetz;Jerry Smith;Aaron Colwell。W3C。URL: https://www.w3.org/TR/mse-byte-stream-format-registry/
[RFC2119]
要件レベルを示すためにRFCで使用する キーワード。S. Bradner。IETF。1997年3月。現在のベストプラクティス。URL:https://www.rfc-editor.org/info/rfc2119/
[RFC8174]
RFC 2119キーワードにおける大文字と小文字の 曖昧さ。B. Leiba。IETF。2017年5月。現在のベストプラクティス。URL:https://www.rfc-editor.org/info/rfc8174/
[WEBIDL]
Web IDL標準。Edgar Chen;Timothy Gu。 WHATWG。リビングスタンダード。URL:https://webidl.spec.whatwg.org/

C.2 参考情報

[INBANDTRACKS]
メディアコンテナからHTMLへの 帯域内メディアリソーストラックの供給。Silvia Pfeiffer;Bob Lund。W3C。 2015年4月26日。非公式草案。URL:https://dev.w3.org/html5/html-sourcing-inband-tracks/
[MEDIA-PLAYBACK-QUALITY]
メディア再生品質。 Mounir Lamouri;Chris Cunningham。W3C。W3C編集者草案。URL:https://w3c.github.io/media-playback-quality/
[url]
URL標準。Anne van Kesteren。WHATWG。 リビングスタンダード。URL:https://url.spec.whatwg.org/