Многоканальная запись USB с Java Sound API?
Я пытаюсь записать/обработать некоторый звук из трех USB-микрофонов с помощью Java Sound на Snow Leopard (но может переключиться на Windows, если он исправляет все). Проблема в том, что когда я пытаюсь использовать микшер, который соответствует микрофону usb, Java Sound говорит мне, что линия не поддерживается. В частности, это говорит об этом...
Доступные смесители:
Java Sound Audio Engine
USBMIC Serial # 041270067
Встроенный встроенный микрофон ввода
Soundflower (2ch)
Soundflower (16ch)
Исключение в потоке "AWT-EventQueue-0" java.lang.IllegalArgumentException: Строка не поддерживается: интерфейс Формат поддержки TargetDataLine PCM_SIGNED 96000.0 Гц, 8 бит, стерео, 2 байта/кадр,
... когда я попрошу выбрать микшер USBMIC:
Mixer mixer = AudioSystem.
getMixer(mixerInfo[1]);
Я пробовал сопоставить аудиоформат с точными характеристиками микрофонов (16 бит, 44100 Гц, стерео), и это не имело никакого значения.
Проблема возникает здесь:
final TargetDataLine line = (TargetDataLine)
mixer.getLine(info);
Казалось бы, микшер и TargetDataLine не любят друг друга. Есть ли способ заставить этих двоих "поиграть" и ладить?
Микрофоны, которые я использую, по общему признанию, немного странные. Они были сделаны для использования в видеоигре караоке под названием SingStar. У самих микрофонов есть стандартные моно линейные разъемы, которые подключаются к небольшому концентратору (от двух до ступицы), который преобразует их в один мужской разъем USB. Странность в стороне, однако, они, похоже, отлично работают с Audacity как отдельные каналы, поэтому многоканальная запись с ними явно возможна, возможно, не на Java.
Я также рассмотрел возможность использования такой программы, как Soundflower, которая делится звуком между различными программами. Тем не менее, я не уверен, что это сработает, поскольку я не могу понять, как сделать входы микрофонов USB в Soundflower, а затем подключить их к Java. Быстрый эксперимент показал мне, что я могу записывать аудио в Audacity из микрофонов, транслировать его через Soundflower, а затем обрабатывать в своей программе Java. Тем не менее, я бы хотел, чтобы все это происходило в реальном времени на Java.
Кто-нибудь знаком с этой проблемой?
Ответы
Ответ 1
Я думаю, что простой способ сделать это - использовать Soundflower и Soundflowerbed.
Я не вижу, как сделать входы микрофонов USB в Soundflower, а затем подключить их к Java.
Похоже, у вас уже установлен Soundflower. Soundflowerbed находится на том же образ диска, что и Soundflower, и представляет собой текстовое приложение. Он позволяет маршрутизировать звук между приложениями, у которых нет встроенных элементов управления для выбора звуковых устройств. Установите это с образа диска и щелкните по нему, чтобы запустить.
Все следующие будут использовать мой Echo Audiofire 4, но в принципе должны работать на любом звуковом устройстве.
Использование Soundflowerbed
Откройте Soundflower и отметьте аудиоустройство, которое вы хотите использовать в Soundflower (16ch). Поскольку я новый пользователь, я не могу размещать изображения, но они связаны ниже. Если я получу награду, я отредактирую сообщение, чтобы включить изображения в строку.
![1]()
Здесь вы должны использовать Soundflower (16ch) в качестве устройства ввода аудио в звуке Java.
Создание агрегатного аудиоустройства
Альтернативный способ решить это, если это не сработало, - создать агрегатное устройство. Откройте "Приложения" > "Утилиты" > "Настройка аудио Midi" и щелкните знак "плюс", чтобы создать новое агрегатное устройство.
Отметьте устройство, которое вы хотите объединить. Вам нужен только ваш USBMIC (поскольку я новый пользователь SO, я могу отправлять только два изображения за каждый ответ, поэтому следующие два связаны здесь).
![3]()
Ключевая часть, которая может вызвать проблемы, - это часы на устройстве. Если вы выберете Mac в качестве источника синхронизации, это может быть более стабильным.
![4]()
Если это все еще не работает, вы можете попробовать добавить встроенный звук Mac в агрегатное устройство и сделать его главными часами, щелкнув правой кнопкой мыши на устройстве, которое вы хотите стать ведущим.
![5]()
Другие опции
Наконец, я не использовал это раньше, но Pulse Audio (Google, я не могу вставлять больше ссылок в этот пост) может быть возможным решением для смешивания ваших аудиопотоков. Однако он выглядит довольно тяжеловесным.
Ответ 2
Согласно моим исследованиям, особенно такие темы, как this, используемый вами микрофон, скорее всего, вызывает проблему. В потоке говорится, что микрофон является даже проблемой, когда дело доходит до переключения игр, поэтому я предполагаю, что это будет проблемой и при переключении платформ.
Мое предложение - если вы еще не пробовали это - использовать другой микрофон! Большинство микрофонов, с которыми я столкнулся, имеют специальные контроллеры чипов, которые преобразуют данные в данные, совместимые для игровой системы. Поскольку вы используете это в операционной системе для компьютера, вы, вероятно, получаете некоторые очень странные эффекты, которые вы не могли бы получить в игровой системе, такой как Playstation или другие.
Надеюсь, это поможет! Счастливое кодирование!
Ответ 3
AudioFormat не соответствует формату, поддерживаемому TargetDataLine. Я не знаю, была ли это опечатка или нет, но Исключение было сказано, что TargetDataLine поддерживает 8-битный звук и прямо ниже того, что вы сказали, что используете 16-битный AudioFormat. Он также поддерживает до 2 байтов на кадр, насколько быстро и в каких размерах вы пытаетесь прочитать данные? Извините, если это не поможет, но я подумал, что укажу на это, если это будет упущено.