使用NAudio更改wav文件(到16KHz和8bit)

Can*_*Can 7 .net c# audio wav naudio

我想用NAudio将WAV文件更改为8KHz和8bit.

            WaveFormat format1 = new WaveFormat(8000, 8, 1);
            byte[] waveByte = HelperClass.ReadFully(File.OpenRead(wavFile));
            Wave
            using (WaveFileWriter writer = new WaveFileWriter(outputFile, format1))
            {
                writer.WriteData(waveByte, 0, waveByte.Length);
            }
Run Code Online (Sandbox Code Playgroud)

但是当我播放输出文件时,声音只是嘶嘶声.我的代码是正确的还是错的?

如果我将WaveFormat设置为WaveFormat(44100,16,1),它可以正常工作.

谢谢.

Mar*_*ath 17

几点建议:

  • 您需要使用WaveFormatConversionStream实际从一个采样率/位深度转换为另一个 - 您只是将原始音频放入具有错误波形格式的新文件中.
  • 您可能还需要分两步进行转换 - 首先更改采样率,然后更改位深度/通道数.这是因为底层的ACM编解码器无法始终在一个步骤中完成所需的转换.
  • 您应该使用WaveFileReader来读取您的输入文件 - 您只希望转换文件的实际音频数据部分,但您当前正在将包括RIFF块在内的所有内容复制到新文件中,就好像它们是音频数据一样.
  • 8位PCM音频通常听起来很可怕.使用16位,或者如果必须有8位,则使用G.711 u-law或a-law
  • 下采样音频可能会导致混叠.为了做得好,您需要首先实现低通滤波器.遗憾的是,这并不容易,但有些网站可以帮助您为特定的下采样生成Chebyshev低通滤波器的系数.

这是一些示例代码,显示如何从一种格式转换为另一种格式.请记住,您可能需要根据输入文件的格式分多步进行转换:

using (var reader = new WaveFileReader("input.wav"))
{
    var newFormat = new WaveFormat(8000, 16, 1); 
    using (var conversionStream = new WaveFormatConversionStream(newFormat, reader))
    {
        WaveFileWriter.CreateWaveFile("output.wav", conversionStream);
    } 
}
Run Code Online (Sandbox Code Playgroud)