带有 NAudio 的音频中继器

Posted

技术标签:

【中文标题】带有 NAudio 的音频中继器【英文标题】:Audio repeater with NAudio 【发布时间】:2011-07-20 10:29:46 【问题描述】:

我正在实现一个程序,它从输入设备读取音频流并使用 NAudio 将其发送到输出设备。为此,我使用WaveIn 及其DataAvailable 事件从输入流中获取数据。写入数据,我即将使用WaveOut,这也意味着我需要使用IWaveProvider的一些实现。使用队列来满足我的需要似乎非常简单。除了一件事:当队列为空并调用Read() 方法时会发生什么?我在文档中没有找到任何关于此的内容。我认为我有的选项:

    该方法应该阻塞,直到一些数据可用。 该方法立即返回 0,表示当前没有可用数据。 用零填充缓冲区。

我在考虑使用选项 1 或 2,但后来我发现 BufferedWaveProvider(和 WaveInProvider,内部使用 BufferedWaveProvider)使用选项 3。据此,我推断选项 3 是首选.

问题是,我是否推断正确,我应该使用选项 3 吗?如果我使用选项 1 或 2 会发生什么?那还能用吗?

【问题讨论】:

【参考方案1】:

当声卡需要更多数据播放时调用 Read 方法。阻塞通常不是一个好的选择,因为您可能在驱动程序本身的线程上(如 ASIO 或带有函数回调的 WaveOut),或者您可能在 GUI 线程上(如带有 windows 消息回调的 WaveOut)。

Read 方法返回 0 表示“这是音频数据的结尾”,因此返回 0 会导致播放停止。

因此,选项三是最好的选择,不阻塞不应阻塞的线程并允许继续播放。

如果您的 Read 方法的使用者是 WaveFileWriter,则选项 1 可以,(选项 2 可能取决于您如何确定何时停止写入 WAV 文件)。

【讨论】:

以上是关于带有 NAudio 的音频中继器的主要内容,如果未能解决你的问题,请参考以下文章

带有中继器的嵌套选项卡 - 高级自定义字段 Wordpress

使用带有json字符串列的中继器

带有效果的 Windows 8.1 应用音频(NAudio 或 SharpDX)

插入计数器时 ACF 中继器字段未打开模式

将传入的令牌下游中继到其他服务

带有 SMTP 中继的 OS X 服务器