首页 > 解决方案 > 导出到 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
  }

标签: wavweb-audio-api32-bit

解决方案


基本思想很简单。使用数组视图将浮点数转换为 Uint32。然后写出 uint32 值而不是 int16 值。不需要剪辑。并确保为更改的长度和格式类型输出正确的 wav 标头。

我知道 Chromium 有一些代码可以用于 WebAudio 测试。但是您必须遵守 Chromium 许可证才能使用它。


推荐阅读