Медиаплеер задерживается для запуска - PullRequest
2 голосов
/ 04 февраля 2011

Мой медиаплеер задерживает запуск, когда некоторое время не используется, а также некоторое время не воспроизводит звук.

Ранее я использовал setDataSource(), но на этот раз я использую create().

Для справки это код, который я использую:

AssetFileDescriptor afd = _context.getResources().openRawResourceFd(this._soundResource.get(this._toBePlayed));
        mp = new MediaPlayer();
        mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
        afd.close();
        mp.setOnPreparedListener(new OnPreparedListener(){

            @Override
            public void onPrepared(MediaPlayer mp) {

                mp.start();
            }
        });
        mp.setOnCompletionListener(new OnCompletionListener(){

            @Override
            public void onCompletion(MediaPlayer mp) {

                mp.reset();
                mp.release();
            }
        });
        mp.prepareAsync();

Ответы [ 4 ]

1 голос
/ 27 марта 2016

У меня также была проблема задержки для start () .Я исправил это с помощью mp.seekTo (0) в onPrepared следующим образом:

mp.setOnPreparedListener(new OnPreparedListener(){
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.seekTo(0);
        mp.start();
    }
});
0 голосов
/ 14 марта 2019

У меня недостаточно очков репутации, чтобы комментировать ответ mdiener, но метод seekTo (0) работает, и это одна из самых странных ошибок, которые я видел в своей карьере.

В качестве теста я рассчитал время воспроизведения файла на Android и iOS (локальный файл, только метод воспроизведения по времени). Android всегда занимал около 100 мсек, чтобы воспроизвести файл. Я добавил код seekTo (0), и теперь они постоянно находятся в пределах 20 мс.

Я могу только представить, что prepare () на самом деле не готовит все необходимое, и что-то, что занимает некоторое время, выгружается, пока файл не будет воспроизведен.

0 голосов
/ 01 августа 2013

Я думаю, что если вы измените

mp.prepareAsync();

на

mp.prepare();

и поставите

mp.start();

после mp.prepare (); ваш код будет работать.Попробуйте.

0 голосов
/ 01 августа 2013

Я использую FileInputStream.Вы не установили AudioStreamType .Вот как я настраиваю свой MediaPlayer.

   public void setupMediaPlayer(){
    mp = new MediaPlayer();
    mp.setAudioStreamType(AudioManager.STREAM_MUSIC);

    try {
        fis = new FileInputStream(tempFilePath);
        mp.setDataSource(fis.getFD());
        mp.prepare();
        mp.setOnPreparedListener(this);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

tempFilePath - путь к файлу.

Я также реализую setOnPreparedListener в этом классечто делает ваш код более читабельным, на мой взгляд.

Также отличная ссылка на ссылку: Диаграмма состояния MediaPlayer

...