Javascript 使用Web音频API将音频数据解码为外部二进制数据

Javascript 使用Web音频API将音频数据解码为外部二进制数据,javascript,mp3,web-audio-api,Javascript,Mp3,Web Audio Api,我搜索了相关问题,但找不到任何相关信息 我正试图让Web Audio API播放另一个文件容器中编码的mp3文件,因此我目前所做的是解析所述容器,并将结果二进制数据(arraybuffer)提供给audioContext.decodeAudioData方法,该方法假定接受任何类型的包含音频数据的arraybuffer。但是,它总是抛出错误回调 我对我正在做的事情只有一点点的了解,所以可能整个方法都是错误的。也许这是不可能的 你们中有人试过这样的东西吗?感谢您的帮助 下面是一些代码,试图更好地说明

我搜索了相关问题,但找不到任何相关信息

我正试图让Web Audio API播放另一个文件容器中编码的mp3文件,因此我目前所做的是解析所述容器,并将结果二进制数据(arraybuffer)提供给audioContext.decodeAudioData方法,该方法假定接受任何类型的包含音频数据的arraybuffer。但是,它总是抛出错误回调

我对我正在做的事情只有一点点的了解,所以可能整个方法都是错误的。也许这是不可能的

你们中有人试过这样的东西吗?感谢您的帮助

下面是一些代码,试图更好地说明这一点。以下仅存储arraybuffer:

newFile: function(filename){
    var that=this;
    var oReq = new XMLHttpRequest();
    oReq.open("GET", filename, true);
    oReq.responseType = "arraybuffer";
    oReq.onload = function (oEvent) {
      var arrayBuffer = oReq.response; // 
      if (arrayBuffer) {
        that.arrayBuffer=arrayBuffer;
        that.parsed=true;
      }
    };
    oReq.send(null);
这就是我在解码部分所做的:

newTrack: function(tracknumber){
    var that=this;
    var arraybuffer=Parser.arrayBuffer;
    that.audioContext.decodeAudioData(arraybuffer,function(buffer){
        var track={};
        track.trackBuffer=buffer;
        track.isLoaded=true;
        track.trackSource=null;
        track.gainNode=that.audioContext.createGainNode(); 
        that.tracklist.push(track);

        },alert('error'));
其中Parser是一个对象文本,我用它来解析和存储arraybuffer(它有newFile函数)


因此,总而言之,我不知道我是做错了什么,还是根本做不到。

没有这个容器,我不确定
解码音频数据
如何知道它是MP3。或者比特率是多少。或者有多少频道。或者很多其他相当重要的信息。基本上,您需要告诉
解码音频数据
如何解释ArrayBuffer

在客户端,我唯一能想到的就是尝试使用Blob。基本上,您必须自己编写头,然后在将其传递到
decodeAudioData
之前
readAsArrayBuffer

如果您有兴趣尝试一下,这里有一个规范:

下面是RecorderJS,它将向您展示如何创建Blob(尽管它编写RIFF/WAV头文件而不是MP3):

您需要查看
encodeWAV
方法


无论如何,如果可以的话,我强烈建议您在服务器上解决这个问题。

错误回调
不是一个函数,您只需调用一个警报,请尝试将其包装在一个匿名函数中。是的,我知道,它只是用来检查decodeAudioData是否有效:)正如您所拥有的,无论decodeAudioData成功与否,警报都会触发。哦,我的上帝,你在开玩笑吗?这就是问题所在吗?我不太明白为什么,如果解码不成功,它不应该激发第三个参数上的任何东西吗?谢谢我以后再试试。你不是以回调的形式传递函数,而是立即调用函数,传递的是警报的返回值,它是未定义的。我解决了这个问题,最终问题与我发布的内容完全无关,但奇怪的是,decodeAudioData不需要任何类型的指示,只要它是一种有效的可接受音频元素格式,就可以知道要传递的缓冲区类型。我知道应该在服务器上做得更好,但这只是一个实验。无论如何,谢谢你的意见,我接受你的答案,因为这是目前唯一的答案。