2 回答

TA貢獻1865條經驗 獲得超7個贊
所以,一段時間后我重新審視了這個,因為我正在重做我的項目中需要單聲道音頻的部分,而且我對這個奇怪的問題做了噩夢。結果發現 Recorder.js 中存在一個錯誤,該錯誤會弄亂單聲道錄音的編碼。在 recorder.js 的 EncodeWav 函數中,我不得不更改 line view.setUint32(28, sampleRate * 4, true); 到 view.setUint32(28, sampleRate * numChannels * 2, true);
這使得音頻文件的搜索變得完美,允許我將文件大小減半,并使我不必在路上將其更改為單聲道。
function encodeWAV(samples) {
var buffer = new ArrayBuffer(44 + samples.length * 2);
var view = new DataView(buffer);
var numChannels = 1;
var sampleRate = 18000;
/* RIFF identifier */
writeString(view, 0, 'RIFF');
/* RIFF chunk length */
view.setUint32(4, 36 + samples.length * 2, true);
/* RIFF type */
writeString(view, 8, 'WAVE');
/* format chunk identifier */
writeString(view, 12, 'fmt ');
/* format chunk length */
view.setUint32(16, 16, true);
/* sample format (raw) */
view.setUint16(20, 1, true);
/* channel count */
view.setUint16(22, numChannels, true);
/* sample rate */
view.setUint32(24, sampleRate, true);
/* byte rate (sample rate * block align) */
//view.setUint32(28, sampleRate * 4, true);
view.setUint32(28, sampleRate * numChannels * 2, true);
/* block align (channel count * bytes per sample) */
view.setUint16(32, numChannels * 2, true);
/* bits per sample */
view.setUint16(34, 16, true);
/* data chunk identifier */
writeString(view, 36, 'data');
/* data chunk length */
view.setUint32(40, samples.length * 2, true);
floatTo16BitPCM(view, 44, samples);
return view;
}

TA貢獻2016條經驗 獲得超9個贊
更新:這是因為它是一個單通道 WAV 文件。將錄音更改為雙通道后,播放效果很好。我最初這樣做是為了減小文件大小,因此為了補償我在雙通道中錄制并將采樣率從 48000 降低到 18000。
添加回答
舉報