Многоканальная USB-запись с Java Sound API? - PullRequest
45 голосов
/ 21 ноября 2010

Я пытаюсь записать / обработать звук с трех USB-микрофонов с помощью Java Sound на Snow Leopard (но могу переключиться на Windows, если это все исправит).Проблема в том, что когда я пытаюсь использовать микшер, который соответствует USB-микрофону, Java Sound говорит мне, что линия не поддерживается.В частности, это говорит об этом ...

Доступные микшеры:

Java Sound Audio Engine

USBMIC Serial # 041270067

Встроенный входВстроенный микрофон

Soundflower (2 канала)

Soundflower (16 каналов)

Исключение в потоке "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.

Кто-нибудь знаком с такой проблемой?

Ответы [ 3 ]

4 голосов
/ 16 октября 2011

Я думаю, что простым способом сделать это было бы использование Soundflower и Soundflowerbed.

Я не понимаю, как сделать входы микрофонов USB для Soundflower, а затем направить их в Java.

Похоже, у вас уже установлен Soundflower.Soundflowerbed находится на том же образе диска, что и Soundflower, и является приложением меню.Это позволяет вам направлять звук между приложениями, в которых нет встроенных элементов управления для выбора звуковых устройств.Установите его из образа диска и щелкните по нему для запуска.

Все нижеперечисленное будет использовать мой Echo Audiofire 4, но в принципе должно работать на любом аудиоустройстве.

Использование Soundflowerbed

Откройте Soundflower и отметьте аудиоустройство, которое вы хотите использовать в Soundflower (16 каналов).Поскольку я новый пользователь, я не могу публиковать изображения, но они связаны ниже.Если я получу вознаграждение, я отредактирую пост, включив в него изображения.

1

Здесь вы можете использовать Soundflower (16-канальный) в качестве устройства ввода звука в звуке Java.

Создание агрегатного аудиоустройства

Альтернативный способ решить эту проблему, если это не сработало, - создать агрегатное устройство.Откройте «Приложения»> «Утилиты»> «Настройка аудио Midi» и щелкните знак «плюс», чтобы создать новое устройство агрегирования.

2 Отметьте устройство, которое вы хотите агрегировать.Вам нужен только USBMIC (так как я новый пользователь SO, я могу опубликовать только два изображения на ответ, поэтому следующие два связаны здесь).

3

Ключевая часть, котораяВозможно, это доставляет вам неприятности - это часы на устройстве.Если вы выберете Mac в качестве источника синхронизации, он может быть более стабильным.4

Если это по-прежнему не работает, вы можете попробовать добавить встроенное аудио Mac к устройству-агрегатору и сделать его основными часами, щелкнув правой кнопкой мыши устройство, которое вы хотите стать главным.

5

Другие опции

Наконец, я не использовал это раньше, но Pulse Audio (Google это, я не могу вставить больше ссылок в этом посте)может быть возможным решением для смешивания ваших аудио потоков вместе.Хотя выглядит довольно тяжеловесно.

2 голосов
/ 16 октября 2011

Согласно моим исследованиям, особенно нитям, таким как this , используемый вами микрофон, скорее всего, вызывает проблему.В ветке говорится, что с переключением игр даже возникает проблема с микрофоном, поэтому я предполагаю, что это будет проблемой и при переключении платформ.

Мое предложение - если вы еще не пробовали это- использовать другой микрофон!Большинство микрофонов, с которыми я сталкивался, имеют специальные чип-контроллеры, которые преобразуют данные в данные, совместимые с игровой системой.Поскольку вы используете это в операционной системе для компьютера, вы, вероятно, получаете некоторые очень странные эффекты, которых вы не получите в игровой системе, такой как Playstation или др.

Надеюсь, это поможет!Удачного кодирования!

0 голосов
/ 17 апреля 2013

AudioFormat не соответствует поддерживаемому формату TargetDataLine. Я не знаю, было ли это опечаткой или нет, но в исключении говорится, что TargetDataLine поддерживает 8-битное аудио, а прямо под ним вы сказали, что используете 16-битный AudioFormat. Он также поддерживает до 2 байтов на кадр. Как быстро и в каком размере вы пытаетесь прочитать данные? Извините, если это не поможет, но я подумал, что укажу на это, если это упустят из виду.

...