Chrome:播放正在通过fetch/XHR下载的视频
Chrome: to play a video that is being downloaded via fetch/XHR
我想要实现的是使Chrome加载视频文件作为数据(通过Fetch API, XHR,无论什么),并使用<video>
播放它,而它仍然被下载而不发出两个单独的请求相同的URL,而不等待,直到文件完全下载。
很容易从Fetch API (response.body
)中获得ReadableStream
,但我找不到将其输入video
元素的方法。我已经弄清楚我需要一个blob
URL,它可以使用MediaSource
对象创建。然而,SourceBuffer#appendStream
方法,这听起来像是需要的,并没有在Chrome中实现,所以我不能将流直接连接到MediaSource
对象。
我可能会读取流块,从中创建Uint8Array
s,并使用SourceBuffer#appendBuffer
,但这意味着播放不会立即开始,除非块大小真的很小。而且感觉就像手工做一些所有这些api都应该能够开箱即用的事情。如果没有其他的解决方案,我走这条路,我应该期待什么警告?
是否可能有其他方法来创建一个blob URL的ReadableStream
?或者是否有办法使fetch
和<video>
共享一个请求?有那么多新的api,我很容易错过一些。
经过几个小时的实验,找到了一个半途而的解决方案:
const video = document.getElementById('audio');
const mediaSource = new MediaSource();
video.src = window.URL.createObjectURL(mediaSource);
mediaSource.addEventListener('sourceopen', async () => {
const sourceBuffer = mediaSource.addSourceBuffer('audio/webm; codecs="opus"');
const response = await fetch(audioSRC);
const body = response.body
const reader = body.getReader()
let streamNotDone = true;
while (streamNotDone) {
const {value, done} = await reader.read();
if (done) {streamNotDone = false; break;}
await new Promise((resolve, reject) => {
sourceBuffer.appendBuffer(value)
sourceBuffer.onupdateend = (() => {
resolve(true);
})
})
}
});
使用https://developer.mozilla.org/en-US/docs/Web/API/MediaSource
另外,我只测试了webm/opus格式,但我相信它应该也适用于其他格式,只要你指定它。
相关文章:
- fetch() 函数未在 Ubuntu Chromium 浏览器上定义
- 当json解析空响应时,Whatwg-Fetch失败,我该如何防止它
- 中止POST XHR可靠
- IE11中的第二个调用取消了第一个Fetch API调用
- Dojo XHR将200 OK视为错误
- Chrome扩展:XHR后关闭窗口
- ajaxStart和ajaxStop等同于fetch API
- XHR不适用于聊天应用程序
- Backbone fetch中的Ajax在fetch调用退出后完成,因此fetch调用中没有成功/失败事件
- 是否可以缓存可下载的文件,并在XHR和非XHR请求之间共享该缓存
- 通过XHR请求将MYSQL数组从PHP返回到Javascript
- 将GET参数添加到q.io.xhr
- Winjs.xhr、Visual Studio和脱机服务器
- 如何使用Redux Thunk处理fetch()响应中的错误
- 访问通过XHR.onreadystatechange回调中的XHR.send(data)发送的数据
- 如何检索AMD的XHR响应代码(+时间戳)'大型Dojo
- 正在发送请求中包含数组的qx.io.request.Xhr请求
- 如何在使用Backbone'进行AJAX请求时访问XHR对象;s Fetch()
- Chrome:播放正在通过fetch/XHR下载的视频
- 是二进制文件(pdf, word, excel, ppt, mp3,..)下载可能使用XHR或fetch