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 文件已结束的事件?的主要内容,如果未能解决你的问题,请参考以下文章

Naudio:如何播放 MP3 和 WAV 文件?

mp3 到样本数组 NAudio

使用 NAudio 修剪 mp3 文件

如何使用 NAudio 从 mp3 中获取音频样本数据

NAudio 的错误,在 MemoryStream,VB 中播放 mp3

使用 C# 中的 NAudio 将 M4A 音频文件转换为 MP3 的问题/错误