1

我试着用这个:

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 时,它会正确更改。

有人能帮我吗?

似乎有一个错误...... http://naudio.codeplex.com/WorkItem/View.aspx?WorkItemId=10726

4

2 回答 2

2

因为NAudio的设计目的是让您做比简单地播放一个文件更复杂的事情,它不一定会在文件末尾停止。决定 WaveOut 是否停止的是我们是否停止向它提供数据。NAudio 中的一些 WaveStream 在到达文件末尾时会停止提供数据,但其他 WaveStream 会很高兴地从它们的 Read 方法返回充满零的缓冲区,就像它们被调用的次数一样。因此,自动停止很大程度上取决于您构建的 WaveStreams 图。

因此,您可能需要确定在完成读取要播放的文件内容后何时停止。我意识到这不是一个理想的情况,我仍在尝试设计一种既适用于只想播放单个文件的人,也适用于那些做更多事情的人的设计。

于 2010-04-04T06:47:20.220 回答
0

试试这个:

在您的 CreateDevice 方法中,更改此行:

_playbackDevice = new WaveOut();

这样:

_playbackDevice = new WaveOut(WaveCallbackInfo.FunctionCallback()
于 2014-05-29T14:15:45.470 回答