Воспроизведение звука в фоновом режиме без прерывания работы медиаплеера

Как воспроизвести фоновый звук на Android, не прерывая MediaPlayer воспроизведения, с помощью MediaPlayer (предпочтительно) или OpenSL ES?

Я знаю, что SoundPool может воспроизводить звуковые эффекты, не прерывая воспроизведения MediaPlayer, но размер ограничен 1M на эффект, что намного меньше. Не запрашивается фокус звука, через AudioManager тоже не работает, в этом случае звук вообще не воспроизводится.

А в случае с OpenSL ES весь звук обычно останавливается, когда я начинаю воспроизводить более длинный ресурсный файл. Это похоже на поведение SoundPool, описанное выше.

Изменить из комментариев:

Я не хочу мешать другим музыкальным проигрывателям, это фоновый звук игры, который должен воспроизводиться, не прерывая, например, музыку проигрывателя. В таких играх, как Subway Surfer, Clash Royale и подобных, это как-то достигается, но мне не удалось добиться этого с помощью OpenSL ES или MediaPlayer.


person Leandros    schedule 05.03.2016    source источник
comment
Мне не ясна ситуация, которую вы пытаетесь избежать. Это ваш собственный MediaPlayer, который каким-то образом прерывается, или что-то из другого приложения?   -  person Doug Stevenson    schedule 05.03.2016
comment
Я не хочу мешать другим музыкальным проигрывателям, это фоновый звук игры, который должен воспроизводиться, не прерывая, например, музыку проигрывателя. В таких играх, как Subway Surfer, Clash Royale и подобных, это как-то достигается, но мне не удалось добиться этого с помощью OpenSL ES или MediaPlayer.   -  person Leandros    schedule 05.03.2016
comment
Пробовали ли вы транслировать (декодированный, необработанный PCM) звук через AudioTrack?   -  person Doug Stevenson    schedule 05.03.2016
comment
Нет, но я сейчас посмотрю.   -  person Leandros    schedule 05.03.2016
comment
@Doug Stevenson AudioTrack действительно работает. Однако он воспроизводит только необработанный звук PCM. И боль в использовании. Хотя это применимо, это лучшее, что у меня есть. Будем надеяться, что libogg надежно работает на Android.   -  person Leandros    schedule 05.03.2016
comment
По моему опыту, ogg — лучший способ работать на Android.   -  person Doug Stevenson    schedule 05.03.2016


Ответы (1)


Для воспроизведения звука в фоновом режиме вы можете использовать SoundPool, AudioTracks и OpenSlES.

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

AudioTrack: вы можете использовать данные RAW PCM в звуковой дорожке. Если вы хотите, вы можете извлечь данные PCM с помощью MediaExtractor практически из всех форматов и использовать их. Но в вашем случае это будет немного работы для вас, но это действительно хорошо (поддерживает огромные данные, даже потоковое вещание).

OpenSLES: по-видимому, Android использует OpenSLES в фоновом режиме для всех своих целей. Так что его использование вам очень поможет. Но сделать все на нем не так-то просто. Вам нужно узнать больше для меньшей работы.

Я глубоко работал над OpenSlES около 20 дней, и все же я скажу, что для небольших целей используйте звуковой пул, для реализации среднего и высокого уровня используйте AudioTracks, а для офигенной реализации используйте OpenSLES.

PS: Это плохо повлияет на вашего пользователя, если вы будете воспроизводить звук игры в фоновом режиме, пока он играет свою музыку или звонит. Личный опыт.

person user2609137    schedule 07.03.2016