メディア要素

4.7.10 メディア要素

メディア要素 (本仕様においては、audiovideo のこと) とは、次のインタフェースを実装したものです:

enum CanPlayTypeEnum { "" /* empty string */, "maybe", "probably" };
interface HTMLMediaElement : HTMLElement {

  // エラー状態
  readonly attribute MediaError? error;

  // ネットワーク状態
           attribute DOMString src;
  readonly attribute DOMString currentSrc;
           attribute DOMString crossOrigin;
  const unsigned short NETWORK_EMPTY = 0;
  const unsigned short NETWORK_IDLE = 1;
  const unsigned short NETWORK_LOADING = 2;
  const unsigned short NETWORK_NO_SOURCE = 3;
  readonly attribute unsigned short networkState;
           attribute DOMString preload;
  readonly attribute TimeRanges buffered;
  void load();
  CanPlayTypeEnum canPlayType(DOMString type);

  // 準備状態
  const unsigned short HAVE_NOTHING = 0;
  const unsigned short HAVE_METADATA = 1;
  const unsigned short HAVE_CURRENT_DATA = 2;
  const unsigned short HAVE_FUTURE_DATA = 3;
  const unsigned short HAVE_ENOUGH_DATA = 4;
  readonly attribute unsigned short readyState;
  readonly attribute boolean seeking;

  // 再生状態
           attribute double currentTime;
  readonly attribute unrestricted double duration;
  Date getStartDate();
  readonly attribute boolean paused;
           attribute double defaultPlaybackRate;
           attribute double playbackRate;
  readonly attribute TimeRanges played;
  readonly attribute TimeRanges seekable;
  readonly attribute boolean ended;
           attribute boolean autoplay;
           attribute boolean loop;
  void play();
  void pause();

  // メディアコントローラー
           attribute DOMString mediaGroup;
           attribute MediaController? controller;

  // 制御
           attribute boolean controls;
           attribute double volume;
           attribute boolean muted;
           attribute boolean defaultMuted;

  // トラック
  readonly attribute AudioTrackList audioTracks;
  readonly attribute VideoTrackList videoTracks;
  readonly attribute TextTrackList textTracks;
  TextTrack addTextTrack(TextTrackKind kind, optional DOMString label = "", optional DOMString language = "");
};

メディア要素属性, src, crossorigin, preload, autoplay, mediagroup, loop, muted, controls は、すべてのメディア要素に適用できます。これらは、本セクションにて定義されています。

メディア要素は、オーティオのデータ、または、ビデオとオーディオのデータをユーザーに提供するために使われます。本セクションではこれをメディアデータと呼びます。なぜなら、本セクションは、オーディオ向けとビデオ向けのどちらのメディア要素にも等しく当てはまるからです。メディアリソースという用語は、メディアデータの完全なセットを指すために使われます。たとえば、完全なビデオファイルや完全なオーディオファイルを指します。

メディアリソースは、複数のオーディオとビデオのトラックを持つことができます。メディア要素の目的においては、メディアリソースのビデオデータとは、その要素の videoTracks 属性によって与えられたその時点の選択トラック(もしあれば)のデータのことで、メディアリソースのオーディオデータとは、その要素の audioTracks 属性によって与えられたその時点のすべての有効トラック(もしあれば)を組み合わせた結果のことです。

audiovideo 要素はともに、オーディオとビデオのどちらに対しても使うことができます。この 2 つの主な違いは、audio 要素はビジュアルコンテンツのための再生領域を持たないのに対し、video 要素はそれを持つ、という点です。

明示的に指定されない限り、本セクション以降でキューイングされるタスクすべてに対するタスクソースは、該当のメディア要素メディア要素イベント・タスクソースです。

4.7.10.1 エラーコード
media . error

要素の現在のエラー状態を表す MediaError オブジェクトを返します。

エラーがなければ null を返します。

すべてのメディア要素は関連のエラー状態を持ちますが、これは、該当の要素が、そのリソース選択アルゴリズムが最後に呼び出されてから遭遇した最後のエラーを記録したものです。error 属性は、取得時には、この最後のエラーに対して生成された MediaError オブジェクトを返さなければいけません。エラーがなければ null を返さなければいけません。

interface MediaError {
  const unsigned short MEDIA_ERR_ABORTED = 1;
  const unsigned short MEDIA_ERR_NETWORK = 2;
  const unsigned short MEDIA_ERR_DECODE = 3;
  const unsigned short MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
  readonly attribute unsigned short code;
};
media . error . code

以下のリストから、現在のエラーのエラーコードを返します。

MediaError オブジェクトの code 属性は、該当のエラーに相当するコードを返さなければいけません。これは、以下のうちのいずれか 1 つでなければいけません:

MEDIA_ERR_ABORTED (数値 1)
メディアリソースのフェッチ処理が、ユーザのリクエストで、ユーザーエージェントによって中止された。
MEDIA_ERR_NETWORK (数値 2)
リソースが利用可能だと確定したあとに、何らかのネットワークエラーによって、ユーザーエージェントがメディアリソースのフェッチを停止することになった。
MEDIA_ERR_DECODE (数値 3)
リソースが利用可能だと確定したあとに、そのメディアリソースのデコード中に何かしらのエラーが発生した。
MEDIA_ERR_SRC_NOT_SUPPORTED (数値 4)
src 属性によって指定されたメディアリソースが適切ではなかった。
4.7.10.2 メディアリソースのロケーション

メディア要素src コンテント属性は、表示するメディアリソース(ビデオ、オーディオ)のアドレスを与えます。この属性は、存在すれば、潜在的にスペースで囲まれた妥当な空でない URL を含まなければいけません。

メディア要素crossorigin コンテント属性は、CORS セッティング属性です。

メディア要素src 属性がセットされたり変更されたりしたら、ユーザーエージェントは、そのメディア要素メディア要素ロードアルゴリズムを呼びださなければいけません。(src 属性の削除では、たとえ source 要素が存在していたとしても、これは行われません)

メディア要素src IDL 属性は、同じ名前のコンテント属性を反映しなければいけません。

crossOrigin IDL 属性は、既知の値のみに限定して、crossorigin コンテント属性を反映しなければいけません。

media . currentSrc

現在のメディアリソースのアドレスを返します。

メディアリソースがない場合は、空文字列を返します。

currentSrc IDL 属性は、当初は、空文字列です。その値は、以降で定義されたリソース選択アルゴリズムによって変更されます。

メディアリソースを指定するには 2 つの方法があります。src 属性と、source 要素です。src 属性は、source 要素より優先されます。

4.7.10.3 MIME タイプ

メディアリソースは、その種類、とりわけ MIME タイプで言い表すことができます。場合によっては、codecs パラメータを伴います。(codecs パラメータが許されるかどうかは、MIME タイプに依存します。) [RFC6381]

タイプは、通常は、いささか不完全な記述です。たとえば、"video/mpeg" は、コンテナのタイプが何なのか以外には何も言っていません。たとえ、"video/mp4; codecs="avc1.42E01E, mp4a.40.2"" のようなタイプだとしても、実際のビットレート(最大ビットレートのみ)などの情報は含まれていません。ゆえに、タイプが与えられても、ユーザーエージェントは、そのタイプのメディアを再生できるかもしれない、または、そのタイプのメディアは絶対に再生することができない、という点しか分かりません。

ユーザーエージェントがレンダリングできないと分かっているタイプとは、ユーザーエージェントが絶対にサポートしていないリソースを記述したタイプのことです。たとえば、コンテナのタイプを認識できない場合や、列挙されたコーデックをサポートしていないなどの理由です。

パラメータなしの MIME タイプ "application/octet-stream" は、決してユーザーエージェントがレンダリングできないと分かっているタイプになることはありません。ユーザーエージェントは、そのようなタイプを、それが潜在的なメディアリソースをラベル付けするために使われるとき、明示的な Content-Type メタデータが何もなかったのと同等に扱わなければいけません。

パラメータなしの MIME タイプ "application/octet-stream" だけが、ここでは特別扱いになっています。もしパラメータが伴えば、他の MIME タイプと同じように扱われるだけです。これは、未知の MIME タイプパラメータは無視されるべき、というルールによってもたらされた例外です。

media . canPlayType(type)

ユーザーエージェントが指定タイプのメディアリソースをどれくらいの確度を持って再生できるのかに応じて、空文字列(ネガティブ応答)、"maybe"、"probably" を返します。

canPlayType(type) メソッドは、typeユーザーエージェントがレンダリングできないと分かっているタイプ、もしくは、タイプ "application/octet-stream" なら、 空文字列を返さなければいけません。そのタイプが、audio 要素か video 要素で使われるならレンダリングできるメディアリソースを表していると、ユーザーエージェントが確信を持てるなら、"probably" を返さなければいけません。そうでなければ、"maybe" を返さなければいけません。そのタイプが確実にサポートされたものかどうかを確信できない限り、実装では "maybe" を返すことが推奨されます。一般的に、ユーザーエージェントは、タイプに codecs パラメータが許されているにもかかわらず、そのパラメータが存在しないなら、そのタイプに対して "probably" を決して返すべきではありません。

このスクリプトは、ユーザーエージェントが (架空の) 新たな形式をサポートしているかどうかをテストして、動的に video 要素かプラグインを使うのかを決定します:

<section id="video">
 <p><a href="playing-cats.nfv">ビデオをダウンロード</a></p>
</section>
<script>
 var videoSection = document.getElementById('video');
 var videoElement = document.createElement('video');
 var support = videoElement.canPlayType('video/x-new-fictional-format;codecs="kittens,bunnies"');
 if (support != "probably" && "New Fictional Video Plugin" in navigator.plugins) {
   // ブラウザーサポートは確実ではないが、
   // プラグインがある
   // だから代わりにプラグインを使う
   videoElement = document.createElement("embed");
 } else if (support == "") {
   // ブラウザーサポートもプラグインもない
   // 何もしない
   videoElement = null;
 }
 if (videoElement) {
   while (videoSection.hasChildNodes())
     videoSection.removeChild(videoSection.firstChild);
   videoElement.setAttribute("src", "playing-cats.nfv");
   videoSection.appendChild(videoElement);
 }
</script>

source 要素の type 属性によって、ユーザーエージェントは、レンダリングできない形式を使うリソースをダウンロードしなくても済むようになります。

4.7.10.4 ネットワーク状態
media . networkState

以下のリストにあるコードから、該当の要素のネットワークのアクティビティの現在の状態を返します。

メディア要素がネットワークと関わるとき、その現在のネットワークアクティビティは、networkState 属性によって表されます。取得時には、要素の現在のネットワークの状態を返さなければいけません。それは、次の値のうちの 1 つでなければいけません:

NETWORK_EMPTY (数値 0)
要素はまだ初期化されていません。すべての属性は初期状態にあります。
NETWORK_IDLE (数値 1)
要素のリソース選択アルゴリズムはアクティブで、リソースが選択されていますが、この時点では実際にはネットワークを使っていません。
NETWORK_LOADING (数値 2)
ユーザーエージェントはアクティブにデータをダウンロードしようとしています。
NETWORK_NO_SOURCE (数値 3)
要素のリソース選択アルゴリズムはアクティブですが、まだ利用するリソースが見つかっていません。

以降で定義されているリソース選択アルゴリズムは、正確には、いつ networkState 属性が値を変更し、どのイベントを発出して状態の変化を示すのかを説明しています。

4.7.10.5 メディアリソースのローディング
media . load()

要素をリセットし、一から新たなメディアリソースを選択しロードしなおします。

すべてのメディア要素自動再生フラグを持ちます。これは、true 状態で開始しなければいけません。そして、load イベント遅延フラグも持ちます。これは false 状態で開始しなければいけません。load イベント遅延フラグが true なら、その要素は、そのドキュメントの load イベントを遅延させなければいけません。

メディア要素load() メソッドが呼び出されたら、ユーザーエージェントは、メディア要素ロードアルゴリズムを実行しなければいけません。

メディア要素ロードアルゴリズムは、次の手順から構成されます。

  1. Abort any already-running instance of the resource selection algorithm for this element.

  2. If there are any tasks from the media element's media element event task source in one of the task queues, then remove those tasks.

    If there are any tasks that were queued by the resource selection algorithm (including the algorithms that it itself invokes) for this same media element from the DOM manipulation task source in one of the task queues, then remove those tasks.

    Basically, pending events and callbacks for the media element are discarded when the media element starts loading a new resource.

  3. If the media element's networkState is set to NETWORK_LOADING or NETWORK_IDLE, queue a task to fire a simple event named abort at the media element.

  4. If the media element's networkState is not set to NETWORK_EMPTY, then run these substeps:

    1. Queue a task to fire a simple event named emptied at the media element.

    2. If a fetching process is in progress for the media element, the user agent should stop it.

    3. Forget the media element's media-resource-specific tracks.

    4. If readyState is not set to HAVE_NOTHING, then set it to that state.

    5. If the paused attribute is false, then set it to true.

    6. If seeking is true, set it to false.

    7. Set the current playback position to 0.

      Set the official playback position to 0.

      If this changed the official playback position, then queue a task to fire a simple event named timeupdate at the media element.

    8. Set the initial playback position to 0.

    9. Set the timeline offset to Not-a-Number (NaN).

    10. Update the duration attribute to Not-a-Number (NaN).

      The user agent will not fire a durationchange event for this particular change of the duration.

  5. Set the playbackRate attribute to the value of the defaultPlaybackRate attribute.

  6. Set the error attribute to null and the autoplaying flag to true.

  7. Invoke the media element's resource selection algorithm.

  8. Playback of any previously playing media resource for this element stops.

メディア要素リソース選択アルゴリズムは次のとおりです。このアルゴリズムは常に同期的に呼び出されますが、このアルゴリズムの最初の手順の一つは、返してから、残りの手順を非同期に実行し続けます。つまり、これは、スクリプトや、平行して実行されている他のタスクとともに、平行して実行されることを意味します。さらに、このアルゴリズムは、イベントループメカニズムに密接に関わります。とりわけ、これは同期セクションを持ちます(これはイベントループアルゴリズムの一部として呼び出されます)。そのようなセクションの手順は ⌛ でマークされています。

  1. Set the element's networkState attribute to the NETWORK_NO_SOURCE value.

  2. Set the element's show poster flag to true.

  3. Set the media element's delaying-the-load-event flag to true (this delays the load event).

  4. Asynchronously await a stable state, allowing the task that invoked this algorithm to continue. The synchronous section consists of all the remaining steps of this algorithm until the algorithm says the synchronous section has ended. (Steps in synchronous sections are marked with ⌛.)

  5. ⌛ If the media element's blocked-on-parser flag is false, then populate the list of pending text tracks.

  6. ⌛ If the media element has a src attribute, then let mode be attribute.

    ⌛ Otherwise, if the media element does not have a src attribute but has a source element child, then let mode be children and let candidate be the first such source element child in tree order.

    ⌛ Otherwise the media element has neither a src attribute nor a source element child: set the networkState to NETWORK_EMPTY, and abort these steps; the synchronous section ends.

  7. ⌛ Set the media element's networkState to NETWORK_LOADING.

  8. Queue a task to fire a simple event named loadstart at the media element.

  9. If mode is attribute, then run these substeps:

    1. ⌛ If the src attribute's value is the empty string, then end the synchronous section, and jump down to the failed with attribute step below.

    2. ⌛ Let absolute URL be the absolute URL that would have resulted from resolving the URL specified by the src attribute's value relative to the media element when the src attribute was last changed.

    3. ⌛ If absolute URL was obtained successfully, set the currentSrc attribute to absolute URL.

    4. End the synchronous section, continuing the remaining steps asynchronously.

    5. If absolute URL was obtained successfully, run the resource fetch algorithm with absolute URL. If that algorithm returns without aborting this one, then the load failed.

    6. Failed with attribute: Reaching this step indicates that the media resource failed to load or that the given URL could not be resolved. Queue a task to run the following steps, using the DOM manipulation task source:

      1. Set the error attribute to a new MediaError object whose code attribute is set to MEDIA_ERR_SRC_NOT_SUPPORTED.

      2. Forget the media element's media-resource-specific tracks.

      3. Set the element's networkState attribute to the NETWORK_NO_SOURCE value.

      4. Set the element's show poster flag to true.

      5. Fire a simple event named error at the media element.

      6. Set the element's delaying-the-load-event flag to false. This stops delaying the load event.

    7. Wait for the task queued by the previous step to have executed.

    8. Abort these steps. Until the load() method is invoked or the src attribute is changed, the element won't attempt to load another resource.

    Otherwise, the source elements will be used; run these substeps:

    1. ⌛ Let pointer be a position defined by two adjacent nodes in the media element's child list, treating the start of the list (before the first child in the list, if any) and end of the list (after the last child in the list, if any) as nodes in their own right. One node is the node before pointer, and the other node is the node after pointer. Initially, let pointer be the position between the candidate node and the next node, if there are any, or the end of the list, if it is the last node.

      As nodes are inserted and removed into the media element, pointer must be updated as follows:

      If a new node is inserted between the two nodes that define pointer
      Let pointer be the point between the node before pointer and the new node. In other words, insertions at pointer go after pointer.
      If the node before pointer is removed
      Let pointer be the point between the node after pointer and the node before the node after pointer. In other words, pointer doesn't move relative to the remaining nodes.
      If the node after pointer is removed
      Let pointer be the point between the node before pointer and the node after the node before pointer. Just as with the previous case, pointer doesn't move relative to the remaining nodes.

      Other changes don't affect pointer.

    2. Process candidate: If candidate does not have a src attribute, or if its src attribute's value is the empty string, then end the synchronous section, and jump down to the failed with elements step below.

    3. ⌛ Let absolute URL be the absolute URL that would have resulted from resolving the URL specified by candidate's src attribute's value relative to the candidate when the src attribute was last changed.

    4. ⌛ If absolute URL was not obtained successfully, then end the synchronous section, and jump down to the failed with elements step below.

    5. ⌛ If candidate has a type attribute whose value, when parsed as a MIME type (including any codecs described by the codecs parameter, for types that define that parameter), represents a type that the user agent knows it cannot render, then end the synchronous section, and jump down to the failed with elements step below.

    6. ⌛ If candidate has a media attribute whose value does not match the environment, then end the synchronous section, and jump down to the failed with elements step below.

    7. ⌛ Set the currentSrc attribute to absolute URL.

    8. End the synchronous section, continuing the remaining steps asynchronously.

    9. Run the resource fetch algorithm with absolute URL. If that algorithm returns without aborting this one, then the load failed.

    10. Failed with elements: Queue a task, using the DOM manipulation task source, to fire a simple event named error at the candidate element.

    11. Asynchronously await a stable state. The synchronous section consists of all the remaining steps of this algorithm until the algorithm says the synchronous section has ended. (Steps in synchronous sections are marked with ⌛.)

    12. Forget the media element's media-resource-specific tracks.

    13. Find next candidate: Let candidate be null.

    14. Search loop: If the node after pointer is the end of the list, then jump to the waiting step below.

    15. ⌛ If the node after pointer is a source element, let candidate be that element.

    16. ⌛ Advance pointer so that the node before pointer is now the node that was after pointer, and the node after pointer is the node after the node that used to be after pointer, if any.

    17. ⌛ If candidate is null, jump back to the search loop step. Otherwise, jump back to the process candidate step.

    18. Waiting: Set the element's networkState attribute to the NETWORK_NO_SOURCE value.

    19. ⌛ Set the element's show poster flag to true.

    20. ⌛ Set the element's delaying-the-load-event flag to false. This stops delaying the load event.

    21. End the synchronous section, continuing the remaining steps asynchronously.

    22. Wait until the node after pointer is a node other than the end of the list. (This step might wait forever.)

    23. Asynchronously await a stable state. The synchronous section consists of all the remaining steps of this algorithm until the algorithm says the synchronous section has ended. (Steps in synchronous sections are marked with ⌛.)

    24. ⌛ Set the element's delaying-the-load-event flag back to true (this delays the load event again, in case it hasn't been fired yet).

    25. ⌛ Set the networkState back to NETWORK_LOADING.

    26. ⌛ Jump back to the find next candidate step above.

