NAudio:重用现有的 AsioOut 实例来播放文件队列是不是安全?

Posted

技术标签:

【中文标题】NAudio:重用现有的 AsioOut 实例来播放文件队列是不是安全?【英文标题】:NAudio: Is it safe to reuse an existing AsioOut instance to play a queue of files?NAudio:重用现有的 AsioOut 实例来播放文件队列是否安全? 【发布时间】:2015-01-20 03:36:54 【问题描述】:

在查看 NAudio AsioOut 类时,似乎很明显,每次通过输出播放新文件时,实例都会被销毁并重新创建。如果实例已经有源流,则 Init 方法会专门抛出 InvalidOperationException。一般来说,在正常情况下处理和重新创建 Asio 输出不是问题,但是,在一种情况下,我想避免这样做,因为我将输出发送到设置为 Asio 驱动程序的卷积器。每次初始化驱动,都要重新加载一个大的卷积滤波器,所以在播放无间隙曲目时,延迟很烦人。

为了避免延迟,我有个思路,如果AsioOut实例已经存在就不要dispose了,队列中下一个文件的位深度和采样率和上一个文件一样。问题是我必须在 AsioOut 类上调用 Init 以将下一个要播放的文件传递给它,这将引发上述异常。如果我确保文件之间的位深度、采样率和输出通道数没有改变,那么更改 Init 方法以避免抛出异常是否安全?

谢谢, 艾伦

【问题讨论】:

【参考方案1】:

我正在回答我自己的问题。如果您使用 MixingSampleProvider 并将 ReadFully 属性设置为 true,则可以继续添加 AudioFileReaders 而无需重新初始化 AsioOut 实例,只要这些文件具有相同的采样率和位深度。 Mark Heath 写了一篇博文,他在其中讨论了一个名为 AutoDisposeFileReader 的帮助类,该类在这里很有用。

【讨论】:

以上是关于NAudio:重用现有的 AsioOut 实例来播放文件队列是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

NAudio AsioOut + 插座

Naudio:如何在不停止所有其他声音的情况下正确删除 AsioOut 播放的几种声音中的一种?

NAudio Asio 和 ieeefloat 格式

如何让 Widget PendingIntend 重用现有的 MainActivity 实例?

NAudio Asio 录制和播放

如何使用 ASIO 和 Naudio 将音频捕获保存在 wav 文件中?