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。
添加回答
举报