1

我想重新采样音频:将其采样率从 44k 更改为 11k。我得到的输入是以字节为单位的原始音频。它确实是原始的,它没有标题 - 如果我尝试将它加载到WaveFileReader.

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

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()在 each 之后找到正确的位置Read(),但这似乎也不起作用,我仍然总是得到相同的值。

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

4

1 回答 1

1

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

new MemoryStream(InputListOfBytes)

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

于 2013-04-15T10:48:25.163 回答