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 更改播放位置时准确获取当前播放位置