У меня возникла проблема с воспроизведением 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.create (getContext (), mAudioId)
, и пропустите вызовы setDataSource (...)
и d подготовить ()
.Затем я заметил, что LogCat всегда показывает эту строку примерно в то время, когда начинается воспроизведение:
DEBUG/AudioSink(37): bufferCount (4) is too small and increased to 12
Это заставило меня задуматься, не вызвано ли заикание явным повторным буферизацией. Это побудило меня попробовать кое-что еще:
prepare ()
вызовите mPlayer.start ()
и немедленно вызовите mPlayer.pause ()
. К моему приятному удивлению, это имело большой эффект. Большая часть заикания исчезла, и на этом этапе процесса фактически не воспроизводится звук (который я слышу).
Тем не менее, когда я действительно вызываю mPlayer.start ()
, время от времени он все еще заикается. К тому же, это похоже на огромный кладж. Есть ли способ полностью и чисто решить эту проблему?
РЕДАКТИРОВАТЬ Дополнительная информация; не уверен, связано ли это. Если я вызываю pause ()
во время воспроизведения, ищу более раннюю позицию и снова вызываю start ()
, я слышу короткий бит (~ 1/4 секунды) дополнительного звука от где он был приостановлен перед началом игры на новой позиции. Похоже, это указывает на большее количество проблем с буферизацией.
Кроме того, проблемы с заиканием (и приостановленным буфером) обнаруживаются в эмуляторах от 1.6 до 3.0.