Микширование звуковых эффектов с помощью OpenSL на Android

В настоящее время я реализую микширование звуковых эффектов на Android через OpenSL. У меня есть начальная реализация, но я столкнулся с некоторыми проблемами.

Моя реализация выглядит следующим образом:

1) Для каждого звукового эффекта я создаю несколько объектов AudioPlayer (по одному для каждого одновременного звука), которые используют источник данных SLDataLocator_AndroidFD, который, в свою очередь, ссылается на файл OGG. Например, если у меня есть звук выстрела из пистолета (давайте назовем его gun.ogg), который воспроизводится в быстрой последовательности, я использую около 5 объектов AudioPlayer, которые ссылаются на один и тот же источник звука gun.ogg, а также на один и тот же объект outputmix.

2) Когда мне нужно воспроизвести этот звуковой эффект, я просматриваю все созданные мной объекты AudioPlayer и нахожу тот, который в настоящее время не находится в состоянии SL_PLAYSTATE_PLAYING, и использую его для воспроизведения эффекта.

3) Перед воспроизведением клипа я ищу его начало с помощью SLPlayItf::SetPosition.

Пока все работает нормально, но при быстром воспроизведении звуков возникает потрескивание. Я прочитал в группе новостей Android NDK, что OpenSL на Android имеет проблемы с переключением источников данных. Кто-нибудь сталкивался с этой проблемой?

Мне также интересно, видел ли кто-нибудь еще или придумал подход к микшированию звука для OpenSL на Android. Если да, то отличается ли ваш подход от моего? Есть совет по поводу треска?

Я обыскал Интернет в поисках документации OpenSL и примера кода, но там не так много информации о микшировании (только загрузка, которую я уже понял). Любая помощь будет принята с благодарностью.


person Mark    schedule 11.09.2011    source источник


Ответы (1)


Это, вероятно, не лучший подход (создание множества экземпляров аудиоплееров). К сожалению, версия OpenSL ES для Android (2.3) не поддерживает SLDynamicSourceItf. Что было бы похоже на интерфейс привязки источника OpenAL. Одним из подходов было бы создание нескольких потоковых проигрывателей. Затем вы должны найти потоковый проигрыватель, который в данный момент не воспроизводится, и начать потоковую передачу на него звукового эффекта из памяти. Это не идеально, но выполнимо.

Вероятно, вам также не следует использовать формат ogg для звуковых эффектов. Вам лучше использовать WAV (PCM), так как его не нужно декодировать.

Ogg отлично подходит для потоковой передачи фоновой музыки.

person Byron    schedule 08.02.2012