Web audio api误报缓冲区的长度?

时间:2014-03-04 21:22:54

标签: javascript web-audio

我正在做一些关于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]);

    }

};

3 个答案:

答案 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(在操作系统级别)。

如前所述,我们将来可能会改变这种情况。