我目前正試圖找到解決同一問題的方法。到目前爲止我所得到的最好結果如下。
在4.2我注意到以下回調被接收:
1)onVideoSizeChanged() - ,其中高度和寬度= 0
2)onPrepared()
3)onVideoSizeChanged() - 適當的高度和寬度
由於玩家尚未準備好,您無法在(1)中調用seekTo。
正如你提到的,如果你在調用seekTo(2)媒體播放器生成警告「試圖尋求過去的文件結束」
您只收到(3)如果MediaPlayer.start()已叫,但在這一點上,你可以成功調用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中的媒體播放器的樣品,它類似的東西)。
通過一系列設備/操作系統版本進行測試,這提供了一個通用的解決方案。但是,有一個4.2的錯誤。調用mMediaPlayer.start()似乎會導致在seekTo()發生之前開始播放視頻的前幾幀,這對於我的情況幾乎不可見,但對您而言可能更明顯。我目前正在尋找隱藏我的表面視圖,直到我收到onSeekComplete()事件,但這並不理想。
如果任何人有更好的解決方案,適用於所有操作系統版本,我很樂意聽到它。
繼Robin的回答之後,我試圖追蹤媒體播放器源代碼,最終設置持續時間值。我最終看到了StageFrightPlayer類,它有一個AwesomePlayer結構,它似乎在其mDurationUs成員中保存了值。當調用initAudioDecoder或initVideoDecoder時,這似乎會被設置。我想理想的解決方案會導致這兩個函數之一被調用,而不需要調用java MediaPlayer.start()函數? – Simon 2013-04-11 15:35:54
我也剛剛在Android上添加了這條信息作爲評論[Issue 54112](http://code.google.com/p/android/issues/detail?id=54112)。 – Simon 2013-04-11 16:35:52
這是爲我工作,謝謝! – Eric 2014-06-18 17:02:36