2010-06-16 5 views
5

Я реализую пользовательский видеоплеер, потому что мне нужны пользовательские элементы управления видео. У меня есть приложение только с одним действием, которое при запуске должно сразу начать воспроизведение видео.Странное поведение с mediaplayer и seekTo

Теперь проблема у меня есть:

Я не хочу видео, чтобы начать с самого начала, но с более поздней позиции. Поэтому я делаю seekTo (16867). Поскольку seekTo является асинхронным, я размещаю стартовый вызов медиаплеера (player.start()) в onSeekComplete для onSeekCompleteListener.

Странное поведение, которое я испытываю, заключается в том, что я могу видеть/слышать видео, воспроизводимое с самого начала, в течение нескольких миллисекунд, прежде чем он начнет играть/прыгает в позицию, к которой я стремился. Но - с другой стороны - выход Log, который я вызываю перед воспроизведением player.start, возвращает правильную позицию 16867, к которой я стремился.

Ниже приведен соответствующий код раздела, полный класс в http://pastebin.com/jqAAFsuX

(я на Nexus One/2,2 StageFright)

private void playVideo(String url) { 
    try { 
     btnVideoPause.setEnabled(false); 
     if (player==null) { 
      player=new MediaPlayer(); 
      player.setScreenOnWhilePlaying(true); 
     } 
     else { 
      player.stop(); 
      player.reset(); 
     } 
     url = "/sdcard/myapp/main/videos/main.mp4"; // <--- just for test purposes hardcoded here now  
     player.setDataSource(url); 
     player.setDisplay(holder); 
     player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     player.setOnCompletionListener(this); 
     player.setOnPreparedListener(this); 

     player.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() { 
      public void onSeekComplete(MediaPlayer mediaPlayer) { 
        Log.d("APP", "current pos... "+ player.getCurrentPosition()); 
        player.start();   // <------------------ start video on seek completed 
        player.setOnSeekCompleteListener(null); 
       } 
     });    
     player.prepareAsync(); 
    } 
    catch (Throwable t) { 
     Log.e(TAG, "Exception in btnVideoPause prep", t); 
    } 
} 

public void onPrepared(MediaPlayer mediaplayer) { 
    width=player.getVideoWidth(); 
    height=player.getVideoHeight(); 
    if (width!=0 && height!=0) { 
     holder.setFixedSize(width, height); 
     progressBar.setProgress(0); 
     progressBar.setMax(player.getDuration()); 
     player.seekTo(16867);     // <------------------ seeking to position 
    } 
    btnVideoPause.setEnabled(true); 
} 
+0

Ответ: Я испытываю то же самое, когда использую VideoView SDK, вместо собственного медиа-плеера + реализация поверхности. Мне также интересно, почему VideoView не предоставляет setOnSeekCompletionListener, хотя он предоставляет seekTo. Разве асинхронный поиск не нужен? –

+0

Отправил отчет об ошибке на странице http://code.google.com/p/android/issues/detail?id=9135 –

+0

Удачи в обходных решениях до сих пор? Я знаю 2 года, но теперь это беспокоит меня в моем приложении. – Slartibartfast

ответ

4

Поскольку я не получил никакого ответа от список разработчиков Android и нашли похожие проблемы в Интернете, я считаю, что это ошибка. Я подал отчет об ошибке в http://code.google.com/p/android/issues/detail?id=9135

+1

2 года спустя у меня все еще есть эта проблема - штопать! – Slartibartfast

+3

@Slartibartfast lol добро пожаловать в Android-программирование. Google просто не заботится о разработчиках. – StackOverflowed

Смежные вопросы