javascript - XMLHttpRequest 分块下载大型 HTML5 视频?

标签 javascript xmlhttprequest html5-video buffer blob

我正在尝试使用 XMLHttpRequest 将大型视频加载到标签中。我已经使用以下代码成功地将其用于小型视频文件:

window.URL = window.URL || window.webkitURL;

var xhr = new XMLHttpRequest();
xhr.open('GET', 'quicktest.mp4', true);
xhr.responseType = 'blob';
xhr.onload = function(e) {
var video = document.createElement('video');
video.src = window.URL.createObjectURL(this.response);
video.autoplay = true;
document.body.appendChild(video);
};
xhr.send();

如果视频很小没问题。但是,我的文件非常大,会产生内存不足错误,导致 Chrome 崩溃。 Firefox 甚至都不会完成加载。经过几个小时的搜索,我看到了两个单独的实例,有人建议“分块下载文件”,然后将它们放回一起,然后再将其发送到标签,我什至发现了一个非常 promising solution 的实例。处理这个非常精确的场景。但是,对于实现此解决方法,我完全不知所措。如果有人能给我指出正确的方向……实现此修复需要什么,或任何其他事情,我将非常感激。

如果好奇为什么我什至费心使用 XHR 加载视频。我想自动播放我的大视频,但 Chrome 总是跳枪并立即开始播放它,认为它可以播放整个视频而不需要问题(不可靠的“canplaythrough”事件),我似乎无法找到让 Chrome 在播放前缓冲整个视频的方法。所以我求助于 XHR,但没有运气。

最佳答案

不幸的是,浏览器需要在这种情况下进行如此多的复制 - 代码看起来应该可以工作,因为您正在创建一个 blob URL 而不是一个超长的 dataURI 字符串。但是果然,这个方法很慢。然而,还有另一种解决方案应该可以满足您的需求,而不会影响 XHR。

创建一个视频元素并将 src 设置为您的 mp4(或 webm for firefox)文件。为“进度”事件添加一个监听器,该事件应在浏览器下载文件时定期触发。在该监听器中,您可以检查 buffered 属性以查看已下载了多少视频,并自行决定是否准备好开始播放。

现在,它变得有点丑陋了。即使有预加载,浏览器仍然只会缓冲一小部分视频,可能与触发 canplaythrough 所需的缓冲量大致相同。您只会收到一两个进度事件,然后什么也没有。因此,当您创建视频元素时,将其设置为 autoplay,然后将其隐藏并静音。这应该会强制浏览器下载视频的其余部分并触发更多的 progress 事件。当它完全缓冲或足以让您满意时,将 currentTime 设置回零,取消静音和取消隐藏。

关于javascript - XMLHttpRequest 分块下载大型 HTML5 视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19645363/

相关文章:

包含两个对象的 Javascript xhr 帖子正文

excel - 如何VBA发送异步XMLHTTP请求?

javascript - 获取调用的方法名和传入的参数

javascript - 对于法语,JQuery 对十进制数字的验证失败

javascript - 如何在文件 .jsx 中使用 React.js 突出显示页面中的代码行?

javascript - 如何扩展 jquery jqXHR 对象

javascript - 用 JavaScript 模拟 cut 函数?

html - HTML 5 中的视频捕获

javascript - HTML5 视频 : Detecting Bandwidth

javascript - 结束事件 videojs 不工作