Приостановить воспроизведение SourceDataLine - PullRequest
2 голосов
/ 11 октября 2009

Я хочу воспроизвести звук WAV (звуковую дорожку в каком-либо пользовательском видеоформате) на Java, однако у меня возникли проблемы с использованием Clip для этого: кажется, что за раз можно услышать только один экземпляр. Поэтому я переключаюсь на простой старый путь SourceDataLine.

В этом контексте я хочу приостановить и возобновить звук, поскольку видео находится в режиме паузы и без паузы. К несчастью. Когда я вызываю stop () на SDL, поток воспроизведения полностью завершается и звуковой буфер очищается:

sdl.open();
sdl.start();
sdl.write(dataBuffer);
sdl.drain();
sdl.stop();

Выполнение асинхронного останова (), когда аудиопоток блокирует запись () или сток (), практически теряет позицию воспроизведения.

Как я могу сделать паузу с SourceDataLine блокирующим способом и / или как я могу узнать, сколько аудио было воспроизведено через него, чтобы сделать резюме с использованием записи (databuffer, skip, len)?

1 Ответ

4 голосов
/ 09 августа 2011

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

drain() следует вызывать в конце, если вы хотите убедиться, что все данные, которые вы записали в SourceDataLine, воспроизводятся. Не называйте это для функциональности "паузы"!

Правильно, что вы должны записывать небольшие буферы в строку исходных данных для лучшего контроля. Хороший размер эквивалентен 50 мс буферам - используйте метод open(AudioFormat, bufferSize), чтобы указать размер буфера в байтах (например, 8820 байт для 44100 Гц, 16-битное стерео).

Также я бы сказал, что использование Clip является предпочтительным решением. Используйте start () и stop () на Clip, и он не должен сильно глотать. Большинство реализаций Java Sound используют SourceDataLine внутри для Clip, поэтому функциональных различий не должно быть. Java Sound должен убедиться, что вы можете воспроизводить несколько клипов одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...