2012-05-02 2 views
1

Проведя довольно много времени, пытаясь разработать свой путь вокруг существующей библиотеки javax.sound.sampled для простого (но относительно точного) захвата/воспроизведения звука, я заключу, что мне действительно нужно добраться до собственный аудио API. Проблема, которую я обнаружил, заключается в том, что мне нужно иметь возможность получить позицию кадра звука (которую я получаю, записывая в SourceDataLine) с шагом в 20 или 50 миллисекунд, с точностью до 1 или 2 миллисекунды. Другими словами, я хочу синхронизировать некоторые графические события с воспроизводимым аудио, с частотой кадров видео от 20 до 50 кадров в секунду, с дрожанием не более 1 или 2 миллисекунд. Похоже, что реализация JavaSound слишком далека от аппаратного обеспечения (для оплаты независимости платформы?). После большого «разметки» с размерами буфера SDL/TDL, аудиоформатов, размера буферов SDL.write() и TDL.read(), частоты записи и т. Д., Я не могу найти способ избежать изменения в кадре по сравнению с системными часами (с разрешением 1 миллисекунды, а не с микросекундами).Ищете оболочку Java для Windows DirectSound/WASAPI /? audio

[Дальнейшее разъяснение: Я мог бы просто позволить графическому рендерингу работать с фиксированной скоростью на основе системных часов, что было бы достаточно точным для моих нужд. Однако, если это нужно синхронизировать со звуковой дорожкой, к тому времени, когда типичная звуковая дорожка (например, 5 минут) приблизилась к концу, даже небольшие временные различия будут накапливаться в заметной разнице во времени между звуком и графикой. Я думал просто проверить синхронизацию каждую секунду (или 2 или 5), но «дрожание» из записанной позиции аудио кадра приведет к исправлениям, которые затем будут заметны.]

Я изучал, какие библиотеки могут уже доступны. Похоже, что многие из существующих пакетов нацелены на поддержку сообщества разработчиков игр. Тем не менее, мне не нужен 3D-звук, аппаратное ускорение эффектов, синтез, обработка - просто способ прочитать позицию кадра того, что слышится с последовательной задержкой. Если бы задержка составляла целых 100 миллисекунд, но я мог бы конструировать вокруг нее.

Я был бы признателен за рекомендации для библиотек Java, предоставляющих такие возможности. Я предполагаю, что это будут обертки JNI из собственного аудио API. На данный момент мне нужно только поддерживать Windows7. Я видел OpenAL (похоже, «открытый» способ поддержки аппаратного ускорения аудио, поскольку теперь он больше не поддерживается в Vista - ориентирован на игры и больше, чем мне нужно), JSyn (сосредоточившись на синтезе, MIDI, а не на простой выборке интерфейс) и JAsioHost (наиболее перспективные до сих пор).

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

Спасибо.

+0

Для этого звука с низкой задержкой, единственное, что может сделать это, это ASIO, поэтому вы можете использовать JAsioHost, но вам потребуется звуковая карта с драйвером ASIO, который в основном является профессиональным звуковым оборудованием. –

+0

@Jakub Zaverka Да, я смотрю ASIO. Я также нашел драйверы ASIO4ALL (которые работают даже для моего крошечного тестового ноутбука), но все же это больше усложняет установку. Я также вижу странное поведение с новыми драйверами. Я бы предпочел просто простую предсказуемость/наблюдаемость положения кадра без этого осложнения. Мне не нужна низкая латентность (мне нужно иметь возможность измерять постоянную задержку, чтобы справиться с ней), но мне нужно иметь возможность синхронизировать мое приложение с воспроизводимым звуком. – ags

ответ

0

Я думаю, что нет такой библиотеки ... но задача, которую вы хотите достичь на самом деле не так уж трудно:

Вы должны синхронизировать приложение аудио кадров ... Значение звука является главным органом в сроках. Вы можете создать новый таймер, который будет периодически размещать фрагменты звука для воспроизведения и выдавать события, которые воспроизводятся chunk xy.

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

Воспроизведение само может быть выполнено с помощью функций WaveOut в Windows (link here, вы можете найти учебники). Вы можете получить доступ к этим функциям из Java с помощью JNI. WaveOut воспроизводит звук в формате Wav, что означает, что вы можете открыть устройство с простой модуляцией LPC и отправлять исходные образцы.

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

0

Я не пробовал любой из них до сих пор, но может быть стоит посмотреть в:

Смежные вопросы