我有一个显示音频波形的 GUI 组件。我也可以在这个组件上显示一个光标。问题:如何从 NAudio 接收当前正在发送到声卡/驱动程序的样本?我唯一的想法是在发送样本后从 IWaveProvider 引发一个事件(在 Read 方法中),但由于刷新率低,这种方法不好。
问问题
3892 次
2 回答
4
你的问题是从 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
}
}
于 2018-06-16T15:46:29.313 回答
2
如果您正在使用WaveOut
,您可以将GetPosition
哪些调用调用到waveOutGetPosition
函数中,返回已写入 WaveOut 的字节数。由此您可以计算出您的确切位置,但您可能需要考虑重新定位,因为 WaveOut 不会知道这一点。
于 2012-08-07T15:51:44.903 回答