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

我想用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),它可以正常工作。

谢谢。

几点建议:

  • 您需要使用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); } } 

下面的代码解决了我处理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(); 
  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!"); }