【发布时间】:2012-08-07 12:37:49
【问题描述】:
我有一个显示音频波形的 GUI 组件。我也可以在这个组件上显示一个光标。问题:如何从 NAudio 接收当前正在发送到声卡/驱动程序的样本?我唯一的想法是在发送样本后(在 Read 方法中)从 IWaveProvider 引发一个事件,但是由于刷新率低,这种方法不好。
【问题讨论】:
我有一个显示音频波形的 GUI 组件。我也可以在这个组件上显示一个光标。问题:如何从 NAudio 接收当前正在发送到声卡/驱动程序的样本?我唯一的想法是在发送样本后(在 Read 方法中)从 IWaveProvider 引发一个事件,但是由于刷新率低,这种方法不好。
【问题讨论】:
您的问题是从 2012 年开始的,有点老,但我目前遇到了同样的问题。
我找到了解决方案 - 问题是,WaveOut 或 WaveOutEvent 只有一个 PlaybackStopped 事件。
但您可以使用单独的Thread 来处理此问题。创建一个带有Loop 的Thread 和一个带有一秒 的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
}
}
【讨论】:
如果您使用WaveOut,您可以调用GetPosition,它调用waveOutGetPosition 函数,返回已写入WaveOut 的字节数。从中您可以计算出您的确切位置,但您可能需要考虑重新定位,因为 WaveOut 不会知道这一点。
【讨论】: