Микширование звуковых эффектов с помощью OpenSL на Android - PullRequest
3 голосов
/ 11 сентября 2011

В настоящее время я реализую микширование звуковых эффектов на 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 и пример кода, но там не так много в отношении микширования (только загрузка, которую я уже понял). Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 08 февраля 2012

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

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

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

...