メディア要素と、与えられた絶対 URLリソースフェッチ・アルゴリズムは次のとおりです:

  1. Let the current media resource be the resource given by the absolute URL passed to this algorithm. This is now the element's media resource.

  2. Remove all media-resource-specific text tracks from the media element's list of pending text tracks, if any.

  3. Optionally, run the following substeps. This is the expected behavior if the user agent intends to not attempt to fetch the resource until the user requests it explicitly (e.g. as a way to implement the preload attribute's none keyword).

    1. Set the networkState to NETWORK_IDLE.

    2. Queue a task to fire a simple event named suspend at the element, using the DOM manipulation task source.

    3. Set the element's delaying-the-load-event flag to false. This stops delaying the load event.

    4. Wait for the task to be run.

    5. Wait for an implementation-defined event (e.g. the user requesting that the media element begin playback).

    6. Set the element's delaying-the-load-event flag back to true (this delays the load event again, in case it hasn't been fired yet).

    7. Set the networkState to NETWORK_LOADING.

  4. Perform a potentially CORS-enabled fetch of the current media resource's absolute URL, with the mode being the state of the media element's crossorigin content attribute, the origin being the origin of the media element's Document, and the default origin behaviour set to taint.

    The resource obtained in this fashion, if any, contains the media data. It can be CORS-same-origin or CORS-cross-origin; this affects whether subtitles referenced in the media data are exposed in the API and, for video elements, whether a canvas gets tainted when the video is drawn on it.

    While the load is not suspended (see below), every 350ms (±200ms) or for every byte received, whichever is least frequent, queue a task to fire a simple event named progress at the element.

    The stall timeout is a user-agent defined length of time, which should be about three seconds. When a media element that is actively attempting to obtain media data has failed to receive any data for a duration equal to the stall timeout, the user agent must queue a task to fire a simple event named stalled at the element.

    User agents may allow users to selectively block or slow media data downloads. When a media element's download has been blocked altogether, the user agent must act as if it was stalled (as opposed to acting as if the connection was closed). The rate of the download may also be throttled automatically by the user agent, e.g. to balance the download with other connections sharing the same bandwidth.

    User agents may decide to not download more content at any time, e.g. after buffering five minutes of a one hour media resource, while waiting for the user to decide whether to play the resource or not, while waiting for user input in an interactive resource, or when the user navigates away from the page. When a media element's download has been suspended, the user agent must queue a task, using the DOM manipulation task source, to set the networkState to NETWORK_IDLE and fire a simple event named suspend at the element. If and when downloading of the resource resumes, the user agent must queue a task to set the networkState to NETWORK_LOADING. Between the queuing of these tasks, the load is suspended (so progress events don't fire, as described above).

    The preload attribute provides a hint regarding how much buffering the author thinks is advisable, even in the absence of the autoplay attribute.

    When a user agent decides to completely stall a download, e.g. if it is waiting until the user starts playback before downloading any further content, the element's delaying-the-load-event flag must be set to false. This stops delaying the load event.

    The user agent may use whatever means necessary to fetch the resource (within the constraints put forward by this and other specifications); for example, reconnecting to the server in the face of network errors, using HTTP range retrieval requests, or switching to a streaming protocol. The user agent must consider a resource erroneous only if it has given up trying to fetch it.

    This specification does not currently say whether or how to check the MIME types of the media resources, or whether or how to perform file type sniffing using the actual file data. Implementors differ in their intentions on this matter and it is therefore unclear what the right solution is. In the absence of any requirement here, the HTTP specification's strict requirement to follow the Content-Type header prevails ("Content-Type specifies the media type of the underlying data." ... "If and only if the media type is not given by a Content-Type field, the recipient MAY attempt to guess the media type via inspection of its content and/or the name extension(s) of the URI used to identify the resource.").

    The networking task source tasks to process the data as it is being fetched must, when appropriate, include the relevant substeps from the following list:

    If the media data cannot be fetched at all, due to network errors, causing the user agent to give up trying to fetch the resource
    If the media data can be fetched but is found by inspection to be in an unsupported format, or can otherwise not be rendered at all

    DNS errors, HTTP 4xx and 5xx errors (and equivalents in other protocols), and other fatal network errors that occur before the user agent has established whether the current media resource is usable, as well as the file using an unsupported container format, or using unsupported codecs for all the data, must cause the user agent to execute the following steps:

    1. The user agent should cancel the fetching process.

    2. Abort this subalgorithm, returning to the resource selection algorithm.

    If the media resource is found to have an audio track
    1. Create an AudioTrack object to represent the audio track.

    2. Update the media element's audioTracks attribute's AudioTrackList object with the new AudioTrack object.

    3. Fire a trusted event with the name addtrack, that does not bubble and is not cancelable, and that uses the TrackEvent interface, with the track attribute initialized to the new AudioTrack object, at this AudioTrackList object.

    If the media resource is found to have a video track
    1. Create a VideoTrack object to represent the video track.

    2. Update the media element's videoTracks attribute's VideoTrackList object with the new VideoTrack object.

    3. Fire a trusted event with the name addtrack, that does not bubble and is not cancelable, and that uses the TrackEvent interface, with the track attribute initialized to the new VideoTrack object, at this VideoTrackList object.

    Once enough of the media data has been fetched to determine the duration of the media resource, its dimensions, and other metadata

    This indicates that the resource is usable. The user agent must follow these substeps:

    1. Establish the media timeline for the purposes of the current playback position, the earliest possible position, and the initial playback position, based on the media data.

    2. Update the timeline offset to the date and time that corresponds to the zero time in the media timeline established in the previous step, if any. If no explicit time and date is given by the media resource, the timeline offset must be set to Not-a-Number (NaN).

    3. Set the current playback position and the official playback position to the earliest possible position.

    4. Update the duration attribute with the time of the last frame of the resource, if known, on the media timeline established above. If it is not known (e.g. a stream that is in principle infinite), update the duration attribute to the value positive Infinity.

      The user agent will queue a task to fire a simple event named durationchange at the element at this point.

    5. For video elements, set the videoWidth and videoHeight attributes, and queue a task to fire a simple event named resize at the media element.

      Further resize events will be fired if the dimensions subsequently change.

    6. Set the readyState attribute to HAVE_METADATA.

      A loadedmetadata DOM event will be fired as part of setting the readyState attribute to a new value.

    7. Let jumped be false.

    8. If the media element's default playback start position is greater than zero, then seek to that time, and let jumped be true.

    9. Let the media element's default playback start position be zero.

    10. If either the media resource or the address of the current media resource indicate a particular start time, then set the initial playback position to that time and, if jumped is still false, seek to that time and let jumped be true.

      For example, with media formats that support the Media Fragments URI fragment identifier syntax, the fragment identifier can be used to indicate a start position. [MEDIAFRAG]

    11. If either the media resource or the address of the current media resource indicate a particular set of audio or video tracks to enable, or if the user agent has information that would enable it to select specific tracks to improve the user's experience, then the relevant audio tracks must be enabled in the element's audioTracks object, and, of the relevant video tracks, the one that is listed first in the element's videoTracks object must be selected. All other tracks must be disabled.

      This could again be triggered by Media Fragments URI fragment identifier syntax, but it could also be triggered e.g. by the user agent selecting a 5.1 surround sound audio track over a stereo audio track. [MEDIAFRAG]

    12. If the media element has a current media controller, then: if jumped is true and the initial playback position, relative to the current media controller's timeline, is greater than the current media controller's media controller position, then seek the media controller to the media element's initial playback position, relative to the current media controller's timeline; otherwise, seek the media element to the media controller position, relative to the media element's timeline.

    Once the readyState attribute reaches HAVE_CURRENT_DATA, after the loadeddata event has been fired, set the element's delaying-the-load-event flag to false. This stops delaying the load event.

    A user agent that is attempting to reduce network usage while still fetching the metadata for each media resource would also stop buffering at this point, following the rules described previously, which involve the networkState attribute switching to the NETWORK_IDLE value and a suspend event firing.

    The user agent is required to determine the duration of the media resource and go through this step before playing.

    Once the entire media resource has been fetched (but potentially before any of it has been decoded)

    Fire a simple event named progress at the media element.

    Set the networkState to NETWORK_IDLE and fire a simple event named suspend at the media element.

    If the user agent ever discards any media data and then needs to resume the network activity to obtain it again, then it must queue a task to set the networkState to NETWORK_LOADING.

    If the user agent can keep the media resource loaded, then the algorithm will continue to its final step below, which aborts the algorithm.

    If the connection is interrupted after some media data has been received, causing the user agent to give up trying to fetch the resource

    Fatal network errors that occur after the user agent has established whether the current media resource is usable (i.e. once the media element's readyState attribute is no longer HAVE_NOTHING) must cause the user agent to execute the following steps:

    1. The user agent should cancel the fetching process.

    2. Set the error attribute to a new MediaError object whose code attribute is set to MEDIA_ERR_NETWORK.

    3. Fire a simple event named error at the media element.

    4. Set the element's networkState attribute to the NETWORK_IDLE value.

    5. Set the element's delaying-the-load-event flag to false. This stops delaying the load event.

    6. Abort the overall resource selection algorithm.

    If the media data is corrupted

    Fatal errors in decoding the media data that occur after the user agent has established whether the current media resource is usable must cause the user agent to execute the following steps:

    1. The user agent should cancel the fetching process.

    2. Set the error attribute to a new MediaError object whose code attribute is set to MEDIA_ERR_DECODE.

    3. Fire a simple event named error at the media element.

    4. If the media element's readyState attribute has a value equal to HAVE_NOTHING, set the element's networkState attribute to the NETWORK_EMPTY value, set the element's show poster flag to true, and fire a simple event named emptied at the element.

      Otherwise, set the element's networkState attribute to the NETWORK_IDLE value.

    5. Set the element's delaying-the-load-event flag to false. This stops delaying the load event.

    6. Abort the overall resource selection algorithm.

    If the media data fetching process is aborted by the user

    The fetching process is aborted by the user, e.g. because the user pressed a "stop" button, the user agent must execute the following steps. These steps are not followed if the load() method itself is invoked while these steps are running, as the steps above handle that particular kind of abort.

    1. The user agent should cancel the fetching process.

    2. Set the error attribute to a new MediaError object whose code attribute is set to MEDIA_ERR_ABORTED.

    3. Fire a simple event named abort at the media element.

    4. If the media element's readyState attribute has a value equal to HAVE_NOTHING, set the element's networkState attribute to the NETWORK_EMPTY value, set the element's show poster flag to true, and fire a simple event named emptied at the element.

      Otherwise, set the element's networkState attribute to the NETWORK_IDLE value.

    5. Set the element's delaying-the-load-event flag to false. This stops delaying the load event.

    6. Abort the overall resource selection algorithm.

    If the media data can be fetched but has non-fatal errors or uses, in part, codecs that are unsupported, preventing the user agent from rendering the content completely correctly but not preventing playback altogether

    The server returning data that is partially usable but cannot be optimally rendered must cause the user agent to render just the bits it can handle, and ignore the rest.

    If the media resource is found to declare a media-resource-specific text track that the user agent supports

    If the media data is CORS-same-origin, run the steps to expose a media-resource-specific text track with the relevant data.

    Cross-origin videos do not expose their subtitles, since that would allow attacks such as hostile sites reading subtitles from confidential videos on a user's intranet.

    When the networking task source has queued the last task as part of fetching the media resource (i.e. once the download has completed), if the fetching process completes without errors, including decoding the media data, and if all of the data is available to the user agent without network access, then, the user agent must move on to the next step. This might never happen, e.g. when streaming an infinite resource such as Web radio, or if the resource is longer than the user agent's ability to cache data.

    While the user agent might still need network access to obtain parts of the media resource, the user agent must remain on this step.

    For example, if the user agent has discarded the first half of a video, the user agent will remain at this step even once the playback has ended, because there is always the chance the user will seek back to the start. In fact, in this situation, once playback has ended, the user agent will end up firing a suspend event, as described earlier.

  5. If the user agent ever reaches this step (which can only happen if the entire resource gets loaded and kept available): abort the overall resource selection algorithm.

メディア要素メディア要素のメディアリソース固有トラックを忘れることになったら、ユーザーエージェントは、そのメディア要素テキストトラックのリストから、すべてのメディアリソース固有テキストトラックを削除してから、そのメディア要素audioTracks 属性の AudioTrackList オブジェクトを空にして、そのメディア要素videoTracks 属性の VideoTrackList オブジェクトを空にしなければいけません。これによってイベントが発出されることはありません (特に、removetrack イベントは発出されません)。the error and emptied events, fired by the algorithms that invoke this one, can be used instead.


The preload 属性は列挙属性です。次の表はこの属性のキーワードと状態をリストしています。左側の列のキーワードは、そのキーワードと同じ行にある 2 列目のセルにある状態に対応します。この属性は、メディアリソースがバッファリングされている、または、再生されているときですら、変更することができますが、下表の説明は、それを念頭に入れて読んでください。

キーワード 状態 概要
none None ウェブ制作者はユーザーがメディアリソースを必要とすることを期待していない、または、サーバーが不必要なトラフィックを避けたい、ということをユーザーエージェントに示唆します。この状態は、バッファリングが何らかの理由で開始したら (たとえばユーザーが再生を押した)、メディアリソースを実際にどれくらい積極的にダウンロードするべきかに関してのヒントを提供するものではありません。
metadata Metadata ウェブ制作者はユーザーがメディアリソースを必要とすると期待していないけれども、リソースのメタデータと最初のフレームくらいはフェッチしたほうが良いだろう、ということをユーザーエージェントに示唆します。ユーザーエージェントがメタデータ以外をまったくフェッチしないなら、そのメディア要素readyState 属性は HAVE_METADATA にセットされることになります。しかし通常は、いくつかのフレームも取得され、HAVE_CURRENT_DATA または HAVE_FUTURE_DATA になります。メディアリソースが再生されているときは、帯域が細いと考慮すべきことをユーザーエージェントに伝えるヒントとなります。たとえば、ダウンロードを加速させようと指示したとしても、一貫した再生を維持できる最も遅いレートでしかメディアデータを取得できない、という意味になります。
auto Automatic ユーザーエージェントは、サーバーへのリスクを考えずに、楽観的にリソースをまるごとダウンロードするレベルまで含めて、まずユーザーのニーズを優先することができることを、ユーザーエージェントに示唆する。

空の文字列も妥当なキーワードです。これは Automatic 状態に対応します。この属性の指定がなかった場合のデフォルトは、ユーザーエージェント定義となりますが、サーバーのロード低減と最適なユーザー体験の提供の間の妥協点として、Metadata 状態が推奨されます。

ウェブ制作者は、ユーザーが再生を開始してから、この属性を "none" または "metadata" から "auto" に動的に変更するかもしれません。たとえば、多くのビデオを伴うページ上で、その多くのビデオはリクエストがない限りダウンロードされるべきではないけれども、1 つがリクエストされたら、積極的にそれをダウンロードするべき、ということを指示するために使われるかもしれません。

preload 属性は、ウェブ制作者がベストなユーザー体験をもたらすだろうと考えたものについて、ユーザーエージェントにヒントを与えることを目的としています。この属性は、たとえば、明示的なユーザー設定や、利用可能な接続性に基づいて、完全に無視することができます。

preload IDL 属性は、既知の値に限定して、同じ名前のコンテント属性を反映しなければいけません。

autoplay 属性は preload 属性に優先することができます (なぜなら、メディアを再生するなら、preload 属性によって与えられたヒントに関わらず、当然ながら最初にバッファリングしなければいけないからです)。しかし、両方を入れてもエラーではありません。


media . buffered

ユーザーエージェントがバッファリングしたメディアリソースの範囲を表す TimeRanges オブジェクトを返します。

buffered 属性は、新たな静的な正規化 TimeRanges オブジェクトを返さなければいけません。これは、この属性が評価された時点で、ユーザーエージェントがバッファリングしたメディアリソースがあれば、その範囲を表します。ユーザーエージェントは、その範囲が利用可能であることを正確に判定しなければいけません。これが面倒な調査でないと判定できないようなメディアストリームであったとしてもです。

これは、普通は、ゼロ地点で固定された単一の範囲になりますが、たとえば、ユーザーエージェントがシークに応えて HTTP range リクエストを使えば、複数の範囲になることがあります。

ユーザーエージェントは、以前にバッファリングしたデータを破棄することができます。

ゆえに、ある時点で buffered 属性によって返されたオブジェクトの範囲内に含まれていた時間位置は、後で同じ属性によって返されたオブジェクトの範囲に含まれない可能性があります。

4.7.10.6 メディアリソースのオフセット
media . duration

メディアリソースの長さを秒で返します。メディアリソースの開始は時間 0 とします。

尺が分からなければ NaN を返します。

終わりがないストリームでは Infinity を返します。

media . currentTime [ = value ]

公式再生位置を秒で返します。

時間をセットしてしーくすることができます。

選択されたメディアリソースがない、または、現在のメディアコントローラーがなければ、InvalidStateError 例外を投げます。

メディアリソースは、そのメディアリソース内の位置に時間を対応付けるメディアタイムラインを持ちます。タイムラインの始まりは、最も早い定義位置です。タイムラインの尺は、その最後の定義位置です。

メディアタイムラインの確立: メディアリソースが明示的なタイムラインを何らかの方法で指定しており、その起源が負でない (それぞれのフレームに特定の時間オフセットを与え、最初のフレームに 0 または正のオフセットを与えている) なら、そのメディアタイムラインがそのタイムラインとなるべきです。(メディアリソースがタイムラインを指定することができるかどうかは、そのメディアリソースの形式に依存します。) メディアリソースが明示的な開始時刻および日付を指定しているなら、その時刻と日付は、そのメディアタイムライン内の 0 地点とみなされるべきです。つまり、そのタイムラインオフセットは、その時刻と日付になり、それは getStartDate() メソッドを使って取得できます。

メディアリソースが非連続なタイムラインを持つなら、ユーザーエージェントは、そのリソースの開始で使われているタイムラインを、リソース全体を覆う形で拡張しなければいけません。こうすることで、メディアリソースメディアタイムラインは、巻き戻し限界位置 (以降で定義されています) から線形に増える形で開始できるようになります。たとえ、下層のメディアデータが、順序がバラバラであったり、重複すら存在するようなタイムコードを持っていたとしてもです。

たとえば、 2 つのクリップが 1 つのビデオファイルに結合され、そのビデオ形式がその 2 つのクリップに対して起源となる時間をそれぞれに持たせているとしたら、そのビデオデータは、たとえば、00:15..00:29 と、それから 00:05..00:38 のようなタイムラインを見せるかもしれません。しかし、ユーザーエージェントはこのような形で時間を見せることはないでしょう。代わりに単一のビデオとして 00:15..00:29 と 00:29..01:02 のような形で時間を見せることになります。

稀なケースですが、明示的なタイムラインを持たないメディアリソースでは、メディアタイムライン上の時間 0 を、そのメディアリソースの最初のフレームに対応付けるべきです。さらに稀なケースですが、明示的なタイミングもなければ、フレームの尺すらないメディアリソースの場合は、ユーザーエージェントはそれぞれのフレームに対する時間を、ユーザーエージェント自身で定義した方法で決定しなければいけません。 (This is a fingerprinting vector.)

明示的なタイムラインは持たないけれども明示的なフレームの尺を持つファイル形式の例は、アニメーション GIF 形式です。明示的なタイミングをまったく持たないファイル形式の例は、JPEG-push 形式 (JPEG フレームを伴う multipart/x-mixed-replace で、よく MJPEG ストリームの形式に使われます) です。

タイミング情報を持たないリソースのケースでは、もしユーザーエージェントが、当初サーバーから提供された最初のフレームより前の地点にシークすることができる場合、時間 0 は、そのメディアリソースのシーク可能な時間の中で最も前の時間に対応づけるべきです。そうでなければ、サーバーから受信した最初のフレームに対応づけるべきです (そのメディアリソースの中で、ユーザーエージェントがそのストリームを受信し始めた地点)。

執筆時点では、明示的なフレーム時間オフセットが欠けているにも関わらず、サーバーから送られてくる最初のフレームの前のフレームへのシークをサポートするような形式は知られていません。

テレビ放送局からのストリームを考えてみましょう。それは 10 月の金曜日の陽が降り注ぐ午後にストリーミングが開始されますが、同じメディアタイムライン上では常に接続中のユーザーエージェントにメディアデータを送り続けています。その時間 0 は、そのストリームの開始にセットされています。数カ月後、このストリームに接続したユーザーエージェントは、最初に受信したフレームが何百万という秒数となる時間を持っていることに気づきます。getStartDate() メソッドは、ブロードキャストが開始された日付をいつも返します。これによって、ブロードキャストが始まったときから見た時間 ("8 ヶ月、4 時間、12 分、23 秒") ではなく、本当の時間 (たとえば "2:30pm") をコントローラーが表示できるようになります。

いくつかのフラグメントを結合したビデオを流すストリームを考えてみましょう。ユーザーが特定の時間を指定できないサーバーによるブロードキャストです。これは、事前に決められた順番でビデオデータをストリームするだけです。配信される最初のフレームの時間は常に 0 になります。もしユーザーエージェントがこのストリームに接続し、最初のフラグメントを受信したとします。このフラグメントは、タイムスタンプが 2010-03-20 23:15:00 UTC から 2010-03-21 00:05:00 UTC まで、そして、2010-02-12 14:25:00 UTC から 2010-02-12 14:35:00 UTC までの範囲をカバーすると定義されています。この場合、このメディアタイムラインは 0 秒で始まり、3,600 秒 (1 時間) に拡張された形で見せるでしょう。2 つ目のクリップの終わりにストリーミングサーバーが切断したとしましょう。その場合、duration 属性は 3,600 を返すでしょう。getStartDate() メソッドは、2010-03-20 23:15:00 UTC に関連付けた時間を持つ Date オブジェクトを返すでしょう。しかし、もし違うユーザーエージェントが 5 分後に接続したとしたら、おそらく、タイムスタンプが 2010-03-20 23:20:00 UTC から 2010-03-21 00:05:00 UTC まで、そして、2010-02-12 14:25:00 UTC から 2010-02-12 14:35:00 UTC までの範囲をカバーするフラグメントを受信するでしょう。そして、このメディアタイムラインは、0 秒で始まり、3,300 秒 (55 分) に拡張された形で見せるでしょう。この場合、getStartDate() メソッドは、2010-03-20 23:20:00 UTC に関連付けた時間を持つ Date オブジェクトを返すでしょう。

これらどちらの例でも、seekable 属性は、コントローラーが UI に実際に表示したい範囲を与えるでしょう。通常、サーバーが任意の時間へのシークをサポートしていないなら、これは、ユーザーエージェントがストリームに接続した時点からユーザーエージェントが取得した最後にフレームまでの範囲になります。しかし、ユーザーエージェントが以前の情報を破棄しながら開始するのであれば、実際の範囲はもっと短くなるかもしれません。

いずれの場合でも、ユーザーエージェントは、確立したメディアタイムラインを使う巻き戻し限界位置 (以降で定義しているとおり) が確実に 0 以上になるようにしなければいけません。

メディアタイムラインは個別にクロックも持ちます。どのクロックを使うのかはユーザーエージェントが定義しますが、それはメディアリソースごとに定義することができます。しかし、おおよそユーザーの実時間に近いものにするべきです。

現在のメディアコントローラーを共有するメディア要素はすべて、それらのメディアタイムラインに同じクロックを使います。

メディア要素現在再生位置を持ちます。最初 (つまりメディアデータがないとき) は 0 秒でなければいけません。現在再生位置は、メディアタイムライン上の時間です。

メディア要素公式再生位置を持ちます。最初は 0 秒にセットされなければいけません。公式再生位置は、スクリプトが実行中に安定が保たれた現在再生位置の近似値です。

メディア要素デフォルト再生開始位置も持ちます。最初は 0 秒にセットされなければいけません。この時間は、メディアがロードされる前であっても、その要素をシークできるようにするために使われます。

メディア要素は、それぞれにポスター表示フラグを持ちます。メディア要素が生成されるとき、このフラグは true にセットされなければいけません。このフラグは、ユーザーエージェントが、ビデオコンテンツを表示するのではなく、video 要素のポスターフレームを表示することになったときを制御するために使われます。

currentTime 属性は、取得時においては、メディア要素デフォルト再生開始位置を返さなければいけません。ただし、それが 0 の場合は、その要素の公式再生位置を返さなければいけません。返される値の単位は秒でなければいけません。セット時においては、メディア要素現在のメディアコントローラーを持つなら、ユーザーエージェントは InvalidStateError 例外を投げなければいけません。そうではなく、メディア要素readyStateHAVE_NOTHING なら、メディア要素デフォルト再生開始位置を新たな値にセットしなければいけません。そうでなければ、公式再生位置を新たな値にセットしてから、新たな値にシークしなければいけません。新たな値は秒で解釈されなければいけません。

メディア要素初期再生位置を持ちます。これは最初 (つまりメディアデータがない状態) は 0 秒でなければいけません。初期再生位置は、メディアリソースがロードされたときにアップデートされます。初期再生位置は、メディアタイムライン上の時間です。

メディアリソースがストリーミングリソースなら、リソースの特定の部分がバッファーから期限切れになったあとでは、ユーザーエージェントはそれを取得することができないかもしれません。同様に、いくつかのメディアリソースは、0 で開始しないメディアタイムラインを持つかもしれません。巻き戻し限界位置とは、ユーザーエージェントが改めて取得できるストリーム、または、リソースの最も前の位置のことです。これは、メディアタイムライン上の時間でもあります。

巻き戻し限界位置は API から明示的に見ることはできません。これは、seekable 属性の TimeRanges オブジェクトがあれば、その中の最初の範囲の開始時間に、なければ、現在再生位置に対応します。

巻き戻し限界位置が変わるとき、現在再生位置がその巻き戻し限界位置より前なら、ユーザーエージェントはその巻き戻し限界位置シークしなければいけません。そうでなく、ユーザーエージェントが過去 15 から 20 ミリ秒以内にその要素で timeupdate イベントを発出しておらず、そのイベントに対するイベントハンドラーをまだ実行していないなら、ユーザーエージェントは、その要素で timeupdate という名前のシンプルなイベントを発出するタスクをキューイングしなければいけません。

前述の要件と、クリップのメタデータが既知になるときにキックするリソース・フェッチ・アルゴリズムでの要件のため、現在再生位置は、巻き戻し限界位置より決して小さくなることはありません。

オーディオまたはビデオのトラックが終わり、そのトラックに関連するすべてのメディアデータが、巻き戻し限界位置よりとなるメディアタイムラインの一部に対応していると、ユーザーエージェントが分かっているときは常に、ユーザーエージェントは、まず 、必要に応じて、audioTracks 属性の AudioTrackList オブジェクトか videoTracks 属性の VideoTrackList オブジェクトからそのトラックを削除してから、removetrack という名前の信頼済みイベントを発出するタスクをキューイングすることができます。このイベントはバブリングせずキャンセル可能ではありません。そしてこれは TrackEvent インタフェースを使い、そのトラックを表している AudioTrack または VideoTrack オブジェクトに初期化された track 属性を伴います。また、このイベントは該当のメディア要素の前述の AudioTrackList または VideoTrackList オブジェクトで発出されます。

duration 属性は、メディアタイムライン上のメディアリソースの終わりの時間を秒で返さなければいけません。利用可能なメディアデータがないなら、この属性は非数値 (NaN) を返さなければいけません。メディアリソースの範囲が分からない場合 (たとえば、ストリーミングラジオや、終了時間が発表されていないライブイベント) は、この属性は正の Infinity 値を返さなければいけません。

ユーザーエージェントは、メディアデータの再生の前、かつ、readyStateHAVE_METADATA より大きいか等しい値にセットする前に、メディアリソースの尺を決定しなければいけません。たとえ、そうしようとしたら、リソースの複数の部分をフェッチしなければならないとしてもです。

メディアリソースの長さが既知の値に変わるとき (たとえば、未知から既知へ、または、以前に確立した長さから新たな長さへ) 、ユーザーエージェントは、そのメディア要素durationchange という名前のシンプルなイベントを発出するタスクをキューイングしなければいけません (尺が新たなメディアリソースのローティングの一環でリセットされるときには、このイベントは発生しません。)。もし、現在再生位置メディアリソースの終わりの時間より大きくなってしまうように変更されるなら、ユーザーエージェントは、そのメディアリソースの終わりの時間にシークもしなければいけません。

"無限" のストリームが何らかの理由で終わるなら、その尺は正の Infinity からそのストリームの最後のフレームかサンプルの時間に変わるでしょう。そして、durationchange イベントが発出されるでしょう。同様に、ユーザーエージェントが、メディアリソースの尺を正確に決定するのではなく、最初にそれを見積もり、後で新たな情報に基づいた見積もりに改訂するなら、その尺は変わり、durationchange イベントが発出されるでしょう。

ビデオによっては、メディアタイムラインの時間 0 に対応する明示的な日付と時刻を持つものもあります。これはタイムラインオフセットとして知られています。最初は、タイムラインオフセットは非数値 (NaN) にセットされなければいけません。

The getStartDate() メソッドは、現在のタイムラインオフセットを表す新たな Date オブジェクトを返さなければいけません。


The loop 属性は論理属性です。指定されたら、そのメディア要素は、メディアリソースの終わりに到達したら、その最初の位置にシークされることを指します。

loop 属性は、要素が現在のメディアコントローラーを持つ間は、何も影響を与えません。

loop IDL 属性は、同じ名前のコンテント属性を反映しなければいけません。

4.7.10.7 準備状態
media . readyState

以下のリストのコードから、現在再生位置をレンダリングするという意味において、要素の現在の状態を表す値を返します。

メディア要素準備状態を持ちます。これは、どれくらいのレベルで、現在再生位置でレンダリングする準備ができているのかを表します。これが取りうる値は次のとおりですが、特定の時間におけるメディア要素の準備状態は、その要素の状態を表す最も大きい値となります:

HAVE_NOTHING (数値 0)

メディアリソースに関する情報が何も入手できていません。現在再生位置のデータも何も入手できていません。networkState 属性が NETWORK_EMPTY にセットされているメディア要素は、常に、この HAVE_NOTHING 状態にあります。

HAVE_METADATA (数値 1)

リソースの尺を入手するのに十分なリソースが利用可能です。video 要素の場合は、ビデオの寸法も利用可能です。この API は、シーク時には、もう例外を投げません。現在再生位置に対するメディアデータは入手できていません。

HAVE_CURRENT_DATA (数値 2)

現在再生位置に対するデータは利用可能ですが、ユーザーエージェントがすぐに HAVE_METADATA 状態に戻ることなしに現在再生位置再生方向に進められるほど十分なデータを得られていない、または、再生方向に取得できるデータがもうない、のいずれかです。たとえば、ビデオでは、これは、現在のフレームのデータを持っているけれども、次のフレームは持っていないユーザーエージェントが相当します。これは、現在再生位置が現在のフレームの終わりにいるときや、再生が終わったときです。

HAVE_FUTURE_DATA (数値 3)

現在再生位置のデータに加え、ユーザーエージェントが現在再生位置再生方向に進めるのに十分なデータが利用可能です。少なくとも、すぐに HAVE_METADATA 状態に戻ってしまうことはありません。また、テキストトラックは準備ができています。たとえばビデオでは、これは、現在再生位置が現在のフレームと次のフレームの間にあるときなら、少なくともそれら 2 つのデータを持っているユーザーエージェントが相当し、現在再生位置がフレームの中間にあるときなら、少なくとも再生を維持している現在のフレームに対するビデオデータとオーディオデータを持っているユーザーエージェントが相当します。ユーザーエージェントは、再生が終わったら、この状態になることはできません。なぜなら、現在再生位置はこの場合は決して進むことができないからです。

HAVE_ENOUGH_DATA (数値 4)

HAVE_FUTURE_DATA 状態で説明された条件すべてを満たし、さらに、次の条件のいずれかも true になります:

  • ユーザーエージェントは、実効再生レートで進められるようなら、再生がメディアリソースの最後に到達する前に現在再生位置が利用可能なデータを追い越すことはない、と見積もっている。
  • ユーザーエージェントは、しばらくデータを取得する必要がない状態に入り、ゆえに、再生を遅らせるようなことはない。(たとえば、バッファーが一杯の場合。)

実際には、HAVE_METADATAHAVE_CURRENT_DATA の違いは小さなものです。違いが関係してくるのは、canvasvideo 要素を書き込むときくらいです。違いが出るのは、何かが描かれているとき (HAVE_CURRENT_DATA 以上) と、何も描かれていないとき (HAVE_METADATA 以下) だけといっても良いでしょう。同様に、HAVE_CURRENT_DATA (現在のフレームだけ) と HAVE_FUTURE_DATA (少なくともそのフレームと次のフレーム) の違いも小さなものです (極論を言えば、1 フレームだけです)。違いが出るのは、ページが "コマ送り" ナビゲーションのインタフェースを提供するときくらいでしょう。

networkStateNETWORK_EMPTYメディア要素の準備状態が変わるとき、ユーザーエージェントは、以下の手順に従わなければいけません:

  1. 次のリストから適用できる最初に副手順を適用します:

    前の準備状態が HAVE_NOTHING で、かつ、新たな準備状態が HAVE_METADATA の場合

    要素で loadedmetadata という名前のシンプルなイベントを発出するタスクをキューイングします。

    このタスクが実行される前に、イベントループメカニズムの一環として、適用可能なら、レンダリングがアップデートされ、video 要素をリサイズするでしょう。

    前の準備状態が HAVE_METADATA で、かつ、新たな準備状態が HAVE_CURRENT_DATA 以上の場合

    これがこのメディア要素load() アルゴリズムが最後に呼び出されてから初めて発生するなら、ユーザーエージェントは、その要素で loadeddata という名前のシンプルなイベントを発出するタスクをキューイングしなければいけません。

    新たな準備状態が HAVE_FUTURE_DATAHAVE_ENOUGH_DATA なら、下記の関連の手順も実行されなければいけません。

    前の準備状態が HAVE_FUTURE_DATA 以上で、新たな準備状態が HAVE_CURRENT_DATA 以下の場合

    メディア要素が、その readyState 属性が HAVE_FUTURE_DATA より小さい値に変わる前は、潜在的に再生中だった、かつ、その要素の再生が終了したわけでなく、かつ、エラーにために再生が停止したり、ユーザー操作で一時停止されたり、帯域内コンテンツで一時停止されたわけでないのであれば、ユーザーエージェントは、その要素で timeupdate という名前のシンプルなイベントを発出するタスクをキューイングしてから、その要素で waiting という名前のシンプルなイベントを発出するタスクをキューイングしなければいけません。

    前の準備状態が HAVE_CURRENT_DATA 以下で、新たな準備状態が HAVE_FUTURE_DATA の場合

    ユーザーエージェントは、要素で canplay という名前のシンプルなイベントを発出するタスクをキューイングしなければいけません。

    要素の paused 属性が false なら、ユーザーエージェントは、要素で playing という名前のシンプルなイベントを発出するタスクをキューイングしなければいけません。

    新たな準備状態が HAVE_ENOUGH_DATA の場合

    前の準備状態が HAVE_CURRENT_DATA 以下だったなら、ユーザーエージェントは、要素で canplay という名前のシンプルなイベントを発出するタスクをキューイングしなければいけません。そして、要素の paused 属性が false なら、要素で playing という名前のシンプルなイベントを発出するタスクをキューイングしなければいけません。

    自動再生フラグが true、かつ、paused 属性が true、かつ、メディア要素autoplay 属性が指定されている、かつ、メディア要素Documentアクティブ・サンドボックス・フラグセットが、サンドボックス化自動機能ブラウジングコンテキストフラグセットをもっていないなら、ユーザーエージェントは、次の副手順も実行することができます:

    1. paused 属性を false にセットします。
    2. 要素のポスター表示フラグが true なら、それを false にセットし、時間進行手順を実行します。
    3. 要素で play という名前のシンプルなイベントを発出するタスクをキューイングします。
    4. 要素で playing という名前のシンプルなイベントを発出するタスクをキューイングします。

    ユーザーエージェントは自動再生をサポートする必要はありません。ユーザーエージェントは、この問題に関しては、ユーザー設定を優先することが推奨されます。ウェブ制作者は、ビデオの再生を強要するためにスクリプトを使うのではなく、autoplay 属性を使うことが強く求められます。こうすることで、ユーザーは、そう望むなら、その挙動を変えることができるようになります。

    いずれの場合でも、ユーザーエージェントは、最後に、要素で canplaythrough という名前のシンプルなイベントを発出するタスクをキューイングしなければいけません。

  2. メディア要素現在メディアコントローラーを持つなら、そのメディア要素現在メディアコントローラーコントローラー状態を報告します。

メディア要素の準備状態がこれらの状態の中で非連続的に飛ぶことが有り得ます。たとえば、メディア要素の状態が、HAVE_CURRENT_DATAHAVE_FUTURE_DATA 状態を通らずに、 HAVE_METADATA からいきなり HAVE_ENOUGH_DATA に飛ぶことがあります。

readyState IDL 属性は、取得時には、メディア要素の現在の準備状態を表す上記の値を返さなければいけません。

The autoplay 属性は論理属性です。存在するときは、ユーザーエージェントは (ここで説明されたアルゴリズムに説明されているとおり) 自動的にメディアリソースの再生を開始します。それも、停止せずに再生できるようになったら、すぐにです。

ウェブ制作者は、スクリプトを使って自動再生を始めるのではなく、autoplay 属性を使うことが強く推奨されます。なぜなら、こうすることで、ユーザーがそうしてほしくないときに、自動再生をやめることができるようになるからです。たとえば、スクリーンリーダーを使っているときです。ウェブ制作者は、また、自動再生の挙動をまったく使わず、ユーザーエージェントにユーザーが明示的に再生を開始するのを待たせるようにすることが推奨されます。

autoplay IDL 属性は、同じ名前のコンテント属性を反映しなければいけません。

4.7.10.8 メディアリソースの再生
media . paused

再生が停止されているなら true を、そうでなければ false を返します。

media . ended

再生がメディアリソースの最後に到達したなら true を返します。

media . defaultPlaybackRate [ = value ]

ユーザーがメディアリソースの早送りや巻き戻しをしていないときの、デフォルトの再生レートを返します。

値をセットして、デフォルトの再生レートを変更することができます。

デフォルトのレートは、再生に影響を直接的に与えることはありませんが、ユーザーが早送りモードに切り替え、通常の再生モードに戻ったときに、再生レートがそのデフォルトの再生レートに戻ると期待されます。

要素が現在のメディアコントローラーを持つとき、defaultPlaybackRate 属性は無視され、現在のメディアコントローラーdefaultPlaybackRate が使われます。

media . playbackRate [ = value ]

現在の再生レートを返します。通常速度は 1.0 です。

値をセットして、再生レートを変更することができます。

要素が現在のメディアコントローラーを持つとき、playbackRate 属性は無視され、現在のメディアコントローラーplaybackRate が使われます。

media . played

ユーザーエージェントが再生したメディアリソースの範囲を表す TimeRanges オブジェクトを返します。

media . play()

paused 属性を false にセットし、必要なら、メディアリソースをロードし、再生を開始します。再生が終っている状態なら、はじめに戻って再生します。

media . pause()

paused 属性を true にセットし、必要なら、メディアリソースをロードします。

paused 属性は、メディア要素が停止されているかどうかを表します。この属性は当初は true でなければいけません。

readyState 属性が HAVE_NOTHING 状態、HAVE_METADATA 状態、HAVE_CURRENT_DATA 状態にある、または、要素がユーザー操作によって停止されているか、帯域内コンテンツによって停止されているなら、そのメディア要素はブロック化メディア要素です。

paused 属性が false で、要素の再生が終了しておらず、再生がエラーによって停止しておらず、要素が現在メディアコントローラーを持っていない、または、現在メディアコントローラーを持っているもののそのメディアコントローラーでブロックされていない、そして、要素がブロック化メディア要素でないなら、そのメディア要素潜在的に再生中と言います。

waiting DOM イベントは、潜在的に再生中の要素の readyState 属性が HAVE_FUTURE_DATA より小さい値に変わったことによって、その要素が再生を停止した結果として発出されることがあります

メディア要素は次の場合に再生が停止したと言います:

ended 属性は、イベントループが手順 1 に最後に到達したとき、メディア要素再生を終了しており、再生方向が前進なら、true を返さなければいけません。そうでなければ、false を返さなければいけません。

メディア要素readyState 属性が HAVE_METADATA 以上で、ユーザーエージェントがそのメディア要素の処理中に非致命的エラーに遭遇し、そのエラーによって、現在再生位置でコンテンツを再生することができないとき、その要素はエラーによって停止したと言います。

メディア要素paused 属性が false で、その readyState 属性が HAVE_FUTURE_DATAHAVE_ENOUGH_DATA のいずれかで、ユーザーエージェントがメディアリソースのうち、ユーザーがリソースを継続するかを選択しなければいけない地点に到達したとき、その要素はユーザー操作で停止したと言います。これが起こったときにメディア要素現在メディアコントローラーを持っていれば、ユーザーエージェントは、そのメディア要素現在メディアコントローラーコントローラー状態を報告しなければいけません。ユーザーが選択したときにメディア要素現在メディアコントローラーを持っていれば、再生の再開を許した上で、ユーザーエージェントは同様にそのメディア要素現在メディアコントローラーコントローラー状態を報告しなければいけません。

メディア要素再生を終了することと、ユーザー操作で停止することの両方が同時に起こることは有り得ます。

潜在的に再生中メディア要素が、ユーザー操作で停止したという理由で再生を止めるとき、ユーザーエージェントは、その要素で timeupdate という名前のシンプルなイベントを発出するタスクをキューイングしなければいけません。

メディア要素paused 属性が false で、readyState 属性が HAVE_FUTURE_DATAHAVE_ENOUGH_DATA のいずれかで、かつ、ユーザーエージェントが、メディアリソースに一時的に固定された長さが 0 でないコンテンツを再生するためか、もしくは、メディアリソースのセグメントに一時的に固定されているものの、そのセグメントより長くない長さを持つコンテンツを再生するために、そのメディアリソースの再生を保留しているとき、その要素は、帯域内コンテンツで停止したといいます。これが起こったときにメディア要素現在メディアコントローラーを持っていたなら、ユーザーエージェントは、そのメディア要素現在メディアコントローラーコントローラー状態を報告しなければいけません。ユーザーエージェントが再生の保留を解除するときに、メディア要素現在メディアコントローラーを持っている場合も同様に、ユーザーエージェントは、そのメディア要素現在メディアコントローラーコントローラー状態を報告しなければいけません。

メディア要素帯域内コンテンツで停止される例の 1 つとして、ユーザーエージェントが外部の WebVTT ファイルの音声描画を再生しているとき、キューに対して生成された同期音声が、テキストトラックキュー開始時間テキストトラックキュー終了時間の間の時間より長くなってしまう場合が挙げられます。


再生方向が前進で、現在再生位置メディアリソースの最後に到達したとき、ユーザーエージェントは次の手順に従わなければいけません:

  1. メディア要素loop 属性が指定されており、現在メディアコントローラーを持っていないなら、そのメディアリソース巻き戻し限界位置シークして、これらの手順を中止します。

  2. 前述の定義のとおり、イベントループの現在のタスクが終わったら、ended IDL 属性は true を返し始めます。

  3. メディア要素timeupdate という名前のシンプルなイベントを発出するタスクをキューイングします。

  4. メディア要素現在メディアコントローラーを持たず、メディア要素がまだ再生を終了しておらず、再生方向が前進で、paused が false なら、paused を true に変更し、そのメディア要素pause という名前のシンプルなイベントを発出するタスクをキューイングします。

  5. メディア要素ended という名前のシンプルなイベントを発出するタスクをキューイングします。

  6. メディア要素現在メディアコントローラーを持っているなら、メディア要素現在メディアコントローラーコントローラー状態を報告します。

再生方向が後進で、現在再生位置メディアリソース巻き戻し限界位置に到達したとき、ユーザーエージェントは、その要素で timeupdate という名前のシンプルなイベントを発出するタスクのキューイングだけをしなければいけません。


defaultPlaybackRate 属性は、メディアリソースが再生されるべき要求速度を、その本来の速度の倍数として与えます。この属性はミュータブルです。取得時においては、最後にセットされた値を返さなければいけません。まだセットされていなければ 1.0 を返さなければいけません。セット時においては、この属性は、新たな値にセットされなければいけません。

defaultPlaybackRate 属性は、ユーザーにユーザーインタフェースを表示するとき、ユーザーエージェントによって使われます。

The playbackRate 属性は、実効再生レートを与えます (それに優先する現在メディアコントローラーが無いと仮定します)。これは、メディアリソースが再生する速度ですが、その本来の速度の倍数として表されます。これが defaultPlaybackRate に等しくないなら、ユーザーが早送りかスロー再生のような機能を使っている可能性があります。この属性はミュータブルです。取得時においては、最後にセットされた値を返さなければいけません。まだセットされていなければ 1.0 を返さなければいけません。セット時においては、この属性は新たな値にセットされなければいけません。すると、再生速度が変わります (要素が潜在的に再生中で、現在メディアコントローラーがない場合)。

defaultPlaybackRate または playbackRate 属性が値を変えるとき (スクリプトからセットされたか、ユーザーの操作などによってユーザーエージェントによって直接的に変更されたとき)、ユーザーエージェントは、そのメディア要素ratechange という名前のシンプルなイベントを発出するタスクをキューイングしなければいけません。

defaultPlaybackRateplaybackRate 属性は、メディア要素現在メディアコントローラーを持つときには、何も効果がありません。この場合は、MediaController オブジェクトの同じ名前の属性が使われます。


played 属性は、この属性が評価されたときに、通常の再生の間に現在再生位置の通常の単調増加を通して到達したメディアリソースメディアタイムライン上の範囲があれば、それを表す新たな静的な正規化 TimeRanges オブジェクトを返さなければいけません。

メディア要素play() メソッドが呼び出されたら、ユーザーエージェントは次の手順を実行しなければいけません。

  1. メディア要素networkState 属性の値が NETWORK_EMPTY なら、メディア要素リソース選択選択アルゴリズムを呼び出します。

  2. 再生が終了しており、再生方向が前進であり、メディア要素現在メディアコントローラーを持っていないなら、メディアリソース巻き戻し限界位置シークします。

    これによって、ユーザーエージェントはメディア要素timeupdate という名前のシンプルなイベントを発出するタスクをキューイングすることになります。

  3. メディア要素現在メディアコントローラーを持っているなら、メディア要素の速度をその新たなメディアコントローラーの速度に引き上げます

  4. メディア要素paused 属性が true なら、次の副手順を実行します:

    1. paused 属性の値を false に変更します。

    2. ポスター表示フラグが true なら、要素のポスター表示フラグを false にセットして、時間進行手順を実行します。

    3. 要素で play という名前のシンプルなイベントを発出するタスクをキューイングします。

    4. メディア要素readyState 属性の値が HAVE_NOTHING, HAVE_METADATA, HAVE_CURRENT_DATA のいずれかなら、その要素で waiting という名前のシンプルなイベントを発出するタスクをキューイングします。

      メディア要素readyState 属性の値が HAVE_FUTURE_DATAHAVE_ENOUGH_DATA なら、その要素で playing という名前のシンプルなイベントを発出するタスクをキューイングします。

  5. メディア要素自動再生フラグを false にセットします。

  6. メディア要素現在メディアコントローラーを持っているなら、そのメディア要素現在メディアコントローラーコントローラー状態を報告します。


pause() メソッドが呼び出されたとき、そして、ユーザーエージェントがメディア要素を停止するよう求められたとき、ユーザーエージェントは次の手順を実行しなければいけません:

  1. メディア要素networkState 属性の値が NETWORK_EMPTY なら、メディア要素リソース選択アルゴリズムを呼び出します。

  2. メディア要素自動再生フラグを false にセットします。

  3. メディア要素paused 属性が false なら、次の手順を実行します:

    1. paused の値を true に変更します。

    2. 要素で timeupdate という名前のシンプルなイベントを発出するタスクをキューイングします。

    3. 要素で pause という名前のシンプルなイベントを発出するタスクをキューイングします。

    4. 公式再生位置現在再生位置にセットします。

  4. メディア要素現在メディアコントローラーを持っているなら、そのメディア要素現在メディアコントローラーコントローラー状態を報告します。


The 実効再生レートは、必ずしも要素の playbackRate とは限りません。メディア要素現在メディアコントローラーを持っているとき、その実効再生レートは、MediaControllerメディアコントローラー再生レートとなります。そうでなければ、実効再生レートは、その要素の playbackRate となります。ゆえに、現在メディアコントローラーは、そのメディア要素よりも優先します。

実効再生レートが正または 0 なら、その再生方向は前進です。そうでなければ後進となります。

メディア要素潜在的に再生中で、その Document完全にアクティブDocument であるとき、その現在再生位置は、メディアタイムラインのクロックの単位時間あたりのメディア時間の実効再生レートの単位で、単調に増加しなければいけません。(本仕様は常に増加としてこれを参照しますが、その増加は実効再生レートが負なら実際には減少になります。)

実効再生レートは、再生が停止されていないにもかかわらず、現在再生位置が動かない場合に 0.0 になりえます (paused は true にならず、 pause イベントは発出されません)。

本仕様では、ユーザーエージェントがどのように適切な再生レートを達成するのかについては定義しません。利用可能なプロトコルやメディアに応じて、ユーザーエージェントがサーバーとネゴシエーションして、サーバーに適切なレートでメディアデータを提供してもらうことで、クライアントは実際にはフレームを落としたり加える事がないようにするのが良いでしょう(レートが変更されてから、サーバーがストリームの再生レートを更新するまでの期間は除きます) 。

ユーザーエージェントが安定状態を提供するときは常に、公式再生位置現在再生位置にセットされなければいけません。

再生方向が後進の場合、対応するオーディオはすべてミュートされなければいけません。ユーザーエージェントがオーディオをまともに再生できないほどに実効再生レートが低かったり高かったりしたときも、対応のオーディオはミュートされなければいけません。実効再生レートが 1.0 でなければ、ユーザーエージェントは、必要に応じて、そのオーディオにピッチ調整を適用して、着実にそれを再生できるようにすることができます。

潜在的に再生中にも関わらず Documentないメディア要素は、ビデオを一切再生してはいけません。しかし、オーディオコンポーネントは再生するべきです。メディア要素は、それへの参照がすべて削除されたという理由だけで、再生を停めてはいけません。; only once a media element is in a state where no further audio could ever be played by that element may the element be garbage collected.

明示的な参照がない要素がオーディオを再生することは可能です。たとえ、そのような要素がアクティブに再生していなくてもです。たとえば、リファレンスがまだ残っている現在メディアコントローラーを持つことはあり、停止されていない状態になりえます。または、停止された状態でないけれども、コンテンツをバッファリングするために待ち状態でストールしていることも考えられます。


Each media element has a list of newly introduced cues, which must be initially empty. Whenever a text track cue is added to the list of cues of a text track that is in the list of text tracks for a media element, that cue must be added to the media element's list of newly introduced cues. Whenever a text track is added to the list of text tracks for a media element, all of the cues in that text track's list of cues must be added to the media element's list of newly introduced cues. When a media element's list of newly introduced cues has new cues added while the media element's show poster flag is not set, then the user agent must run the time marches on steps.

When a text track cue is removed from the list of cues of a text track that is in the list of text tracks for a media element, and whenever a text track is removed from the list of text tracks of a media element, if the media element's show poster flag is not set, then the user agent must run the time marches on steps.

When the current playback position of a media element changes (e.g. due to playback or seeking), the user agent must run the time marches on steps. If the current playback position changes while the steps are running, then the user agent must wait for the steps to complete, and then must immediately rerun the steps. (These steps are thus run as often as possible or needed — if one iteration takes a long time, this can cause certain cues to be skipped over as the user agent rushes ahead to "catch up".)

The time marches on steps are as follows:

  1. Let current cues be a list of cues, initialized to contain all the cues of all the hidden or showing text tracks of the media element (not the disabled ones) whose start times are less than or equal to the current playback position and whose end times are greater than the current playback position.

  2. Let other cues be a list of cues, initialized to contain all the cues of hidden and showing text tracks of the media element that are not present in current cues.

  3. Let last time be the current playback position at the time this algorithm was last run for this media element, if this is not the first time it has run.

  4. If the current playback position has, since the last time this algorithm was run, only changed through its usual monotonic increase during normal playback, then let missed cues be the list of cues in other cues whose start times are greater than or equal to last time and whose end times are less than or equal to the current playback position. Otherwise, let missed cues be an empty list.

  5. Remove all the cues in missed cues that are also in the media element's list of newly introduced cues, and then empty the element's list of newly introduced cues.

  6. If the time was reached through the usual monotonic increase of the current playback position during normal playback, and if the user agent has not fired a timeupdate event at the element in the past 15 to 250ms and is not still running event handlers for such an event, then the user agent must queue a task to fire a simple event named timeupdate at the element. (In the other cases, such as explicit seeks, relevant events get fired as part of the overall process of changing the current playback position.)

    The event thus is not to be fired faster than about 66Hz or slower than 4Hz (assuming the event handlers don't take longer than 250ms to run). User agents are encouraged to vary the frequency of the event based on the system load and the average cost of processing the event each time, so that the UI updates are not any more frequent than the user agent can comfortably handle while decoding the video.

  7. If all of the cues in current cues have their text track cue active flag set, none of the cues in other cues have their text track cue active flag set, and missed cues is empty, then abort these steps.

  8. If the time was reached through the usual monotonic increase of the current playback position during normal playback, and there are cues in other cues that have their text track cue pause-on-exit flag set and that either have their text track cue active flag set or are also in missed cues, then immediately pause the media element.

    In the other cases, such as explicit seeks, playback is not paused by going past the end time of a cue, even if that cue has its text track cue pause-on-exit flag set.

  9. Let events be a list of tasks, initially empty. Each task in this list will be associated with a text track, a text track cue, and a time, which are used to sort the list before the tasks are queued.

    Let affected tracks be a list of text tracks, initially empty.

    When the steps below say to prepare an event named event for a text track cue target with a time time, the user agent must run these substeps:

    1. Let track be the text track with which the text track cue target is associated.

    2. Create a task to fire a simple event named event at target.

    3. Add the newly created task to events, associated with the time time, the text track track, and the text track cue target.

    4. Add track to affected tracks.

  10. For each text track cue in missed cues, prepare an event named enter for the TextTrackCue object with the text track cue start time.

  11. For each text track cue in other cues that either has its text track cue active flag set or is in missed cues, prepare an event named exit for the TextTrackCue object with the later of the text track cue end time and the text track cue start time.

  12. For each text track cue in current cues that does not have its text track cue active flag set, prepare an event named enter for the TextTrackCue object with the text track cue start time.

  13. Sort the tasks in events in ascending time order (tasks with earlier times first).

    Further sort tasks in events that have the same time by the relative text track cue order of the text track cues associated with these tasks.

    Finally, sort tasks in events that have the same time and same text track cue order by placing tasks that fire enter events before those that fire exit events.

  14. Queue each task in events, in list order.

  15. Sort affected tracks in the same order as the text tracks appear in the media element's list of text tracks, and remove duplicates.

  16. For each text track in affected tracks, in the list order, queue a task to fire a simple event named cuechange at the TextTrack object, and, if the text track has a corresponding track element, to then fire a simple event named cuechange at the track element as well.

  17. Set the text track cue active flag of all the cues in the current cues, and unset the text track cue active flag of all the cues in the other cues.

  18. Run the rules for updating the text track rendering of each of the text tracks in affected tracks that are showing. For example, for text tracks based on WebVTT, the rules for updating the display of WebVTT text tracks. [WEBVTT]

For the purposes of the algorithm above, a text track cue is considered to be part of a text track only if it is listed in the text track list of cues, not merely if it is associated with the text track.

If the media element's Document stops being a fully active document, then the playback will stop until the document is active again.

When a media element is removed from a Document, the user agent must run the following steps:

  1. Asynchronously await a stable state, allowing the task that removed the media element from the Document to continue. The synchronous section consists of all the remaining steps of this algorithm. (Steps in the synchronous section are marked with ⌛.)

  2. ⌛ If the media element is in a Document, abort these steps.

  3. ⌛ If the media element's networkState attribute has the value NETWORK_EMPTY, abort these steps.

  4. Pause the media element.

4.7.10.9 シーク
media . seeking

ユーザーエージェントが現在シーク中なら true を返します。

media . seekable

ユーザーエージェントがシーク可能なメディアリソースの範囲を表す TimeRanges オブジェクトを返します。

seeking 属性の値は最初は false でなければいけません。

ユーザーエージェントが、メディアリソースの特定の新たな再生位置へシークするよう要求された場合、オプションで approximate-for-speed フラグセットを伴いますが、それは、ユーザーエージェントは次の手順を実行しなければならないことを意味します。このアルゴリズムは、イベントループメカニズムに密接に関わります。とりわけ、これは同期セクションを伴います (これはイベントループアルゴリズムの一環で呼び出されます)。このセクションの手順は ⌛ でマークされています。

  1. メディア要素ポスター表示フラグを false にセットします。

  2. メディア要素readyStateHAVE_NOTHING なら、これらの手順を中止します。

  3. 要素の seeking IDL 属性が true なら、このアルゴリズムの他のインスタンスがすでに実行されていることになります。このアルゴリズムの他のインスタンスを、それが実行中の手順が完了するのを待たずに、中止します。

  4. seeking IDL 属性を true にセットします。

  5. シークが DOM メソッドのコールか IDL 属性のセットに応えるものであったなら、そのスクリプトを継続します。これらの手順の残りは非同期に実行されなければいけません。例外として、 ⌛ でマークされたステップは、呼び出されているこのアルゴリズムの他のインスタンスによって、いつでも中止されることができます。

  6. new playback positionメディアリソースの最後より後なら、それを、そのメディアリソースの最後とします。

  7. new playback position巻き戻し限界位置より小さいなら、それをその位置とします。

  8. もし (今、変更されるかもしれない) new playback positionseekable 属性に与えられている範囲の 1 つにも入らないなら、それを、seekable 属性に与えられている範囲のうち、new playback position に最も近い位置とします。その制約を満たす位置が 2 つあれば (つまり、new playback positionseekable 属性の 2 つの範囲のちょうど中間)、現在再生位置に近い位置を使います。seekable 属性に与えられている範囲がないなら、seeking IDL 属性を false にセットして、これらの手順を中止します。

  9. approximate-for-speed フラグがセットされているなら、new playback position を、再生が即座に再開できる値に調整します。この手順の前に new playback position現在再生位置の前にあったなら、調整後の new playback position現在再生位置の前でなければいけません。同様に、この手順の前に new playback position現在再生位置の後ろにあったなら、調整後の new playback position現在再生位置の後ろでなければいけません。

    たとえば、直近のキーフレームに飛ぶことで、ユーザーエージェントは、再生を再開する前に、中間のフレームをデコードしてから破棄する時間を費やす必要がなくなるでしょう。

  10. 要素で seeking という名前のシンプルなイベントを発出するタスクをキューイングします。

  11. 現在再生位置を、指定の new playback position にセットします。

    メディア要素がシークを開始する直前では潜在的に再生中だったにも関わらず、シークしたら readyState 属性が HAVE_FUTURE_DATA より小さい値に変わってしまったなら、その要素で waiting発出されます。

    currentTime 属性は非同期に更新されることはありません。なぜなら、それは現在再生位置ではなく公式再生位置を返すからです。

  12. new playback positionメディアデータが利用可能かどうかをユーザーエージェントが確立するまで待ち、利用可能なら、その位置を再生するに十分なデータをデコードできるまで待ちます。

  13. 安定状態になるまで待ちます同期セクションは、このアルゴリズムの残りのすべての手順から構成されます。(同期セクションの手順は ⌛ でマークされています。)

  14. seeking IDL 属性を false にセットします。

  15. 時間進行手順を実行します。

  16. ⌛ 要素で timeupdate という名前のシンプルなイベントを発出するタスクをキューイングします。

  17. ⌛ 要素で seeked という名前のシンプルなイベントを発出するタスクをキューイングします。


The seekable 属性は、メディアリソースのうち、この属性が評価された時点でユーザーエージェントがシークできる範囲範囲を表す新たな静的な正規化 TimeRanges オブジェクトを返さなければいけません。

たとえば、シンプルなムービーファイルだったり、ユーザーエージェントとサーバーが HTTP Range リクエストをサポートしているなどして、ユーザーエージェントがメディアリソースのどこにでもシークできるなら、この属性は、1 つの範囲を持ったオブジェクトを返すでしょう。その開始は最初のフレームの時間 (巻き戻し限界位置ですが通常は 0 ) で、終わりは最初のフレームの時間に duration 属性の値 (最後のフレームの時間と同等ですが、正の Infinity の場合もあります) を加えたものと同じです。

範囲は連続的に変わっていくかもしれません。たとえば、ユーザーエージェントが無限のストリームでスライディグウィンドウをバッファリングしている場合です。これは、たとえば、DVR で生放送を見ているときに見られる挙動です。

メディアリソースは内部的にはスクリプトを含んでいたりインタラクティブであったりするかもしれません。ゆえに、メディア要素は非線形な形で再生することがあります。もしこれが起こったら、ユーザーエージェントは、あたかも、現在再生位置が非連続な形で変化したときには常にシークのアルゴリズムが使われたかのように、振る舞わなければいけません (関連のイベントを発出されることになります)。メディア要素現在メディアコントローラーを持っているなら、ユーザーエージェントは適切にメディアコントローラーをシークしなければいけません。

4.7.10.10 複数のメディアトラックを伴うメディアリソース

メディアリソースには、複数のオーディオとビデオのトラックを組み込むことができます。たとえば、メインのビデオとオーティオのトラックに加えて、会話を吹き替えた外国語、ディレクターのコメント、音声描画、別アングル、手話の重ね表示などを、メディアリソースに入れることができます。

media . audioTracks

メディアリソースで使えるオーティオトラックを表す AudioTrackList オブジェクトを返します。

media . videoTracks

メディアリソースで使えるビデオトラックを表す VideoTrackList オブジェクトを返します。

メディア要素audioTracks 属性は、そのメディア要素メディアリソースの利用可能なオーディオトラックを表すライブAudioTrackList オブジェクトを返さなければいけません。いつ取り出されても、同じオブジェクトが返されなければいけません。

メディア要素videoTracks 属性は、そのメディア要素メディアリソースの利用可能なビデオトラックを表すライブVideoTrackList オブジェクトを返さなければいけません。いつ取り出されても、同じオブジェクトが返されなければいけません。

メディア要素ごとに、AudioTrackList オブジェクトと VideoTrackList オブジェクトは 1 つずつしかありません。たとえ、別のメディアリソースがその要素にロードされたとしてもです。これらのオブジェクトは使いまわされます。(ただし、AudioTrackVideoTrack は違います。)

この例では、スクリプトが、ビデオへの URL と、ビデオが配置されることになる要素への参照を引数として受け取る関数を定義しています。この関数は、ビデオをロードしようとし、ロードされたら、利用可能な手話トラックがあるかどうかをチェックします。もしあれば、そのトラックも表示します。両方のトラックが指定のコンテナーの中にピッタリと配置されます。これをうまく機能させるためにスタイルが適用されると仮定します。

<script>
 function loadVideo(url, container) {
   var controller = new MediaController();
   var video = document.createElement('video');
   video.src = url;
   video.autoplay = true;
   video.controls = true;
   video.controller = controller;
   container.appendChild(video);
   video.onloadedmetadata = function (event) {
     for (var i = 0; i < video.videoTracks.length; i += 1) {
       if (video.videoTracks[i].kind == 'sign') {
         var sign = document.createElement('video');
         sign.src = url + '#track=' + video.videoTracks[i].id; 
         sign.autoplay = true;
         sign.controller = controller;
         container.appendChild(sign);
         return;
       }
     }
   };
 }
</script>
4.7.10.10.1 AudioTrackListVideoTrackList オブジェクト

AudioTrackListVideoTrackList インタフェースは、前のセクションで定義された属性によって使われます。

interface AudioTrackList : EventTarget {
  readonly attribute unsigned long length;
  getter AudioTrack (unsigned long index);
  AudioTrack? getTrackById(DOMString id);

           attribute EventHandler onchange;
           attribute EventHandler onaddtrack;
           attribute EventHandler onremovetrack;
};

interface AudioTrack {
  readonly attribute DOMString id;
  readonly attribute DOMString kind;
  readonly attribute DOMString label;
  readonly attribute DOMString language;
           attribute boolean enabled;
};

interface VideoTrackList : EventTarget {
  readonly attribute unsigned long length;
  getter VideoTrack (unsigned long index);
  VideoTrack? getTrackById(DOMString id);
  readonly attribute long selectedIndex;

           attribute EventHandler onchange;
           attribute EventHandler onaddtrack;
           attribute EventHandler onremovetrack;
};

interface VideoTrack {
  readonly attribute DOMString id;
  readonly attribute DOMString kind;
  readonly attribute DOMString label;
  readonly attribute DOMString language;
           attribute boolean selected;
};
media . audioTracks . length
media . videoTracks . length

リストのトラック数を返します。

audioTrack = media . audioTracks[index]
videoTrack = media . videoTracks[index]

指定の AudioTrack または VideoTrack オブジェクトを返します。

audioTrack = media . audioTracks . getTrackById( id )
videoTrack = media . videoTracks . getTrackById( id )

指定の識別子を持つ AudioTrack または VideoTrack オブジェクトを返します。その識別子を持つトラックがなければ null を返します。

audioTrack . id
videoTrack . id

指定のトラックの ID を返します。この ID は、フォーマットが Media Fragments URI 構文をサポートしているなら、フラグメント識別子とともに使うことができ、getTrackById() メソッドで使うこともできます。 [MEDIAFRAG]

audioTrack . kind
videoTrack . kind

指定のトラックが入るカテゴリーを返します。可能なトラックのカテゴリーは、後述のとおりです。

audioTrack . label
videoTrack . label

指定のトラックがラベルが既知のものなら、そのラベルを返します。そうでなければ空文字列を返します。

audioTrack . language
videoTrack . language

指定のトラックが言語が既知のものなら、その言語を返します。そうでなければ空文字列を返します。

audioTrack . enabled [ = value ]

指定のトラックがアクティブなら true を、そうでなければ false を返します。

値をセットして、該当のトラックが有効かそうでないのかを変えることができます。同時に複数のオーディオトラックが有効なら、それらはミックスされます。

media . videoTracks . selectedIndex

現在の選択トラックがあれば、そのインデックスを返します。なければ、-1 を返します。

videoTrack . selected [ = value ]

指定のトラックがアクティブなら true を、そうでなければ false を返します。

値をセットして、該当のトラックが選択されているかどうかを変えることができます。0 個または 1 個のビデオトラックが選択される場合:前のトラックが選択されている状態で新たなトラックを選択すると、その前のトラックの選択は解除されます。

AudioTrackList オブジェクトは、0 個以上のオーディオトラックの動的なリストを表します。これらは 1 度に 0 個以上を有効にすることができます。それぞれのオーディオトラックは、AudioTrack オブジェクトによって表されます。

VideoTrackList オブジェクトは、0 個以上のビデオトラックの動的なリストを表します。これらは 1 度に 0 個、または 1 個を選択することができます。それぞれのビデオトラックは、VideoTrack オブジェクトによって表されます。

AudioTrackListVideoTrackList オブジェクトのトラックは、連続的に並べられなければいけません。メディアリソースが順番を定義するフォーマットにあれば、その順番が使われなければいけません。そうでなければ、順番は、メディアリソースの中でトラックが宣言されている相対順でなければいけません。この使われる順番は、リストの自然順と呼ばれます。

ゆえに、TrackList にあるそれぞれのトラックはインデックスを持ちます。最初はインデックス 0 で、それに続くトラックは前のより 1 大きいインデックスに番号付けされます。メディアリソースが動的にオーディオやビデオのトラックを追加したり削除したりしたら、そのトラックのインデックスは動的に変わります。メディアリソースが完全に変わってしまうなら、前のすべてのトラックは削除され、新たなトラックに置き換えられます。

AudioTrackList.lengthVideoTrackList.length 属性は、取得された時点での、それらオブジェクトによって表されるトラックの数を返さなければいけません。

AudioTrackListVideoTrackList オブジェクトの添字付きプロパティのインデックスは、どの時点においても、0 から、各オブジェクトによって表されるトラックがあれば、その数から 1 を引いた数までの数字でなければいけません。AudioTrackList または VideoTrackList オブジェクトがトラックを何も表していないなら、それには添字付きプロパティのインデックスがありません。

AudioTrackList または VideoTrackList オブジェクトのリスト list の中に指定されたインデックス index に対するインデックス化プロパティの値を確定するために、ユーザーエージェントは、list にある index 番目のトラックを表す AudioTrack または VideoTrack オブジェクトを返さなければいけません。

AudioTrackList.getTrackById(id)VideoTrackList.getTrackById(id) メソッドは、(それぞれ)識別子が引数 id の値に等しい AudioTrackListVideoTrackList オブジェクトにある(それぞれ)最初の AudioTrack または VideoTrack オブジェクトを返さなければいけません(前に定義された通り、リストの中から自然順で)。指定の引数に一致するトラックがないとき、このメソッドは null を返さなければいけません。

AudioTrackVideoTrack オブジェクトは、メディアリソースの特定のトラックを表します。それぞれのトラックは識別子、カテゴリー、ラベル、言語を持つことができます。トラックのこれらの特徴は、そのトラックの存続期間の間は永続的なものです。たとえトラックがメディアリソースAudioTrackListVideoTrackList オブジェクトから削除されたとしても、それらの特徴が変わることはありません。

さらに、AudioTrack オブジェクトごとに有効にも無効にもすることができます。これは、オーディオトラックの有効状態です。AudioTrack が生成されるとき、その有効状態は false (無効) にセットされなければいけません。リソースフェッチ・アルゴリズムはこれに優先します。

同様に、VideoTrackList オブジェクトごとに VideoTrack オブジェクトを 1 つだけ選択することができますが、これはビデオトラックの選択状態です。VideoTrack が生成されるとき、その選択状態は false (未選択) にセットされなければいけません。リソースフェッチ・アルゴリズムはこれに優先します。

AudioTrack.idVideoTrack.id は、トラックが識別子を持っているなら、それを返さなければいけません。なければ空文字列を返さなければいけません。メディアリソースMedia Fragments URI フラグメント識別子構文をサポートするフォーマットにあるなら、特定のトラックに対して返される識別子は、フラグメント識別子の中でトラックの名前として使われるならそのトラックを有効にするであろう同じ識別子でなければいけません。 [MEDIAFRAG]

たとえば、Ogg ファイルでは、これは、トラックの Name ヘッダーフィールドとなります。 [OGGSKELETONHEADERS]

AudioTrack.kindVideoTrack.kind 属性は、トラックがカテゴリーを持っているなら、それを返さなければいけません。なければ空文字列を返さなければいけません。

トラックのカテゴリーは、下表の最初のカラムの文字列となりますが、このうち、表の 2 列目と 3 列目の定義に基づいたトラックに最も適した文字列となります。これは、メディアリソースのトラックに含まれているメタデータによって決定されます。行の 3 列目のカラムの中は、その行の最初の列のセルに与えられたカテゴリが何に適用されるのかを言っています。カテゴリーは、それがオーディオトラックに適用できるならオーディオトラックのみに適しており、それがビデオトラックに適用できるならビデオトラックのみに適しています。カテゴリーは、それがオーディオに適しているなら、AudioTrack オブジェクトのみに対して返されなければならず、それがビデオに適しているなら VideoTrack オブジェクトに対してのみ返されなければいけません。

AudioTrack.kind()VideoTrack.kind() の返り値
カテゴリー 定義 適用先
"alternative" メイントラックの可能な代替。たとえば、歌の別のテイク (オーディオ) や、違うアングル (ビデオ) オーディオとビデオ
"captions" 組み込みのキャプションを伴うメインのビデオトラック。(古いコンテンツには、新たなコンテンツはテキストトラックを使います。) ビデオのみ
"descriptions" ビデオトラックの音声描画。 オーディオのみ
"main" 主音声または主映像のトラック オーディオとビデオ
"main-desc" 主音声のトラック。音声描画とミックスされます。 オーディオのみ
"sign" オーディオトラックの手話通訳。 ビデオのみ
"subtitles" 組み込みの字幕を伴うメインのビデオトラック。(古いコンテンツには、新たなコンテンツはテキストトラックを使います。) ビデオのみ
"translation" メインのオーディオトラックの通訳バージョン オーディオのみ
"commentary" 主音声や主映像のトラックに関する注釈。たとえば、ディレクターの注釈など。 オーディオとビデオ
"" (空文字列) 明示的な種類がない、または、トラックのメタデータによって与えられた種類をユーザーエージェントが認識できない。 オーディオとビデオ

AudioTrack.labelVideoTrack.label 属性は、トラックのラベルを持つなら、それを返さなければいけません。なければ空文字列を返さなければいけません。

AudioTrack.languageVideoTrack.language 属性は、トラックの言語の BCP 47 言語タグを持っていれば、それを返さなければいけません。なければ空文字列を返さなければいけません。ユーザーエージェントが BCP 47 言語タグとしてその言語を表現することができないなら (たとえば、メディアリソースのフォーマットの言語情報が定義済みの解釈を持たない自由形式の文字列の場合)、このメソッドは、あたかもそのトラックが言語を持たなかったかのように、空文字列を返さなければいけません。

マルチトラックのオーディオとビデオの id, kind, label, language に対する属性値のソースは、関連のメディアリソースのフォーマットごとに記述されているとおりです。 [INBANDTRACKS]

The AudioTrack.enabled 属性は、取得時においては、トラックがその時点で有効になっているなら true を、そうでなければ false を返さなければいけません。セット時においては、新たな値が true なら、トラックを有効にし、そうでなければ無効にしなければいけません。(該当のトラックがもう AudioTrackList オブジェクトにないなら、有効または無効にされようとしているトラックは、その AudioTrack オブジェクトの属性値を変えても、何も効果はありません。)

AudioTrackList にあるオーディオトラックが有効または無効にされるとき、ユーザーエージェントは、その AudioTrackList オブジェクトで change という名前のシンプルなイベントを発出するタスクをキューイングしなければいけません。

VideoTrackList.selectedIndex 属性は、その時点で選択済みのトラックがあれば、そのインデックスを返さなければいけません。VideoTrackList オブジェクトがその時点でどのトラックも表していない、または、どのトラックも選択されていないなら、-1 を返さなければいけません。

VideoTrack.selected 属性は、取得時においては、そのトラックがその時点で選択されているなら true を、そうでなければ false を返さなければいけません。セット時においては、新たな値が true なら、そのトラックを選択し、そうでなければ選択を解除しなければいけません。トラックが VideoTrackList にあるなら、そのリストにある他の VideoTrack オブジェクトすべては選択を解除されなければいけません。(トラックがもう VideoTrackList オブジェクトにないなら、選択または選択解除されようとしているトラックは、その VideoTrack オブジェクトの属性を変えても、何も効果はありません。)

VideoTrackList にあるトラックで、以前に選択されていなかったトラックが選択されるとき、ユーザーエージェントは、その VideoTrackList オブジェクトで change という名前のシンプルなイベントを発出するタスクをキューイングしなければいけません。このタスクは、resize イベントを発出するタスクがあれば、それより前にキューイングされなければいけません。


次は、AudioTrackListVideoTrackList インタフェースを実装するすべてのオブジェクトによって、イベントハンドラー IDL 属性として、サポートされなければならないイベントハンドラー (そして、それらに対応するイベントハンドラーのイベントタイプ) です:

イベントハンドラー イベントハンドラーのイベントタイプ
onchange change
onaddtrack addtrack
onremovetrack removetrack

本セクションで挙げられたタスクに対するタスクソースは、DOM 操作タスクソースです。

4.7.10.10.2 特定のオーディオとビデオトラックの宣言型による選択

audioTracksvideoTracks 属性によって、スクリプトはどのトラックを再生するべきかを選択することができますが、特定のトラックを宣言的に指定することも可能です。メディアリソースの URL のフラグメント識別子に、特定のトラックを指定します。フラグメント識別子の形式は、メディアリソースMIME タイプに依存します。 [RFC2046] [URL]

この例では、Media Fragments URI フラグメント識別子をサポートする形式を使うビデオが、"Alternative" とラベル付けされた代替アングルがデフォルトのビデオトラックの代わりに有効にされる形で、組み込まれています。 [MEDIAFRAG]

<video src="myvideo#track=Alternative"></video>
4.7.10.11 複数のメディア要素の同期
4.7.10.11.1 イントロダクション

メディア要素は、それぞれに MediaController を持つことができます。MediaController は、複数のメディア要素の再生を統合連携するオブジェクトです。たとえば、手話通訳トラックをビデオトラック上に重ねて表示し、その 2 つを同期した状態にすることができます。

デフォルトでは、メディア要素MediaController を持ちません。mediagroup コンテント属性を使うと、暗黙的に MediaController が割り当てられます。明示的に MediaController を直接的に割り当てるには、controller IDL 属性を使います。

MediaController を伴うメディア要素は、そのコントローラーにスレーブ化されていると言います。MediaController は、再生レートや、それにスレーブ化されたメディア要素のそれぞれの再生音量を変更し、そのスレーブ化されたメディア要素が不意にストールしてしまったときには、確実に、他も同時に停止します。

メディア要素MediaController にスレーブ化されるとき、その再生レートは、同じ MediaController にある他のトラックのものに固定されます。そして、ループは無効になります。

4.7.10.11.2 メディアコントローラー
enum MediaControllerPlaybackState { "waiting", "playing", "ended" };
[Constructor]
interface MediaController : EventTarget {
  readonly attribute unsigned short readyState; // HTMLMediaElement.readyState の値を使います。

  readonly attribute TimeRanges buffered;
  readonly attribute TimeRanges seekable;
  readonly attribute unrestricted double duration;
           attribute double currentTime;

  readonly attribute boolean paused;
  readonly attribute MediaControllerPlaybackState playbackState;
  readonly attribute TimeRanges played;
  void pause();
  void unpause();
  void play(); // すべてのメディア要素の play() も呼び出します

           attribute double defaultPlaybackRate;
           attribute double playbackRate;

           attribute double volume;
           attribute boolean muted;

           attribute EventHandler onemptied;
           attribute EventHandler onloadedmetadata;
           attribute EventHandler onloadeddata;
           attribute EventHandler oncanplay;
           attribute EventHandler oncanplaythrough;
           attribute EventHandler onplaying;
           attribute EventHandler onended;
           attribute EventHandler onwaiting;

           attribute EventHandler ondurationchange;
           attribute EventHandler ontimeupdate;
           attribute EventHandler onplay;
           attribute EventHandler onpause;
           attribute EventHandler onratechange;
           attribute EventHandler onvolumechange;
};
controller = new MediaController()

新たな MediaController オブジェクトを返します。

media . controller [ = controller ]

メディア要素に現在の MediaController があれば、それを返し、なければ null を返します。

値をセットして、明示的な MediaController をセットすることができます。そうした場合、mediagroup 属性があれば、それを削除します。

controller . readyState

MediaController がイベントを最後に発出した状態を、コントローラーの状態の報告の結果として、返します。この属性の値は、メディア要素readyState 属性と同じです。

controller . buffered

TimeRanges オブジェクトを返します。これは、ユーザーエージェントが持っているフレーブ化されたメディア要素すべての関連メディアデータすべての時間範囲の共通部分を表します。

controller . seekable

TimeRanges オブジェクトを返します。これは、ユーザーエージェントがスレーブ化されたメディア要素すべてに対してシークできる時間範囲の共通部分を表します。

controller . duration

再生可能な範囲のうち最初と最後の時間の差を返します (該当のデータが実際にバッファっリングされているか、直接的にシーク可能かは考慮しませんが、無限のストリームに対して未来の時間は含みません)。メディアがなければ 0 を返します。

controller . currentTime [ = value ]

現在再生位置を、時間 0 と現在の duration の間の位置として、秒で返します。

値をセットして、指定の時間にシークすることができます。

controller . paused

再生が停止されているなら true を、そうでなければ false を返します。この属性が true のとき、このコントローラーにスレーブ化されているメディア要素はすべて停止します。

controller . playbackState

MediaController がイベントを最後に発出した状態を、コントローラーの状態の報告の結果として、返します。この属性の値は、メディアがアクティブに再生中であることを示す "playing"、再生がすべてのスレーブ化されたメディア要素の終わりに到達したために、そのメディア要素は再生中ではないことを示す "ended"、何らかの他の理由でメディアが再生中ではない (たとえば、MediaController が停止された) ことを示す "waiting"、のいずれかとなります。

controller . pause()

paused 属性を true にセットします。

controller . unpause()

paused属性を false にセットします。

controller . play()

paused 属性を false にセットし、スレーブ化されたメディア要素それぞれの play() メソッドを呼び出します。

controller . played

すべてのスレーブ化されたメディア要素の時間範囲のうち、再生済みの範囲の和集合を表す TimeRanges オブジェクトを返します。

controller . defaultPlaybackRate [ = value ]

デフォルトの再生レートを返します。

値をセットして、デフォルトの再生レートを変更することができます。

デフォルトのレートは、再生に直接的な影響を与えることはありませんが、ユーザーが早送りモードへ切り替えて、通常の再生モードに戻ったときに、再生レート (playbackRate) がこのデフォルトのレートに戻ることが期待されます。

controller . playbackRate [ = value ]

現在の再生レートを返します。

値をセットして、再生レートを変更することができます。

controller . volume [ = value ]

現在の再生音量倍率を返します。これは、0.0 から 1.0 の範囲の数値で、0.0 が最も低音量で、1.0 が最も高音量です。

値をセットして、音量倍率を変更することができます。

新たな値が 0.0 から 1.0 の範囲でないなら、IndexSizeError 例外を投げます。

controller . muted [ = value ]

すべてのオーディオがミュートなら true を返します (このコントローラー上の、または、このコントローラーにスレーブ化されているメディア要素上の、他の属性がどうであれ)。そうでなければ false を返します。

値をセットして、オーディオがミュートかそうでないのかを変更することができます。

メディア要素現在メディアコントローラーを持つことができますが、これは、MediaController オブジェクトのことです。メディア要素mediagroup 属性なしに生成されるとき、それは現在メディアコントローラーを持ちません。(もしそれがその属性とともに生成されるなら、その属性は、下記に定義されている通り、現在メディアコントローラーを初期化します。)

MediaController従属メディア要素は、現在メディアコントローラーがその MediaController となるメディア要素のことです。MediaController のすべての従属メディア要素は、それらのメディアタイムラインの単位時間の定義に対して同じクロックを使わなければいけません。ユーザーエージェントがそれぞれの従属メディア要素で順番にアクションを求められるとき、それらは、その MediaController と最後に関連付けられた順に処理されなければいけません。


メディア要素controller 属性は、取得時においては、その要素に現在メディアコントローラーがあれば、それを返さなければいけません。なければ null を返さなければいけません。セット時においては、ユーザーエージェントは次の手順を実行しなければいけません:

  1. m を、該当のメディア要素とします。

  2. old controller を、m現在メディアコントローラーとします。その時点でそれがなければ null とします。

  3. new controller を null とします。

  4. m現在メディアコントローラーを持っていれば、m からそれを切り離します。

  5. 要素に mediagroup コンテント属性があれば、それを削除します。

  6. 新たな値が null なら、後述の update controllers 手順に飛びます。

  7. m現在メディアコントローラーを、新たな値とします。

  8. new controller を、m現在メディアコントローラーとします。

  9. メディア要素の速度を、その新たなメディアコントローラーに合わせて引き上げます

  10. Update controllers: old controllernew controller が同じなら (いずれも null、または、いずれも同じコントローラー)、これらの手順を中止します。

  11. old controller が null でなく、まだ 1 個以上の従属メディア要素を持っているなら、old controllerコントローラー状態を報告します。

  12. new controller が null でないなら、new controllerコントローラー状態を報告します。


MediaController() コンストラクターは、呼び出されたら、新たに生成した MediaController オブジェクトを返さなければいけません。


readyState 属性は、それが直近でセットされた値を返さなければいけません。MediaController オブジェクトが生成されるとき、この属性の値は 0 (HAVE_NOTHING) にセットされなければいけません。この値は、後述のコントローラー状態を報告するアルゴリズムによって更新されます。

seekable 属性は、新たな静的な正規化 TimeRanges オブジェクトを返さなければいけません。それは、この属性が評価された時点で、従属メディア要素メディアリソースの範囲のうち、ユーザーエージェントがシークできる範囲の共通部分を表すものでなければいけません。

buffered 属性は、新たな正規化 TimeRanges オブジェクトを返さなければいけません。それは、この属性が評価された時点で、従属メディア要素メディアリソースの範囲のうち、ユーザーエージェントがバッファリングした範囲の共通部分を表すものでなければいけません。ユーザーエージェントは、その範囲が利用可能かどうかを正確に確定しなければいけません。たとえ面倒な調査をしないと判定できないとしてもです。

duration 属性は、メディアコントローラーの尺を返さなければいけません。

15 から 250 ミリ秒ごと、または、MediaControllerメディアコントローラーの尺が変わるときのいずれかで、頻繁に発生しない方で、ユーザーエージェントは、その MediaControllerdurationchange という名前のシンプルなイベントを発出するタスクをキューイングしなければいけません。メディアコントローラーの位置メディアコントローラーの尺より大きくなる形で、MediaControllerメディアコントローラーの尺が増えるなら、ユーザーエージェントは、すぐに、メディアコントローラーの尺メディアコントローラーをシークしなければいけません。

currentTime 属性は、取得時においては、メディアコントローラーの位置を返さなければいけません。セット時においては、新たな値にメディアコントローラーをシークしなければいけません。

15 から 250 ミリ秒ごと、または、MediaControllerメディアコントローラーの位置が変わるときのいずれかで、頻繁に発生しない方で、ユーザーエージェントは、その MediaControllertimeupdate という名前のシンプルなイベントを発出するタスクをキューイングしなければいけません。


MediaController が生成されるとき、それは再生中メディアコントローラーとなります。これは、ユーザーエージェントのユーザーインタフェースを通して (要素がユーザーにユーザーインタフェースを表示している場合) か、本セクション (以下を参照のこと) で定義された API を使うスクリプトによって、一時停止メディアコントローラーに変わったり戻ったりすることができます。

paused 属性は、MediaController オブジェクトが一時停止メディアコントローラーなら、true を返し、そうでなければ false を返さなければいけません。

pause() メソッドが呼び出されるとき、MediaController再生中メディアコントローラーなら、ユーザーエージェントは、その MediaController一時停止メディアコントローラーに変え、その MediaControllerpause という名前のシンプルなイベントを発出するタスクをキューイングしてから、その MediaControllerコントローラー状態を報告しなければいけません。

unpause() メソッドが呼び出されるとき、MediaController一時停止メディアコントローラーなら、ユーザーエージェントは、その MediaController再生中メディアコントローラーに変え、その MediaControllerplay という名前のシンプルなイベントを発出するタスクをキューイングしてから、その MediaControllerコントローラー状態を報告しなければいけません。

play() メソッドが呼び出されるとき、ユーザーエージェントは従属メディア要素play() メソッドをそれぞれ順番に呼び出してから、MediaControllerunpause メソッドを呼び出さなければいけません。

playbackState 属性は、それが直近にセットされた値を返さなければいけません。MediaController オブジェクトが生成されるとき、この属性の値は "waiting" にセットされなければいけません。この値は、後述のコントローラー状態を報告するアルゴリズムによって更新されます。

played 属性は、新たな静的な正規化 TimeRanges オブジェクトを返さなければいけません。それは、この属性が評価された時点で、従属メディア要素メディアリソースメディアタイムライン上の範囲のうち、通常の再生の間にそれらの現在再生位置の通常の単調増加を通してユーザーエージェントがこれまで到達してきた範囲の和集合を表す範囲でなければいけません。


MediaController は、メディアコントローラーデフォルト再生レートメディアコントローラー再生レートを持ち、MediaController が生成されるときは、これらのいずれも 1.0 にセットされなければいけません。

defaultPlaybackRate 属性は、取得時においては、MediaControllerメディアコントローラーデフォルト再生レートを返さなければいけません。セット時においては、MediaControllerメディアコントローラーデフォルト再生レートを新たな値にセットしてから、その MediaControllerratechange という名前のシンプルなイベントを発出するタスクをキューイングしなければいけません。

playbackRate 属性は、取得時においては、MediaControllerメディアコントローラー再生レートを返さなければいけません。セット時においては、MediaControllerメディアコントローラー再生レートを新たな値にセットしてから、その MediaControllerratechange という名前のシンプルなイベントを発出するタスクをキューイングしなければいけません。


MediaControllerメディアコントローラー音量乗数を持ちますが、これは、MediaController オブジェクトが生成されるときは 1.0 にセットされなければいけません。そして、あわせて、メディアコントローラーミュート優先も持ちますが、これは、最初は false にセットされなければいけません。

volume 属性は、取得時においては、MediaControllerメディアコントローラー音量乗数を返さなければいけません。そして、セット時においては、新たな値が 0.0 以上 1.0 以下の範囲なら、MediaControllerメディアコントローラー音量乗数を、その新たな値にセットして、その MediaControllervolumechange という名前のシンプルなイベントを発出するタスクをキューイングしなければいけません。新たな値が 0.0 から 1.0 までの範囲にないなら、セット時において、IndexSizeError 例外が投げられなければいけません。

muted 属性は、取得時においては、MediaControllerメディアコントローラーミュート優先を返さなければいけません。そして、セット時においては、MediaControllerメディアコントローラーミュート優先を、新たな値にセットして、その MediaControllervolumechange という名前のシンプルなイベントを発出するタスクをキューイングしなければいけません。


The media resources of all the slaved media elements of a MediaController have a defined temporal relationship which provides relative offsets between the zero time of each such media resource: for media resources with a timeline offset, their relative offsets are the difference between their timeline offset; the zero times of all the media resources without a timeline offset are not offset from each other (i.e. the origins of their timelines are cotemporal); and finally, the zero time of the media resource with the earliest timeline offset (if any) is not offset from the zero times of the media resources without a timeline offset (i.e. the origins of media resources without a timeline offset are further cotemporal with the earliest defined point on the timeline of the media resource with the earliest timeline offset).

The media resource end position of a media resource in a media element is defined as follows: if the media resource has a finite and known duration, the media resource end position is the duration of the media resource's timeline (the last defined position on that timeline); otherwise, the media resource's duration is infinite or unknown, and the media resource end position is the time of the last frame of media data currently available for that media resource.

Each MediaController also has its own defined timeline. On this timeline, all the media resources of all the slaved media elements of the MediaController are temporally aligned according to their defined offsets. The media controller duration of that MediaController is the time from the earliest earliest possible position, relative to this MediaController timeline, of any of the media resources of the slaved media elements of the MediaController, to the time of the latest media resource end position of the media resources of the slaved media elements of the MediaController, again relative to this MediaController timeline.

Each MediaController has a media controller position. This is the time on the MediaController's timeline at which the user agent is trying to play the slaved media elements. When a MediaController is created, its media controller position is initially zero.

When the user agent is to bring a media element up to speed with its new media controller, it must seek that media element to the MediaController's media controller position relative to the media element's timeline.

When the user agent is to seek the media controller to a particular new playback position, it must follow these steps:

  1. If the new playback position is less than zero, then set it to zero.

  2. If the new playback position is greater than the media controller duration, then set it to the media controller duration.

  3. Set the media controller position to the new playback position.

  4. Seek each slaved media element to the new playback position relative to the media element timeline.

A MediaController is a restrained media controller if the MediaController is a playing media controller, and none of its slaved media elements are blocked media elements, but either at least one of its slaved media elements whose autoplaying flag is true still has its paused attribute set to true, or, all of its slaved media elements have their paused attribute set to true.

A MediaController is a blocked media controller if the MediaController is a paused media controller, or if any of its slaved media elements are blocked media elements, or if any of its slaved media elements whose autoplaying flag is true still have their paused attribute set to true, or if all of its slaved media elements have their paused attribute set to true.

A media element is blocked on its media controller if the MediaController is a blocked media controller, or if its media controller position is either before the media resource's earliest possible position relative to the MediaController's timeline or after the end of the media resource relative to the MediaController's timeline.

When a MediaController is not a blocked media controller and it has at least one slaved media element whose Document is a fully active Document, the MediaController's media controller position must increase monotonically at media controller playback rate units of time on the MediaController's timeline per unit time of the clock used by its slaved media elements.

When the zero point on the timeline of a MediaController moves relative to the timelines of the slaved media elements by a time difference ΔT, the MediaController's media controller position must be decremented by ΔT.

In some situations, e.g. when playing back a live stream without buffering anything, the media controller position would increase monotonically as described above at the same rate as the ΔT described in the previous paragraph decreases it, with the end result that for all intents and purposes, the media controller position would appear to remain constant (probably with the value 0).


A MediaController has a most recently reported readiness state, which is a number from 0 to 4 derived from the numbers used for the media element readyState attribute, and a most recently reported playback state, which is either playing, waiting, or ended.

When a MediaController is created, its most recently reported readiness state must be set to 0, and its most recently reported playback state must be set to waiting.

When a user agent is required to report the controller state for a MediaController, the user agent must run the following steps:

  1. If the MediaController has no slaved media elements, let new readiness state be 0.

    Otherwise, let it have the lowest value of the readyState IDL attributes of all of its slaved media elements.

  2. If the MediaController's most recently reported readiness state is less than the new readiness state, then run these substeps:

    1. Let next state be the MediaController's most recently reported readiness state.

    2. Loop: Increment next state by one.

    3. Queue a task to run the following steps:

      1. Set the MediaController's readyState attribute to the value next state.

      2. Fire a simple event at the MediaController object, whose name is the event name corresponding to the value of next state given in the table below.

    4. If next state is less than new readiness state, then return to the step labeled loop.

    Otherwise, if the MediaController's most recently reported readiness state is greater than new readiness state then queue a task to fire a simple event at the MediaController object, whose name is the event name corresponding to the value of new readiness state given in the table below.

    Value of new readiness state Event name
    0 emptied
    1 loadedmetadata
    2 loadeddata
    3 canplay
    4 canplaythrough
  3. Let the MediaController's most recently reported readiness state be new readiness state.

  4. Initialize new playback state by setting it to the state given for the first matching condition from the following list:

    If the MediaController has no slaved media elements
    Let new playback state be waiting.
    If all of the MediaController's slaved media elements have ended playback and the media controller playback rate is positive or zero
    Let new playback state be ended.
    If the MediaController is a blocked media controller
    Let new playback state be waiting.
    Otherwise
    Let new playback state be playing.
  5. If the MediaController's most recently reported playback state is not equal to new playback state and the new playback state is ended, then queue a task that, if the MediaController object is a playing media controller, and all of the MediaController's slaved media elements have still ended playback, and the media controller playback rate is still positive or zero, changes the MediaController object to a paused media controller and then fires a simple event named pause at the MediaController object.

  6. If the MediaController's most recently reported playback state is not equal to new playback state then queue a task to run the following steps:

    1. Set the MediaController's playbackState attribute to the value given in the second column of the row of the following table whose first column contains the new playback state.

    2. Fire a simple event at the MediaController object, whose name is the value given in the third column of the row of the following table whose first column contains the new playback state.

    New playback state New value for playbackState Event name
    playing "playing" playing
    waiting "waiting" waiting
    ended "ended" ended
  7. Let the MediaController's most recently reported playback state be new playback state.


次は、MediaController インタフェースを実装するすべてオブジェクトによって、イベントハンドラー IDL 属性としてサポートされなければならないイベントハンドラー (および、それらに対応するイベントハンドラー・イベントタイプ) です:

イベントハンドラー イベントハンドラー・イベントタイプ
onemptied emptied
onloadedmetadata loadedmetadata
onloadeddata loadeddata
oncanplay canplay
oncanplaythrough canplaythrough
onplaying playing
onended ended
onwaiting waiting
ondurationchange durationchange
ontimeupdate timeupdate
onplay play
onpause pause
onratechange ratechange
onvolumechange volumechange

本セクションで挙げたタスクに対するタスクソースは、DOM 操作タスクソースです。

4.7.10.11.3 宣言的なメディアコントローラーの割り当て

メディア要素mediagroup コンテント属性は、MediaController を暗黙的に生成することで、複数のメディア要素を結び付けるために使うことができます。この値はテキストです。同じ値を持ったメディア要素は、ユーザーエージェントによって自動的に結び付けられます。

メディア要素mediagroup 属性を伴って生成されるとき、そして、メディア要素mediagroup 属性がセット、変更、削除されるとき、ユーザーエージェントは次の手順を実行しなければいけません:

  1. m を、該当のメディア要素とします。

  2. old controller を、m現在メディアコントローラーとします。その時点でなければ、null とします。

  3. new controller を null とします。

  4. その時点で m現在メディアコントローラーがあれば、それを切り離します。

  5. mmediagroup 属性が削除されているなら、後述の コントローラーの更新 手順へ飛びます。

  6. DocumentmDocument と同じ (たとえ、それらの要素の一方または両方が実際に Document中になかったとしても) で、mediagroup 属性も持ち、その mediagroup 属性が mmediagroup 属性の新たな値と同じ値を持つメディア要素が他にあるなら、controller を、そのメディア要素現在メディアコントローラーとします。

    そうでなければ、controller を、新たに生成された MediaController とします。

  7. m現在メディアコントローラーを、controller とします。

  8. new controller を、m現在メディアコントローラーとします。

  9. メディア要素を、その新たなメディアコントローラーの速度まで上げます

  10. コントローラーの更新: old controllernew controller が同じなら (ともに null か、両方が同じコントローラー)、これらの手順を中止します。

  11. old controller が null ではなく、まだ 1 つ以上の従属メディア要素を持っているなら、old controllerコントローラー状態を報告します。

  12. new controller が null でないなら、new controllerコントローラー状態を報告します。

メディア要素mediaGroup IDL 属性は、mediagroup コンテント属性を反映しなければいけません。

複数のメディア要素が同じメディアリソースを参照していれば、それらは 1 つのネットワークリスエストを共有します。これを使うことで、スクリーン上に 2 つの異なる場所に同じメディアリソースの 2 つの (ビデオ) トラックを効率的に再生できるようになります。加えて、mediagroup 属性を使うと、これらの要素は、同期され続けます。

この例では、映画ファイルの手話通訳トラックが、同じビデオの主映像トラック上に重ね表示されます。2 つの video 要素、いくつかの CSS、そして、暗黙的な MediaController を使います:

<article>
 <style>
  div { margin: 1em auto; position: relative; width: 400px; height: 300px; }
  video { position; absolute; bottom: 0; right: 0; }
  video:first-child { width: 100%; height: 100%; }
  video:last-child { width: 30%; }
 </style>
 <div>
  <video src="movie.vid#track=Video&amp;track=English" autoplay controls mediagroup=movie></video>
  <video src="movie.vid#track=sign" autoplay mediagroup=movie></video>
 </div>
</article>
4.7.10.12 タイミング同期テキストトラック
4.7.10.12.1 テキストトラック・モデル

メディア要素は、テキストトラックを関連付けたグループを持つことができます。このグループはメディア要素テキストトラックのリストと呼ばれます。テキストトラックは、次のとおりにソートされます:

  1. ツリー順メディア要素の子の track 要素に対応付けられたテキストトラック
  2. addTextTrack() メソッドを使って追加されたテキストトラック。追加された順で、古いものが最初に来ます。
  3. メディアリソース固有のテキストトラック (メディアリソースの中にあるデータに対応するテキストトラック)。メディアリソースのフォーマット仕様で定義された順です。

テキストトラックは次から構成されます:

テキストトラック種別

これは、トラックがユーザーエージェントによってどう扱われるかを決定します。この種別は文字列によって表されます。利用可能な文字列は以下の通りです:

  • subtitles
  • captions
  • descriptions
  • chapters
  • metadata

track 要素がテキストトラックに対応付けられている場合には、トラック種別を動的に変更することができます。

ラベル

これは、ユーザーに対してトラックを識別できるようにすることを目的にした人間が解読可能な文字列です。

track 要素に対応付けられたテキストトラックの場合、トラックのラベルは動的に変更することができます。

テキストトラックのラベルが空文字列の場合、ユーザーエージェントは、そのテキストトラックの他のプロパティから適切なラベルを自動的に生成して、ユーザーインタフェースに使うべきです (たとえば、テキストトラックの種別やテキストトラックの言語)。この自動生成されたラベルは、API からはアクセスできません。

インバンドのメタデータトラックの送出種別

これは、メディアリソースから取り出される文字列ですが、とりわけ、インバンドのメタデータトラック向けです。これは、それらトラックを、ドキュメントの異なるスクリプトに発出できるようにします。

たとえば、旧来のテレビ局のブロードキャストでも、ウェブ上でストリーミングされ、ウェブ固有のインタラクティブな機能を使って機能強化されたものには、ターゲット広告、クイズ番組のトリビアクイズのゲームデータ、スポーツのプレーヤーの状態、料理番組のレシピ情報などが加えられることがあるでしょう。それぞれの番組が開始し終了すると、新たなトラックがストリームに加えられたり、ストリームから削除されたりします。そして、トラックが追加されると、ユーザーエージェントは、この属性の値を使って、それらを専用のスクリプトモジュールに結びづけることができるでしょう。

インバンドのメタデータテキストトラックでなければ、インバンド・メタデータトラックの送出種別は空文字列です。この値が異なるメディア形式に対してどのように組み込まれるかは、メディアリソース固有のテキストトラックにアクセスできるようにする手順にて説明されています。

言語

これは、テキストトラックのキューの言語を表す文字列(BCP 47 言語タグ)です。 [BCP47]

track 要素がテキストトラックに対応付けられている場合には、テキストトラックの言語を動的に変更することができます。

読取状態

次のいずれか 1 つになります:

未ロード

テキストトラックのキューが取得できていないことを表します。

ロード中

テキストトラックがロード中で、今のところ致命的なエラーはないことを表します。パーサーによってさらなるキューがトラックに加えられるかもしれません。

ロード済み

テキストトラックが致命的なエラーなしにロードされたことを表します。

ロード失敗

テキストトラックは有効とされていたが、ユーザーエージェントがそれを取得しようとしたら、何かしらの理由で失敗したことを表します (たとえば、URL が解決できなかったとか、テキストトラックのフォーマットが未知のものだった、など)。キューのいくつか、または、すべてが欠けている、または取得できません。

テキストトラック読取状態は、そのトラックが取得されると、動的に変わります。

モード

次のいずれか 1 つになります:

無効

テキストトラックはアクティブでないことを表します。DOM からトラックにアクセスできるようにするという目的を除き、ユーザーエージェントはテキストトラックを無視しています。アクティブなキューはなく、発出されるイベントもなく、ユーザーエージェントはトラックのキューを取得しようとはしません。

非表示

テキストトラックがアクティブだけれども、ユーザーエージェントはキューを表示していないことを表します。まだトラックのキューの取得を試みていないなら、ユーザーエージェントはすぐにそれを試みます。ユーザーエージェントはアクティブなキューのリストを維持しており、それに応じてイベントは発出されています。

表示中

テキストトラックがアクティブであることを表します。まだトラックのキューの取得を試みていないなら、ユーザーエージェントはすぐにそれを試みます。ユーザーエージェントはアクティブなキューのリストを維持しており、それに応じてイベントは発出されています。加えて、種別subtitlescaptions のテキストトラックに対して、キューはビデオ上に適切に重ね表示されています。種別descriptions のテキストトラックに対しては、ユーザーエージェントは、そのキューを、表示するのではない方法で、ユーザーから利用できるようにしています。種別chapters のテキストトラックに対しては、ユーザーエージェントは、ユーザーがキューを選択することでメディアリソースのあらゆる地点にナビゲートできるメカニズムを、ユーザーから利用できるようにしています。

0 個以上のキューのリスト

テキストトラックのキューのリストのことです。テキストトラックのレンダリングを更新する規則を伴います。たとえば、WebVTT では、WebVTT テキストトラックの表示を更新する規則です。 [WEBVTT]

テキストトラックのキューのリストは、テキストトラックまだロードされていない、または、今なおロード中、または、DOM 操作のいずれかの理由で、動的に変わることがあります。

テキストトラックは、それぞれに対応する TextTrack オブジェクトを持ちます。


メディア要素は、ぞれぞれに、保留中テキストトラックのリストを持ちます。これは当初は空でなければいけません。そして、パーサー上ブロック化フラグを持ちます。これは、当初は false でなければいけません。また、トラック自動選択実行済みフラグを持ちます。これも、当初は false でなければいけません。

ユーザーエージェントがメディア要素保留中テキストトラックのリストの投入が求められたら、ユーザーエージェントは、要素の保留中テキストトラックのリストに、要素のテキストトラックのリストの中で、テキストトラックのモード無効でない、かつ、テキストトラックの読取り状態ロード中のテキストトラックを加えなければいけません。

track 要素の親ノードが変わったら、ユーザーエージェントは、対応するテキストトラックを、それが入っていた保留中テキストトラックのリストから削除しなければいけません。

テキストトラックテキストトラック読取り状態ロード済みロード失敗のいずれかに変わるとき、ユーザーエージェントは、それを、それが入っていた保留中テキストトラックのリストから削除しなければいけません。

メディア要素HTML パーサーまたは XML パーサーによって生成されるとき、ユーザーエージェントは、その要素のパーサー上ブロック化フラグを true にセットしなければいけません。メディア要素HTML パーサーまたは XML パーサーの開始要素のスタックから追い出されるとき、ユーザーエージェントは、テキストトラック自動選択に対するユーザー設定に従い保留中テキストトラックのリストを投入し、要素のパーサー上ブロック化フラグを false にセットしなければいけません。

メディア要素テキストトラックは、その要素の保留中テキストトラックのリストが空で、かつ、その要素のパーサー上ブロック化フラグが false とのき、準備完了と言います。

メディア要素は、それぞれに、保留中テキストトラック変更通知フラグを持ちます。これは当初はセットされてはいけません。

メディア要素テキストトラックのリストにあるテキストトラックが、そのテキストトラックのモードを変更されるとき、ユーザーエージェントは、そのメディア要素で次の手順を実行しなければいけません:

  1. メディア要素保留中テキストトラック変更通知フラグがセットされているなら、これらの手順を中止します。

  2. メディア要素保留中テキストトラック変更通知フラグをセットします。

  3. 次の副手順を実行するタスクをキューイングします:

    1. メディア要素保留中テキストトラック変更通知フラグを解除します。

    2. メディア要素textTracks 属性の TextTrackList オブジェクトで、change という名前のシンプルなイベントを発出します。

  4. メディア要素ポスター表示フラグがセットされていないなら、時間進行手順を実行します。

このセクションで挙げたタスクに対するタスクソースは、DOM 操作タスクソースです。


テキストトラックキューは、テキストトラック内の時間依存のデータの単位のことで、サブタイトルやキャプションのインスタンスに対して、特定の時間で現れ、それ以外の時間では消えるテキストに対応付けます。

テキストトラックキューは、それぞれ、次から構成されます:

識別子

任意の文字列です。

開始時間

キューが適用されるメディアデータの範囲の開始を表す時間で、秒および小数秒で表されます。

終了時間

キューが適用されるメディアデータの範囲の終了を表す時間で、秒および小数秒で表されます。

終了時再生停止フラグ

キューが適用される範囲の終わりに到達したときに、メディアリソースの再生を停止するかどうかを表す真偽値です。

いくつかの追加のフォーマット固有データ

フォーマットが必要とする場合に使う追加フィールドです。たとえば、WebVTT にはテキストトラックキュー書式方向があります。 [WEBVTT]

キューのデータ

キューの生データ、そして、キューを分離してレンダリングする規則

このデータの正確な特性はフォーマットによって定義されています。たとえば、WebVTT ではテキストを使います。

テキストトラックキュー開始時間テキストトラックキュー終了時間は負になりえます。(とはいえ、現在再生位置は決して負になることはないため、時間 0 より前のキューはどれもアクティブになることはありません。)

テキストトラックキューには、それぞれ、TextTrackCue オブジェクトが対応付けられます (より正確に言えば TextTrackCue から継承されるオブジェクトです。たとえば、WebVTT キューは VTTCue インタフェースを使います)。テキストトラックキューのメモリー上の表現は、この TextTrackCue API を通して動的に変更することができます。 [WEBVTT]

テキストトラックキューは、テキストトラックのレンダリングを更新する規則と関連付けられます。これは、テキストトラックキューの種別ごとの仕様で定義されているとおりです。これらの規則は、とりわけ、キューを表しているオブジェクトが addCue() メソッドを使って TextTrack オブジェクトに追加されるときに使われます。

さらに、テキストトラックキューは、それぞれ、2 つの動的な情報を持ちます:

アクティブフラグ

このフラグは当初はセットされてはいけません。このフラグは、キューがアクティブまたは非アクティブになるときに確実にイベントが適切に発出されるようにするために、そして、確実に正しいキューがレンダリングされるようにするために使われます。

ユーザーエージェントは、テキストトラックキューがそのテキストトラックテキストトラックキューリストから削除されるとき、および、テキストトラック自身がメディア要素テキストトラックリストから削除されるときか、そのテキストトラックのモード無効に変わるとき、そして、メディア要素readyStateHAVE_NOTHING に戻るときは、同期的にこのフラグを解除しなければいけません。関連の出来事より前から表示されていたテキストトラックの 1 つ以上のキューに対して、このフラグが解除されているとき、ユーザーエージェントは、影響を受けるすべてのキューに対してフラグを解除した後に、それらのテキストトラックテキストトラックのレンダリングを更新する手順を適用しなければいけません。たとえば、WebVTT に基づいたテキストトラックなら、 WebVTT テキストトラックの表示を更新する手順です。 [WEBVTT]

表示状態

これは、レンダリングモデルの一環で、一貫した位置にキューを維持するために使われます。これは当初は空でんかえればいけません。テキストトラックキューアクティブフラグが解除されているとき、ユーザーエージェントは、そのテキストトラックキュー表示状態を空にしなければいけません。

メディア要素テキストトラックテキストトラックキューは、テキストトラックキュー順にそれぞれ並べられます。これは次のように決定されます: まずテキストトラックによってキューをグループ化します。それらグループは、テキストトラックメディア要素テキストトラックリストに現れる順と同じにソートされます。次に、それぞれのグループの中では、キュー開始時間によってソートされなければいけません。早いものが先です。同じ開始時間を持つキューがあれば、終了時間でソートされなければいけません。遅いものが先に来ます。そして最後に、終了時間が同じキューがあれば、それぞれのテキストトラックキューリストに加えられた順にソートされなければいけません。古いものが先に来ます (ゆえに、たとえば、WebVTT ファイルのキューなら、それは、キューがファイルの中でリストされている順となるでしょう)。 [WEBVTT]

4.7.10.12.2 帯域内テキストトラックの抽出

メディアリソース固有のテキストトラックとは、メディアリソースの中にあるデータに対応付けられたテキストトラックのことです。

このようなデータの処理やレンダリングの規則は、関連の仕様で定義されています。例えば、メディアリソースがビデオであれば、そのビデオ形式の仕様です。

ユーザーエージェントがテキストトラックと等価であると認識できサポートできるデータをメディアリソースが含んでいるとき、次のように、ユーザーエージェントは、その関連データを使って、メディアリソース固有のテキストトラックにアクセスできるようにする手順実行します:

  1. 関連データを、新たなテキストトラックと、それに相当する新たな TextTrack オブジェクトと関連付けます。そのテキストトラックが、メディアリソース固有のテキストトラックとなります。

  2. 関連のデータのセマンティクスに基づいて、新たなテキストトラック種別ラベル言語をセットします。これらは、関連のフォーマットに対して定義されているとおりです [INBANDTRACKS]。そのデータにラベルがなければ、そのラベルは空の文字列にセットされなければいけません。

  3. テキストトラックキューのリストを、該当のフォーマットに適したテキストトラックのレンダリングを更新する規則と関連付けます。

  4. 新たなテキストトラック種別metadata なら、次のテキストトラック帯域内メタデータトラック送出タイプを、メディアリソースのタイプにもとづいて、セットします:

    メディアリソースが Ogg ファイルの場合
    テキストトラック帯域内メタデータトラック送出タイプは、Role ヘッダーフィールドの値にセットされなければいけません。 [OGGSKELETONHEADERS]
    メディアリソースが WebM ファイルの場合
    テキストトラック帯域内メタデータトラック送出タイプは、CodecID 要素の値にセットされなければいけません。 [WEBMCG]
    メディアリソースが MPEG-2 ファイルの場合
    stream type を、ファイルのプログラムマップセクションにあるテキストトラックのタイプを表す "stream_type" フィールドの値とします。これは 8 ビット符号なし整数として解釈します。length を、プログラムマップセクションの同じ部分にあるトラックに対する "ES_info_length" フィールドの値とします。これは、MPEG-2 仕様の定義のとおり、整数として解釈します。descriptor bytes を、"ES_info_length" フィールドに後の length バイトとします。テキストトラック帯域内メタデータトラック送出タイプは、stream type バイトと、0 個以上の descriptor bytes バイトを結合したものにセットされなければいけません。この際、大文字 16 進法桁表現を使った 16 進数で表されます。 [MPEG2]
    メディアリソースが MPEG-4 ファイルの場合
    ファイルの最初の moov ボックスにあるテキストトラックtrak ボックスの最初の mdia ボックスの最初の minf ボックスの最初の stbl ボックスの最初の stsd ボックスがあれば、それを stsd box とします。ファイルに stsd box がない、または、stsd boxmett ボックスも metx ボックスもなければ、テキストトラック帯域内メタデータトラック送出タイプは、空文字列にセットされなければいけません。stsd boxmett ボックスがあれば、テキストトラック帯域内メタデータトラック送出タイプは、文字列 "mett"、U+0020 SPACE 文字、stsd box の最初の mett ボックスの最初の mime_format フィールドの値を連結したものにセットされなければいけません。そのボックスにフィールドがなければ、空文字列にセットされなければいけません。stsd boxmett ボックスは無いが metx ボックスがあれば、テキストトラック帯域内メタデータトラック送出タイプは、文字列 "metx"、U+0020 SPACE 文字、stsd box の最初の metx ボックスの最初の namespace フィールドの値を連結したものにセットされなければいけません。そのボックスにフィールドがなければ、空文字列にセットされなければいけません。[MPEG4]
    メディアリソースが DASH メディアリソースの場合
    テキストトラック帯域内メタデータトラック送出タイプは、"AdaptationSet" 要素属性と、子となるすべての Role 説明を結合したものにセットされなければいけません。 [DASH]
  5. キューにアクセスできるようにするガイドラインに従って、新たなテキストトラックキューのリストに、それまでパースされたキューを投入します。必要に応じて、動的にそれの更新を開始します。

  6. 新たなテキストトラック読取状態ロード済みにセットします。

  7. 新たなテキストトラックモードを、ユーザー設定やデータの関連の仕様の要件に合うモードにセットします。

  8. 新たなテキストトラックを、メディア要素テキストトラックのリストにセットします。

  9. addtrack という名前を持った信頼済みイベントを発出します。このイベントはバブリングせずキャンセル可能ではありません。そしてこれは TrackEvent インタフェースを使い、テキストトラックTextTrack オブジェクトに初期化された track 属性を伴います。また、このイベントは該当のメディア要素textTracks 属性の TextTrackList オブジェクトで発出されます。

4.7.10.12.3 帯域外テキストトラックの抽出

track 要素が生成されるとき、それは、新たなテキストトラック(後で定義する値を使います)と、それに相当する新たな TextTrack オブジェクトに関連付けられなければいけません。

テキストトラック種別は、下表の通り、要素の kind 属性の状態から決定されます。最初の列のセルにある状態に対応する種別は、その次の列にある文字列となります:

状態 文字列
Subtitles subtitles
Captions captions
Descriptions descriptions
Chapters chapters
Metadata metadata

テキストトラックラベルは、その要素のトラックラベルです。

テキストトラック言語は、その要素のトラック言語があれば、それになり、なければ空文字列となります。

kind, label, srclang 属性がセット、変更、削除されたら、テキストトラックはそれに応じて前述の定義のとおりに更新されなければいけません。

トラック URL の変更は、後述のアルゴリズムで扱われます。

テキストトラック読取状態は当初は未ロードで、テキストトラックモードは当初は無効です。

テキストトラックのキューのリストは当初は空です。これは参照されたファイルがパースされたときに動的に変更されます。このリストと関連付けられるのは、該当のフォーマットに適したテキストトラックのレンダリングを更新する規則です。WebVTT なら、これは WebVTT テキストトラックの表示を更新する規則です。 [WEBVTT]

track 要素の親要素が変わり、その新たな親がメディア要素なら、ユーザーエージェントは、その track 要素の対応するテキストトラックを、メディア要素テキストトラックのリストに追加してから、addtrack という名前の信頼済みイベントを発出するタスクをキューイングしなければいけません。このイベントは、バブリングせず、キャンセル可能ではありません。そして、このイベントは TrackEvent インタフェースを使い、テキストトラックTextTrack オブジェクトに初期化された track 属性を伴い、メディア要素textTracks 属性の TextTrackList オブジェクトで発出されます。

track 要素の親要素が変わり、その古い親がメディア要素だったなら、ユーザーエージェントは、その track 要素の関連するテキストトラックを、メディア要素テキストトラックのリストから削除してから、removetrack という名前の信頼済みイベントを発出するタスクをキューイングしなければいけません。このイベントは、バブリングせず、キャンセル可能ではありません。そして、このイベントは TrackEvent インタフェースを使い、テキストトラックTextTrack オブジェクトに初期化された track 属性を伴い、メディア要素textTracks 属性の TextTrackList オブジェクトで発出されます。


track 要素に対応するテキストトラックメディア要素テキストトラックのリストに追加されるとき、ユーザーエージェントは、そのメディア要素に対して次の手順を実行するタスクをキューイングしなければいけません:

  1. 要素のパーサー上ブロック化フラグが true なら、これらの手順を中止します。

  2. 要素のトラック自動選択実行済みフラグが true なら、これらの手順を中止します。

  3. この要素に対して、テキストトラック自動選択に対するユーザー設定に従います。

ユーザーエージェントがメディア要素に対してテキストトラック自動選択に対するユーザー設定に従うことが求められるとき、ユーザーエージェントは次の手順を実行しなければいけません:

  1. subtitlescaptions に対して、テキストトラック自動選択を実行します。

  2. descriptions に対して、テキストトラック自動選択を実行します。

  3. chapters に対して、テキストトラック自動選択を実行します。

  4. メディア要素テキストトラックのリストのうち、テキストトラック種別metadata で、default 属性がセットされテキストトラックモード無効にセットされた track 要素に対応するテキストトラックがあれば、それらトラックのテキストトラックモード非表示にセットします。

  5. その要素のトラック自動選択実行済みフラグを true にセットします。

上記の手順が 1 個以上のテキストトラック種別に対してテキストトラック自動選択を実行すると言うときは、次の手順を実行することを意味します:

  1. メディア要素テキストトラックのリストのうち、テキストトラック種別がこのアルゴリズムに引き渡された種別の 1 つとなるテキストトラックがあれば、candidates を、それらテキストトラックから成るリストとします。順番は、テキストトラックのリストに入っていた順とします。

  2. candidates が空なら、これらの手順を中止します。

  3. candidates に、テキストトラックモード表示中にセットされたテキストトラックがあれば、これらの手順を中止します。

  4. ユーザーが、テキストトラック種別テキストトラック言語テキストトラックラベルに基いて、candidates にあるトラックを有効にさせたいと関心を示したなら、そのテキストトラックモード表示中にセットします。

    たとえば、ユーザーは、"可能なら常にフランス語のキャプションを使いたい"、とか、"タイトルが '注釈' のサブタイトルのトラックがあれば、それを有効しなさい"、とか、"音声描画トラックが使えるなら、それを有効にしなさい、理想を言えば、スイスのドイツ語が良いが、ダメなら標準のスイスのドイツ語か標準のドイツ語を有効にしなさい" といった効果などを、ユーザーがブラウザーに設定していることが考えられます。

    そうでなければ、candidates のうち、テキストトラックモード無効にセットされた default 属性を伴う track 要素に対応するテキストトラックがあれば、それらのトラックのテキストトラックモード表示中にセットします。

track 要素に対応するテキストトラックが次の状況のいずれかに遭遇するとき、ユーザーエージェントは、そのテキストトラックとその track 要素に対して、track 処理モデルを開始しなければいけません:

ユーザーエージェントが、テキストトラック、および、track track 要素に対して、track 処理モデルを開始することになったときは、次のアルゴリズムを実行しなければいけません。このアルゴリズムは、イベントループ・アルゴリズムに密接に作用します。これは同期セクションを伴います (イベントループ・アルゴリズムの一環で呼び出されます)。そのセクションの手順は ⌛ でマークされています。

  1. If another occurrence of this algorithm is already running for this text track and its track element, abort these steps, letting that other algorithm take care of this element.

  2. If the text track's text track mode is not set to one of hidden or showing, abort these steps.

  3. If the text track's track element does not have a media element as a parent, abort these steps.

  4. Run the remainder of these steps asynchronously, allowing whatever caused these steps to run to continue.

  5. Top: Await a stable state. The synchronous section consists of the following steps. (The steps in the synchronous section are marked with ⌛.)

  6. ⌛ Set the text track readiness state to loading.

  7. ⌛ Let URL be the track URL of the track element.

  8. ⌛ If the track element's parent is a media element then let CORS mode be the state of the parent media element's crossorigin content attribute. Otherwise, let CORS mode be No CORS.

  9. End the synchronous section, continuing the remaining steps asynchronously.

  10. If URL is not the empty string, perform a potentially CORS-enabled fetch of URL, with the mode being CORS mode, the origin being the origin of the track element's Document, and the default origin behaviour set to fail.

    The resource obtained in this fashion, if any, contains the text track data. If any data is obtained, it is by definition CORS-same-origin (cross-origin resources that are not suitably CORS-enabled do not get this far).

    The tasks queued by the fetching algorithm on the networking task source to process the data as it is being fetched must determine the type of the resource. If the type of the resource is not a supported text track format, the load will fail, as described below. Otherwise, the resource's data must be passed to the appropriate parser (e.g. the WebVTT parser) as it is received, with the text track list of cues being used for that parser's output. [WEBVTT]

    The appropriate parser will synchronously (during these networking task source tasks) and incrementally (as each such task is run with whatever data has been received from the network) update the text track list of cues.

    This specification does not currently say whether or how to check the MIME types of text tracks, or whether or how to perform file type sniffing using the actual file data. Implementors differ in their intentions on this matter and it is therefore unclear what the right solution is. In the absence of any requirement here, the HTTP specification's strict requirement to follow the Content-Type header prevails ("Content-Type specifies the media type of the underlying data." ... "If and only if the media type is not given by a Content-Type field, the recipient MAY attempt to guess the media type via inspection of its content and/or the name extension(s) of the URI used to identify the resource.").

    If the fetching algorithm fails for any reason (network error, the server returns an error code, a cross-origin check fails, etc), if URL is the empty string, or if the type of the resource is not a supported text track format, then run these steps:

    1. Queue a task to first change the text track readiness state to failed to load and then fire a simple event named error at the track element.

    2. Wait until the text track readiness state is no longer set to loading.

    3. Wait until the track URL is no longer equal to URL, at the same time as the text track mode is set to hidden or showing.

    4. Jump to the step labeled top.

    If the fetching algorithm does not fail, then the final task that is queued by the networking task source must run the following steps after it has tried to parse the data:

    1. Change the text track readiness state to loaded.

    2. If the file was successfully processed, fire a simple event named load at the track element.

      Otherwise, the file was not successfully processed (e.g. the format in question is an XML format and the file contained a well-formedness error that the XML specification requires be detected and reported to the application); fire a simple event named error at the track element.

    3. Wait until the track URL is no longer equal to URL, at the same time as the text track mode is set to hidden or showing.

    4. Jump back to the step labeled top.

    If, while the fetching algorithm is active, either:

    ...then the user agent must run the following steps:

    1. Abort the fetching algorithm, discarding any pending tasks generated by that algorithm (and in particular, not adding any cues to the text track list of cues after the moment the URL changed).

    2. Jump back to the step labeled top.

    Until one of the above circumstances occurs, the user agent must remain on this step.

track 要素の src 属性がセット、変更、削除されるときは、ユーザーエージェントは、その要素のテキストトラックテキストトラックキューリストを同期的に空にしなければいけません。(これによって、上記のアルゴリズムは、前に与えられた URL を使って取得したリソースからのキューがあれば、それを追加することを止めることになります。)

4.7.10.12.4 様々なフォーマットのキューをテキストトラックキューとしてアクセス可能にするためのガイドライン

特定のフォーマットのテキストトラックキューを、HTML ユーザーエージェントによって処理する目的で、どのように解釈するべきかは、そのフォーマットで定義されています。 [INBANDTRACKS]. そういった仕様がない場合のために、このセクションではいくつかの制約を提供し、実装がそのようなフォーマットを一貫性を持ってアクセス可能にできるようにします。

HTML のテキストトラックモデルをサポートするために、タイミング同期データのそれぞれの単位は、テキストトラックキューに変換されます。フォーマットの機能をこの仕様で定義されたテキストトラックキューの状態をどこに対応付けするかは定義されていません。実装は、上記で定義されたテキストトラックキューの状態の定義に加え、次の制約にも矛盾がないよう、確実に対応付けしなければいけません。

テキストトラックキュー識別子

キューごとの識別子に明らかに相当するものがフォーマットになければ、空文字列にセットされるべきです。

終了時再生停止フラグ

false にセットされるべきです。

4.7.10.12.5 テキストトラック API
interface TextTrackList : EventTarget {
  readonly attribute unsigned long length;
  getter TextTrack (unsigned long index);
  TextTrack? getTrackById(DOMString id);

           attribute EventHandler onchange;
           attribute EventHandler onaddtrack;
           attribute EventHandler onremovetrack;
};
media . textTracks . length

メディア要素と関連付けられたテキストトラックの数を返します (track 要素など)。これは、メディア要素テキストトラックのリストにあるテキストトラックの数です。

media . textTracks[ n ]

メディア要素テキストトラックのリストのうち、n 番目のテキストトラックを表す TextTrack オブジェクトを返します。

textTrack = media . textTracks . getTrackById( id )

指定の識別子を持った TextTrack オブジェクトを返します。その識別子を持ったトラックがなければ null を返します。

track . track

track 要素のテキストトラックを表す TextTrack オブジェクトを返します。

TextTrackList オブジェクトは、指定の順番を持ったテキストトラックの動的な更新リストを表します。

メディア要素textTracks 属性は、メディア要素テキストトラックのリストにあるテキストトラックTextTrack オブジェクトたちを表す TextTrackList オブジェクトを返さなければいけません。その順番は、テキストトラックのリストの順番と同じです。この属性がアクセスされる都度、同じオブジェクトが返されなければいけません。 [WEBIDL]

TextTrackList オブジェクトの length 属性は、その TextTrackList オブジェクトによって表されるリストにあるテキストトラックの数を返さなければいけません。

TextTrackList オブジェクトの添字付きプロパティインデックスは、いかなる時点においても、TextTrackList オブジェクトによって表されるリストにテキストトラックがあれば、0 に始まり、その全体数から 1 を引いた数までです。リストにテキストトラックがなければ、添字付きプロパティインデックスはありません。

指定のインデックス index に対する TextTrackList オブジェクトのインデックス化プロパティの値を確定するために、ユーザーエージェントは、その TextTrackList オブジェクトによって表されるリストにある index 番目のテキストトラックを返さなければいけません。

getTrackById(id) メソッドは、TextTrackList オブジェクトにある TextTrack のうち、id IDL 属性が引数 id の値に等しい値を返すであろう最初のもの返さなければいけません。指定の引数に一致するトラックがなければ、このメソッドは null を返さなければいけません。


enum TextTrackMode { "disabled",  "hidden",  "showing" };
enum TextTrackKind { "subtitles",  "captions",  "descriptions",  "chapters",  "metadata" };
interface TextTrack : EventTarget {
  readonly attribute TextTrackKind kind;
  readonly attribute DOMString label;
  readonly attribute DOMString language;

  readonly attribute DOMString id;
  readonly attribute DOMString inBandMetadataTrackDispatchType;

           attribute TextTrackMode mode;

  readonly attribute TextTrackCueList? cues;
  readonly attribute TextTrackCueList? activeCues;

  void addCue(TextTrackCue cue);
  void removeCue(TextTrackCue cue);

           attribute EventHandler oncuechange;
};
textTrack = media . addTextTrack( kind [, label [, language ] ] )

新たなTextTrack オブジェクトを生成し返します。これは、メディア要素テキストトラックのリストにも加えられます。

textTrack . kind

テキストトラック種別の文字列を返します。

textTrack . label

テキストトラックラベルがあればそれを返し、なければ空文字列 (オブジェクトがユーザーに表示されるなら、恐らくそのオブジェクトの他の属性から独自のラベルが生成される必要があることを意味します)を返します。

textTrack . language

テキストトラック言語の文字列を返します。

textTrack . id

指定のトラックの ID を返します。

帯域内トラックでは、これは、フォーマットが Media Fragments URI 構文をサポートするなら、フラグメント識別子とともに使われることができ、そして、getTrackById() メソッドとともに使われることができる ID です。 [MEDIAFRAG]

track 要素に対応する TextTrack オブジェクトでは、これは、その track 要素の ID となります。

textTrack . inBandMetadataTrackDispatchType

テキストトラック帯域内メタデータトラック送出タイプの文字列を返します。

textTrack . mode [ = value ]

テキストトラックモードを返します。これは次のリストの文字列で表されます:

"disabled"

テキストトラック無効モード。

"hidden"

テキストトラック非表示モード。

"showing"

テキストトラック表示中モード。

値をセットしてモードを変えることができます。

textTrack . cues

テキストトラックのキューのリストTextTrackCueList オブジェクトとして返します。

textTrack . activeCues

テキストトラックのキューのリストのうち現在アクティブ (つまり、現在再生位置の前に開始し、かつ、その後で終わる) なテキストトラックキューTextTrackCueList として返します。

textTrack . addCue( cue )

textTrackテキストトラックのキューのリストに指定のキューを加えます。

textTrack . removeCue( cue )

textTrackテキストトラックのキューのリストから指定のキューを削除します。

メディア要素addTextTrack(kind, label, language) メソッドは、呼び出されたら、次の手順を実行しなければいけません:

  1. 新たに TextTrack オブジェクトを生成します。

  2. 新たなオブジェクトに対応する新たなテキストトラックを生成し、そのテキストトラックの種別kind に、テキストトラックのラベルlabel に、テキストトラックの言語language に、テキストトラックの準備状態テキストトラックロード済み状態に、テキストトラックのモードテキストトラック非表示モードに、テキストトラックのキューのリストを空のリストに、セットします。

    当初、テキストトラックのキューのリストは、テキストトラックのレンダリングを更新する規則には関連付けられません。テキストトラックのキューがそれに追加されたら、その結果として、永続的にテキストトラックのキューのリストにその規則がセットされます。

  3. 新たなテキストトラックを、メディア要素テキストトラックのリストに追加します。

  4. メディア要素textTracks 属性の TextTrackList オブジェクトで addtrack という名前の信頼済みイベントを発出するタスクをキューイングします。これは、TrackEvent インタフェースを使い、その track 属性は新たなテキストトラックTextTrack オブジェクトに初期化されます。

  5. 新たな TextTrack オブジェクトを返します。


kind 属性は、TextTrack オブジェクトが表すテキストトラックテキストトラック種別を返さなければいけません。

label 属性は、TextTrack オブジェクトが表すテキストトラックテキストトラックラベルを返さなければいけません。

language 属性は、TextTrack オブジェクトが表すテキストトラックテキストトラック言語を返さなければいけません。

id 属性は、トラックに識別子があれば、それを返し、なければ空文字列を返します。track 要素に対応するトラックでは、そのトラックの識別子は、その要素に id 属性があれば、その値になります。帯域内トラックでは、そのトラックの識別子は、メディアリソースによって指定されます。メディアリソースMedia Fragments URI フラグメント識別子構文をサポートするフォーマットにあるなら、特定のトラックに対して返される識別子は、フラグメント識別子の中でトラックの名前として使われるならそのトラックを有効にするであろう識別子と同じになります。[MEDIAFRAG]

inBandMetadataTrackDispatchType 属性は、TextTrack オブジェクトが表すテキストトラックテキストトラック帯域内メタデータトラック送出タイプを返さなければいけません。

mode 属性は、取得時においては、次のリストで定義されている通り、TextTrack オブジェクトが表すテキストトラックテキストトラックモードに対応する文字列を返さなければいけません:

"disabled"
テキストトラック無効モード。
"hidden"
テキストトラック非表示モード。
"showing"
テキストトラック表示中モード。

セット時においては、新たな値が、この属性がその時点で返すであろう値と等しくないなら、新たな値は次のとおりに処理されなければいけません:

新たな値が "disabled" の場合

TextTrack オブジェクトが表すテキストトラックテキストトラックモードを、テキストトラック無効モードにセットします。

新たな値が "hidden" の場合

TextTrack オブジェクトが表すテキストトラックテキストトラックモードを、テキストトラック非表示モードにセットします。

新たな値が "showing" の場合

TextTrack オブジェクトが表すテキストトラックテキストトラックモードを、テキストトラック表示中モードにセットします。

TextTrack オブジェクトが表すテキストトラックテキストトラックモードテキストトラック無効モードなら、cues 属性はライブTextTrackCueList を返さなければいけません。これは、TextTrack オブジェクトが表すテキストトラックテキストトラック・キューリストのサブセットを表し、その終了時間は、スクリプトが開始したときの巻き戻し限界位置かそれ以降で起こります。そのリストの順番は、テキストトラックのキュー順となります。上記に該当しなければ、null を返さなければいけません。オブジェクトが返される都度、同じオブジェクトが返されなければいけません。

スクリプトが開始したときの巻き戻し限界位置は、巻き戻し限界位置が何であろうが、最後にイベントループが手順 1 に到達したときとなります。

TextTrack オブジェクトが表すテキストトラックテキストトラックモードテキストトラック無効モードなら、activeCues 属性はライブTextTrackCueList オブジェクトを返さなければいけません。これは、TextTrack オブジェクトが表すテキストトラックテキストトラック・キューリストのサブセットを表し、そのアクティブフラグは、スクリプトが開始されたときにはセットされています。そのリストの順番は、テキストトラックのキュー順となります。上記に該当しなければ、null を返さなければいけません。オブジェクトが返される都度、同じオブジェクトが返されなければいけません。

イベントループが手順 1 に最後に到達したときに、テキストトラックキューテキストトラックキュー・アクティブ・フラグがセットされたなら、そのアクティブフラグはスクリプト開始時にセットされた、と言います。


TextTrack オブジェクトの addCue(cue) メソッドは、呼び出されたら、次の手順を実行しなければいけません:

  1. テキストトラックのキューのリストがまだテキストトラックのレンダリングを更新する手順を関連付けていないなら、そのテキストトラックのキューのリストを、cue に応じたテキストトラックのレンダリングを更新する手順と関連付けます。

  2. テキストトラックのレンダリングを更新する手順に関連付けられたテキストトラックのキューのリストが、cue に応じたものと同じテキストトラックのレンダリングを更新する手順でないなら、InvalidStateError 例外を投げて、これらの手順を中止します。

  3. 指定の cueテキストトラックのキューのリストにあれば、そのテキストトラックのキューのリストから cue を削除します。

  4. cue を、このメソッドの TextTrack オブジェクトのテキストトラックテキストトラック・キュー・リストに加えます。

TextTrack オブジェクトの removeCue(cue)メソッドは、呼び出されたら、次の手順を実行しなければいけません:

  1. 指定の cue が、このメソッドの TextTrack オブジェクトのテキストトラックテキストトラック・キュー・リストにその時点でリストされていないなら、NotFoundError 例外を投げて、これらの手順を中止します。

  2. cue を、このメソッドの TextTrack オブジェクトのテキストトラックテキストトラック・キュー・リストから削除します。

この例では、audio 要素を使って、多くの音響効果を含んだサウンドファイルから特定の音響効果を再生します。キューを使ってオーディオの停止をすることで、正確にクリップの終わりで再生が止まります。たとえ、ブラウザーが何らかのスクリプトの実行でビジーだったとしてもです。もしページがオーディオの停止にスクリプトを頼っていたら、ブラウザーが指定の時間に正確にスクリプトを実行することができないと、次のクリップが聞こえ始めていたかもしれません。

var sfx = new Audio('sfx.wav');
var sounds = sfx.addTextTrack('metadata');

// 関係するサウンドを追加
function addFX(start, end, name) {
  var cue = new VTTCue(start, end, '');
  cue.id = name;
  cue.pauseOnExit = true;
  sounds.addCue(cue);
}
addFX(12.783, 13.612, '犬が吠える');
addFX(13.612, 15.091, '子猫がニャ~と鳴く'))

function playSound(id) {
  sfx.currentTime = sounds.getCueById(id).startTime;
  sfx.play();
}

// 可能な限り吠え声を再生
sfx.oncanplaythrough = function () {
  playSound('犬が吠える');
}
// ユーザーが離れようとしたときにニャ~と鳴く
window.onbeforeunload = function () {
  playSound('子猫がニャ~と鳴く');
  return '本当にこんなに凄いページから離れたいのかい?';
}

interface TextTrackCueList {
  readonly attribute unsigned long length;
  getter TextTrackCue (unsigned long index);
  TextTrackCue? getCueById(DOMString id);
};
cuelist . length

リストにあるキューの数を返します。

cuelist[index]

リストの中でインデックスが index となるテキストトラックキューを返します。キューはテキストトラックキュー順にソートされています。

cuelist . getCueById( id )

トラックキュー識別子 id を持った (テキストトラックキュー順で) 最初のテキストトラックキューを返します。

指定の識別子を持つキューがない、または、引数が空文字列なら、null を返します。

TextTrackCueList オブジェクトは、順番を持ったテキストトラックキューの動的な更新リストを表します。

length 属性は、TextTrackCueList オブジェクトによって表されるリストのキューの数を返さなければいけません。

TextTrackCueList オブジェクトの添字付きプロパティインデックスは、いかなる時点においても、0 から、TextTrackCueList オブジェクトによって表されるリストのキューの数から 1 を引いた数までの数字となります。リストにキューがなければ、添字付きプロパティインデックスはありません。

指定のインデックス index に対するインデックス化プロパティの値を決定するために、ユーザーエージェントは、TextTrackCueList オブジェクトによって表されるリストの index 番目のテキストトラックキューを返さなければいけません。

getCueById(id) メソッドは、空文字列でない引数とともに呼び出されたら、TextTrackCueList によって表されるリストのうち、テキストトラックキュー識別子id となるテキストトラックキューがあれば、その最初のものを返さなければいけません。なければ null を返さなければいけません。引数が空文字列なら、このメソッドは null を返さなければいけません。


interface TextTrackCue : EventTarget {
  readonly attribute TextTrack? track;

           attribute DOMString id;
           attribute double startTime;
           attribute double endTime;
           attribute boolean pauseOnExit;

           attribute EventHandler onenter;
           attribute EventHandler onexit;
};
cue . track

このテキストトラックキューが属する TextTrack オブジェクトがあれば、それを返し、なければ、null を返します。

cue . id [ = value ]

テキストトラックキュー識別子を返します。

セットすることができます。

cue . startTime [ = value ]

テキストトラックキュー開始時間を秒で返します。

セットすることができます。

cue . endTime [ = value ]

テキストトラックキュー終了時間を秒で返します。

セットすることができます。

cue . pauseOnExit [ = value ]

テキストトラックキュー終了時停止フラグがセットされているなら true を返し、そうでなければ false を返します。

セットすることができます。

track 属性は、取得時においては、キューのリストTextTrackCue オブジェクトが表すテキストトラックキューが見つかるテキストトラックがあれば、その TextTrack オブジェクトを返さなければいけません。なければ null を返さなければいけません。

id 属性は、取得時においては、TextTrackCue オブジェクトが表すテキストトラックキューテキストトラックキュー識別子を返さなければいけません。セット時においては、そのテキストトラックキュー識別子は新たな値にセットされなければいけません。

startTime 属性は、取得時においては、TextTrackCue オブジェクトが表すテキストトラックキューテキストトラックキュー開始時間を秒で返さなければいけません。セット時においては、そのテキストトラックキュー開始時間は新たな値を秒で解釈してセットされなければいけません。そして、TextTrackCue オブジェクトのテキストトラックキューテキストトラックキューのリストの中にあり、そのテキストトラックメディア要素テキストトラックのリストの中にあり、そのメディア要素ポスター表示フラグがセットされていないなら、そのメディア要素時間進行手順を実行しなければいけません。

endTime 属性は、取得時においては、TextTrackCue オブジェクトが表すテキストトラックキューテキストトラックキュー終了時間を秒で返さなければいけません。セット時においては、そのテキストトラックキュー終了時間は新たな値を秒で解釈してセットされなければいけません。そして、TextTrackCue オブジェクトのテキストトラックキューテキストトラックキューのリストの中にあり、そのテキストトラックメディア要素テキストトラックのリストの中にあり、そのメディア要素ポスター表示フラグがセットされていないなら、そのメディア要素時間進行手順を実行しなければいけません。

pauseOnExit 属性は、取得時においては、TextTrackCue オブジェクトが表すテキストトラックキューテキストトラックキュー終了時再生停止フラグがセットされているなら true を、そうでなければ false を返さなければいけません。セット時においては、新たな値が true なら、そのテキストトラックキュー終了時再生停止フラグはセットされなければいけません。そうでなければ解除されなければいけません。

4.7.10.12.6 チャプターを説明するテキストトラック

チャプターとは、指定のタイトルを伴うメディアリソースのセグメントのことです。ドキュメントのアウトラインのセクションが副セクションを持てるのと同じように、チャプターもネスト可能です。

チャプターを説明するために使われているテキストトラックテキストトラックキューは、それぞれ、3 つの主要な機能を持ちます。1 つ目は、テキストトラックキュー開始時間で、チャプターの開始時間を与えます。2 つ目は、テキストトラック終了時間で、チャプターの終了時間を与えます。3 つ目は、テキストトラックキューデータで、チャプターのタイトルを与えます。

The rules for constructing the chapter tree from a text track are as follows. They produce a potentially nested list of chapters, each of which have a start time, end time, title, and a list of nested chapters. This algorithm discards cues that do not correctly nest within each other, or that are out of order.

  1. Let list be a copy of the list of cues of the text track being processed.

  2. Remove from list any text track cue whose text track cue end time is before its text track cue start time.

  3. Let output be an empty list of chapters, where a chapter is a record consisting of a start time, an end time, a title, and a (potentially empty) list of nested chapters. For the purpose of this algorithm, each chapter also has a parent chapter.

  4. Let current chapter be a stand-in chapter whose start time is negative infinity, whose end time is positive infinity, and whose list of nested chapters is output. (This is just used to make the algorithm easier to describe.)

  5. Loop: If list is empty, jump to the step labeled end.

  6. Let current cue be the first cue in list, and then remove it from list.

  7. If current cue's text track cue start time is less than the start time of current chapter, then return to the step labeled loop.

  8. While current cue's text track cue start time is greater than or equal to current chapter's end time, let current chapter be current chapter's parent chapter.

  9. If current cue's text track cue end time is greater than the end time of current chapter, then return to the step labeled loop.

  10. Create a new chapter new chapter, whose start time is current cue's text track cue start time, whose end time is current cue's text track cue end time, whose title is current cue's text track cue data interpreted according to its rules for rendering the cue in isolation, and whose list of nested chapters is empty.

    For WebVTT, the rules for rendering the cue in isolation are the rules for interpreting WebVTT cue text. [WEBVTT]

  11. Append new chapter to current chapter's list of nested chapters, and let current chapter be new chapter's parent.

  12. Let current chapter be new chapter.

  13. Return to the step labeled loop.

  14. End: Return output.

次は WebVTT ファイルの抜粋ですが、チャプターをネストしてマークアップできる点を示しています。このファイルには 3 つの 50 分のチャプターが記述されており、それぞれは、"天体物理学", "計算物理学", "一般相対性理論" です。1 つ目は 3 つ、2 つ目は 4 つ、3 つ目は 2 つの副チャプターを持っています。 [WEBVTT]

WEBVTT

00:00:00.000 --> 00:50:00.000
天体物理学

00:00:00.000 --> 00:10:00.000
天体物理学の紹介

00:10:00.000 --> 00:45:00.000
太陽系

00:00:00.000 --> 00:10:00.000
講義の説明

00:50:00.000 --> 01:40:00.000
計算物理学

00:50:00.000 --> 00:55:00.000
プログラミングの紹介

00:55:00.000 --> 01:30:00.000
データ構造

01:30:00.000 --> 01:35:00.000
前回の試験の回答

01:35:00.000 --> 01:40:00.000
講義の説明

01:40:00.000 --> 02:30:00.000
一般相対性理論

01:40:00.000 --> 02:00:00.000
テンソル代数

02:00:00.000 --> 02:30:00.000
一般相対論的な場の方程式
4.7.10.12.7 イベント定義

次は、TextTrackList インタフェースを実装するすべてのオブジェクトにサポートされなければならないイベントハンドラ (そして対応するイベントハンドラのイベントタイプ) です。これらはイベントハンドラ IDL 属性としてサポートされなければなりません:

イベントハンドラ イベントハンドラのイベントタイプ
onchange change
onaddtrack addtrack
onremovetrack removetrack

次は、TextTrack インタフェースを実装するすべてのオブジェクトにサポートされなければならないイベントハンドラ (そして対応するイベントハンドラのイベントタイプ)です。これらはイベントハンドラ IDL 属性としてサポートされなければいけません:

イベントハンドラ イベントハンドラのイベントタイプ
oncuechange cuechange

次は、TextTrackCue インタフェースを実装するすべてのオブジェクトにサポートされなければならないイベントハンドラ (そして対応するイベントハンドラのイベントタイプ)です。これらはイベントハンドラ IDL 属性としてサポートされなければいけません:

イベントハンドラ イベントハンドラのイベントタイプ
onenter enter
onexit exit
4.7.10.13 ユーザーインタフェース

controls 属性は論理属性です。存在すれば、それは、ウェブ制作者はスクリプトベースのコントローラーを提供しておらず、ユーザーエージェントに自身が持つコントロールのセットを提供してほしい、ということを表します。

この属性が存在するなら、または、メディア要素に対してスクリプティングが無効なら、ユーザーエージェントはユーザーにユーザーインタフェースを表示するべきです。このユーザーインタフェースは、再生開始、一時停止、コンテンツの中の任意の位置へのシーク (そのコンテンツが任意の位置へのシークをサポートしている場合)、音量の変更、クローズドキャプションや組み込みの手話トラックの表示切替、別のオーディオトラックの選択や音声描画の有効化、ユーザーにとってより適した手段でメディアコンテンツを表示 (たとえばビデオをフルスクリーン表示したり、独立したリサイズ可能なウィンドウに表示するなど) する機能を含めるべきです。他のコントロールを利用可能にすることもできます。

メディア要素現在メディアコントローラーを持っているなら、ユーザーエージェントは、すべての従属メディア要素のオーディオトラックを見せるべきです (もし同じメディアリソースが複数回使われているなら、それらが重複しない形で)。このような形で見せられるメディアリソースのオーディオトラックに既知の名前がなく、それが特定のメディア要素だけのためのオーディオトラックなら、ユーザーエージェントは、その要素に title 属性があれば、それをそのトラックの名前として (または名前の一部として) 使うべきです。

しかし、この属性がなかったとしても、ユーザーエージェントは、そのメディアリソースの再生に影響を与えるためのコントロールを提供することができます (たとえば、再生、一時停止、シーク、音量調整)。しかし、そういった機能は、そのページの通常のレンダリングを妨げないようにするべきです。たとえば、そういった機能は、メディア要素のコンテキストメニューに表示することもできるでしょう。ユーザーエージェントは、 (たとえ controls 属性が存在していたとしても)、前述のようなユーザーインタフェースをユーザーに見せることによって、これを簡潔に実装することができます。

もしユーザーエージェントが、メディア要素上にコントロールを表示することで、ユーザーにユーザーインタフェースを見せるのであれば、ユーザーエージェントは、このインタフェースを処理している間は、あらゆるユーザー操作のイベントを抑止するべきです。(たとえば、ユーザーがビデオの再生コントロールをクリックしたら、そのページの要素で mousedown イベントなどは同時に発出されないことになります。)

可能な限り (とりわけ、再生の開始、停止、一時停止、再開や、シークや、再生レートの変更や、早送りや巻き戻しや、テキストトラックの一覧表示や有効化や無効化や、オーディオの音量のミュートや変更に対して)、ユーザーエージェントによって表示されるユーザーインタフェース機能は、前述の DOM API の観点で実装されなければいけません。こうすることで、たとえば、同じイベントすべてが発出されることになります。

メディア要素現在メディアコントローラーを持つとき、グループ全体の再生の一時停止と再開、シーク、再生レートの変更、早送りや巻き戻し、音量のミュートや変更に関して、ユーザーエージェントのユーザーインタフェースは、その現在メディアコントローラーでアクセスできる MediaController API の観点で、実装されなければいけません。また、メディア要素現在メディアコントローラーを持ち、その MediaController従属メディア要素すべてが一時停止されている場合は、ユーザーがユーザーエージェントのインタフェースのコントロールで再生開始を行ったときに、ユーザーエージェントは、すべての従属メディア要素の再生を再開するべきです。

ユーザーエージェントのインタフェースの "再生" 機能は、play() メソッドを呼び出す前に、playbackRate 属性を defaultPlaybackRate 属性の値にセットしなければいけません。メディア要素現在メディアコントローラーを持つ場合は、MediaController オブジェクト上のそれらの名前を持つ属性とメソッドが使われなければいけません。そうでない場合は、メディア要素上のそれらの名前を持つ属性とメソッドが使われなければいけません。

早送りや巻き戻しといった機能は、playbackRate 属性の変更のみによって実装されなければいけません (defaultPlaybackRate 属性ではありません)。また、メディア要素現在メディアコントローラーを持つ場合は、その MediaController オブジェクト上のそれらの名前を持つ属性が使われなければいけません。そうでない場合は、メディア要素上のそれらの名前を持った属性が使われなければいけません。

メディア要素現在メディアコントローラーを持つ場合、シークは、その MediaController オブジェクト上の currentTime 属性の観点で、実装されなければいけません。そうでない場合は、ユーザーエージェントは、そのメディア要素メディアタイムライン上の要求された位置に直接的にシークしなければいけません。任意の位置へのシークが遅くなってしまうメディアリソースに対しては、ユーザーがシークバーといった概位置インタフェースを操作することでシークするときは、ユーザーエージェントは、approximate-for-speed フラグを使うことが推奨されます。

メディア要素現在メディアコントローラーを持っているとき、ユーザーエージェントは、MediaController に影響をあたえることなしに、個別のメディア要素を直接的に操作するコントロールをユーザーに提供することもできます。しかし、そのような機能は、比較的先進的で、ほとんどのユーザーにとってはあまり役に立たないものと考えられています。

ユーザーにユーザーインタフェースを表示しているメディア要素アクティベーション・ビヘイビアは、次の手順を実行することでなければいけません:

  1. メディア要素現在メディアコントローラーを持っており、その現在メディアコントローラー抑制メディアコントローラーであるなら、MediaControllerplay() メソッドを呼び出します。

  2. そうではなく、メディア要素現在メディアコントローラーを持っており、その現在メディアコントローラー一時停止中メディアコントローラーであるなら、MediaControllerunpause() メソッドを呼び出します。

  3. そうではなく、メディア要素現在メディアコントローラーを持っており、その現在メディアコントローラー再生中メディアコントローラーであるなら、MediaControllerpause() メソッドを呼び出します。

  4. そうではなく、メディア要素現在メディアコントローラーを持っておらず、メディア要素paused 属性が true なら、そのメディア要素play() メソッドを呼び出します。

  5. そうではなく、メディア要素現在メディアコントローラーを持っておらず、メディア要素paused 属性が false なら、そのメディア要素pause() メソッドを呼び出します。

メディアリソースのチャプターを列挙する目的においては、メディア要素テキストトラックのリストのうち、表示中、かつ、テキストトラック種別chapters であるテキストトラックのみが使われるべきです。そのようなトラックは、テキストトラックからチャプターツリーを構成する規則に基づいて解釈されなければいけません。ユーザーがチャプター選択インタフェースを操作したことでシークするときには、ユーザーエージェントは、approximate-for-speed フラグを使うべきではありません。

controls IDL 属性は、同じ名前のコンテント属性を反映しなければいけません。


media . volume [ = value ]

現在の再生音量を数値で返します。その範囲は 0.0 から 1.0 の範囲で、0.0 は最低音量、1.0 は最大音量です。

値をセットして音量を変えることができます。

新たな値が 0.0 から 1.0 の範囲でなければ、IndexSizeError 例外を投げます。

media . muted [ = value ]

オーディオがミュートされていれば true を返します。これは volume 属性より優先します。volume 属性が採用されていれば false を返します。

値をセットして、オーディオがミュートされるかそうでないかを変えることができます。

volume 属性は、メディア要素の再生音量を、0.0 (無音) から 1.0 (最大音量) の範囲で返さなければいけません。当初は音量は 1.0 であるべきですが、ユーザーエージェントは、サイトごとなどセッションを通して最後にセットされた値を覚えておくなどして、別の値で音量を開始することができます。セット時においては、新たな値が 0.0 以上 1.0 以下なら、メディア要素の再生音量はその新たな値にセットされなければいけません。新たな値が 0.0 以上 1.0 以下の範囲でないなら、セット時において、IndexSizeError 例外が投げられなければいけません。

muted 属性は、オーディオ出力がミュートされているなら true を、そうでなければ false を返さなければいけません。当初はオーディオ出力はミュートされるべきではありません (false) が、ユーザーエージェントはサイトごとにセッションを通して最後にセットされた値を覚えておき、ミュート状態をミュートされているものとして開始することができます (true)。セット時においては、新たな値が true なら、そのオーディオ出力はミュートされるべきです。新たな値が false なら、ミュートは解除されるべきです。

volume または muted 属性のいずれかで返される値が変わるときは、ユーザージェントはそのメディア要素volumechange という名前のシンプルなイベントを発出するタスクをキューイングしなければいけません。

要素の実効メディア音量は次のとおりに決定されます:

  1. ユーザーエージェントは要素の音量を無視するようユーザーが指示していたなら、その要素の実効メディア音量は、ユーザーによって求められた音量となります。これらの手順を中止します。

  2. 要素のオーディオ出力がミュートされているなら、その要素の実効メディア音量は 0 です。これらの手順を中止します。

  3. 要素が現在メディアコントローラーを持ち、その MediaController オブジェクトのメディアコントローラー・ミュート優先が true なら、その要素の実効メディア音量は 0 となります。これらの手順を中止します。

  4. volume を、メディア要素のオーティオ再生音量とします。範囲は 0.0 (無音) から 1.0 (最大音量) の範囲です。

  5. 要素が現在メディアコントローラーを持つなら、volume に、その MediaController オブジェクトのメディアコントローラー音量乗数を掛けあわせます。

  6. 要素の実効メディア音量volume となります。0.0 から 1.0 までの範囲から相対的に解釈し、その間で大きいほど音量が大きくなり、0.0 は無音、1.0 は最大音量となります。この範囲は線形である必要はありません。最大音量の設定は、そのシステムで最も大音量の設定より低くすることができます。そうすれば、ユーザーは最大音量にセットできるでしょう。

メディア要素muted 属性は論理属性で、メディアリソースのオーディオ出力のデフォルトの状態を制御します。ユーザー設定より優先される場合があります。

メディア要素が生成されるとき、muted 属性が指定されていれば、ユーザーエージェントは、そのメディア要素のオーディオ出力を、ユーザー設定に優先して、ミュートしなければいけません。

defaultMuted IDL 属性は、muted コンテント属性を反映しなければいけません。

この属性は動的な効果を持ちません (これは要素のデフォルトの状態を制御するだけです)。

このビデオ (広告) は自動再生しますが、ユーザーに嫌がられないよう、サウンドを使わずに再生し、ユーザーがサウンドを有効にすることができるようにしています。

<video src="adverts.cgi?kind=video" controls autoplay loop muted></video>
4.7.10.14 時間範囲

TimeRanges インタフェースを実装するオブジェクトは、時間の範囲 (期間) のリストを表します。

interface TimeRanges {
  readonly attribute unsigned long length;
  double start(unsigned long index);
  double end(unsigned long index);
};
media . length

オブジェクトにある範囲の数を返します。

time = media . start(index)

指定のインデックスを持った範囲の開始の時間を返します。

インデックスが範囲外なら IndexSizeError 例外を投げます。

time = media . end(index)

指定のインデックスを持った範囲の終了の時間を返します。

インデックスが範囲外なら、IndexSizeError 例外を投げます。

length IDL 属性は、オブジェクトによって表された範囲の数を返さなければいけません。

start(index) メソッドは、オブジェクトによって表された index 番目の範囲の開始位置を、オブジェクトがカバーするタイムラインの開始から測った秒で返さなければいけません。

end(index) メソッドは、オブジェクトによって表された index 番目の範囲の終了位置を、オブジェクトがカバーするタイムラインの開始から測った秒で返さなければいけません。

これらのメソッドは、オブジェクトによって表される範囲の数以上の index で呼び出されたら、IndexSizeError 例外を投げなければいけません。

TimeRanges オブジェクトが正規化 TimeRanges オブジェクトだと言うとき、それが表す範囲は次の基準を満たさなければいけません:

  • 範囲の開始は、前にあるどの範囲の終了よりも大きくなければいけません。
  • 範囲の開始は、同じ範囲の終了より小さくなければいけません。

言い換えると、オブジェクトを並べたときに、それら範囲は重複せず、空ではなく、隣接しあうこともない、ということです (隣接した範囲は 1 つにまとめられて大きな範囲になります)。

TimeRanges オブジェクトの範囲は包括的でなければいけません。

ゆえに、範囲の終了は、次の隣接する (隣り合っているものの重複しない) 範囲の開始に等しくなります。同様に、0 に固定されたタイムライン全体をカバーする範囲の場合、その開始は 0 に等しく、終了はタイムラインの尺に等しくなります。

メディア要素buffered, seekable, played IDL 属性によって返されたオブジェクトによって使われるタイムラインは、その要素のメディアタイムラインでなければいけません。

4.7.10.15 イベント定義
[Constructor(DOMString type, optional TrackEventInit eventInitDict)]
interface TrackEvent : Event {
  readonly attribute (VideoTrack or AudioTrack or TextTrack) track;
};

dictionary TrackEventInit : EventInit {
  (VideoTrack or AudioTrack or TextTrack) track;
};
event . track

イベントが関係するトラックのオブジェクト (TextTrack, AudioTrack, VideoTrack) を返します。

track 属性は、それが初期化されたときの値を返さなければいけません。オブジェクトが生成されるとき、この属性は null に初期化されなければいけません。これは、イベントに対するコンテキスト情報を表します。

4.7.10.16 イベント概要

このセクションは非規定です。

前述の処理モデルの一環で、次のイベントがメディア要素で発出されます:

イベント名 インタフェース 発出されるとき 前提条件
loadstart Event ユーザーエージェントが、リソース選択アルゴリズムの一環で、メディアデータを探し始めるとき。 networkStateNETWORK_LOADING に等しい
progress Event ユーザーエージェントがメディアデータをフェッチしているとき。 networkStateNETWORK_LOADING に等しい
suspend Event ユーザーエージェントが意図的にメディアデータのフェッチを止めている。 networkStateNETWORK_IDLE に等しい
abort Event ユーザーエージェントが、エラーではない理由で、メディアデータを完全にダウンロードする前にフェッチを止めるとき。 error は、コード MEDIA_ERR_ABORTED を伴うオブジェクトです。networkStateNETWORK_EMPTYNETWORK_IDLE のいずれかで、それはダウンロードがいつ中止されたかに依ります。
error Event メディアデータのフェッチ中にエラーが発生したとき。 error は、MEDIA_ERR_NETWORK 以上のコードを伴うオブジェクトです。networkStateNETWORK_EMPTYNETWORK_IDLE のいずれかで、それはダウンロードがいつ中止されたかに依ります。
emptied Event networkState が以前には NETWORK_EMPTY 状態ではなかったメディア要素が、その状態に変わったとき (まさに報告しようとしていたロードで致命的なエラーが発生した、または、リソース選択アルゴリズムがすでに実行している間に load() メソッドが呼び出された、のいずれかの理由)。 networkStateNETWORK_EMPTY です。すべての IDL 属性は、その初期の状態にあります。
stalled Event ユーザーエージェントがメディアデータをフェッチしようとしているけれども、期待に反して、データがやってこないとき。 networkStateNETWORK_LOADING です。
loadedmetadata Event ユーザーエージェントがメディアリソースの尺と寸法を確定し、テキストトラックの準備ができたとき。 readyState は初めて新たに HAVE_METADATA 以上になります。
loadeddata Event ユーザーエージェントが、初めて現在再生時間メディアデータをレンダリングできるようになったとき。 readyState が初めて新たに HAVE_CURRENT_DATA 以上に増えることになります。
canplay Event ユーザーエージェントがメディアデータの再生を再開できるようになったとき。ただし、もし再生が今の時点で開始されることになった場合は、ユーザーエージェントは、コンテンツのバッファリングによる停止なしに、そのメディアリソースを現在再生レートで最後までレンダリングできないかもしれないと見積もっています。 readyState が新たに HAVE_FUTURE_DATA 以上に増えることになります。
canplaythrough Event もし再生が今の時点で開始されることになった場合は、コンテンツのバッファリングによる停止なしに、そのメディアリソースを現在再生レートで最後までレンダリングできるだろう、とユーザーエージェントが見積もったとき。 readyState が新たに HAVE_ENOUGH_DATA になります。
playing Event 停止された、または、メディアデータの不足によって遅延が出た後に、再生の開始の準備ができたとき。 readyState が新たに HAVE_FUTURE_DATA 以上になり、paused が false になる、または、paused が新たに false になり、readyStateHAVE_FUTURE_DATA 以下になります。たとえこのイベントが発出されてもなお、要素は潜在的に再生中となることはないでしょう。たとえば、要素が そのメディアコントローラーでブロックされている (たとえば、現在のメディアコントローラーが停止された、または、他の従属メディア要素が何かしらの理由でストールした、または、メディアリソースメディアコントローラーの位置に対応するデータがない、といった理由で)、または、要素がユーザー操作によって停止された、または、帯域内コンテンツのために停止された場合です。
waiting Event 次のフレームが手に入っていないという理由で再生が停止されたとき。ただし、ユーザーエージェントは、そのうちにそのフレームは利用できるようになると期待しています。 readyStateHAVE_CURRENT_DATA 以下になり、paused は false になります。seeking が true になる、または、buffered の範囲に現在再生位置が含まれていない、のいずれかになります。paused が false になることなしに、他の理由で再生が停止することは有り得ます。しかし、それらの理由でこのイベントが発出されることはありません (そして、それらの状況が解決するとき、別の playing イベントが発出されることもありません):たとえば、要素が新たにメディアコントローラーでブロックされた、または、再生が終了した、または、エラーによって再生が停止された、または、要素がユーザー操作で停止された、または、帯域内コンテンツのために停止された場合です。
seeking Event seeking IDL 属性が true に変わり、ユーザーエージェントが新たな位置にシークを開始したとき。
seeked Event 現在再生位置が変わった後に seeking IDL 属性が false に変わったとき。
ended Event メディアリソースの終わりに達したために再生が停止したとき。 currentTimeメディアリソースの終了位置と等しくなります。ended は true になります。
durationchange Event duration 属性がアップデートされたとき。
timeupdate Event 通常の再生の一環で、または、不連続に再生するなどの変わった方法で、現在再生位置が変わるとき。
play Event 要素がもう停止ではなくなったとき。play() メソッドが返ってきたあと、または、autoplay 属性によって再生が開始されたときに発出されます。 paused が新たに false になります。
pause Event 要素が停止されたとき。pause() メソッドが返ってきたときに発出されます。 paused が新たに true になります。
ratechange Event defaultPlaybackRateplaybackRate 属性のいずれかがアップデートされたとき。
resize Event videoWidthvideoHeight 属性の一方か両方がアップデートされたとき。 メディア要素video 要素です。readyStateHAVE_NOTHING ではありません。
volumechange Event volume 属性か muted 属性のいずれかが変わったとき。関連の属性のセッターが返ったあとに発出されます。

次のイベントが MediaController オブジェクトで発出されます:

イベント名 インタフェース 発出されるとき
emptied Event すべての従属メディア要素readyState が新たに HAVE_NOTHING 以上にセットされたとき、または、もう従属メディア要素がなくなったとき。
loadedmetadata Event すべての従属メディア要素readyState が新たに HAVE_METADATA 以上にセットされたとき。
loadeddata Event すべての従属メディア要素readyState が新たに HAVE_CURRENT_DATA 以上にセットされたとき。
canplay Event すべての従属メディア要素readyState が新たに HAVE_FUTURE_DATA 以上にセットされたとき。
canplaythrough Event すべての従属メディア要素readyState が新たに HAVE_ENOUGH_DATA 以上にセットされたとき。
playing Event MediaController がもうブロックされたメディアコントローラーでなくなったとき。
ended Event MediaController がすべての従属メディア要素の終わりに到達したとき。
waiting Event MediaControllerブロックされたメディアコントローラーになったとき。
ended Event すべての従属メディア要素が新たに再生を終えたとき。
durationchange Event duration 属性がアップデートされたとき。
timeupdate Event メディアコントローラーの位置が変わったとき。
play Event paused 属性が新たに false になったとき。
pause Event paused 属性が新たに true になったとき。
ratechange Event defaultPlaybackRate 属性か playbackRate 属性のいずれかがアップデートされたとき。
volumechange Event volume 属性か muted 属性のいずれかがアップデートされたとき。

次のイベントが、AudioTrackList, VideoTrackList, TextTrackList オブジェクトで発出されます:

イベント名 インタフェース 発出されるとき
change Event トラックリストの 1 つ以上のトラックが有効または無効になったとき。
addtrack TrackEvent トラックリストにトラックが追加されたとき。
removetrack TrackEvent トラックリストからトラックが削除されたとき。
4.7.10.17 セキュリティーとプライバシーの考慮

videoaudio 要素の主たるセキュリティーとプライバシー実装は、組み込まれるメディアのクロスオリジンの能力に起因します。脅威は 2 つの方向から起こりえます。悪意のあるコンテンツから犠牲になるページへの方向と、悪意のあるページから犠牲になるコンテンツへの方向です。


もし犠牲になるページが悪意のあるコンテンツを組み込んでいたら、そのコンテンツは、そのコンテンツを組み込んでいる Document と相互作用を試みるスクリプトコードを含むかもしれない、という点が脅威となります。これを回避するためには、ユーザーエージェントは、そのコンテンツから、それを組み込んでいるページへアクセスできないようにしなければいけません。DOM という概念を使うメディアコンテンツの場合、その組み込まれたコンテンツは、あたかも、無関係なトップレベル・ブラウジングコンテキストの中にいるかのように扱われなければいけません。

たとえば、もし SVG アニメーションが video 要素に組み込まれたとしたら、ユーザーエージェントは、それが外側のページの DOM にアクセスできないようにするでしょう。SVG リソースのスクリプトから見ると、その SVG ファイルは、親を持たない孤立したトップレベル・ブラウジングコンテキストにいるかのように見えるでしょう。


もし悪意のあるページが犠牲になるコンテンツを組み込んでいたならば、組み込んでいるページは、組み込んでなければ本来はアクセスできなかったコンテンツから情報を取得てきてしまう可能性がある点が脅威となります。メディアの存在、タイプ、尺、サイズ、そして、そのホストのパフォーマンス特性など、API からいくつかの情報にアクセスできます。そういった情報は問題になる可能性がありますが、実際には、多かれ少なかれ、img 要素でも同じような情報を取得することができますので、これは受け入れ可能と見なされてきました。

しかし、もしユーザーエージェントがサブタイトルやチャプターのタイトルといったコンテンツ内のメタデータにアクセスできるようにしていたなら、かなり重大な機密情報も取得できてしまうかもしれません。ゆえに、そういった情報は、ビデオリソースが CORS リソース共有チェックを通った場合にだけに、アクセス可能となります。crossorigin 属性は、このチェックがどのように実行されるのかをウェブ制作者が制御できるようにします。 [CORS]

この制約がないと、攻撃者はユーザーを騙して、会社のネットワークの中で、以前に漏洩した会社のイントラネット上のロケーションからビデオのロードを試みるサイトに訪問させようとするかもしれません。もしそのビデオに機密の新製品の計画が含まれていたら、サブタイトルが読めてしまうだけで、深刻な守秘義務違反を招いてしまうでしょう。

4.7.10.18 メディア要素を使うウェブ制作者向けのベストプラクティス

このセクションは非規定です。

セットトップボックスや携帯電話のような小さなデバイスでオーディオやビデオのリソースを再生すると、そのデバイスにおける限定されたハードウェアリソースによって制約を受けることがあります。たとえば、デバイスが同時に 3 つのビデオしかサポートしていないかもしれません。この場合、ビデオの再生が終わったら、メディア要素がつかんでいるリソースを開放するのが良いでしょう。要素へのすべての参照を削除して、ガベージコレクションの対象になるようにしたり、要素の src 属性と、その子孫にある source 要素を削除して、要素の load() メソッドを呼び出したりします。

同様に、再生レートがきっかり 1.0 でないとき、ハードウェア、ソフトウェア、フォーマットの制限によって、ビデオフレームが落ちたり、オーディオが途切れ途切れになったりミュートされたりすることが起こります。

4.7.10.19 メディア要素の実装者向けのベストプラクティス

このセクションは非規定です。

メディア要素 API がどれくらい正確に実装されるかは、実装品質の問題です。

たとえば、buffered 属性の実装で、実装がどれくらい正確にバッファリングした範囲を報告するかは、ユーザーエージェントがどれくらい注意深くデータを調べるのかによります。API は時間として範囲を報告しますが、そのデータはバイトストリームで取得されるゆえに、可変ビットレートのストリームを受信するユーザーエージェントは、そのデータのすべてを実際にデコードするまで、正確な時間を判定することができないかもしれません。ユーザーエージェントはそうすることは求められません。代わりに、推定 (たとえば、それまでの平均ビットレートから推定するなど) を返すことができます。この推定は、より多くの情報が得られたら補正されます。

一般的な規則として、ユーザーエージェントは、楽観的ではなく保守的であることが強く求められます。たとえば、すべてがバッファリングされていないにも関わらず、そうなったと報告するのは良くありません。

他に実装品質の問題が出るのは、コーデックが正方向の再生にしか対応していないにも関わらず、ビデオを巻き戻し再生する場合でしょう (たとえば、キーフレームが多くないため、それらが離れており、その間にあるフレームは前のフレームからの差分しか持たない場合)。ユーザーエージェントは、キーフレームしか表示できないなど、これをうまくこなせないかもしれません。しかし、実装が良ければ、もっといろいろやって、うまくこなすでしょう。たとえば、ビデオを正方向に実際に再生し、フレームをすべて保存しておいてから、それらフレームを逆方向に再生するのかもしれません。

同様に、実装では、いつでもバッファリングされたデータを落としてもよいことになっていますが (ユーザーエージェントがメディア要素の生存期間の間に取得したメディアデータすべてを保持し続けなければならないという要件はありません)、それも実装品質の問題です。ユーザーエージェントがすべてのデータを保持し続けるに十分なリソースを持っているなら、そうすることが推奨されます。なぜなら、そうすることでユーザー体験が良くなるからです。たとえば、ユーザーがライブのストリーミングを見ていたとしましょう。ユーザーエージェントは、ユーザーにライブのビデオを見せるだけでしょうが、もっと出来の良いユーザーエージェントなら、すべてをバッファリングして、ユーザーが以前の素材にシークしたり、一時停止したり、早送りや巻き戻ししたりできるようにするでしょう。

複数のトラックが MediaController's で同期されているとき、スクリプトから MediaController's の従属メディア要素のリストに要素を追加したり削除したりすることができます。たとえ、それらのトラックが再生中だとしてもです。そのような状況でどれくらいスムーズにメディアが再生できるかも、実装品質の問題となります。


停止されているメディア要素ドキュメントから削除され、次にイベントループが回ってくるまでには再挿入されないなら、リソースに制約を持つ実装は、その機会を使って、そのメディア要素によって使われているすべてのハードウェアリソース (ビデオプレーンやネットワーキングリソースやデータバッファーなど) を開放することが推奨されます。 (とはいえ、ユーザーエージェントは、後に再開する場合にそなえ、そのトラックの再生位置などは維持しておかなければいけません。)


※ 原文:http://www.w3.org/TR/2014/REC-html5-20141028/embedded-content-0.html#media-elements