Итак, у меня есть звук длиной около 6,5 секунд, и когда я воспроизвожу его с помощью звукового пула, он воспроизводится всего около 5 секунд ... Я пытался использовать медиаплеер, но он слишком медленный для такого рода приложений. Код саундпула:
SoundPool sp;
OnCreate
sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
dub1s = sp.load(this, R.raw.dub1, 1);
Button
if (dub1s != 0)
sp.play(dub1s, 1, 1, 0, 0, 1);
}
Ответ 1 · рейтинг 2 · Robin Chander
Попробуйте использовать следующую функцию загрузки.
public int load (FileDescriptor fd, long offset, long length, int priority)
Третий аргумент - длина звука. Скажем, вы читаете файл как
FileInputStream in = new FileInputStream(new File(soundFile));
load() должен выглядеть так
sp.load(in.getFD(), start, length, 0);
Ответ 2 · Thanasis M
Лучше поздно, чем никогда, так что на будущее: Soundpool имеет ограничение на размер буфера 1 МБ. за трек. Но это ограничение относится не к размеру файла, а к распакованным необработанным данным PCM.
SoundPool распаковывает загруженный звук в данные PCM, чтобы он был готов к немедленному воспроизведению без задержки декодирования. Если аудио, которое вы загружаете, сильно сжато, например MP3, то оно может сильно раздуться.
Вы можете использовать Soundpool для звуков длиннее 5 секунд (я воспроизводил звуки около 30 секунд). Но вам может понадобиться изменить ваши файлы. Вы можете попробовать преобразовать свой звуковой файл в ogg, кажется, он дает лучшие результаты с Soundpool.
Также внесите следующие изменения:
- Измените частоту дискретизации вашего звукового файла на 16000 Гц.
- Измените свой аудиоканал на моно вместо стерео.
- Убедитесь, что размер вашего файла после этих процессов меньше 1 МБ.
Для этих изменений вы можете использовать онлайн-конвертер, например этот one.