wav - 导出到 32 位而不是 16 位 Web 音频 API
问题描述
我正在使用网络音频 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 许可证才能使用它。
推荐阅读
- python - 使用 ExternalCredentials 对 rabbitmq 进行身份验证
- apache-kafka - 处于状态时等待连接超时:CONNECTING
- python - 使用 Counter().most_common 找到所有具有相同计数的元素
- python - 最后一个子进程启动后,主进程什么也没有执行,为什么?
- c# - 如何在后台工作线程中调用要在主 UI 线程上完成的函数?
- r - 如何在没有循环的情况下对数据帧的 n 个元素的移动子集执行计算
- javascript - 如何从 JavaScript 调用 Django 服务器中的 Python 脚本?
- mapbox - 频繁更新时注释“闪烁”
- unix - 管道 unix 中的 Read()
- visual-studio-code - 禁用 VSCode 上的内在建议