Нужна помощь с воспроизведением аудио на Android. У нас есть приложение OpenGL (Java + C++), и теперь мы хотим воспроизвести звуковые эффекты. Игроки должны позволять изменять скорость воспроизведения и громкость во время игры. Может быть OpenSL или Audiotrack.
Первый вопрос? Есть ли бесплатная или коммерческая библиотека/оболочка, которая может это сделать? (может быть, Java или нативная)
.., если нет, я объясню, что мы сделали до сих пор, и проблемы, с которыми мы столкнулись.
Мы создали класс MusicPlayer (расширяет AsyncTask) с экземпляром AudioTrack. В onResume() активности мы создали 5 экземпляров, выполняя их в пуле потоков. В задаче doInBackground() у нас есть работающий цикл, который проверяет изменение состояния, загружает файлы и записывает в буфер. В JNI у нас есть синглтон, который хранит очередь событий и отправляет их в java раз в 10 миллисекунд. Это как-то работает, но довольно далеко от того, чтобы быть приемлемым. Мы испытываем следующие проблемы:
- Когда файл начинает воспроизводиться, мы слышим короткий шум при запуске. Например, щелчок или что-то в этом роде.
- Даже если мы сбрасываем или отпускаем AudioTrack, кажется, что звук воспроизводится в очереди (особенно когда нужно быстро изменить буферы)
- Мы не можем создать цикл в MODE_STREAM
- Когда мы изменяем локальную переменную AsyncTask CHANGE_RATE и RATE, она должна вызывать audioTrack.setPlaybackRate(RATE). Это происходит, но ничего не происходит.
Раньше я писал на Obj-C для iOS, и есть много «готовых к использованию» решений (например, управление какао). Никогда не думал, что работа со звуком на Android станет таким кошмаром;/ Будем очень признательны за любую помощь :)
AudioTrack
. Если вы снова и снова заполняете буферы одними и теми же данными PCM, вы будете слышать одни и те же данные PCM снова и снова. - person Michael   schedule 21.02.2014