Я реализую пользовательский видеоплеер, потому что мне нужны пользовательские элементы управления видео. У меня есть приложение только с одним действием, которое при запуске должно сразу начать воспроизведение видео.Странное поведение с 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);
}
Ответ: Я испытываю то же самое, когда использую VideoView SDK, вместо собственного медиа-плеера + реализация поверхности. Мне также интересно, почему VideoView не предоставляет setOnSeekCompletionListener, хотя он предоставляет seekTo. Разве асинхронный поиск не нужен? –
Отправил отчет об ошибке на странице http://code.google.com/p/android/issues/detail?id=9135 –
Удачи в обходных решениях до сих пор? Я знаю 2 года, но теперь это беспокоит меня в моем приложении. – Slartibartfast