Javascript 如何使用web audio api获得audiotrack样本的正确振幅(不播放)

Javascript 如何使用web audio api获得audiotrack样本的正确振幅(不播放),javascript,audio,web-audio-api,Javascript,Audio,Web Audio Api,我用web audio api提供给我的样本音量数据做了一些实验,结果显示它们与其他程序(例如audasity)获得的数据不同。如果我们按采样率(leftChannel.length/44100,在我的例子中)对数组长度进行分采样,它会在大约40秒的时间内显示音频的持续时间,并且audacity会在音频中显示较大的采样,而我的脚本会显示安静(有时几乎安静)。我演奏了我的剧本中所说的安静而大胆的曲子,而且声音绝对很大 所以问题是:我找到音频样本振幅的方法正确吗?我的代码有什么问题 我读过关于为au

我用web audio api提供给我的样本音量数据做了一些实验,结果显示它们与其他程序(例如audasity)获得的数据不同。如果我们按采样率(leftChannel.length/44100,在我的例子中)对数组长度进行分采样,它会在大约40秒的时间内显示音频的持续时间,并且audacity会在音频中显示较大的采样,而我的脚本会显示安静(有时几乎安静)。我演奏了我的剧本中所说的安静而大胆的曲子,而且声音绝对很大

所以问题是:我找到音频样本振幅的方法正确吗?我的代码有什么问题

我读过关于为audiotrack创建波形的帖子 我使用了一个很好的例子,下面是我的代码:

(函数($){
window.AudioContext=window.AudioContext | | window.webkitadiocontext;
var context=new window.AudioContext();//创建音频容器
var音频数据;
var checkPoint=21;//这是以秒为单位的点,仅用于调试,请稍后删除!!
功能解码(音频数据){
试一试{
上下文。解码音频数据(音频数据,
功能(已解码){
声音(解码);
播放音频(解码);
},
函数(){//此处不执行任何操作
});
}捕获(e){
console.log('decode exception',e.message);
}
}
函数drawSound(缓冲区){
var leftChannel=buffer.getChannelData(0);
console.log('audioduration:'+leftChannel.length/44100+'sec');
对于(变量i=0;i

我进行了更彻底的测量和测试,发现我的脚本中没有错误,但是!!web audio api在我的一台计算机(Chrome和Firefox)上的音轨长度和振幅以及在另一台计算机上的错误结果(同样是独立于浏览器)上给出的结果与audasity相同,因此我得出结论,web audio api使用了一些低级别的处理器相关功能,因为我有相同的操作系统(windows 7)在我的两台电脑上,唯一的区别是硬件。
在我的帖子中提供的代码正在按预期工作

如果您认为这是Chrome中的一个bug,请在crbug.com/new上提交一个bug。并提供一个音轨,产生不同的结果和细节的不同机器


还要注意,在chrome中,ffmpeg用于解码文件。解码文件的长度可能与audacity不同。

多亏了Raymond Toy,我成功地解决了这个问题。看起来,buffer.getChannelData(0)返回的结果取决于计算机声卡的采样率(可以从context.sampleRate中找到)。如果你想找到音轨的长度,你应该这样做:

var samples = buffer.getChannelData(0);
var duration = samples/context.sampleRate;
var duration = buffer.duration;
以秒为单位的样本从开始的偏移量为:

var sample = samples[i];
var offsetInSeconds = i/context.sampleRate
我的错误是,我在公式中使用了mp3 audiotrack的采样率,这在具有不同音频卡采样率的计算机上造成了错误

正如Raymond Toy所注意到的,如果您只需要音频的持续时间,您可以像这样获得更简单的音频:

var samples = buffer.getChannelData(0);
var duration = samples/context.sampleRate;
var duration = buffer.duration;

正如我已经说过的,这不仅仅是Chrome的bug,至少是Chrome和Firefox的bug,但事实上我认为它隐藏在更深的地方。它出现在我在两台计算机中的一台上尝试的所有mp3曲目上,完全中断了所有进一步的应用程序算法的工作,而在另一台计算机上,虽然两台计算机都有相同的操作系统和相同版本的浏览器,但都能正常工作包括导致问题的mp3文件将有助于跟踪此问题。还包括您使用的Chrome版本以及它使用和不使用的计算机类型。我添加了JSFIDLE with snippet并加载到我用于测试的filedropper mp3中(虽然这不是我使用的唯一一个,但您也可以尝试其他mp3),这是url。两台计算机上的Chrome版本都是42.0.2311.152打印出每台计算机的context.sampleRate值。不同机器上的采样率可能不同。如果这与mp3文件的采样率不匹配,webaudio将根据上下文采样率对mp3文件重新采样,这可能会导致缓冲区长度出现一些差异。您是否尝试使用buffer.duration而不是按频率划分频道长度?Ken,谢谢您的评论,您关于buffer.duration的看法是正确的,这个变量是一致的,在我的计算机和一台计算机上都相等,它的值等于buffer.getChannelData(0),在另一台计算机上它们是不同的(在Chrome和Firefox中)。源文件是MP3吗?我只是在这里猜测,但可能产生的缓冲区是基于块的解码/解压缩的结果,而持续时间的计算/获取方式不同(即,如果可能,MP3只有帧头IIRC,因此您需要扫描文件以查找持续时间,但我可能记错了这一部分)。是的,我测试了不同的mp3f