Please note, this is a STATIC archive of website developer.mozilla.org from 03 Nov 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

Revision 935897 of MediaSource

  • Revision slug: Web/API/MediaSource
  • Revision title: MediaSource
  • Revision id: 935897
  • Created:
  • Creator: chrisdavidmills
  • Is current revision? No
  • Comment

Revision Content

{{APIRef("Media Source Extensions")}}{{SeeCompatTable}}

The MediaSource interface represents a source of media data for an {{domxref("HTMLMediaElement")}} object. A MediaSource object can be attached to a {{domxref("HTMLMediaElement")}} to be played in the user agent.

Constructor

{{domxref("MediaSource.MediaSource", "MediaSource()")}}
Constructs and returns a new MediaSource object with no associated source buffers.

Properties

Inherits properties from its parent interface, {{domxref("EventTarget")}}.

{{domxref("MediaSource.sourceBuffers")}} {{readonlyInline}}
Returns a {{domxref("SourceBufferList")}} object containing the list of {{domxref("SourceBuffer")}} objects associated with this MediaSource.
{{domxref("MediaSource.activeSourceBuffers")}} {{readonlyInline}}
Returns a {{domxref("SourceBufferList")}} object containing a subset of the {{domxref("SourceBuffer")}} objects contained within {{domxref("SourceBuffers")}} — the list of objects providing the selected video track,  enabled audio tracks, and shown/hidden text tracks.
{{domxref("MediaSource.readyState")}} {{readonlyInline}}
Returns an enum representing the state of the current MediaSource, whether it is not currently attached to a media element (closed), attached and ready to receive {{domxref("SourceBuffer")}} objects (open), or attached but the stream has been ended via {{domxref("MediaSource.endOfStream()")}} (ended.)
{{domxref("MediaSource.duration")}}
Gets and sets the duration of the current media being presented.

Methods

Inherits properties from its parent interface, {{domxref("EventTarget")}}.

{{domxref("MediaSource.addSourceBuffer()")}}
Creates a new {{domxref("SourceBuffer")}} of the given MIME type and adds it to the MediaSource's {{domxref("SourceBuffers")}} list.
{{domxref("MediaSource.removeSourceBuffer()")}}
Removes the given {{domxref("SourceBuffer")}} from the {{domxref("SourceBuffers")}} list associated with this MediaSource object.
{{domxref("MediaSource.endOfStream()")}}
Signals the end of the stream.

Static methods

{{domxref("MediaSource.isTypeSupported()")}}
Returns a {{domxref("Boolean")}} value indicating if the given MIME type is supported by the current user agent — this is, if it can successfully create {{domxref("SourceBuffer")}} objects for that MIME type.

Examples

The following simple example loads a video chunk by chunk as fast as possible, playing it as soon as it can. This example was written by Nick Desaulniers and can be viewed live here (you can also download the source for further investigation.)

var video = document.querySelector('video');

var assetURL = 'frag_bunny.mp4';
// Need to be specific for Blink regarding codecs
// ./mp4info frag_bunny.mp4 | grep Codec
var mimeCodec = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"';

if ('MediaSource' in window && MediaSource.isTypeSupported(mimeCodec)) {
  var mediaSource = new MediaSource;
  //console.log(mediaSource.readyState); // closed
  video.src = URL.createObjectURL(mediaSource);
  mediaSource.addEventListener('sourceopen', sourceOpen);
} else {
  console.error('Unsupported MIME type or codec: ', mimeCodec);
}

function sourceOpen (_) {
  //console.log(this.readyState); // open
  var mediaSource = this;
  var sourceBuffer = mediaSource.addSourceBuffer(mimeCodec);
  fetchAB(assetURL, function (buf) {
    sourceBuffer.addEventListener('updateend', function (_) {
      mediaSource.endOfStream();
      video.play();
      //console.log(mediaSource.readyState); // ended
    });
    sourceBuffer.appendBuffer(buf);
  });
};

function fetchAB (url, cb) {
  console.log(url);
  var xhr = new XMLHttpRequest;
  xhr.open('get', url);
  xhr.responseType = 'arraybuffer';
  xhr.onload = function () {
    cb(xhr.response);
  };
  xhr.send();
};

Specifications

Specification Status Comment
{{SpecName('Media Source Extensions', '#mediasource', 'MediaSource')}} {{Spec2('Media Source Extensions')}} Initial definition.

