2014-03-04 37 views
1

我在Chrome上做了一些web音頻的東西,我注意到buffer.length屬性與我在Sonar中看到的不匹配。網絡音頻聲稱我的文件長度爲1391324個樣本,或約31.6秒。聲納向我展示1278279個樣本,或約29秒。窗口中的文件屬性也確認Sonar的數字。它是一個普通的16位,44.1k的wav文件。這裏可能會發生什麼?Web音頻API誤報緩衝區的長度?

編輯:看起來鉻重新採樣音頻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

T esting表明音頻長度在瀏覽器中不一致。 檢查出http://forestmist.org/blog/web-audio-api-loops-and-formats/欲知更多信息。

希望有所幫助。

+0

有趣的是,你的鏈接中的一條評論說firefox重新採樣音頻到48K。首先,他們爲什麼會這樣做?我認爲網絡音頻是關於準確性和性能的。這樣做需要額外的計算能力並導致意想不到的結果。其次,我的測試也會讓我相信firefox *不會那樣做,因爲它是我測試過的兩個精確的瀏覽器.... hmmmmmmm –

+0

看看這個,Chrome * *重新採樣到48k和firefox *不*:http://jsfiddle.net/kV7aV/6/。我根本就不喜歡這個... –

+0

[SoundJS](http://www.createjs.com/#!/SoundJS)我們發現很多瀏覽器在默認編碼之外都有問題,所以這並不讓我感到意外。 – OJay

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; 

} 
0

該規範任務重採樣到AudioContext率(point 4在這此鏈接到規範)。您可以使用OfflineAudioContext以特定的速率而不是那樣做,然後使用正常的AudioContext中的AudioBuffer。 Firefox的使用

具有48kHz的固定採樣率,但它現在使用調音臺/硬件的採樣率,因爲它節省了CPU的道路(在操作系統級別)。

如前所述,我們可能會在將來改變這一點。