Naudio,如何判断播放完成

Posted

技术标签:

【中文标题】Naudio,如何判断播放完成【英文标题】:Naudio,how to tell playback is completed 【发布时间】:2012-06-30 09:02:38 【问题描述】:

我正在使用 NAudio 库来编写一个简单的 WinForms 录音机/播放器。我的问题是如何判断播放已完成?之后我需要关闭波流。

我知道下面列出了一个 PlaybackStopped 事件:

wfr = new NAudio.Wave.WaveFileReader(this.outputFilename);
audioOutput = new DirectSoundOut();
WaveChannel32 wc = new NAudio.Wave.WaveChannel32(wfr); 
audioOutput.Init(wc);
audioOutput.PlaybackStopped += new EventHandler<StoppedEventArgs>(audioOutput_PlaybackStopped);
audioOutput.Play();

但是这个 PlaybackStopped 事件似乎只能通过调用audioOutput.stop() 触发,有谁知道如何判断播放是否完成?

我为这个问题创建了一个开源项目,你可以在这里找到它:https://code.google.com/p/stack-overflow-questions/

【问题讨论】:

你确定播放完成后PlaybackStopped没有被触发吗?因为从source 到最后processSamples() 的结尾会触发事件... 是的,我确定。我在一个新项目中进行了测试。它仍然产生同样的问题。这是一个错误吗? 如果使用 WaveOut 作为音频输出,则相同。 【参考方案1】:

PlaybackStopped 事件在您手动停止播放时引发,或者您正在使用的 IWaveProvider 的 Read 方法返回 0。这里的问题是 WaveChannel32 在源流结束时不会停止返回数据,所以播放永远不会结束。 PadWithZeroes 属性应设置为 false 以解决此问题。

【讨论】:

多么不起眼的属性。我自己永远不会找到这个,谢谢。只是为了在 8 年后稍微清楚一点,PaddWithZeroes 属性位于 WaveChannel32 对象中。这对某些人来说可能是显而易见的,但也许不是。【参考方案2】:

正如@Mark Heath 所描述的那样,我想添加 Naudio 的编码示例,它将在 Debug/Sound 文件夹中播放一个 mp3 文件并等到它没有完成。 播放完成可以通过waveOut.PlaybackState == PlaybackState.Stopped查看

play_string = @"SOUND/space.mp3";
var reader = new Mp3FileReader(play_string);
var waveOut = new WaveOut(); // or WaveOutEvent()
waveOut.Init(reader);
waveOut.Play();
while (waveOut.PlaybackState != PlaybackState.Stopped) ; // Wait untill the playing isn't finished. 

【讨论】:

这是有效的@MuhammadAshikuzzaman 吗?没有人给出 + 或 - 的比率。 在 *** 中,当某个人的答案有效时,他/她可能会对此表示赞同。我的答案是一个新的答案。几天前我已经练习过这个。从那个练习本我复制了答案。你可以自己测试一下,然后可能会提高利率。谢谢。

以上是关于Naudio,如何判断播放完成的主要内容,如果未能解决你的问题,请参考以下文章

NAudio:如何在使用 AudioFileReader 和 WaveOutEvent 更改播放位置时准确获取当前播放位置

是否可以使用 NAudio 从短 [] 而不是字节 [] 播放音频?

如何使用 C# NAudio 操作字节?

NAudio - 从 Stream 播放 MIDI

如何使用 NAudio 播放双数组(包括波浪)[关闭]

如何在 WPF 中使用 nAudio 从 Resource 播放 mp3?