NAudio:我怎样才能得到一个告诉我 MP3 文件已结束的事件?
Posted
技术标签:
【中文标题】NAudio:我怎样才能得到一个告诉我 MP3 文件已结束的事件?【英文标题】:NAudio: How can I get an event that tells me that the MP3 file reached the end? 【发布时间】:2010-04-03 13:02:26 【问题描述】:我试过用这个:
private void CreateDevice()
_playbackDevice = new WaveOut();
_playbackDevice.PlaybackStopped += PlaybackDevicePlaybackStopped;
void PlaybackDevicePlaybackStopped(object sender, EventArgs e)
if (OnPlaybackStopped != null)
OnPlaybackStopped(this, e);
但它从未调用过。
然后我尝试通过使用计时器轮询属性来使用 PlaybackState:
public PlaybackState PlaybackState
get
if (_playbackDevice == null)
return default(PlaybackState);
return _playbackDevice.PlaybackState;
但是当歌曲结束时,它不会变为“停止”。但是当我手动调用 Stop 时,它会正确更改。
有人可以帮我吗?
好像有bug...http://naudio.codeplex.com/WorkItem/View.aspx?WorkItemId=10726
【问题讨论】:
【参考方案1】:因为NAudio 旨在让您做比简单播放一个文件更复杂的事情,它不一定会在文件末尾停止。决定 WaveOut 是否停止的是我们是否停止向它提供数据。 NAudio 中的一些 WaveStreams 在到达文件末尾时会停止提供数据,但其他 WaveStreams 会很高兴地从它们的 Read 方法返回充满零的缓冲区,就像它们被调用的次数一样。所以自动停止很大程度上取决于您构建的 WaveStreams 图。
因此,您可能需要在读完要播放的文件内容后确定何时停下来。我意识到这不是一个理想的情况,我仍在尝试设计一种既适用于只想播放单个文件的人,也适用于那些做更多事情的人的设计。
【讨论】:
你想出解决方案了吗?如果我从结尾倒带,如果音频继续播放,那就有点尴尬了。 ReachedEnd 事件或布尔 StopAtEnd 属性就足够了。实际上我更喜欢暂停而不是停止;) 你在玩什么?如果您播放永无止境的流,PlaybackStopped
将永远不会触发。但是如果你播放一个文件(例如Mp3FileReader
你会在最后自动停止)
我正在使用 WaveOutEvent 和 AudioFileReader 播放波形文件。在播放状态改变(播放、暂停、停止等)时调用的事件也是一个好主意。
可以通过RegisterEventClient监控流所属的会话。它不会告诉您流何时结束,但它会在流的状态从活动切换到非活动时通知您,反之亦然。
获取该事件的代码解决方案在哪里?【参考方案2】:
试试这个:
在您的 CreateDevice 方法中,更改此行:
_playbackDevice = new WaveOut();
通过这个:
_playbackDevice = new WaveOut(WaveCallbackInfo.FunctionCallback()
【讨论】:
我不建议这样做。函数回调通常会导致死锁。如果您不在 Windows 窗体或 WPF 应用程序中,请改用WaveOutEvent
类。以上是关于NAudio:我怎样才能得到一个告诉我 MP3 文件已结束的事件?的主要内容,如果未能解决你的问题,请参考以下文章