Javascript <;音频>;标签到音频缓冲区-可能吗?

Javascript <;音频>;标签到音频缓冲区-可能吗?,javascript,html,audio,web-audio-api,Javascript,Html,Audio,Web Audio Api,我的javascript webApp首先读取一个简短的mp3文件,并在其中找到静音间隙(出于导航目的),然后播放相同的mp3文件,提示它从一个或另一个静音结束的地方开始。这与通常的webAudio场景不同,webAudio场景旨在授权访问流中当前正在播放的音频数据(而不是整个曲目) 要使我的Web应用程序正常工作,我必须读取/访问mp3文件两次: 通过XMLHttpRequest读取整个MP3文件并将其放入音频缓冲区,随后我可以使用audioContext.decodeAudioData()对

我的javascript webApp首先读取一个简短的mp3文件,并在其中找到静音间隙(出于导航目的),然后播放相同的mp3文件,提示它从一个或另一个静音结束的地方开始。这与通常的webAudio场景不同,webAudio场景旨在授权访问流中当前正在播放的音频数据(而不是整个曲目)

要使我的Web应用程序正常工作,我必须读取/访问mp3文件两次:

  • 通过
    XMLHttpRequest
    读取整个MP3文件并将其放入音频缓冲区,随后我可以使用
    audioContext.decodeAudioData()
    对其进行解码-如下所述:
  • 通过指定

  • Q:目前是否有任何方法可以声明
    关于
    createMediaElementSource
    ,但我不知道如何使用它来获取
    音频缓冲区

    在进行第一次XHR时,请输入一个blob:

    xhr.responseType = 'blob'
    
    然后从中取出一个ArrayBuffer:

    var arrayBuffer;
    var fileReader = new FileReader();
    fileReader.onload = function() {
        arrayBuffer = this.result;
    };
    fileReader.readAsArrayBuffer(blob);
    
    和往常一样,用它来解码音频数据,得到音频缓冲区。现在可以进行处理了

    然后,处理完成后,将blob作为源提供给标记,当您想要播放它时,它将正常工作:

     audio.src = window.URL.createObjectURL(blob);
    

    您可能需要使用webkit供应商前缀作为URL的前缀,我不记得他们是否实现了非固定版本。不管怎么说,水滴是最好的选择

    谢谢,但是我想你错过了我问题中的一句话,那就是“不诉诸XMLHttpRequest”这是不可能的。标记的语义是流式的、缓存在磁盘上的、不透明的资源。音频缓冲区的语义是本地的、解码的、平面的、非常快速的访问、存储在内存中的数据。你可以在前者中使用后者,但是,出于明显的原因,不是相反。你有没有用过它?没有,我没有试一下