NAudio PlaybackState 永远不会停止?
Posted
技术标签:
【中文标题】NAudio PlaybackState 永远不会停止?【英文标题】:NAudio PlaybackState never stops? 【发布时间】:2013-06-09 15:27:44 【问题描述】:我正在使用 NAudio 创建一个简单的音频播放器,但我找不到可以将我的 WaveOut
流的 PlaybackState
更改为“已停止”并因此触发PlaybackState
事件。
如下图所示:
private BlockAlignReductionStream stream = null;
private NAudio.Wave.WaveOut output = null;
private void Add_to_stream()
string[] files = Directory.GetFiles(Settings.Default.m + "\\","*"+selected_music+"*");
if (files[0].EndsWith(".mp3"))
NAudio.Wave.Mp3FileReader mp3fr = new NAudio.Wave.Mp3FileReader(Settings.Default.m + "\\" + selected_music + ".mp3");
var pcm = NAudio.Wave.WaveFormatConversionStream.CreatePcmStream(mp3fr);
stream = new NAudio.Wave.BlockAlignReductionStream(pcm);
else if (files[0].EndsWith(".wav"))
NAudio.Wave.WaveFileReader wavfr = new NAudio.Wave.WaveFileReader(Settings.Default.m + "\\" + selected_music + ".wav");
var pcm = new NAudio.Wave.WaveChannel32(wavfr);
pcm.PadWithZeroes = false;
stream = new NAudio.Wave.BlockAlignReductionStream(pcm);
else throw new InvalidOperationException("file type is not supported.");
output = new NAudio.Wave.WaveOut();
output.Init(stream);
最初,我使用DirectSoundOut 而不是WaveOut 类,我能够克服这个问题,但不支持恢复。
我知道有很多人已经遇到过这个问题,但是这两种情况(恢复和触发 PlaybackState)是否有替代方案?
【问题讨论】:
【参考方案1】:您必须将 WaveCallbackInfo 添加到 WaveOut 类的构造函数中才能引发事件。
output = new NAudio.Wave.WaveOut(WaveCallbackInfo.FunctionCallback());
output.PlaybackStopped += (pbss, pbse) => Debug.WriteLine("Stopped"); ;
【讨论】:
我已经按照你说的做了,但它不能正常工作(实际上,它只有在流第一次接收到值时才有效):事件在下一首歌曲的中间触发。 您必须记住,Wave 播放是在不同的线程上处理的。如果在调用对象 Dispose/Close 方法之后调用了 Stop 或设置了 WaveOutEvent 回调,它只会调用引发事件。 @rene 我不知道这是什么意思【参考方案2】:摆脱BlockAlignConversionStream
和WaveFormatConversionStream
。 Mp3FileReader
直接发出 PCM(假设您使用的是最新版本的 NAudio)。
【讨论】:
效果很好,谢谢!我现在唯一遇到的问题是将另一个值传递给 output.Init()。当 PlaybackState 事件触发并 Dispose() 输出时,我使用了一个新的 EventHandler 来抛出一条消息,但是,当我调用一个过程来完成任务的其余部分时,即使用 output.Init(),它只是忽略了所有下面的行并没有任何反应(顺便说一句,没有任何错误消息)。我在调试时感觉到它,就像“时间不足以让事件调用另一个东西,它只是中断了”。以上是关于NAudio PlaybackState 永远不会停止?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 PlaybackState 在 PlaybackStopped 触发后仍保持在 Playing 状态?
NAudio MeteringSampleProvider 没有触发事件?
Xcode 11 beta -playbackState 仅在 iOS 13.0 或更新版本中可用
NAudio - WaveOut 与 WaveOffsetStream 一起使用时不会引发 PlaybackStopped 事件