Javascript 通过XMLHttpRequest预加载音频文件

Javascript 通过XMLHttpRequest预加载音频文件,javascript,audio,xmlhttprequest,mp3,Javascript,Audio,Xmlhttprequest,Mp3,我目前正在尝试通过浏览器中的XMLHttpRequest预加载MP3文件,并在音频播放器中播放。音频文件直接在播放器中设置时播放。因此,我必须在处理响应时出错 loadAudio : function(playerId, source) { var player = document.getElementById(playerId); var request = new XMLHttpRequest(); request.onreadystatechange = func

我目前正在尝试通过浏览器中的XMLHttpRequest预加载MP3文件,并在音频播放器中播放。音频文件直接在播放器中设置时播放。因此,我必须在处理响应时出错

loadAudio : function(playerId, source) {
    var player = document.getElementById(playerId);
    var request = new XMLHttpRequest();
    request.onreadystatechange = function() {
        console.log('readyState: ' + request.readyState + ', status: ' + request.status)
        if (this.readyState == 4 && this.status == 200) {
            console.log(request.getAllResponseHeaders());
            var blob = new Blob( [request.response] );
            var url = URL.createObjectURL( blob );
            player.src = url;
            player.addEventListener('loaded', function(e) {
                URL.revokeObjectURL(player.src);
            });
            player.play();
        // Typical action to be performed when the document is ready:
        }
    };
    request.open("GET", source, true);
    request.send();
}
我收到以下错误消息:

解复用器\u错误\u无法\u打开:FFmpegDemuxer:打开上下文失败(代码4)

有人知道哪里可以找到错误吗? 谢谢您的回答。

试试这个:

var blob = new Blob( [ request.response], { type: "audio/mp3" } );
var url = null;

if ( window.webkitURL ) {
    url = window.webkitURL.createObjectURL(blob);
} else if ( window.URL && window.URL.createObjectURL ) {
    url = window.URL.createObjectURL(blob);
}
player.addEventListener('loaded', function(e) {
    URL.revokeObjectURL(url);
});
player.addEventListener('load', function(e) {
    URL.revokeObjectURL(url);
});
player.src = url;

您可以尝试将ajax请求中的响应类型设置为blob

loadAudio : function(playerId, source) {
    var player = document.getElementById(playerId);
    var request = new XMLHttpRequest();
    request.onreadystatechange = function() {
        console.log('readyState: ' + request.readyState + ', status: ' + request.status)
        if (this.readyState == 4 && this.status == 200) {
            var url = URL.createObjectURL( request.response);
            player.src = url;
            player.addEventListener('loaded', function(e) {
                URL.revokeObjectURL(player.src);
            });
            player.play();
        // Typical action to be performed when the document is ready:
        }
    };
    request.open("GET", source, true);
    request.responseType = 'blob';
    request.send();
}

你好谢谢你的回答。如果我没看错的话,您只需将URL替换为webkitURL并设置不同的内容类型。不幸的是,这两个更改都没有帮助。您好。谢谢你的回答。当我用blob构造函数填充括号时,它就工作了。添加了“request.responseType='blob';”确实很有帮助。到目前为止,我认为像MP3这样的文件总是以流的形式发送。