问题描述
我正在使用网络音频 API 来应用效果和导出文件。效果很好,但我想以 32 位而不是 16 位导出文件。
如何更改以下设置以实现此目的?
setUint32(0x46464952); // "RIFF"
setUint32(length - 8); // file length - 8
setUint32(0x45564157); // "WAVE"
setUint32(0x20746d66); // "fmt " chunk
setUint32(16); // length = 16
setUint16(1); // PCM (uncompressed)
setUint16(numOfChan);
setUint32(abuffer.sampleRate);
setUint32(abuffer.sampleRate * 2 * numOfChan); // avg. bytes/sec
setUint16(numOfChan * 2); // block-align
setUint16(16);
setUint32(0x61746164); // "data" - chunk
setUint32(length - pos - 4); // chunk length
// write interleaved data
for (i = 0; i < abuffer.numberOfChannels; i++)
channels.push(abuffer.getChannelData(i));
while (pos < length) {
for (i = 0; i < numOfChan; i++) {
// interleave channels
sample = Math.max(-1,Math.min(1,channels[i][offset])); // clamp
sample = (0.5 + sample < 0 ? sample * 32768: sample * 32767) | 0;
view.setInt16(pos,sample,true); // update data chunk
pos += 2;
}
offset++; // next source sample
}
解决方法
基本思想很简单。使用数组视图将浮点数转换为 Uint32。然后写出 uint32 值而不是 int16 值。不需要剪辑。并且一定要为改变的长度和格式类型输出正确的wav头。
我知道 Chromium 有一些代码可以用于 WebAudio 测试。但您必须遵守 Chromium 许可才能使用它。