Javascript 不使用“快速解码Html5音频”;createMediaElementSource“;

Javascript 不使用“快速解码Html5音频”;createMediaElementSource“;,javascript,web-audio-api,Javascript,Web Audio Api,我使用的是WebAudioAPI的“createMediaElementSource”,它可以在Firefox(Gecko)和Chrome(Blink)上正常工作,但不能在Safari(Webkit)上正常工作。这对我来说是个大问题,因为我更喜欢从我的Html5音频播放器获取音频,而不是使用XMLHttpRequests,因为后者太慢了 我所做的第一次尝试是从audio标记中获取源代码作为字符串,并将其作为XMLHttpRequest中的url。正如预期的那样,它可以工作,但解码速度非常慢,我不

我使用的是WebAudioAPI的“createMediaElementSource”,它可以在Firefox(Gecko)和Chrome(Blink)上正常工作,但不能在Safari(Webkit)上正常工作。这对我来说是个大问题,因为我更喜欢从我的Html5音频播放器获取音频,而不是使用XMLHttpRequests,因为后者太慢了

我所做的第一次尝试是从audio标记中获取源代码作为字符串,并将其作为XMLHttpRequest中的url。正如预期的那样,它可以工作,但解码速度非常慢,我不能用stop()暂停音频,因为恢复会导致在听到之前对整个文件进行另一轮事先解码

stackoverflow用户Kevin Ennis给了我一个非常好的建议:

您可以将音频分解为多个较小的文件。喜欢 可能会将其分解成4个独立的1MB音频文件并加载到 秩序。然后可以在加载第一个后开始播放,然后 在播放的同时,你加载其他的

我的问题是,技术上我如何做到这一点?我不知道有什么函数可以检查音频文件是否完成

我想会是这样的:

    var source = document.getElementByTagName["audio"][0].src;
    var fileExt = source.indexOf('.');
    var currentFile = 1;

    if(decodeCurrentData == complete) {
        currentFile += 1;
        source = source.slice(0, fileExt) + "_part" + currentFile.toString() + ".mp3";
        loadAudioFile();
    }

        var loadAudioFile = function () {
              var request = new XMLHttpRequest();
              request.open( "GET", "source", true );
              request.responseType = "arraybuffer";
              request.onload = function (){
                context.decodeAudioData(request.response, function (buffer) {
                  convolver.buffer = buffer;
                });
              };
              request.send();
            };
     loadAudioFile();

我的想法行得通还是彻底失败?您建议我如何处理较长的解码时间?

您不需要检查它是否完成-您只需要提前安排它应该完成的时间。(不管怎样,这是获得样本精确调度的唯一方法,您需要使用这种方法。)此外,我要指出,您需要小心-MP3解码有时会根据解码器的不同而增加长度,在不同的系统上会有所不同。decodeAudioData被指定为重新采样,因此,如果文件采样率与上下文采样率不匹配,则用于很好地组合在一起的片段可能不再平滑。