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 的类,这样每当从文件中读取数据时,我就可以“跟踪”并发送事件。但是,我的问题是我想控制读取多少字节。由于 Play() 函数正在调用 AmplitudeStream 的 Read 函数,因此我不知道如何限制读取的字节数(始终为 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

}

我想知道。谢谢!除此之外,有没有办法不使用 WaveChannel32 类作为我的 AmplitudeStream 的输入?

4

1 回答 1

2

在 NAudio 演示中查看如何绘制波形,因为这听起来正是您想要做的。它实质上拦截了读取,并在绘图代码可以订阅的每 n 个样本中发送一个事件。

更新读取的字节数是播放延迟的函数 - 较低的延迟 = 读取的字节数更少。如果您的源流只能以 8192 的块大小读取,我会很想引入一个中间缓冲流。

于 2011-02-28T09:24:58.343 回答