【问题标题】:NAudio playback positionN音频播放位置
【发布时间】:2012-08-07 12:37:49
【问题描述】:

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

【问题讨论】:

    标签: c# naudio


    【解决方案1】:

    您的问题是从 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
            }
        }
    

    【讨论】:

      【解决方案2】:

      如果您使用WaveOut,您可以调用GetPosition,它调用waveOutGetPosition 函数,返回已写入WaveOut 的字节数。从中您可以计算出您的确切位置,但您可能需要考虑重新定位,因为 WaveOut 不会知道这一点。

      【讨论】:

      • WaveOut 构造函数中的 CallbackInfo 有用吗?我找不到任何关于它的信息:/(?)。
      • WaveOut API 提供了很多回调选项。如果您在 Windows 窗体或 WPF 中,则窗口回调是最可靠的,默认构造函数只会使用它。如果你在控制台应用程序或服务器上,可以使用函数回调(新的 WaveOutEvent 类在这种情况下可能是更好的选择,但我认为没有添加 GetPosition 函数)
      • 谢谢,我会检查的。我知道的一个是当我使用 WindowCallback 时 - 当我更改一些组合框(动画)时声音会断断续续。在函数回调上它不存在,但有时程序只是退出。也许事件会好起来的。子问题:为什么 waveOut 有这么多方法:播放、暂停、恢复、如果 stop==pause 则停止?当我想停止并开始时,我认为需要更改 waveProvider 中的位置。嗯。
      • 好的,我查看了广告源,当我点击停止时,它会调用 OnDone。
      猜你喜欢
      • 2016-06-19
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      • 2022-07-13
      相关资源
      最近更新 更多