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

时间:2011-07-11 08:47:26

标签: c# .net 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);
            }

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

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

感谢。

3 个答案:

答案 0 :(得分:17)

一些指示:

  • 您需要使用WaveFormatConversionStream实际从一个采样率/位深度转换为另一个 - 您只是将原始音频放入具有错误波形格式的新文件中。
  • 您可能还需要分两步进行转换 - 首先更改采样率,然后更改位深度/通道数。这是因为基础ACM编解码器无法始终在一个步骤中完成所需的转换。
  • 您应该使用WaveFileReader来读取您的输入文件 - 您只希望转换文件的实际音频数据部分,但您当前正在将包括RIFF块在内的所有内容复制到新文件中,就好像它们是音频数据一样。 / LI>
  • 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);
    } 
}

答案 1 :(得分:3)

以下代码解决了我处理G.711 Mu-Law的问题,并对wav文件进行了vox文件扩展。我一直在使用WaveFileReader获得“No RIFF Header”错误。

 FileStream fileStream = new FileStream(fileName, FileMode.Open);
           var waveFormat = WaveFormat.CreateMuLawFormat(8000, 1);
           var reader = new RawSourceWaveStream(fileStream, waveFormat);
            using (WaveStream convertedStream = WaveFormatConversionStream.CreatePcmStream(reader))
            {
                WaveFileWriter.CreateWaveFile(fileName.Replace("vox", "wav"), convertedStream);
            }
           fileStream.Close();

答案 2 :(得分:1)

            openFileDialog openFileDialog = new openFileDialog();
            openFileDialog.Filter = "Wave Files (*.wav)|*.wav|All Files (*.*)|*.*";
            openFileDialog.FilterIndex = 1;


            WaveFileReader reader = new NAudio.Wave.WaveFileReader(dpmFileDestPath);

            WaveFormat newFormat = new WaveFormat(8000, 16, 1);

            WaveFormatConversionStream str = new WaveFormatConversionStream(newFormat, reader);

            try
            {
                 WaveFileWriter.CreateWaveFile("C:\\Konvertierten_Dateien.wav", str);
            }
            catch (Exception ex)
            {
                 MessageBox.Show(String.Format("{0}", ex.Message));
            }
            finally
            {               
                str.Close();
            }

                 MessageBox.Show("Konvertieren ist Fertig!");
            }