Chrome: to play a video that is being downloaded via fetch/XHR(Chrome:播放正在通过FETCH/XHR下载的视频)
问题描述
我想要实现的是让Chrome将视频文件加载为数据(通过Fetch API、XHR等等),并在下载过程中使用<video>播放视频文件,而无需对同一URL发出两个单独的请求,也无需等待文件完全下载。
从FETCH API(response.body)获取ReadableStream很容易,但是我找不到将其提供给video元素的方法。我想我需要一个blobURL,它可以使用MediaSource对象创建。但是,在Chrome中没有实现SourceBuffer#appendStream方法,它听起来正是所需的,因此我不能将流直接连接到MediaSource对象。
Uint8Array,并使用SourceBuffer#appendBuffer,但这意味着回放不会立即开始,除非块大小非常小。而且感觉像是手动做一些所有这些API都应该开箱即用就能做的事情。如果没有其他解决方案,我走这条路,我应该期待什么警告?
是否有其他方法可以为ReadableStream创建BLOB URL?或者有没有办法让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格式进行了测试,但我相信它也可以与其他格式一起使用只要您指定它。
这篇关于Chrome:播放正在通过FETCH/XHR下载的视频的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Chrome:播放正在通过FETCH/XHR下载的视频
基础教程推荐
- 带角度的选项卡:仅使用 $http 在单击时加载选项卡 2022-01-01
- 逻辑运算符 ||在 javascript 中,0 代表 Boolean false? 2022-01-01
- 当木偶师打开Chrome时,不能使用Chrome扩展 2022-01-01
- 最佳动态 JavaScript/JQuery 网格 2022-01-01
- 即使每次插入第一个输入的值不同,第二个输入仍显示相同的输入值 2022-01-01
- 在 Javascript 中使用 Fetch API 上传文件并显示进度 2022-01-01
- 从快速中间件中排除路由 2022-01-01
- 使用 jQuery 在悬停时交换 DIV 类 2022-01-01
- CORS:当凭据标志为真时,无法在 Access-Control-Allow-Origin 中使用通配符 2022-01-01
- HTML5 画布调整为父级 2022-01-01
