Быстрый Аудио Вход / Выход - PullRequest
4 голосов
/ 11 мая 2009

Вот что я хочу сделать:

Я хочу, чтобы пользователь дал моей программе некоторые звуковые данные (через микрофонный вход), затем удерживал их в течение 250 мс, а затем выводил их обратно через динамики.

Я сделал это уже с помощью Java Sound API. Проблема в том, что это довольно медленно. С момента создания звука до момента, когда звук снова слышен через динамики, требуется не менее 1-2 секунд, и я даже не пытался реализовать логику задержки. Теоретически не должно быть никаких задержек, но есть. Я понимаю, что вам нужно подождать, пока звуковая карта не заполнит свой буфер или что-то еще, и размер выборки и частота дискретизации как-то связаны с этим.

У меня такой вопрос: я должен продолжать идти по пути Java, пытаясь это сделать? Я хочу уменьшить задержку до 100 мс, если это возможно. У кого-нибудь есть опыт использования драйвера ASIO с Java? Возможно, это быстрее ..

Кроме того, я парень .NET. Имеет ли это смысл вместо .NET? А как насчет C ++? Я ищу подходящую технологию для использования здесь, и, может быть, хороший пример того, как читать / записывать аудио потоки ввода / вывода, используя вашу предлагаемую технологическую платформу. Спасибо за вашу помощь!

Ответы [ 5 ]

3 голосов
/ 13 мая 2009

Возможно, вы захотите взглянуть на JACK , аудио API, разработанный для обработки звука с малой задержкой. Кроме того, Google открывает эту изящную презентацию [PDF] об использовании JACK с Java.

Теоретически задержки быть не должно, но есть.

Ну, невозможно иметь нулевую задержку. Лучшее, на что вы можете надеяться - это незаметная задержка (с точки зрения человеческого восприятия). Это может помочь, если вы опишите свой основной алгоритм чтения и записи звуковых данных, чтобы люди могли определить возможные проблемы.

Потенциальная проблема с использованием языка сборки мусора, такого как Java, заключается в том, что сборщик мусора будет периодически запускаться, прерывая вашу обработку на некоторое произвольное время. Тем не менее, я был бы удивлен, если это> 100 мс при нормальном использовании. Если проблема с GC, большинство JVM предоставляют альтернативные алгоритмы сбора, которые вы можете попробовать.

3 голосов
/ 14 мая 2009

Если вы решите пойти по пути C / C ++, я настоятельно рекомендую использовать PortAudio (http://portaudio.com/). Он работает практически со всем на нескольких платформах и дает вам низкоуровневый контроль над звуковыми драйверами, фактически не имея дело с различными технологиями звуковых драйверов, которые существуют.

Я использовал PortAudio в нескольких проектах, и использовать его очень приятно. И лицензия разрешительная.

3 голосов
/ 11 мая 2009

Я использовал JavaSound в прошлом и обнаружил, что он чудесно ненадежный (и он постоянно меняется между выпусками ВМ) Если вам нравится C #, используйте его, просто используйте API DirectX. Вот пример того, что вы хотите делать, используя DirectSound и C #. Вы можете использовать плагины Effects для выполнения эхо-сигнала в течение 250 мс.

http://blogs.microsoft.co.il/blogs/tamir/archive/2008/12/25/capturing-and-streaming-sound-by-using-directsound-with-c.aspx

1 голос
/ 24 октября 2015

Если ваша цель - низкая задержка, вы не можете победить C.

libsoundio - это низкоуровневая библиотека C для ввода и вывода звука в реальном времени. Он даже поставляется с примером программы , которая делает именно то, что вы хотите - подключить микрофонный вход к выходу колонок.

0 голосов
/ 22 февраля 2016

С помощью JavaSound это, безусловно, достижимо, чтобы обеспечить сквозную задержку в приблизительном диапазоне 100-150 мс.

  1. Основной причиной задержки является размер буфера строк захвата и воспроизведения. Размер задается при открытии строк:

    • захват: TargetDataLine#open(AudioFormat format, int bufferSize)
    • воспроизведение: SourceDataLine#open(AudioFormat format, int bufferSize)

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

Размер буфера по умолчанию можно проверить с помощью DataLine#getBufferSize при вызове #open(AudioFormat format). Размер по умолчанию будет варьироваться в зависимости от AudioFormat и, по-видимому, предназначен для приложений с быстрым воспроизведением без задержек (например, для потоковой передачи через Интернет). Если вы разрабатываете приложение с низкой задержкой, размер буфера по умолчанию слишком велик и должен быть изменен.

В моем тестировании с 16-битным PCM AudioFormat размер буфера 1024 байта был довольно близок к идеальному для низкой задержки.

  1. Вторая и часто пропускаемая причина задержки звука - это любая другая активность, выполняемая в потоках захвата или воспроизведения. Например, запись сообщений на консоль может вводить 10 мс задержки. Выключи его.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...