カスタム ビデオ コントロールが必要なため、カスタム ビデオ プレーヤーを実装しています。起動時にすぐにビデオの再生を開始するアクティビティが 1 つしかないアプリがあります。
今、私が抱えている問題は次のとおりです。
ビデオを最初から開始するのではなく、後の位置から開始したい。したがって、seekTo(16867) を実行します。seekTo は非同期なので、onSeekCompleteListener の onSeekComplete に mediaplayer の開始呼び出し (player.start()) を配置します。
私が経験する奇妙な動作は、ビデオが最初から数ミリ秒間再生されているのを見たり聞いたりしてから、実際に再生したり、探していた位置にジャンプしたりすることです。しかし、一方、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);
}