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.
<div id="interfaceDiagram" style="display: inline-block; position: relative; width: 100%; padding-bottom: 11.666666666666666%; vertical-align: middle; overflow: hidden;"><svg style="display: inline-block; position: absolute; top: 0; left: 0;" viewbox="-50 0 600 70" preserveAspectRatio="xMinYMin meet"><a xlink:href="https://developer.mozilla.org/en-US/docs/Web/API/EventTarget" target="_top"><rect x="1" y="1" width="110" height="50" fill="#fff" stroke="#D4DDE4" stroke-width="2px" /><text x="56" y="30" font-size="12px" font-family="Consolas,Monaco,Andale Mono,monospace" fill="#4D4E53" text-anchor="middle" alignment-baseline="middle">EventTarget</text></a><polyline points="111,25 121,20 121,30 111,25" stroke="#D4DDE4" fill="none"/><line x1="121" y1="25" x2="151" y2="25" stroke="#D4DDE4"/><a xlink:href="https://developer.mozilla.org/en-US/docs/Web/API/MediaSource" target="_top"><rect x="151" y="1" width="110" height="50" fill="#F4F7F8" stroke="#D4DDE4" stroke-width="2px" /><text x="206" y="30" font-size="12px" font-family="Consolas,Monaco,Andale Mono,monospace" fill="#4D4E53" text-anchor="middle" alignment-baseline="middle">MediaSource</text></a></svg></div>
a:hover text { fill: #0095DD; pointer-events: all;}
Constructor
MediaSource()- Constructs and returns a new
MediaSourceobject with no associated source buffers.
Properties
MediaSource.sourceBuffersRead only- Returns a
SourceBufferListobject containing the list ofSourceBufferobjects associated with thisMediaSource. MediaSource.activeSourceBuffersRead only- Returns a
SourceBufferListobject containing a subset of theSourceBufferobjects contained withinMediaSource.sourceBuffers— the list of objects providing the selected video track, enabled audio tracks, and shown/hidden text tracks. MediaSource.readyStateRead 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 receiveSourceBufferobjects (open), or attached but the stream has been ended viaMediaSource.endOfStream()(ended.) MediaSource.duration- Gets and sets the duration of the current media being presented.
Event handlers
MediaSource.onsourceclose- The event handler for the
sourcecloseevent. MediaSource.onsourceended- The event handler for the
sourceendedevent. MediaSource.onsourceopen- The event handler for the
sourceopenevent.
Methods
Inherits methods from its parent interface, EventTarget.
MediaSource.addSourceBuffer()- Creates a new
SourceBufferof the given MIME type and adds it to theMediaSource.sourceBufferslist. MediaSource.clearLiveSeekableRange()- Clears a seekable range privious set with a call to
setLiveSeekableRange(). MediaSource.endOfStream()- Signals the end of the stream.
MediaSource.removeSourceBuffer()- Removes the given
SourceBufferfrom theMediaSource.sourceBufferslist. MediaSource.setLiveSeekableRange()- Sets the range that the user can seek to in the media element.
Static methods
MediaSource.isTypeSupported()- Returns a
Booleanvalue indicating if the given MIME type is supported by the current user agent — this is, if it can successfully createSourceBufferobjects 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
| Desktop | Mobile | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Basic support | Chrome
Full support
31
| Edge Full support Yes | Firefox
Full support
42
| IE
Full support
11
| Opera Full support 15 | Safari Full support 8 | WebView Android Full support 4.4.3 | Chrome Android Full support 33 | Edge Mobile Full support Yes | Firefox Android Full support 41 | Opera Android Full support 30 | Safari iOS No support No | Samsung Internet Android Full support Yes |
MediaSource | Chrome
Full support
31
| Edge Full support Yes | Firefox
Full support
42
| IE
Full support
11
| Opera Full support 15 | Safari Full support 8 | WebView Android Full support 4.4.3 | Chrome Android Full support 33 | Edge Mobile Full support Yes | Firefox Android Full support 41 | Opera Android Full support 30 | Safari iOS No support No | Samsung Internet Android Full support Yes |
sourceBuffers | Chrome
Full support
31
| Edge Full support 12 | Firefox
Full support
42
| IE
Full support
11
| Opera Full support 15 | Safari Full support 8 | WebView Android Full support 4.4.3 | Chrome Android Full support 33 | Edge Mobile Full support Yes | Firefox Android Full support 41 | Opera Android Full support 30 | Safari iOS No support No | Samsung Internet Android Full support Yes |
activeSourceBuffers | Chrome
Full support
31
| Edge Full support 12 | Firefox
Full support
42
| IE
Full support
11
| Opera Full support 15 | Safari Full support 8 | WebView Android Full support 4.4.3 | Chrome Android Full support 33 | Edge Mobile Full support Yes | Firefox Android Full support 41 | Opera Android Full support 30 | Safari iOS No support No | Samsung Internet Android Full support Yes |
readyState | Chrome
Full support
31
| Edge Full support 12 | Firefox
Full support
42
| IE
Full support
11
| Opera Full support 15 | Safari Full support 8 | WebView Android Full support 4.4.3 | Chrome Android Full support 33 | Edge Mobile Full support Yes | Firefox Android Full support 41 | Opera Android Full support 30 | Safari iOS No support No | Samsung Internet Android Full support Yes |
duration | Chrome
Full support
31
| Edge Full support 12 | Firefox
Full support
42
| IE
Full support
11
| Opera Full support 15 | Safari Full support 8 | WebView Android Full support 4.4.3 | Chrome Android Full support 33 | Edge Mobile Full support Yes | Firefox Android Full support 41 | Opera Android Full support 30 | Safari iOS No support No | Samsung Internet Android Full support Yes |
onsourceclose | Chrome Full support 53 | Edge Full support 17 | Firefox
Full support
42
| IE
Full support
11
| Opera Full support 15 | Safari Full support 8 | WebView Android Full support 4.4.3 | Chrome Android Full support 33 | Edge Mobile Full support Yes | Firefox Android Full support 41 | Opera Android Full support 30 | Safari iOS No support No | Samsung Internet Android Full support Yes |
onsourceended | Chrome Full support 53 | Edge Full support 17 | Firefox
Full support
42
| IE
Full support
11
| Opera Full support 15 | Safari Full support 8 | WebView Android Full support 4.4.3 | Chrome Android Full support 33 | Edge Mobile Full support Yes | Firefox Android Full support 41 | Opera Android Full support 30 | Safari iOS No support No | Samsung Internet Android Full support Yes |
onsourceopen | Chrome Full support 53 | Edge Full support 17 | Firefox
Full support
42
| IE
Full support
11
| Opera Full support 15 | Safari Full support 8 | WebView Android Full support 4.4.3 | Chrome Android Full support 33 | Edge Mobile No support No | Firefox Android Full support 41 | Opera Android Full support 30 | Safari iOS No support No | Samsung Internet Android Full support Yes |
addSourceBuffer | Chrome
Full support
31
| Edge Full support 12 | Firefox
Full support
42
| IE
Full support
11
| Opera Full support 15 | Safari Full support 8 | WebView Android Full support 4.4.3 | Chrome Android Full support 33 | Edge Mobile Full support Yes | Firefox Android Full support 41 | Opera Android Full support 30 | Safari iOS No support No | Samsung Internet Android Full support Yes |
removeSourceBuffer | Chrome
Full support
31
| Edge Full support 12 | Firefox
Full support
42
| IE
Full support
11
| Opera Full support 15 | Safari Full support 8 | WebView Android Full support 4.4.3 | Chrome Android Full support 33 | Edge Mobile Full support Yes | Firefox Android Full support 41 | Opera Android Full support 30 | Safari iOS No support No | Samsung Internet Android Full support Yes |
endOfStream | Chrome
Full support
31
| Edge Full support 12 | Firefox
Full support
42
| IE
Full support
11
| Opera Full support 15 | Safari Full support 8 | WebView Android Full support 4.4.3 | Chrome Android Full support 33 | Edge Mobile Full support Yes | Firefox Android Full support 41 | Opera Android Full support 30 | Safari iOS No support No | Samsung Internet Android Full support Yes |
setLiveSeekableRange | Chrome Full support 62 | Edge No support No | Firefox No support No | IE No support No | Opera Full support 49 | Safari No support No | WebView Android Full support 62 | Chrome Android Full support 62 | Edge Mobile ? | Firefox Android ? | Opera Android Full support 49 | Safari iOS ? | Samsung Internet Android No support No |
clearLiveSeekableRange | Chrome Full support 62 | Edge Full support 17 | Firefox No support No | IE No support No | Opera Full support 49 | Safari No support No | WebView Android Full support 62 | Chrome Android Full support 62 | Edge Mobile ? | Firefox Android ? | Opera Android Full support 49 | Safari iOS ? | Samsung Internet Android No support No |
isTypeSupported | Chrome
Full support
31
| Edge Full support 12 | Firefox
Full support
42
| IE
Full support
11
| Opera Full support 15 | Safari Full support 8 | WebView Android Full support 4.4.3 | Chrome Android Full support 33 | Edge Mobile Full support Yes | Firefox Android Full support 41 | Opera Android Full support 30 | Safari iOS No support No | Samsung Internet Android Full support Yes |
Legend
- Full support
- Full support
- No support
- No support
- Compatibility unknown
- Compatibility unknown
- Experimental. Expect behavior to change in the future.
- Experimental. Expect behavior to change in the future.
- See implementation notes.
- See implementation notes.
- User must explicitly enable this feature.
- User must explicitly enable this feature.
- Requires a vendor prefix or different name for use.
- Requires a vendor prefix or different name for use.