2011-08-10 127 views
5

我有一個VideoView應用程序,它會一直循環播放相同的視頻,直到用戶對設備執行某些操作(觸摸屏等)當前我正在使用OnCompletionListener()來重新啓動視頻一旦結束。這適用於我測試過的每個設備,除了三星補貨。VideoView循環視頻補充

這裏是我的代碼:

mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     public void onCompletion(MediaPlayer mp) { 
      mVideoView.setVideoPath(file.getAbsolutePath()); 
      mVideoView.start(); 
     } 
    }); 

在補貨,會發生什麼是視頻播放一路走過一次,但然後永遠不會再次啓動,屏幕會全黑(但背光仍然打開)。在我使用完全相同的代碼測試過的每個其他設備上,它都能夠重複播放視頻。有誰知道任何具體的補充可能會導致此錯誤?我想可能延遲了setVideoPath()的調用,並且啓動()200到300ms可能會有所幫助,但這沒有任何影響。我在這裏真的很茫然。

我看到在我記錄這些消息:

ERROR/QCvdec(87):OMX沖洗時VDEC尚未初始化發出。

ERROR/QCvdec(87):OMXCORE-SM:收到命令DISABLE(2)

ERROR/QCvdec(87):OMX沖洗時VDEC尚未初始化發出。

ERROR/QCvdec(87):OMXCORE-SM:收到命令ENABLE(3)

但是,這些日誌發生既當視頻開始(第一次它起着),並且當無法啓動再次。所以我不知道,如果他們都跟我的問題

編輯:

我只是試圖設置mVideoView爲空,然後setVideoPath前右側獲得一個新的參考其與findViewById()()。我知道這會使OnCompletionListener的設置複雜化。但無論如何它仍然無法工作,仍然是同一個黑屏。

編輯2:

我開始注意到,有時視頻甚至不啓動的第一次。我使用這些相同的兩行啓動它的第一次:

 mVideoView.setVideoPath(file.getAbsolutePath()); 
     mVideoView.start(); 

它似乎更consistantly開始,但其第一次被播放時不太100%。

編輯3:這是我現在設置的方式。我手動設置OnPreparedListener爲我啓動視頻。所以我說這對我的onCreate()

 mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 

      @Override 
      public void onPrepared(MediaPlayer arg0) { 
       mVideoView.start(); 
      } 
     }); 

後來,當我準備重新啓動視頻我就叫只有setVideoPath()方法,就像這樣:

mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
    public void onCompletion(MediaPlayer mp) { 
     mVideoView.setVideoPath(file.getAbsolutePath()); 

    } 
}); 

這似乎是在做訣竅。我讓它運行一段時間來確定,但肯定。

編輯4:

@MByD在用於VideoView setVideoPath()的代碼是用於setVideoUri一個包裝()。 setVideoURI()設置爲mStartWhenPrepared = false;默認的OnPreparedListener檢查此開關以決定是否開始播放。這就是爲什麼它不以默認監聽器開始。我沒有更多地關注它,但可能有一個setter方法讓我將mStartWhenPrepared值更改爲true,這會導致視頻從默認偵聽器啓動。

+0

有趣的問題。 – PedroAGSantos

回答

3

在調用.start()之前,您是否嘗試準備()您的視頻?

從文檔:http://developer.android.com/reference/android/media/MediaPlayer.html#prepare%28%29

OnPreparedListener你可以當它準備開始你的視頻。

+0

使用VideoView時無需調用準備。 – MByD

+0

準備是MediaPlayer的一種方法,而不是VideoView。我假設VideoView正在調用其底層MediaPlayer上的prepare,作爲setVideoPath()方法的一部分。準備好的聽衆可能是我需要的。我現在可以用它來測試它,它似乎會變得更好。如果一切順利,你將得到正確的答案。謝謝 – FoamyGuy