N音频播放位置
Posted
技术标签:
【中文标题】N音频播放位置【英文标题】:NAudio playback position 【发布时间】:2012-08-07 12:37:49 【问题描述】:我有一个显示音频波形的 GUI 组件。我也可以在这个组件上显示一个光标。问题:如何从 NAudio 接收当前正在发送到声卡/驱动程序的样本?我唯一的想法是在发送样本后(在 Read 方法中)从 IWaveProvider 引发一个事件,但是由于刷新率低,这种方法不好。
【问题讨论】:
【参考方案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。以上是关于N音频播放位置的主要内容,如果未能解决你的问题,请参考以下文章
React Native Expo 音频 |从最新位置播放直播