【问题标题】:Feed a capture device (e.g. microphone) with audio in C#在 C# 中为捕获设备(例如麦克风)提供音频
【发布时间】:2021-08-17 23:40:16
【问题描述】:

有没有办法在 C# 中直接将音频播放到捕获设备中?在我的项目中,我稍后将不得不在带有音频的虚拟捕获驱动程序上使用它,以便我可以在其他程序中使用它并在其他任何地方播放所需的音频,但我不确定在 C# 中是否可行,我尝试使用@987654321 来做到这一点@(真是太棒了):

    var enumerator = new MMDeviceEnumerator();
    MMDevice captureDevice = enumerator.GetDefaultAudioEndpoint(DataFlow.Capture, Role.Multimedia);
    WasapiOut wasapiOut = new WasapiOut(captureDevice, AudioClientShareMode.Shared, false, 0);

但最终它只是抛出带有代码0x88890003COMException,这会转换为错误“AUDCLNT_STREAMFLAGS_LOOPBACK 标志已设置,但端点设备是捕获设备,而不是渲染设备”。那么到底有没有可能的解决方案,还是我必须转向另一种语言,比如 C++?

【问题讨论】:

    标签: c# windows naudio wasapi


    【解决方案1】:

    您不能将音频推送到自行生成音频的设备,即“捕获设备”。

    Loopback mode 表示您可以从渲染设备获得音频流的副本,但反之则不行。

    当您有一个特殊的(以及自定义或第三方,因为不存在这种库存实现)实现音频捕获设备时,事情可以或多或少地工作,旨在生成由外部应用程序提供的音频比如你通过 API 推送有效载荷音频数据。

    切换到 C++ 对这个挑战毫无帮助。

    【讨论】:

    • 很有趣,所以虚拟音频捕获驱动程序必须负责获取自己的数据,如果我没弄错的话。能否请您指导我到一些链接,在这些链接中我可以找到有关在本地推送有效负载数据的过程的更多信息,这些数据可以被其他应用程序读取(例如本场景中的自定义驱动程序)?
    • 恐怕最接近的样本是来自 DDK 的通用音频设备驱动程序。一些使用的解决方法是使用第三方虚拟音频软件,该软件创建一对虚拟设备,捕获和播放。您将“播放”到后者,驱动程序将复制前者的数据,显示为来自捕获设备。
    • 很遗憾我不能在这个项目中使用第三方驱动程序,特别是如果它们不是开源的,我将不得不从头开始构建一个:D
    猜你喜欢
    • 1970-01-01
    • 2015-07-08
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    相关资源
    最近更新 更多