gpt4 book ai didi

带有 NAudio 的音频中继器

转载 作者:行者123 更新时间:2023-12-02 22:24:28 27 4
gpt4 key购买 nike

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

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

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

    问题是,我是否推断正确,我应该使用选项 3 吗?如果我使用选项 1 或 2 会发生什么?这甚至会起作用吗?

    最佳答案

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

    从 Read 方法返回 0 意味着“这是音频数据的结尾”,因此返回 0 将导致播放停止。

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

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

    关于带有 NAudio 的音频中继器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6760485/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com