45

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

可用的混音器:

Java 声音音频引擎

USBMIC 序列号#041270067

内置输入内置麦克风

音花 (2ch)

音花 (16ch)

线程“AWT-EventQueue-0”java.lang.IllegalArgumentException 中的异常:不支持行:接口 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 中实时发生。

有人熟悉这种问题吗?

4

3 回答 3

4

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

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

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

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

使用 Soundflowerbed

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

1

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

创建聚合音频设备

如果这不起作用,另一种解决方法是创建一个聚合设备。打开 Applications > Utilities > Audio Midi Setup 并单击加号以创建新的聚合设备。

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

3

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

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

5

其他选项

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

于 2011-10-15T20:35:27.187 回答
2

根据我的研究,尤其是这样的线程您使用的麦克风最有可能导致问题。该帖子指出,在切换游戏时麦克风甚至是一个问题,所以我猜测切换平台时也会出现问题。

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

希望这会有所帮助!快乐编码!

于 2011-10-15T20:04:18.970 回答
0

AudioFormat 与 TargetDataLine 支持的格式不匹配。我不知道这是否是一个错字,但抛出的异常说 TargetDataLine 支持 8 位音频,并且在您说您正在使用 16 位音频格式的下方。它还支持每帧最多 2 个字节,您尝试读取数据的速度和大小是多少?抱歉,如果这没有帮助,但我想我会指出这一点,以防它被忽视。

于 2013-04-17T12:53:49.950 回答