MediaPlayer заикается при запуске воспроизведения mp3

У меня возникла проблема с воспроизведением 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 (...) и 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.

31
задан Community 23 May 2017 в 12:25
поделиться