3

我有一个显示音频波形的 GUI 组件。我也可以在这个组件上显示一个光标。问题:如何从 NAudio 接收当前正在发送到声卡/驱动程序的样本?我唯一的想法是在发送样本后从 IWaveProvider 引发一个事件(在 Read 方法中),但由于刷新率低,这种方法不好。

4

2 回答 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 回答