Насколько плох Android SoundPool? Какая альтернатива использованию?

Я рассматривал Android SoundPool как механизм для реализации звуковых эффектов в моей общей библиотеке разработки игр. Это казалось идеальным.

Но немного исследований показывает, что все виды ошибок в SoundPool. Являются ли ошибки в SoundPool актуальными?

Поскольку я разрабатываю библиотеку, любые ошибки в SoundPool становятся ошибками в моей библиотеке, и я хочу изолировать своих пользователей от этого.

Итак, мой вопрос в основном: какой API я должен использовать для аудио?

Использование AudioTrack и запись моего собственного микшера не может быть и речи. Но, очевидно, было бы предпочтительнее избегать этого. И есть ли какой-нибудь API для декодирования для меня?

Мне нужно иметь возможность воспроизводить разумное количество одновременных звуковых эффектов (не менее 16, скажем), и еще более открытыми. Звуки должны начинаться с низкой латентности. WAV файлы должны поддерживаться (MP3/Ogg неважно). Звуковые эффекты должны поддерживать бесшовный цикл и динамическую индивидуальную регулировку громкости. Жизненный цикл приложения Android должен быть должным образом поддержан.

Я слышал, что для SoundPool есть ограничение 1 МБ, это, вероятно, приемлемо для каждого отдельного звукового эффекта, но не для всех буферов/звуков. Может ли кто-нибудь сказать мне, в чем предел?

Наконец, мне нужно иметь возможность играть в фоновую музыку, в сжатых форматах, с низкой загрузкой процессора. Я предполагаю, что MediaPlayer идеально подходит для этого. Может ли он использоваться параллельно с другим API?

Я знаю, что несколько человек использовали MediaPlayer для заполнения для SoundPool. Но поддерживает ли он те функции, которые мне нужны?

Есть ли какие-либо другие аудио API, которые я пропустил?

Ответ 1

Просто добавьте несколько последних отзывов об этой проблеме. Я использую SoundPool в течение некоторого времени в приложении с довольно большой базой данных для ключевых звуков нажатия. Наш прецедент:

  • Необходимо немедленно воспроизвести
  • Звук до 3+ параллельно
  • Мы используем setRate через весь диапазон [0.5f-2.0f]

Теперь я столкнулся с двумя серьезными проблемами, связанными с устройством, и решил сократить мои потери и отключиться от SoundPool

  • Большое количество 4.4 устройств LG (в основном линии LG G2/G3) имели собственный сбой с их внедрением SoundPool. Это было исправлено в обновлении (в конечном итоге), но у нас все еще есть много пользователей с неусовершенствованными устройствами.
  • У устройств Sony Xperia в настоящее время есть всевозможные проблемы с SoundPool как сообщенные другими пользователями. В моем случае я обнаружил, что если вы используете setRate с rate > 1.0f, SoundPool с запуском бросает исключения до тех пор, пока ваше приложение не закроется (и не запустит кучу батареи в процессе).

TL; DR; Я больше не думаю, что это стоит опасности/нервозности отладки SoundPool

Ответ 2

Придерживайтесь файлов OGG, а SoundPool будет вам в порядке. Это характер мультиплатформенного зверя, который является Android, что там будут аппаратные конфигурации, которые не будут работать с любой важной программой, независимо от того, насколько старательно пытаются программисты.

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

К сожалению. Кажется, что это не тот ответ, который вы искали. Удачи!

Ответ 3

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: У меня небольшой опыт работы с MediaPlayer, и я не знаю успешного опыта с другими API, о которых я упоминаю, и следующая информация основана на том, что я читал в DOC, и о том, что я прочитал из поисковых запросов Google.

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

Там также JetPlayer http://developer.android.com/reference/android/media/JetPlayer.html, который, похоже, много работает для эффективного использования, но он будет очень хорошо работать с воспроизведением фоновой музыки, а затем воспроизводить другие звуки по мере необходимости в игре. Из того, что я читал о DOC, требуется файл MIDI (я думаю?), И вы отключите звук и включите треки, чтобы заставить его работать так, как вы хотите.

Мне нравится AudioTrack, потому что он дает вам возможность редактировать звуки во время выполнения, изменяя частоты звука, и SoundPool может сделать то же самое.

Хотя для вашей ситуации AudioTrack не похоже, что он будет работать хорошо, поскольку для воспроизведения двух звуков потребуется два потока, потому что AudioTrack блокирует (я уверен).

И с SoundPool я думаю, что, поскольку у вас есть 16 звуков, возможно, в каждом потоке может быть два потока с одним SoundPool и применять 8 звуков для каждого SoundPool. Я действительно не знаю, хотя, поскольку я даже не пытался использовать SoundPool.

И снова моя информация основана не на опыте, а на том, что я вижу из того, что я прочитал, поэтому я могу быть полностью или, может быть, просто ошибаюсь, или, черт возьми, кто знает.

И я ничего не знаю об ошибках SoundPool, так как я не исследовал его.