使用NAudio重新采样原始音频

时间:2013-04-14 23:25:25

标签: c# naudio

我想重新采样音频:将采样率从44k改为11k。我得到的输入是原始音频,以字节为单位。它确实是原始的,它没有标题 - 如果我尝试将其加载到WaveFileReader,我会得到一个例外,说“不是WAVE文件 - 没有RIFF标题”。

我目前正在努力实现它是这样的(只是一段非常简化的代码):

WaveFormat ResampleInputFormat = new WaveFormat(44100, 1);
WaveFormat ResampleOutputFormat = new WaveFormat(11025, 1);

MemoryStream ResampleInputMemoryStream = new MemoryStream();

foreach (var b in InputListOfBytes)
{
    ResampleInputMemoryStream.Write(new byte[]{b}, 0, 1);
}

RawSourceWaveStream ResampleInputWaveStream =
  new RawSourceWaveStream(ResampleInputMemoryStream, ResampleInputFormat);
WaveFormatConversionStream ResampleOutputStream =
  new WaveFormatConversionStream(ResampleOutputFormat, ResampleInputWaveStream);

byte[] bytes = new byte[2];
while (ResampleOutputStream.Read(bytes, 0, 2) > 0)
{
    OutputListOfBytes.Add(bytes[0]);
    OutputListOfBytes.Add(bytes[1]);
}

我的问题是:最后一个循环是一个无限循环。 Read()始终获得相同的值,并且永远不会在Stream中前进。我甚至尝试Seek() - 在每个Read()之后到达正确的位置,但这似乎也不起作用,我仍然总是得到相同的值。

我做错了什么?这是重新采样原始音频的正确方法吗?提前谢谢!

1 个答案:

答案 0 :(得分:1)

首先,您需要将ResampleInputMemoryStream的位置重置为开头。实际上,根据数组创建内存流可能更容易:

new MemoryStream(InputListOfBytes)

其次,当读出重采样器时,您需要一次读取比两个字节更大的块。尝试至少一秒钟的音频(使用ResampleOutputStream.WaveFormat.AverageBytesPerSecond)。