【问题标题】:Playing the same mp3 file again using NAudio使用 NAudio 再次播放相同的 mp3 文件
【发布时间】:2012-09-24 16:01:02
【问题描述】:

使用 NAudio 反复播放 mp3 文件的推荐方法是什么?

到目前为止我做了什么:

在一个全球性的地方:

Mp3Reader mp3Reader = new Mp3FileReader(url);

那么每次播放 mp3 时:

WaveStream channel = new WaveChannel32( mp3Reader) ;
IWavePlayer waveout = new WaveOut();
waveout.Init(channel);
waveout.PlaybackStopped += new EventHandler(naudio_PlaybackStopped);
waveout.Play();

但它只播放第一次。

此外,它给出了这样的断言:

WaveOut device was not closed

可能在第一个实例仍在播放时再次播放 mp3 文件。

【问题讨论】:

    标签: .net naudio


    【解决方案1】:

    如果您想背靠背循环,我会通过创建自定义IWaveProvider 来实现,该自定义IWaveProvider 在内部创建Mp3FileReader。然后在Read 方法中,它传递从Mp3FileReader 读取的数据。当它结束时(mp3FileReader.Read 返回 0),您将 Position 设置回 0 并继续读取(您也可以在其间插入一点静默)。

    另一种方法是在最新版本的 NAudio (available on Nuget) 中使用 MixingSampleProvider,然后您可以在想要播放 MP3 文件时添加 AudioFileReader 的实例。然后您实际上可以同时播放相同的 MP3 文件。您可能还想放入一个虚拟的永无止境的静音流,以确保播放永无止境,您可以随时排队播放新的 MP3。

    另外,“WaveOut 设备未关闭”就是这个意思。您不能第二次调用 Init。如果您不想使用自定义波形提供程序或混音器方法,则必须处置您的原始文件并创建一个新文件(例如在您的 PlaybackStopped 处理程序中)。

    【讨论】:

    • 感谢您的回答。我会尝试第二个选项,让你知道它是否有效。这是游戏,顺便说一句。
    • 关于waveoutdevice 错误:我实际上是在播放停止时对WaveOut 执行Dispose()。正如您在我的示例代码中看到的那样,每次播放 mp3 时,我都会创建一个新的 WaveOut。
    • 好的,可能是驱动问题。通常你可以为同一个声卡创建多个 WaveOut 实例。
    • 啊哈。这也可能是 ASIO 无法正常工作的问题吗?它说我没有安装 ASIO 驱动程序。
    猜你喜欢
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    相关资源
    最近更新 更多