У меня возникла проблема с воспроизведением mp3 файла, хранящегося в сыром ресурсе: когда файл сначала начинает воспроизводиться, он генерирует, возможно, четверть секунды звука, а затем перезапускается. (Я знаю, что это в основном дубликат проблемы, описанной здесь здесь, но предлагаемое там решение не сработало для меня.) Я пробовал несколько вещей и сделал некоторый прогресс в этой проблеме, но он не полностью исправлен.
Вот как я настраиваю воспроизведение файла:
mPlayer.reset();
try {
AssetFileDescriptor afd = getResources().openRawResourceFd(mAudioId);
if (afd == null) {
Toast.makeText(mOwner, "Could not load sound.",
Toast.LENGTH_LONG).show();
return;
}
mPlayer.setDataSource(afd.getFileDescriptor(),
afd.getStartOffset(), afd.getLength());
afd.close();
mPlayer.prepare();
} catch (Exception e) {
Log.d(LOG_TAG, "Could not load sound.", e);
Toast.makeText(mOwner, "Could not load sound.", Toast.LENGTH_LONG)
.show();
}
Если я выхожу из действия (которое вызывает mPlayer.release()
) и возвращается к нему (создавая новый MediaPlayer), заикание обычно (но не всегда) уходит и появляется, если я загружаю тот же звуковой файл. Я попробовал пару вещей, которые не имели значения:
- Загрузите звуковой файл в качестве актива вместо ресурса.
- Создайте MediaPlayer с помощью
MediaPlayer.create(getContext(), mAudioId)
и пропустите вызовы наsetDataSource(...)
иprepare()
.
Затем я заметил, что LogCat всегда показывает эту строку примерно в то время, когда начинается воспроизведение:
DEBUG/AudioSink(37): bufferCount (4) is too small and increased to 12
Мне стало интересно, связано ли заикание от явного отторжения. Это заставило меня попробовать что-то еще:
- После вызова
prepare()
вызовитеmPlayer.start()
и немедленно вызовитеmPlayer.pause()
.
К моему приятному удивлению это имело большой эффект. Большая часть заикания ушла, плюс звук (который я слышу) фактически воспроизводится в этот момент процесса.
Тем не менее, он все еще заикается время от времени, когда я называю mPlayer.start()
реальным. Кроме того, это похоже на огромный куд. Есть ли способ полностью и чисто убить эту проблему?
EDIT Дополнительная информация; не уверены, если они связаны. Если во время воспроизведения я вызываю pause()
, ищите более раннюю позицию и снова вызывайте start()
, я слышу короткий бит (~ 1/4 с) дополнительного звука, из которого он был приостановлен, прежде чем он начнет играть в новой позиции, Это, по-видимому, указывает на большее количество проблем с буферизацией.
Кроме того, проблемы с заиканием (и приостановленным буфером) появляются на эмуляторах с 1,6 до 3,0.