我有一个显示音频波形的GUI组件。我也可以在这个组件上显示一个光标。问题:如何从NAudio接收哪个样本当前正在发送给声卡/驱动程序?我只有想法是在发送样本后(在Read方法中)从IWaveProvider引发一个事件,但由于刷新率低,这种方法并不好。
答案 0 :(得分:3)
如果您使用的是WaveOut
,则可以调用调用GetPosition
函数的waveOutGetPosition
,并返回已写入WaveOut的字节数。从这里你可以计算你到底在哪里,但你可能需要考虑重新定位,因为WaveOut不会知道这一点。
答案 1 :(得分:3)
你的问题是从2012年开始有点旧,但我现在遇到了同样的问题。
我找到了一个解决方案 - 问题是,WaveOut
或WaveOutEvent
只有PlaybackStopped
个事件。
但您可以使用单独的Thread
来处理此问题。创建Thread
Loop
和Sleep-Interval
一秒;在这里,您可以每秒跟踪当前的播放时间。
this.Thread = new Thread(new ThreadStart(Run)); // Tracking the Audio-Data on `Run` Method
this.Thread.Start();
在Run
方法中,您可以处理音频数据,如:
private void Run() {
while(true) { // Create an infinite loop
System.Diagnostics.Debug.WriteLine("PlaybackState: " + this.Wrapper.PlaybackState);
if(this.Wrapper.PlaybackState == PlaybackState.Playing) {
System.Diagnostics.Debug.WriteLine("Bytes played: " + this.Wrapper.GetPosition());
double ms = this.Wrapper.GetPosition() * 1000.0 / this.Wrapper.OutputWaveFormat.BitsPerSample / this.Wrapper.OutputWaveFormat.Channels * 8 / this.Wrapper.OutputWaveFormat.SampleRate;
System.Diagnostics.Debug.WriteLine("Milliseconds Played: " + ms);
}
Thread.Sleep(1000); // Sleep for 1 second
}
}