我有两个音频文件,必须一个接一个地播放.为此,我使用XHR下载了这两个文件
var xhr = new XMLHttpRequest(); xhr.open('GET', fileURL, true); xhr.responseType = 'arraybuffer'; xhr.onload = function () { data = new Uint8Array(xhr.response); //... other handling code };
并从他们那里构建了一个Blob
var blob = new Blob([data], {type: 'video/mp4'})
这些我用来构建Blob URL
var url = URL.createObjectURL(blob)
然后将其注入标签.(
audioDOM.src = url;
)
此过程适用于Chrome和Firefox.但IE11有时会给我一个问题,它会显示以下通知:
通过关闭为其创建的blob来撤消一个或多个blob URL.这些URL将不再解析,因为已释放支持URL的数据.
然而,最奇怪的部分是它对第一个文件起作用(在IE中),但对第二个文件不起作用.它们都对整个过程使用相同的代码,只需使用不同的代码即可fileURL
.这两个文件都存在,已正确下载并已记录到控制台进行验证.
我试图在构造blob之前复制数据,但似乎并不重要:错误仍然存在.
有谁知道导致问题的原因以及如何解决问题?
在sbgoran之后编辑:整个脚本在单个文档上运行,该文档未被重新加载.我仍然感到困惑,为什么会这样.我确实设法通过在音频无法加载时循环和创建新URL来创建变通方法,但这不是一个可行的解决方案.奇怪的是,上述方法随机失败:有时URL在加载到标签时可用,有时则不是.
除了sbgoran的回答,我还有一个可能的原因-作为WHATWG的邮件列表上的讨论,有一个在IE浏览器导致的Blob进行垃圾回收时,指向它的变量超出范围的错误-即使仍然存在对象的网址指向尚未撤销的Blob.
只要需要对象URL,解决方法就可以依赖于保留变量中的原始Blob对象,然后使变量无效并随后撤消其对象URL.