N音频播放位置

Posted

技术标签:

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

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

【问题讨论】:

【参考方案1】:

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

但您可以使用单独的Thread 来处理此问题。创建一个带有LoopThread 和一个带有一秒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。

以上是关于N音频播放位置的主要内容,如果未能解决你的问题,请参考以下文章

React Native Expo 音频 |从最新位置播放直播

请问js如何实现多个音频文件依次播放,而不是同时播放?如何实现播放制定位置,如音频3秒到10秒之间

根据滚动位置播放不同的音频文件

更改音频播放器的轨道位置

pyqt5音频播放

在 SwiftUI 应用程序中放置音频播放代码的位置[关闭]