Проведя довольно много времени, пытаясь разработать свой путь вокруг существующей библиотеки 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, это тоже было бы хорошо, но я только что отказался после недели усилий.
Спасибо.
Для этого звука с низкой задержкой, единственное, что может сделать это, это ASIO, поэтому вы можете использовать JAsioHost, но вам потребуется звуковая карта с драйвером ASIO, который в основном является профессиональным звуковым оборудованием. –
@Jakub Zaverka Да, я смотрю ASIO. Я также нашел драйверы ASIO4ALL (которые работают даже для моего крошечного тестового ноутбука), но все же это больше усложняет установку. Я также вижу странное поведение с новыми драйверами. Я бы предпочел просто простую предсказуемость/наблюдаемость положения кадра без этого осложнения. Мне не нужна низкая латентность (мне нужно иметь возможность измерять постоянную задержку, чтобы справиться с ней), но мне нужно иметь возможность синхронизировать мое приложение с воспроизводимым звуком. – ags