This is an experimental technology
Check the Browser compatibility table carefully before using this in production.

The MediaSource interface of the Media Source Extensions API represents a source of media data for an HTMLMediaElement object. A MediaSource object can be attached to a HTMLMediaElement to be played in the user agent.

Constructor

MediaSource()
Constructs and returns a new MediaSource object with no associated source buffers.

Properties

MediaSource.sourceBuffers Read only
Returns a SourceBufferList object containing the list of SourceBuffer objects associated with this MediaSource.
MediaSource.activeSourceBuffers Read only
Returns a SourceBufferList object containing a subset of the SourceBuffer objects contained within MediaSource.sourceBuffers — the list of objects providing the selected video track,  enabled audio tracks, and shown/hidden text tracks.
MediaSource.readyState Read only
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 SourceBuffer objects (open), or attached but the stream has been ended via MediaSource.endOfStream() (ended.)
MediaSource.duration
Gets and sets the duration of the current media being presented.

Event handlers

MediaSource.onsourceclose
The event handler for the sourceclose event.
MediaSource.onsourceended
The event handler for the sourceended event.
MediaSource.onsourceopen
The event handler for the sourceopen event.

Methods

Inherits methods from its parent interface, EventTarget.

MediaSource.addSourceBuffer()
Creates a new SourceBuffer of the given MIME type and adds it to the MediaSource.sourceBuffers list.
MediaSource.removeSourceBuffer()
Removes the given SourceBuffer from the MediaSource.sourceBuffers list.
MediaSource.endOfStream()
Signals the end of the stream.
MediaSource.setLiveSeekableRange()
Sets the range that the user can seek to in the media element.
MediaSource.clearLiveSeekableRange()
Clears the live seekable range.

Static methods

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

Examples

The following simple example loads a video with XMLHttpRequest, 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
Media Source Extensions
The definition of 'MediaSource' in that specification.
Recommendation Initial definition.

Browser compatibility

FeatureChromeEdgeFirefoxInternet ExplorerOperaSafari
Basic support

31

23 — 31 -webkit-

Yes

42

25 — 421 2

113158
MediaSource

31

23 — 31 -webkit-

Yes

42

25 — 421 2

113158
sourceBuffers

31

23 — 31 -webkit-

12

42

25 — 421 2

113158
activeSourceBuffers

31

23 — 31 -webkit-

12

42

25 — 421 2

113158
readyState

31

23 — 31 -webkit-

12

42

25 — 421 2

113158
duration

31

23 — 31 -webkit-

12

42

25 — 421 2

113158
onsourceclose

31

23 — 31 -webkit-

Yes

42

25 — 421 2

113158
onsourceended

31

23 — 31 -webkit-

Yes

42

25 — 421 2

113158
onsourceopen

31

23 — 31 -webkit-

Yes

42

25 — 421 2

113158
addSourceBuffer

31

23 — 31 -webkit-

12

42

25 — 421 2

113158
removeSourceBuffer

31

23 — 31 -webkit-

12

42

25 — 421 2

113158
endOfStream

31

23 — 31 -webkit-

12

42

25 — 421 2

113158
setLiveSeekableRange62 No No No49 No
clearLiveSeekableRange62 No No No49 No
isTypeSupported

31

23 — 31 -webkit-

12

42

25 — 421 2

113158
FeatureAndroid webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
Basic support3333 Yes4130 No Yes
MediaSource3333 Yes4130 No Yes
sourceBuffers3333 Yes4130 No Yes
activeSourceBuffers3333 Yes4130 No Yes
readyState3333 Yes4130 No Yes
duration3333 Yes4130 No Yes
onsourceclose3333 Yes4130 No Yes
onsourceended3333 Yes4130 No Yes
onsourceopen3333 Yes4130 No Yes
addSourceBuffer3333 Yes4130 No Yes
removeSourceBuffer3333 Yes4130 No Yes
endOfStream3333 Yes4130 No Yes
setLiveSeekableRange6262 ? ?49 ? No
clearLiveSeekableRange6262 ? ?49 ? No
isTypeSupported3333 Yes4130 No Yes

1. Limited support to a whitelist of sites, for example YouTube, Netflix, and other popular streaming sites. The whitelist was removed when Media Source Extensions was enabled by default in Firefox 42.

2. From version 25 until version 42 (exclusive): this feature is behind the media.mediasource.enabled preference. To change preferences in Firefox, visit about:config.

3. Only works on Windows 8+.

See also

Document Tags and Contributors

 Last updated by: fscholz,