Browser compatibility

{{CompatibilityTable}}
Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
Basic support 23 {{CompatGeckoDesktop("25.0")}}[1]
{{CompatGeckoDesktop("42.0")}}
11[2] 15 8
Feature Android Firefox Mobile (Gecko) Firefox OS (Gecko) IE Phone Opera Mobile Safari Mobile
Basic support 4.4.4

{{CompatNo}}

{{CompatNo}} 11 30 {{CompatNo}}

[1] Available after switching the about:config preference media.mediasource.enabled to true. In addition, support was limited to a whitelist of sites, for example YouTube, Netflix, and other popular streaming sites. The whitelist was removed and Media Source Extensions was enabled by default in 42+ for all sites.

[2] Only works on Windows 8+.

See also

  • {{domxref("SourceBuffer")}}
  • {{domxref("SourceBufferList")}}

Revision Source

<p>{{APIRef("Media Source Extensions")}}{{SeeCompatTable}}</p>

<p>The <strong><code>MediaSource</code></strong> interface represents a source of media data for an {{domxref("HTMLMediaElement")}} object. A <code>MediaSource</code> object can be attached to a {{domxref("HTMLMediaElement")}} to be played in the user agent.</p>

<h2 id="Constructor">Constructor</h2>

<dl>
 <dt>{{domxref("MediaSource.MediaSource", "MediaSource()")}}</dt>
 <dd>Constructs and returns a new <code>MediaSource</code> object with no associated source buffers.</dd>
</dl>

<h2 id="Properties">Properties</h2>

<p><em>Inherits properties from its parent interface, {{domxref("EventTarget")}}.</em></p>

<dl>
 <dt>{{domxref("MediaSource.sourceBuffers")}} {{readonlyInline}}</dt>
 <dd>Returns a {{domxref("SourceBufferList")}} object containing the list of {{domxref("SourceBuffer")}} objects associated with this <code>MediaSource</code>.</dd>
 <dt>{{domxref("MediaSource.activeSourceBuffers")}} {{readonlyInline}}</dt>
 <dd>Returns a {{domxref("SourceBufferList")}} object containing a subset of the&nbsp;{{domxref("SourceBuffer")}} objects contained within {{domxref("SourceBuffers")}} — the list of objects providing the selected video track,&nbsp; enabled audio tracks, and shown/hidden text tracks.</dd>
 <dt>{{domxref("MediaSource.readyState")}} {{readonlyInline}}</dt>
 <dd>Returns an enum representing the state of the current <code>MediaSource</code>, whether it is not currently attached to a media element (<code>closed</code>), attached and ready to receive {{domxref("SourceBuffer")}} objects (<code>open</code>), or attached but the stream has been ended via {{domxref("MediaSource.endOfStream()")}} (<code>ended</code>.)</dd>
 <dt>{{domxref("MediaSource.duration")}}</dt>
 <dd>Gets and sets the duration of the current media being presented.</dd>
</dl>

<dl>
</dl>

<dl>
</dl>

<h2 id="Methods">Methods</h2>

<p><em>Inherits properties from its parent interface, {{domxref("EventTarget")}}.</em></p>

<dl>
 <dt>{{domxref("MediaSource.addSourceBuffer()")}}</dt>
 <dd>Creates a new {{domxref("SourceBuffer")}} of the given MIME type and adds it to the <code>MediaSource</code>'s {{domxref("SourceBuffers")}} list.</dd>
 <dt>{{domxref("MediaSource.removeSourceBuffer()")}}</dt>
 <dd>Removes the given {{domxref("SourceBuffer")}} from the {{domxref("SourceBuffers")}} list associated with this <code>MediaSource</code> object.</dd>
 <dt>{{domxref("MediaSource.endOfStream()")}}</dt>
 <dd>Signals the end of the stream.</dd>
 <dt>
 <h2 id="Static_methods">Static methods</h2>
 </dt>
 <dt>{{domxref("MediaSource.isTypeSupported()")}}</dt>
 <dd>Returns a {{domxref("Boolean")}} value indicating if the given MIME type is supported by the current user agent — this is, if it can successfully create {{domxref("SourceBuffer")}} objects for that MIME type.</dd>
</dl>

<h2 id="Examples">Examples</h2>

