java - 使用现有声音输入在Java中为Windows创建麦克风

标签 java audio java-stream

我想通过将声音输入到Java中的实际麦克风中来创建虚拟麦克风。例如:
笔记本电脑实际麦克风输入->转换为Java对象麦克风的任何输入(实时)->虚拟麦克风。
我希望能够将ethe虚拟麦克风用作外部应用程序上的实际麦克风。例如,假设我将此Java麦克风设置为Zoom上的输入设备,以增强原始麦克风的音频质量。如果这不是表达它的最佳方式,我深表歉意。
请记住,这是我感兴趣的个人项目,而不是我关心的用例。再次澄清一下,我想创建一个虚拟麦克风,该虚拟麦克风从实际麦克风或其他音频源获取输入,并可以被其他应用程序视为麦克风。

最佳答案

在我看来,需要解决三个不同的 Realm :

  • 阅读声音,
  • 存储在某种缓冲区
  • 为其他程序提供一个连接,以从该缓冲区获取音频数据。

  • 纯粹是DIY,我找到了一些有关Java麦克风读取的教程,并对其进行了改编,以便我将传入的音频数据打包到缓冲区中,而不是直接发送到扬声器或保存到文件中。对于缓冲区的容器类,我选择了一个ConcurrentLinkedQueue,因为它不费力地提供了add方法来放入缓冲区数据包,并提供poll方法来使一个完全独立的线程取出数据包,而无需编写任何显式的同步代码。
    需要某种中间缓冲区的原因是,音频处理趋于以不可预测的方式进行并开始,并且在一个线程上进行读取/添加和在另一个线程上进行轮询的 Activity 突发不一定会重合。我不确定,但是在我看来,如果两端直接连接,则吞吐量会受到影响,因为任一条线都会减慢信号传输的速度,这大大增加了信号丢失的可能性。有了缓冲区,两条线都可以弯曲一些而不会互相阻塞。
    我摆弄ConcurrentLinkedQueue以获得合理的数据包大小,但我不确定是否有最佳设置,目前设置为512 PCM值。但是我确实有一个功能设置,即使有些迟钝,也可以将麦克风数据传送到数字延迟器,然后将延迟输出回声作为我编写的混音器上的音轨。
    似乎您可以通过某种套接字或与外界的连接来轻松处理轮询。但是连接到外部世界超出了我的个人经验。

    关于java - 使用现有声音输入在Java中为Windows创建麦克风,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63656295/

    相关文章:

    java - 用于登录/注册/检查 HttpSession 的 Web servlet 方法是否有效?

    java - Linux下java war文件解压异常

    java - Java 播放 wav 声音最有效的方法

    java - 列出不同的元素,包括 Java Streams 的计数

    java - 使用 startDate 和 endDate 按月分组

    Java 使用 void 方法进行流映射?

    java - 为什么强制转换 Object[] 数组是错误的?

    javascript - 从 Javascript 播放声音的跨平台、跨浏览器方式?

    javascript - 振荡器的网络音频 FFT?

    java - 在这个简单的类中是否有任何需要避免的异常?