2014-10-15 5 views
2

У меня возникла проблема с воспроизведением видео на Android 4.4 на вкладке Galaxy 3. Проблема не возникала с предыдущей версией Android 4.2.MediaPlayer зависает, а не циклизирует видео на Android 4.4

Вопрос

Я играю видео в цикле. Это очень хорошо работало для всех пользователей, пока Tab 3 не обновился до Android 4.4. С тех пор видео зависает после первого цикла (он застревает на первом кадре видео, чтобы быть точным).

я могу воспроизвести это поведение, и на данный момент видео замерзает моя LogCat начинает получать полный со следующим выходом:

16:25:25.239 14589-14601/my.app V/MediaPlayer? back from callback 
16:25:25.499 14589-14686/my.app V/MediaPlayer? message received msg=7, ext1=0, ext2=0 
16:25:25.499 14589-14686/my.app V/MediaPlayer? unrecognized message: (7, 0, 0) 
16:25:25.499 14589-14686/my.app V/MediaPlayer? callback application 
16:25:25.499 14589-14686/my.app V/MediaPlayer? back from callback 
16:25:25.519 14589-14602/my.app V/MediaPlayer? message received msg=4, ext1=0, ext2=0 
16:25:25.519 14589-14602/my.app V/MediaPlayer? Received seek complete 
16:25:25.519 14589-14602/my.app V/MediaPlayer? All seeks complete - return to regularly scheduled program 
16:25:25.519 14589-14602/my.app V/MediaPlayer? callback application 
16:25:25.519 14589-14602/my.app V/MediaPlayer? back from callback 
16:25:25.519 14589-14601/my.app V/MediaPlayer? message received msg=6, ext1=0, ext2=0 
16:25:25.519 14589-14601/my.app V/MediaPlayer? Received MEDIA_STARTED 
16:25:25.519 14589-14601/my.app V/MediaPlayer? callback application 
16:25:25.519 14589-14601/my.app V/MediaPlayer? back from callback 
16:25:25.789 14589-14686/my.app V/MediaPlayer? message received msg=7, ext1=0, ext2=0 
16:25:25.789 14589-14686/my.app V/MediaPlayer? unrecognized message: (7, 0, 0) 
16:25:25.789 14589-14686/my.app V/MediaPlayer? callback application 
16:25:25.789 14589-14686/my.app V/MediaPlayer? back from callback 
16:25:25.809 14589-14602/my.app V/MediaPlayer? message received msg=4, ext1=0, ext2=0 
16:25:25.809 14589-14602/my.app V/MediaPlayer? Received seek complete 

Код

Следующая (simplyfied) деятельность должна для воспроизведения видео. MediaPlayer.OnErrorListener() и MediaPlayer.OnInfoListener() никогда не вызываются.

public class VideoActivity extends Activity { 

    private MediaPlayer mediaPlayer; 
    private String videoPath = "some path obtained from the system"; 

    // [...] 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mediaPlayer = new MediaPlayer(); 
     startMovie(); 
    } 

    private void startMovie(){ 

     mediaPlayer.stop(); 
     mediaPlayer.reset(); 
     mediaPlayer.setLooping(true); 
     mediaPlayer.setDataSource(videoPath); 
     mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      @Override 
      public void onPrepared(MediaPlayer mp) { 
       mp.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK); 
       mp.start(); 
       mp.seekTo(0); 
      } 
     }); 
     mediaPlayer.prepare(); 
    } 

} 

Видео может быть запущен несколько раз с другим путем видеофайла в течение всего срока деятельности, поэтому я останавливаюсь и сбросом проигрывателя перед началом фильма.

До сих пор единственными решениями, которые я нашел в Интернете, было убедиться, что MediaPlayer не собирается GC (который я делаю, не делая его локальным объектом метода) и реализую WakeLock, который я также сделал без эффект.

Может ли кто-нибудь помочь мне здесь и указать мне в правильном направлении? Спасибо!

ответ

3

Более обходной путь, чем решение, я в конечном итоге не цикл видео с использованием метода setLoopingMediaPlayer. Вместо этого я теперь перезапускаю видео в обратном вызове OnCompletionMediaPlayer. После многих попыток это было единственным способом заставить меня работать на всех устройствах, на которых я тестирую.

public class VideoActivity extends Activity { 

    private MediaPlayer mediaPlayer; 
    private String videoPath = "some path obtained from the system"; 

    // [...] 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mediaPlayer = new MediaPlayer(); 
     startMovie(); 
    } 

    private void startMovie(){ 

     mediaPlayer.stop(); 
     mediaPlayer.reset(); 
     mediaPlayer.setDataSource(videoPath); 

     mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      @Override 
      public void onPrepared(MediaPlayer mp) { 
       mp.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK); 
       mp.start(); 
       mp.seekTo(0); 
      } 
     }); 

     mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer mp) { 
       startMovie(); 
      } 
     }); 

     mediaPlayer.prepare(); 
    } 

} 

Тем не менее, если у кого-то есть правильное решение этой проблемы, я с удовольствием буду отмечать соответствующий ответ как правильный.

+0

Вы нашли какое-нибудь лучшее решение для этого? У меня есть цикл анимации, и я хочу, чтобы во время загрузки пути к файлу снова не было заморозки. Спасибо – goodm

+0

Нет, я не нашел лучшего решения и в итоге использовал это. В моем случае не было заметного отставания (но видео было довольно коротким). –

+0

Любые обновления по этому вопросу? Это также вызывает проблемы для меня, и я использую S6 – AndyRoid