<p>The following simple example loads a video chunk by chunk as fast as possible, playing it as soon as it can. This example was written by Nick Desaulniers and can be <a href="https://nickdesaulniers.github.io/netfix/demo/bufferAll.html">viewed live here</a> (you can also <a href="https://github.com/nickdesaulniers/netfix/blob/gh-pages/demo/bufferAll.html">download the source</a> for further investigation.)</p>

<pre class="brush: js">
var video = document.querySelector('video');

var assetURL = 'frag_bunny.mp4';
// Need to be specific for Blink regarding codecs
// ./mp4info frag_bunny.mp4 | grep Codec
var mimeCodec = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"';

if ('MediaSource' in window &amp;&amp; MediaSource.isTypeSupported(mimeCodec)) {
  var mediaSource = new MediaSource;
  //console.log(mediaSource.readyState); // closed
  video.src = URL.createObjectURL(mediaSource);
  mediaSource.addEventListener('sourceopen', sourceOpen);
} else {
  console.error('Unsupported MIME type or codec: ', mimeCodec);
}

function sourceOpen (_) {
  //console.log(this.readyState); // open
  var mediaSource = this;
  var sourceBuffer = mediaSource.addSourceBuffer(mimeCodec);
  fetchAB(assetURL, function (buf) {
    sourceBuffer.addEventListener('updateend', function (_) {
      mediaSource.endOfStream();
      video.play();
      //console.log(mediaSource.readyState); // ended
    });
    sourceBuffer.appendBuffer(buf);
  });
};

function fetchAB (url, cb) {
  console.log(url);
  var xhr = new XMLHttpRequest;
  xhr.open('get', url);
  xhr.responseType = 'arraybuffer';
  xhr.onload = function () {
    cb(xhr.response);
  };
  xhr.send();
};</pre>

<h2 id="Specifications">Specifications</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">Specification</th>
   <th scope="col">Status</th>
   <th scope="col">Comment</th>
  </tr>
  <tr>
   <td>{{SpecName('Media Source Extensions', '#mediasource', 'MediaSource')}}</td>
   <td>{{Spec2('Media Source Extensions')}}</td>
   <td>Initial definition.</td>
  </tr>
 </tbody>
</table>

<h2 id="Browser_compatibility">Browser compatibility</h2>

<div>{{CompatibilityTable}}</div>

<div id="compat-desktop">
<table class="compat-table">
 <tbody>
  <tr>
   <th>Feature</th>
   <th>Chrome</th>
   <th>Firefox (Gecko)</th>
   <th>Internet Explorer</th>
   <th>Opera</th>
   <th>Safari (WebKit)</th>
  </tr>
  <tr>
   <td>Basic support</td>
   <td>23</td>
   <td>{{CompatGeckoDesktop("25.0")}}<sup>[1]</sup><br />
    {{CompatGeckoDesktop("42.0")}}</td>
   <td>11<sup>[2]</sup></td>
   <td>15</td>
   <td>8</td>
  </tr>
 </tbody>
</table>
</div>

<div id="compat-mobile">
<table class="compat-table">
 <tbody>
  <tr>
   <th>Feature</th>
   <th>Android</th>
   <th>Firefox Mobile (Gecko)</th>
   <th>Firefox OS (Gecko)</th>
   <th>IE Phone</th>
   <th>Opera Mobile</th>
   <th>Safari Mobile</th>
  </tr>
  <tr>
   <td>Basic support</td>
   <td>4.4.4</td>
   <td>
    <p>{{CompatNo}}</p>
   </td>
   <td>{{CompatNo}}</td>
   <td>11</td>
   <td>30</td>
   <td>{{CompatNo}}</td>
  </tr>
 </tbody>
</table>
</div>

<p>[1] Available after switching the <code>about:config</code> preference <code>media.mediasource.enabled</code> to <code>true</code>. In addition, support was limited to a whitelist of sites, for example YouTube, Netflix, and other popular streaming sites. The whitelist was removed and Media Source Extensions was enabled by default in 42+ for all sites.</p>

<p>[2] Only works on Windows 8+.</p>

<h2 id="See_also">See also</h2>

<ul>
 <li>{{domxref("SourceBuffer")}}</li>
 <li>{{domxref("SourceBufferList")}}</li>
</ul>
Revert to this revision