8

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

谢谢。

4

3 回答 3

19

几点建议:

  • 您需要使用 WaveFormatConversionStream 将一个采样率/位深度实际转换为另一个 - 您只是将原始音频放入具有错误波形格式的新文件中。
  • 您可能还需要分两步进行转换 - 首先更改采样率,然后更改位深度/通道数。这是因为底层 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);
    } 
}
于 2011-07-11T10:46:02.577 回答
3

以下代码解决了我处理 G.711 Mu-Law 的问题,其中 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();
于 2013-05-23T16:55:46.713 回答
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!");
            }
于 2013-09-04T11:05:53.620 回答