【问题标题】:win32 Output bytes as Sound Inputwin32 输出字节作为声音输入
【发布时间】:2013-07-04 06:53:33
【问题描述】:

我有一个应用程序的疯狂想法:会有两个设备。一台设备会接受麦克风输入,通过网络将原始 PCM 字节发送到另一台设备,并且其上的应用程序会使设备认为这些声音来自麦克风。除了作为声音输入部分的馈送字节之外,我已经设法编写了所有内容。

我已经在网上搜索了很长时间,但我找不到任何东西:看起来我不知道如何正确命名问题。

接收器是用原生 C++ 编写的,带有用于 GUI 的 C# WPF Wrapper。有谁知道我可以通过 Win32 API 解决这个问题的方法,或者 .NET 中可能有这样的功能?

【问题讨论】:

  • 通过“作为声音输入部分的馈送字节”很难准确说出您想要什么:(a)从麦克风获取 PCM 输入(即原始“字节”数据); (b) 通过网络发送数据; (c) 在另一台电脑上播放; (d) 在远程计算机上制作一个麦克风设备来播放字节......?
  • (d) 是我想要的。我已经成功地从一台计算机获取 PCM 字节,通过网络将其发送到第二台计算机,但是,我不知道如何使该声音显示为第二台计算机的麦克风输入。
  • 在这种情况下,您可能需要使用内核驱动程序 (?) 创建麦克风设备或使用Windows Core Audio APIs 之一
  • 我在寻找适合我需要的 Windows Core Audio API,但我之前和现在都找不到任何有用的东西(也许我错过了什么?)。至于司机......我想这超出了我的范围:/。
  • @Sunius 当您说“声音显示为第二台 PC 的麦克风输入”时,通过扬声器播放 RAW PCM 就足够了,或者您是否有其他原因想要“伪造”麦克风。

标签: c# c++ winapi audio input


【解决方案1】:

你需要两件事:

  1. 实现符合 PortCI 的驱动程序:请参阅 http://msdn.microsoft.com/en-us/library/windows/hardware/ff536829(v=vs.85).aspx 作为起点
  2. 在您的应用程序中使用此驱动程序来执行 您需要的任何音频功能。

在第 1 步中,您必须编写一个音频适配器驱动程序,该驱动程序将使用一些现有的内核驱动程序来处理网络适配器。顺便说一句,在这里你必须注意不要从网络中“窃取”不需要的数据包。您必须想办法确定哪些数据包是音频数据包,哪些不是。也许在第一步中您只为此使用一个专用网络驱动程序。

建议在内核级别工作,以便操作系统将您的“自定义网络音频设备”视为音频设备。 Windows 提供了一个不错的 API,用于将您的字节视为音频字节,对它们应用过滤器等(另请参阅 http://msdn.microsoft.com/en-us/library/windows/hardware/ff538901(v=vs.85).aspx 了解更多信息)

【讨论】:

  • 内核代码将用于虚拟音频驱动程序,但我认为没有理由在那里处理网络。用于接收和处理传入音频然后将其传递给内核驱动程序的用户模式流应该运行良好,更易于开发和调试,并且安全漏洞不那么严重。尽可能避免使用内核代码处理不受信任的数据。
  • 您必须向驱动程序提供字节;这取决于你如何做到这一点。我同意,从网络驱动程序中过滤字节不是一个好主意......他的问题很特别,因为他想欺骗操作系统输入声源。自然,如果您是硬件供应商,您会从内核领域的某个硬件端口获取字节。
  • 谢谢,我会调查的。
猜你喜欢
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多