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
元素的方法。我想我需要一个blob
URL,它可以使用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下载的视频
基础教程推荐
- 当用户滚动离开时如何暂停 youtube 嵌入 2022-01-01
- 在 JS 中获取客户端时区(不是 GMT 偏移量) 2022-01-01
- 响应更改 div 大小保持纵横比 2022-01-01
- 角度Apollo设置WatchQuery结果为可用变量 2022-01-01
- 悬停时滑动输入并停留几秒钟 2022-01-01
- Karma-Jasmine:如何正确监视 Modal? 2022-01-01
- 有没有办法使用OpenLayers更改OpenStreetMap中某些要素 2022-09-06
- 我什么时候应该在导入时使用方括号 2022-01-01
- 在for循环中使用setTimeout 2022-01-01
- 动态更新多个选择框 2022-01-01