wav文件转换PCM 48kHz / 16比特率到u-law 8kHz / 8比特率使用NAudio

时间:2018-04-11 13:37:49

标签: c# naudio audio-converter

我有一个wav文件,我需要将其转换为可由我们的某个应用程序读取的格式。我要转换的文件格式为:

  • 编码:PCM
  • 采样率:48kHz
  • 比特率:16位
  • 频道:1

我要转换为的可读文件格式为:

  • 编码:u-Law
  • 采样率:8kHz
  • 比特率:8位
  • 频道:1

为实现这一目标,我使用了NAudio库。我用于转换的代码类似于:

using (WaveFileReader reader = new WaveFileReader(inputWavFilePath))
{
    WaveFormat newFormat = WaveFormat.CreateMuLawFormat(8000, 1);
    using (var conversionStream = new WaveFormatConversionStream(newFormat, reader))
    {
        WaveFileWriter.CreateWaveFile(outputWavFilePath, conversionStream);
    }
}

上述转换会引发错误

  

AcmNotPossible调用acmStreamOpen

我已经看到了从u-law转换为PCM的一些链接,但是反过来遇到了麻烦。

我努力理解的是为什么当我转换PCM/48kHz/16bit -> uLaw/48kHz/8bit时,不会抛出异常。但是,当我尝试将生成的文件转换为uLaw/8kHz/8bit时,会抛出异常

我是处理音频文件和不同格式的新手,所以如果我错过了一些简单的话,我很抱歉。

有人可以解释一下为什么转换只是在采样率转换时抛出异常而不是其他两次转换(编码PCM -> uLaw&& 16bit -> 8bit)?

2 个答案:

答案 0 :(得分:1)

我写了一个fairly detailed article来解释如何在.NET中使用各种音频类型进行转换(许多使用NAudio)

使用ACM编解码器,通常一次只能改变一件事 - 例如

  • 更改采样率(例如48kHz - > 8kHz)
  • 更改频道数(例如单声道 - >立体声)
  • 更改位深度(例如,32位浮点数 - > 16位整数)
  • 使用编解码器进行编码或解码(例如,从PCM到mu-law)

您可以将它们链接在一起以执行两阶段转换 - 例如像这样:

using (var reader = new WaveFileReader(inputWav))
using (var conversionStream1 = new WaveFormatConversionStream(pcm8k16bit, reader))
using (var conversionStream2 = new WaveFormatConversionStream(muLaw8k8bit, conversionStream1))
{
    WaveFileWriter.CreateWaveFile(outputWav, conversionStream2);
}

答案 1 :(得分:0)

我相信我发现了哪些转换以及转换需要的顺序才能使其正常工作。以下代码似乎正在运作。

String inputWav = "D:\\test-input.wav";
String tempWav = "D:\\test-input-temp.wav";
String outputWav = "D:\\test-output.wav";

WaveFormat pcm8k16bit = new WaveFormat(8000, 16, 1);
WaveFormat muLaw8k8bit = WaveFormat.CreateMuLawFormat(8000, 1);

using (var reader = new WaveFileReader(inputWav))
using (var conversionStream = new WaveFormatConversionStream(pcm8k16bit, reader))
{
    WaveFileWriter.CreateWaveFile(tempWav, conversionStream);
}

using (var fs = new FileStream(tempWav, FileMode.Open))
using (var rawSrcReader = new RawSourceWaveStream(fs, pcm8k16bit))
using (var conversionStream = new WaveFormatConversionStream(muLaw8k8bit, rawSrcReader))
{
    WaveFileWriter.CreateWaveFile(outputWav, conversionStream);
}

问题是我仍然无法弄清楚为什么会这样。我尝试了许多相同和类似代码的其他安排无济于事。例如,为什么从PCM 48kHz / 8bit转换为MuLaw 48kHz / 8bit时转换失败?