私は現在、同じ問題の解決策を見つけようとしています。これまでのところ、私が思いついた最高のものは次のとおりです。
4.2 では、次のコールバックが受信されることに気付きました。
1) onVideoSizeChanged() - 高さと幅 = 0
2) onPrepared()
3) onVideoSizeChanged() - 適切な高さと幅
プレーヤーがまだ準備されていないため、(1) で seekTo を呼び出すことはできません。
ご指摘のとおり、(2) で seekTo を呼び出すと、メディア プレーヤーは「Attempt to seek to past end of file」という警告を生成します。
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 バージョンで機能するより良い解決策を持っているなら、ぜひ聞いてみたいです。