1

次のコードがあります。

IWavePlayer player = new WaveOut();
WaveStream reader = new WaveFileReader(filePath);
WaveChannel32 input = new WaveChannel32(reader);

AmplitudeStream ampStream = new AmplitudeStream(input);
ampStream.AmplitudeEventHandler += new EventHandler<AmplitudeArgs>(AmplitudeStreamHandler);

player.Init(ampStream);
player.Play();

AmplitudeStream は、ファイルからデータが読み取られるたびにイベントを「追跡」して送信できるように、WaveStream を実装する私が作成したクラスです。ただし、私の問題は、読み取るバイト数を制御したいということです。AmplitudeStream の Read 関数は Play() 関数によって呼び出されているため、読み取るバイト数を制限する方法がわかりません (常に 35,280 です)。

これを行う方法?ファイルを再生して観察できるようにするため、Play() コマンドを使用しています。したがって、Read() コマンド中にファイルを再生する別の方法がある場合、次のようになります。

byte[] buffer = byte[8192]
int bytesRead = 0;

do{

bytesRead = ampStream.Read(buffer,0,buffer.Length);

}while(bytesRead != 0);

@override
private int Read(byte[] buffer, int offset, int count)
{

//some command to play the file here

}

私が知りたいのですが。ありがとう!それとは別に、AmplitudeStream の入力として WaveChannel32 クラスを使用しない方法はありますか?

4

1 に答える 1

2

波形描画がどのように行われるかについては、NAudio のデモをご覧ください。これは基本的に Read をインターセプトし、描画コードがサブスクライブできる n サンプルごとにイベントを送信します。

読み取られるバイト数の更新は、再生レイテンシーの関数です。レイテンシーが低い = 読み取られるバイト数が少なくなります。ただし、ソース ストリームが 8192 のブロック サイズでしか読み取れない場合は、中間バッファリング ストリームを導入したくなるでしょう。

于 2011-02-28T09:24:58.343 に答える