1

オーディオをリサンプリングしたい: サンプル レートを 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()常に同じ値を取得し、ストリーム内で進むことはありません。Seek()各 の後に正しい位置に -ingしようとしましたRead()が、それもうまくいかないようで、常に同じ値が得られます。

私は何を間違っていますか?そして、これは生のオーディオをリサンプリングする正しい方法ですか? 前もって感謝します!

4

1 に答える 1

1

まず、ResampleInputMemoryStream の位置を最初にリセットする必要があります。実際には、配列に基づいてメモリ ストリームを作成する方が簡単かもしれません。

new MemoryStream(InputListOfBytes)

第 2 に、リサンプラーから読み取るときは、一度に 2 バイトよりも大きなチャンクを読み取る必要があります。少なくとも 1 秒分の音声を試してください ( を使用ResampleOutputStream.WaveFormat.AverageBytesPerSecond)。

于 2013-04-15T10:48:25.163 に答える