Javascript 使用Web音频API将音频数据解码为外部二进制数据
我搜索了相关问题,但找不到任何相关信息 我正试图让Web Audio API播放另一个文件容器中编码的mp3文件,因此我目前所做的是解析所述容器,并将结果二进制数据(arraybuffer)提供给audioContext.decodeAudioData方法,该方法假定接受任何类型的包含音频数据的arraybuffer。但是,它总是抛出错误回调 我对我正在做的事情只有一点点的了解,所以可能整个方法都是错误的。也许这是不可能的 你们中有人试过这样的东西吗?感谢您的帮助 下面是一些代码,试图更好地说明这一点。以下仅存储arraybuffer:Javascript 使用Web音频API将音频数据解码为外部二进制数据,javascript,mp3,web-audio-api,Javascript,Mp3,Web Audio Api,我搜索了相关问题,但找不到任何相关信息 我正试图让Web Audio API播放另一个文件容器中编码的mp3文件,因此我目前所做的是解析所述容器,并将结果二进制数据(arraybuffer)提供给audioContext.decodeAudioData方法,该方法假定接受任何类型的包含音频数据的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不需要任何类型的指示,只要它是一种有效的可接受音频元素格式,就可以知道要传递的缓冲区类型。我知道应该在服务器上做得更好,但这只是一个实验。无论如何,谢谢你的意见,我接受你的答案,因为这是目前唯一的答案。