使用 Java Sound API 进行多声道 USB 录制?

2022-09-01 00:42:10

我正在尝试在Snow Leopard上使用Java Sound录制/处理来自三个USB麦克风的一些音频(但如果它可以解决问题,则可以切换到Windows)。问题是,当我尝试使用与USB麦克风对应的混音器时,Java Sound告诉我该线路不受支持。具体来说,它说这个...

可用混频器:

Java 声音音频引擎

USBMIC 串行# 041270067

内置输入内置麦克风

声花(2通道)

声花 (16ch)

线程 “AWT-EventQueue-0” java.lang.IllegalArgument 异常: 行不受支持: 接口 TargetDataLine 支持格式 PCM_SIGNED 96000.0 Hz, 8 位, 立体声, 2 字节/帧,

...当我要求它选择USBMIC混音器时:

  Mixer mixer = AudioSystem.
          getMixer(mixerInfo[1]);

我尝试将音频格式与麦克风的确切规格(16位,44100Hz,立体声)相匹配,但这没有任何区别。

问题在这里突然出现:

 final TargetDataLine line = (TargetDataLine)
        mixer.getLine(info);

混合器和TargetDataLine似乎并不喜欢对方。有没有办法让这两者“匹配”并相处?

我使用的麦克风确实有点奇怪。它们被制作用于一个名为SingStar的卡拉OK视频游戏。麦克风本身具有标准的单声道线路输入连接器,可插入一个小集线器(两个插入集线器),将其转换为单个公头USB连接器。然而,除了奇怪之外,它们似乎与Audacity作为单独的通道完全一起工作,因此使用它们进行多通道录制显然是可能的,只是可能不是在Java中。

我还考虑使用像Soundflower这样的程序,在不同程序之间共享音频。但是,我不确定这是否有效,因为我看不到如何将USB麦克风输入到Soundflower,然后将它们管道传输到Java中。一个快速实验告诉我,我可以用麦克风以Audacity录制音频,通过Soundflower将其通过管道输出,然后在我的Java程序中进行处理。不过,我想做的是让这一切在Java中实时发生。

有人熟悉这种问题吗?


答案 1

我认为一个简单的方法是使用Soundflower和Soundflowerbed。

我看不出如何将USB麦克风输入到Soundflower,然后将它们通过管道传输到Java中。

听起来你已经安装了Soundflower。Soundflowerbed与Soundflower位于同一磁盘映像中,是一个菜单栏应用程序。它允许您在没有内置控件以选择声音设备的应用程序之间路由声音。从磁盘映像安装它,然后单击它以运行。

以下所有内容都将使用我的Echo Audiofire 4,但原则上应该适用于任何音频设备。

使用声花床

打开 Soundflower,然后在 Soundflower (16ch) 下勾选要使用的音频设备。由于我是新用户,我无法发布图像,但它们在下面链接。如果我获得赏金,那么我将编辑帖子以内联图像。

1

从这里开始,您将使用Soundflower(16ch)作为Java声音中的音频输入设备。

创建聚合音频设备

如果这不起作用,另一种方法是创建一个聚合设备。打开“应用程序>实用工具”>音频 Midi 设置“,然后单击加号以创建新的聚合设备。

2勾选要聚合的设备。你只需要你的USBMIC(因为我是一个新的SO用户,我只能为每个答案发布两个图像,所以接下来的两个链接到这里)。

3

可能给您带来麻烦的关键部分是设备上的时钟。如果您选择Mac作为时钟源,那么这可能会更稳定。4

如果这仍然不起作用,那么您可以尝试将Mac内置音频添加到聚合设备,并通过右键单击要成为主设备的设备使其成为主时钟。

5

其他选项

最后,我以前没有使用过这个,但是Pulse Audio(谷歌它,我不能在这篇文章中插入更多链接)可能是将音频流混合在一起的可能解决方案。不过,它看起来相当重量级。


答案 2

根据我的研究,特别是像这样的线程,您使用的麦克风最有可能导致问题。该线程指出,在切换游戏时,麦克风甚至是一个问题,因此我猜在切换平台时也会有问题。

我的建议是 - 如果你还没有尝试过这个 - 使用不同的麦克风!我弄得乱七八糟的大多数麦克风都有特殊的芯片控制器,可以将数据转换为与游戏系统兼容的数据。由于您在计算机的操作系统上使用它,您可能会获得一些非常奇怪的效果,而这些效果在Playstation或其他游戏系统上是无法获得的。

希望这有帮助!祝您编码愉快!


推荐