Ограничения кучи Android SoundPool

Я использую SoundPool для загрузки нескольких звуковых клипов и их воспроизведения.

Насколько я могу судить, он работает на 100% правильно. Но во время вызовов .load() я получаю спам в своем журнале:

06-09 11:30:26.110: ERROR/AudioCache(23363): Heap size overflow! req size: 1050624, max size: 1048576

Я загружаю 11 звуковых файлов, из них 2 очень маленькие ~ 3 КБ, а остальные - от 10 до 15 КБ. Windows сообщает

Размер: 114кб

Размер на диске: 128кб

Раздвигаю ли я границы возможностей SoundPool? Есть ли какие-то настройки, которые я должен изменить, чтобы избежать этого переполнения? Буду очень признателен за любые рекомендации о том, как мне следует настраивать элементы управления звуком.


person FoamyGuy    schedule 09.06.2011    source источник
comment
В SoundPool довольно много ошибок. Даже если вы работаете с относительно небольшими звуковыми файлами, лучше все же использовать MediaPlayer.   -  person Brian    schedule 09.06.2011
comment
Вы можете использовать несколько экземпляров SoundPool, чтобы предотвратить ошибку размера кучи. Более подробную информацию можно найти на stackoverflow.com/a/15331311/1124084.   -  person andyao    schedule 11.03.2013


Ответы (2)


SoundPool распаковывает загруженный звук в данные PCM, чтобы он был готов к немедленному воспроизведению без задержки декодирования. Если аудио, которое вы загружаете, сильно сжато, например MP3, то оно может сильно раздуться. Попробуйте закодировать звук как моно, если стерео не нужно (обычно это не для коротких звуковых эффектов).

person Douglas Jones    schedule 11.10.2012

SoundPool имеет ограничение на размер буфера 1 Мб на дорожку. Но это ограничение относится не к размеру файла, а к распакованным необработанным данным PCM.

Я предлагаю использовать SoundPoolCompat из сторонней библиотеки. Он имеет API, аналогичный SoundPool, но имеет настраиваемый размер буфера, все данные в этом буфере будут загружаться в память и воспроизводиться с небольшой задержкой, как это делает SoundPool. Все данные, которые превышают этот размер буфера, будут загружаться по запросу (что увеличивает задержку, аналогичную MediaPlayer). Но это не приведет к сбою и не воспроизведет данные, которые соответствуют только размеру буфера, например SoundPool. Также размер буфера выражается в размере файла, а не в размере распакованных данных. Что удобнее пользователю API.

implementation 'com.olekdia:sound-pool:3.2.0'

https://gitlab.com/olekdia/common/libraries/sound-pool

person Oleksandr Albul    schedule 12.11.2019
comment
Эта библиотека дает сбой во время выполнения из-за неправильной зависимости. - person bitemybyte; 30.04.2020