1

我正在使用 WaveFormatConversionStream 将包含录制语音的单通道 16 位 PCM WAV 文件的采样率从 11025 提高到 16000 Hz。生成的 WAV 文件仍然可以理解,但似乎有很多“静态”(听起来好像是通过部分爆裂的扬声器播放的)。这是正常的,预期的行为,还是我做错了什么?代码如下:

using (WaveFileReader wfr = new WaveFileReader("inFile.wav"))
{
  var newFormat = new WaveFormat(16000, wfr.WaveFormat.BitsPerSample, wfr.WaveFormat.Channels);
  using (WaveFileWriter wfw = new WaveFileWriter("outFile.wav", newFormat))
  {
    using (WaveFormatConversionStream conversionStream = new WaveFormatConversionStream(newFormat, wfr))
    {
      conversionStream.Position = 0;
      byte[] buffer = new byte[1024];
      while (conversionStream.Position < conversionStream.Length)
      {
        int bytesRead = conversionStream.Read(buffer, 0, 1024);
        if (bytesRead > 0)
        {
          wfw.Write(buffer, 0, bytesRead);
        }
        else
        {
          break;
        }
      }
    }
  }
}
4

1 回答 1

1

我看不出你的代码有什么问题(尽管不需要设置 Position = 0)。它在后台使用 Windows 提供的 ACM 采样率转换,这很合理,但并不出色。特别是,我认为它不应用任何低通滤波器,通常建议在重采样时减少混叠和伪影。但你所描述的听起来比那更严重。您可以尝试的另一件事是使缓冲区大小整整一秒 - 即 16000 * 通道 * 2。

另一件事,我假设音频是 16 位的?

于 2012-05-03T12:54:55.903 回答