2011-07-11 46 views
6

我想使用NAudio将WAV文件更改为8KHz和8位。使用NAudio更改wav文件(16KHz和8位)

  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),它工作正常。

谢谢。

回答

13

几个要点:

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

下面是一些示例代码,演示了如何从一种格式转换为另一种格式。请记住,你可能需要根据您的输入文件的格式在多个步骤的转化做:

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); 
    } 
} 
3

下面的代码解决我的问题处理G.711 Mu律与VOX文件扩展名wav文件。否则,我一直在使用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(); 
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!"); 
      } 
相关问题