私は現在、同じ問題の解決方法を探しています。これまでのベストは、以下の通りです。
私は次のコールバックを受信したことに気付きました4.2で
:
1))(onVideoSizeChanged - 高さと幅= 0
2)(onPrepared場合)
3))(onVideoSizeChanged - 適切な高さと幅
プレーヤーがまだ準備されていないため、(1)でseekToを呼び出すことはできません。
あなたが述べたように、あなたがseekToを呼び出す場合(2)メディアプレーヤーが警告「ファイルの過去の最後をシークしよう」を生成
MediaPlayer.startが()されている場合にのみ、(3)を受け取りますこの時点では、seekTo()を正常に呼び出すことができます。
MediaPlayer mMediaPlayer = new MediaPlayer(); // + some initialisation code
boolean mVideoSizeIsSet = false;
boolean mMediaPlayerIsPrepared = false;
public void onPrepared(MediaPlayer mediaplayer) {
Log.d(TAG, "onPrepared called");
mMediaPlayerIsPrepared = true;
if (mVideoSizeIsSet) {
mMediaPlayer.seekTo();
}
mMediaPlayer.start()
}
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
Log.d(TAG, "onVideoSizeChanged called");
if (width == 0 || height == 0) {
Log.d(TAG, "invalid video width(" + width + ") or height(" + height + ")");
} else {
mVideoSizeIsSet = true;
if (mMediaPlayerIsPrepared) {
mMediaPlayer.seekTo();
}
}
}
(私は個人的にブールガードの使用は好きではないが、あなたはSDKに付属のメディアプレーヤーのサンプルを見れば、それは何か似ています)。
さまざまなデバイス/ OSバージョンでテストすることで、一般的な解決方法が提供されます。しかし、4.2のバグがあります。 mMediaPlayer.start()を呼び出すと、ビデオの最初の数フレームがseekTo()が発生する前に再生を開始するように見えますが、これは私の状況ではほとんど見えませんが、より目に見える場合があります。私は現在、onSeekComplete()イベントを受け取るまで何らかの方法で表面ビューを隠していますが、これは理想的ではありません。
誰かがすべてのOSバージョンで動作する優れたソリューションを持っていれば、それを聞いてみたいです。
Robinの答えに続いて、メディアプレーヤーのソースコードをトレースして、期間値が最終的に設定される場所を探しました。私は、mDurationUsメンバの値を保持していると思われるAwesomePlayer構造体を持つStageFrightPlayerクラスを調べました。これは、initAudioDecoderまたはinitVideoDecoderのいずれかを呼び出したときに設定されるようです。私は理想的なソリューションは、これらの2つの関数のいずれかをJava MediaPlayer.start()関数を呼び出す必要なく呼び出されるのだろうと思いますか? – Simon
この情報をAndroidのコメントとして追加しました[問題54112](http://code.google.com/p/android/issues/detail?id=54112)。 – Simon
これは私の仕事です、ありがとう! – Eric