简体   繁体   English

通过XMLHttpRequest预加载音频文件

[英]Pre-load audio file via XMLHttpRequest

I am currently trying to pre-load an MP3 file via an XMLHttpRequest in the browser and play it in the audio player. 我目前正在尝试通过XMLHttpRequest在浏览器中预加载MP3文件并在音频播放器中播放。 The audio file is played when set directly in the player. 直接在播放器中设置时播放音频文件。 Therefore, I must have an error when processing the response. 因此,在处理响应时我必须出错。

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();
}

I receive the following error message: 我收到以下错误消息:

DEMUXER_ERROR_COULD_NOT_OPEN: FFmpegDemuxer: open context failed (code 4) DEMUXER_ERROR_COULD_NOT_OPEN:FFmpegDemuxer:打开上下文失败(代码4)

Does anyone have any idea where to find the error? 有谁知道在哪里找到错误? Thank you for your answers. 谢谢您的回答。

Try this: 尝试这个:

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;

You can try setting the response type in your ajax request to blob. 您可以尝试将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();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM