Events 我怎样才能得到一个事件,告诉我MP3文件已经结束了?

Events 我怎样才能得到一个事件,告诉我MP3文件已经结束了?,events,mp3,naudio,Events,Mp3,Naudio,我试着用这个: private void CreateDevice() { _playbackDevice = new WaveOut(); _playbackDevice.PlaybackStopped += PlaybackDevicePlaybackStopped; } void PlaybackDevicePlaybackStopped(object sender, EventArgs e) { if (OnPlaybackStopped != null)

我试着用这个:

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;
    }
}
但当歌曲结束时,它不会变为“停止”。但是,当我手动调用“停止”时,它会正确更改

有人能帮我吗

好像有个虫子

因为它的设计允许你做比简单播放一个文件更复杂的事情,所以它不一定会在文件末尾停止。决定WaveOut是否停止的是我们是否停止向其提供数据。NAudio中的一些WaveStreams在到达文件末尾时确实停止提供数据,但其他WaveStreams会很高兴地从其读取方法返回满是零的缓冲区,每次调用都是如此。因此,自动停止在很大程度上取决于您构建的波流图

因此,您可能需要在读取完要播放的文件内容后确定何时停止播放。我意识到这不是一个理想的情况,我仍在努力想出一种设计,既适合那些只想播放一个文件的人,也适合那些正在做一些更复杂的事情的人。

试试这个:

在CreateDevice方法中,更改此行:

_playbackDevice = new WaveOut();
据此:

_playbackDevice = new WaveOut(WaveCallbackInfo.FunctionCallback()

你想出解决办法了吗?如果音频一直播放,如果我从结尾倒带,这会有点尴尬。一个ReachedEnd事件或布尔StopAtEnd属性就足够了。事实上,我更喜欢暂停而不是停止;)你在玩什么?如果您播放的是永无止境的流,
PlaybackStopped
将永远不会触发。但是如果你播放一个文件(例如,
Mp3FileReader
你会在最后自动停止),我正在使用WaveOutEvent和AudioFileReader播放一个wave文件。最好还有和事件,在播放状态更改(播放、暂停、停止等)时调用。您可以使用RegisterEventClient监视流所属的会话。它不会告诉您流何时结束,但会在流的状态从活动状态切换到非活动状态时通知您,反之亦然。获取该事件的代码解决方案在哪里?我不建议这样做。函数回调通常会导致死锁。如果您不在Windows窗体或WPF应用程序中,请改用
WaveOutEvent
类。