【问题标题】:NAudio: How can I get an event that tells me that the MP3 file reached the end?NAudio:我怎样才能得到一个告诉我 MP3 文件已结束的事件?
【发布时间】: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

【问题讨论】:

    标签: events mp3 naudio


    【解决方案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 类。
    猜你喜欢
    • 2018-06-28
    • 2020-04-02
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 2015-06-08
    • 1970-01-01
    相关资源
    最近更新 更多