[英]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.