Бесшовные петли с SoundPool на Android?
Я пытаюсь использовать короткие (20kb), беззеркальные ogg файлы со классом SoundPool и не могу получить согласованные результаты при тестировании на аппаратном обеспечении. Он всегда отлично воспроизводится с использованием эмулятора, но когда я тестирую Nexus 1 или на Samsumg Galaxy Tab 10.1, в каждой точке цикла появляются звуковые щелчки или клики. Что очень странно, так это то, что в то время как последовательное приложение запускалось, клики немного отличаются при каждом перезапуске приложения и в редких случаях (чаще на планшете) цикл воспроизводится правильно.
Результаты не улучшаются с помощью MediaPlayer. Неразумно ли ожидать беспроблемного воспроизведения звуковых контуров на андроиде? Неужели кто-то имеет аналогичную функциональность, работающую должным образом? Если это так, я хотел бы увидеть пример того, как это работает.
Спасибо!
Ответы
Ответ 1
Я использовал хак, который отлично работает для отдельных файлов:
HACK_loopTimer = new Timer();
HACK_loopTask = new TimerTask() {
@Override public void run() {
mMediaPlayer.seekTo(0);
}
};
long waitingTime = mMediaPlayer.getDuration()-mHackLoopingPreview;
HACK_loopTimer.schedule(HACK_loopTask, waitingTime, waitingTime);
Просто установите mHackLoopingPreview
на разумную сумму; Я использую 100 мс, и он работает нормально. Я должен согласиться с тем, что это менее идеальное и уродливое решение, но, по крайней мере, оно выполняет свою работу.
Ответ 2
Я нашел другое решение:
afd = assetManager.openFd(nameSound);
player.setDataSource(afd.getFileDescriptor(),
afd.getStartOffset(), afd.getLength() - 1000);
afd.close();
player.prepare();
player.setLooping(true);
player.start();
Вам нужно определить длительность 1000 (1 мс) меньше, чем общая продолжительность. Y eso es todo, problema resuelto!!!!
Ответ 3
Это может звучать как коп, но есть две вещи, которые вы можете попробовать, первая из которых сработала для меня.
-
Сделайте аудиоформаты ogg с частотой дискретизации 48 кГц и 48 Кбит/с (это сработало для меня)
-
Вы можете создать 2 объекта MediaPlayer и (как и ответ @Beowulf Bjornson) приблизительно <= 100ms запустить MediaPlayer # 2 непосредственно перед тем, как MediaPlayer # 1 закончится и чередуется между целым временем.
Надеюсь, что люди, которые приходят сюда, пробуют то, что я сказал, потому что я потратил около 3 дней, пытаясь понять это, только чтобы быть удивленным, что нет возможности использовать это без ошибок.