我正在做一些关于chrome的网络音频内容,我注意到buffer.length属性与我在Sonar中看到的不匹配。网络音频声称我的文件长度为1391324,或约31.6秒。 Sonar向我展示了1278279个样本,或约29秒。 Windows中的文件属性也确认了Sonar的数字。它是一个普通的16位,44.1k wav文件。可能会发生什么事?
编辑:Chrome会将音频重新采样为48k。为什么???我想要同样的wav文件,谢谢。 Firefox不会这样做并给我正确的长度。
使用这个小提琴尝试使用chrome和firefox:http://jsfiddle.net/kV7aV/2/ 并使用此文件:https://dl.dropboxusercontent.com/u/75652364/amp.wav
小提琴代码让你开心:
HTML:
<input type="file" id="audio_file" accept="audio/wav" multiple />
<p id="output"></p>
<p id="output2"></p>
JS:
var fileInput = document.getElementById("audio_file");
var output = document.getElementById("output");
var output2 = document.getElementById("output2");
window.AudioContext = window.AudioContext || window.webkitAudioContext;
var context = new AudioContext();
fileInput.onchange = function (evt) {
var files = evt.target.files; // FileList object
for (var f = 0; f < files.length; f++) {
var reader = new FileReader();
reader.onload = function (e) {
context.decodeAudioData(e.target.result, function (buffer) {
console.log(buffer.length);
output.innerHTML = buffer.length;
var data = buffer.getChannelData(0);
// undefined in firefox
console.log(data[1391323]);
output2.innerHTML = data[1391323];
});
};
reader.readAsArrayBuffer(files[f]);
}
};
答案 0 :(得分:0)
测试表明,不同浏览器的音频长度不一致。 查看http://forestmist.org/blog/web-audio-api-loops-and-formats/了解更多信息。
希望有所帮助。
答案 1 :(得分:0)
根据您的浏览器,音频文件的采样率和声卡的采样率,网络音频可能会重新取样或不重新取样。见步骤4 here。我的声卡设置为48k,看起来像Chrome继续前进并重新采样以匹配我的声卡。我不确定为什么firefox没有。目前,似乎无法强制decodeAudioData解码为原始采样率,但有关于主题here的讨论。在此期间作为临时修复,我编写了一个简单的重新采样音频功能:
// takes a Float32Array of audio data and resamples it
function resample( signal, oldSR, newSR ) {
var ratio = oldSR / newSR;
var newLength = Math.round((newSR / oldSR) * signal.length);
var signalNew = new Float32Array(newLength);
var sampCount;
var m;
var weight;
if ( ratio > 1.0 ) {
for ( var n = 0; n < newLength; n++ ) {
sampCount = n * ratio;
m = Math.floor(sampCount);
weight = sampCount - m;
signalNew[n] = (signal[m] * (1-weight)) + (signal[m+1] * weight);
}
} else {
for ( var n = 0; n < newLength; n++ ) {
m = Math.round(n * ratio);
signalNew[n] = signal[m];
}
}
return signalNew;
}
答案 2 :(得分:0)
规范要求重新采样AudioContext的速率(此链接指向此规范的point 4)。您可以按特定的费率使用OfflineAudioContext
而不是这样做,然后在正常的AudioContext
中使用AudioBuffer。
使用的Firefox具有48kHz的固定采样率,但现在它确实使用了调音台/硬件的采样率,因为它可以节省CPU(在操作系统级别)。
如前所述,我们将来可能会改变这种情况。