簡體   English   中英

Web音頻api錯誤報告緩沖區長度?

[英]Web audio api misreporting length of buffer?

我在chrome上做一些網絡音頻工作,我注意到buffer.length屬性與我在Sonar中看到的不匹配。 網絡音頻聲稱我的文件長1391324個樣本,約31.6秒。 聲納正在向我顯示1278279個樣本,或〜29秒。 Windows中的文件屬性也會確認Sonar的編號。 它是一個普通的16位44.1k WAV文件。 這可能是怎么回事?

編輯:鉻似乎將音頻重新采樣為48k。 為什么??? 我想要我的相同的WAV文件,謝謝。 Firefox不會執行此操作,而是給我正確的長度。

使用以下小提琴在chrome和firefox上進行嘗試: http : //jsfiddle.net/kV7aV/2/並使用以下文件: https : //dl.dropboxusercontent.com/u/75652364/amp.wav

小提琴代碼使SO高興:

的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]);

    }

};

測試表明音頻長度在不同瀏覽器中不一致。 請查看http://forestmist.org/blog/web-audio-api-loops-and-formats/了解更多信息。

希望能有所幫助。

根據瀏覽器,音頻文件的采樣率和聲卡的采樣率,網絡音頻似乎可能會重新采樣,也可能不會重新采樣。 請參閱此處的步驟4。 我的聲卡設置為48k,看起來像是chrome繼續前進並重新采樣以匹配我的聲卡。 我不確定firefox為什么沒有。 目前,似乎沒有辦法強迫decodeAudioData解碼成原始采樣率,但對這一問題的討論在這里 同時,作為臨時解決方案,我編寫了一個簡單的函數來對音頻進行重采樣:

// 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;

}

規范要求以AudioContext的速率重新采樣(此鏈接指向規范的第4點 )。 您可以使用OfflineAudioContext在specificed率這樣做,然后在您的正常使用AudioBuffer AudioContext

Firefox使用的固定采樣率為48kHz,但現在確實使用混頻器/硬件的采樣率,因為它可以節省CPU的使用時間(在OS級別)。

如前所述,我們將來可能會對此進行更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM