MediaSource - 表示 HTMLMediaElement 对象的媒体数据源
这是一个实验中的功能
此功能某些浏览器尚在开发中,请参考浏览器兼容性表格以得到在不同浏览器中适合使用的前缀。由于该功能对应的标准文档可能被重新修订,所以在未来版本的浏览器中该功能的语法和行为可能随之改变。
MediaSource
是 Media Source Extensions API 的接口,表示 HTMLMediaElement
对象的媒体数据源。可以将 MediaSource
对象附加到要在用户代理中播放的 HTMLMediaElement
。
构造函数
MediaSource()
构造并返回一个没有关联源缓冲区的新 MediaSource
对象。
属性
MediaSource.sourceBuffers
只读
返回一个 SourceBufferList
对象,其中包含与此 MediaSource
关联的 SourceBuffer
对象的列表。
MediaSource.activeSourceBuffers
只读
返回一个 SourceBufferList
对象,其中包含 MediaSource.sourceBuffers
中包含的 SourceBuffer
对象的子集 - 提供的对象列表选定的视频轨道,启用的音轨和显示/隐藏的文本轨道。
MediaSource.readyState
只读
返回一个表示当前 MediaSource
状态的枚举,包括了它当前是否附加到媒体元素(closed
),已附加并准备接收 SourceBuffer
对象(open
),或已附加但流已被 MediaSource.endOfStream()
结束(ended
)。
MediaSource.duration
获取并设置当前媒体的持续时间。
事件处理程序
MediaSource.onsourceclose
sourceclose
事件的事件处理程序。
MediaSource.onsourceended
sourceended
事件的事件处理程序。
MediaSource.onsourceopen
sourceopen
事件的事件处理程序。
方法
从其父接口 EventTarget
继承了方法。
MediaSource.addSourceBuffer()
创建给定 MIME 类型的新 SourceBuffer
并将其添加到 MediaSource.sourceBuffers
列表中。
MediaSource.clearLiveSeekableRange()
通过调用 setLiveSeekableRange()
清除可搜索范围的私有集。
MediaSource.endOfStream()
通知流已结束。
MediaSource.removeSourceBuffer()
从 MediaSource.sourceBuffers
列表中删除给定的 SourceBuffer
。
MediaSource.setLiveSeekableRange()
设置用户可以在 media 元素中查找的范围。
静态方法
MediaSource.isTypeSupported()
返回一个 Boolean
值,指示当前用户代理是否支持给定的 MIME 类型 - 即它是否可以成功创建该 MIME 类型的 SourceBuffer
对象。
实例
以下简单实例使用 XMLHttpRequest
加载视频,并尽快播放。这个例子是由 Nick Desaulniers 编写的,可以在这里查看(你也可以下载源代码进一步查看。)
var video = document.querySelector('video');
var assetURL = 'frag_bunny.mp4';
// 需要为 Blink 指定编解码器
// ./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();
};
规范
规范 | 状态 | 备注 |
---|---|---|
Media Source Extensions MediaSource 的定义 |
候选推荐 | 初始定义。 |
桌面浏览器兼容性
特性 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
基础支持 | 31 23 — 31 -webkit- | 支持 | 42 25 — 421 | 112 | 15 | 8 |
MediaSource | 31 23 — 31 -webkit- | 支持 | 42 25 — 421 | 112 | 15 | 8 |
sourceBuffers | 31 23 — 31 -webkit- | 12 | 42 25 — 421 | 112 | 15 | 8 |
activeSourceBuffers | 31 23 — 31 -webkit- | 12 | 42 25 — 421 | 112 | 15 | 8 |
readyState | 31 23 — 31 -webkit- | 12 | 42 25 — 421 | 112 | 15 | 8 |
duration | 31 23 — 31 -webkit- | 12 | 42 25 — 421 | 112 | 15 | 8 |
onsourceclose | 53 | 17 | 42 25 — 421 | 112 | 15 | 8 |
onsourceended | 53 | 17 | 42 25 — 421 | 112 | 15 | 8 |
onsourceopen | 53 | 17 | 42 25 — 421 | 112 | 15 | 8 |
addSourceBuffer | 31 23 — 31 -webkit- | 12 | 42 25 — 421 | 112 | 15 | 8 |
removeSourceBuffer | 31 23 — 31 -webkit- | 12 | 42 25 — 421 | 112 | 15 | 8 |
endOfStream | 31 23 — 31 -webkit- | 12 | 42 25 — 421 | 112 | 15 | 8 |
setLiveSeekableRange | 62 | 不支持 | 不支持 | 不支持 | 49 | 不支持 |
clearLiveSeekableRange | 62 | 17 | 不支持 | 不支持 | 49 | 不支持 |
isTypeSupported | 31 23 — 31 -webkit- | 12 | 42 25 — 421 | 112 | 15 | 8 |
移动浏览器兼容性
特性 | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
基础支持 | 33 | 33 | 支持 | 41 | 未知 | 30 | 不支持 |
MediaSource | 33 | 33 | 支持 | 41 | 未知 | 30 | 不支持 |
sourceBuffers | 33 | 33 | 支持 | 41 | 未知 | 30 | 不支持 |
activeSourceBuffers | 33 | 33 | 支持 | 41 | 未知 | 30 | 不支持 |
readyState | 33 | 33 | 支持 | 41 | 未知 | 30 | 不支持 |
duration | 33 | 33 | 支持 | 41 | 未知 | 30 | 不支持 |
onsourceclose | 33 | 33 | 支持 | 41 | 未知 | 30 | 不支持 |
onsourceended | 33 | 33 | 支持 | 41 | 未知 | 30 | 不支持 |
onsourceopen | 33 | 33 | 17 | 41 | 未知 | 30 | 不支持 |
addSourceBuffer | 33 | 33 | 支持 | 41 | 未知 | 30 | 不支持 |
removeSourceBuffer | 33 | 33 | 支持 | 41 | 未知 | 30 | 不支持 |
endOfStream | 33 | 33 | 支持 | 41 | 未知 | 30 | 不支持 |
setLiveSeekableRange | 62 | 62 | 未知 | 未知 | 未知 | 49 | 未知 |
clearLiveSeekableRange | 62 | 62 | 未知 | 未知 | 未知 | 49 | 未知 |
isTypeSupported | 33 | 33 | 支持 | 41 | 未知 | 30 | 不支持 |
1. 限制支持白名单中的网站,例如 YouTube,Netflix 和其他热门流媒体网站。默认情况下,在 Firefox 42 中启用了 Media Source Extensions 时,白名单会被删除。
2. 仅适用于 Windows 8+。