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】:

摆脱BlockAlignConversionStreamWaveFormatConversionStreamMp3FileReader 直接发出 PCM(假设您使用的是最新版本的 NAudio)。

【讨论】:

效果很好,谢谢!我现在唯一遇到的问题是将另一个值传递给 output.Init()。当 PlaybackState 事件触发并 Dispose() 输出时,我使用了一个新的 EventHandler 来抛出一条消息,但是,当我调用一个过程来完成任务的其余部分时,即使用 output.Init(),它只是忽略了所有下面的行并没有任何反应(顺便说一句,没有任何错误消息)。我在调试时感觉到它,就像“时间不足以让事件调用另一个东西,它只是中断了”。

以上是关于NAudio PlaybackState 永远不会停止?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 PlaybackState 在 PlaybackStopped 触发后仍保持在 Playing 状态?

NAudio MeteringSampleProvider 没有触发事件?

麦克风停止向 NAudio 提供数据

Xcode 11 beta -playbackState 仅在 iOS 13.0 或更新版本中可用

NAudio - WaveOut 与 WaveOffsetStream 一起使用时不会引发 PlaybackStopped 事件

NAudio - 如何在结束后立即播放音频而不会有任何延迟?