NAudio播放位置

时间:2012-08-07 12:37:50

标签: c# naudio

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

2 个答案:

答案 0 :(得分:3)

如果您使用的是WaveOut,则可以调用调用GetPosition函数的waveOutGetPosition,并返回已写入WaveOut的字节数。从这里你可以计算你到底在哪里,但你可能需要考虑重新定位,因为WaveOut不会知道这一点。

答案 1 :(得分:3)

你的问题是从2012年开始有点旧,但我现在遇到了同样的问题。 我找到了一个解决方案 - 问题是,WaveOutWaveOutEvent只有PlaybackStopped个事件。

但您可以使用单独的Thread来处理此问题。创建Thread LoopSleep-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
        }
    }
相关问题