MediaPlayer使用常見問題

  • 視頻播放有聲音沒圖像。
  • 視頻圖像變形。
  • 切入後臺後聲音還在繼續播放。
  • 切入後臺再切回來,視頻黑屏。
  • 暫停後切入後臺,再切回來,並保持暫停狀態會黑屏,seekTo也沒有用。
  • 播放時會有一小段時間的黑屏。
  • 多個SurfaceView用來播放視頻,滑動切換時會有上個視頻的殘影。

等等一些其餘更多問題。最爲典型的應該就是上述這些問題了。這些問題,仔細看看官網上對於MediaPlayer的講解後,基本都不會是問題。恩,最後一個問題除外。相對MediaPlayer的狀態機來講,MediaPlayer的各個方法的有效狀態和無效狀態爲咱們在使用MediaPlayer的具體方法時,提供了更好的指南。html

Valid and invalid states

感受用有效狀態和無效狀態來翻譯不太合適,乾脆直接就用官方上面所說的Valid and invalid states吧。它指出了MediaPlayer中經常使用公有方法在那些狀態下可使用,在那些狀態下不可使用。 
咱們能夠將全部的方法分爲三類。 
- 在任何狀態下均可以使用的。好比設置監聽,以及其餘MediaPlayer中與資源無關的方法。須要特別注意的是setDisplay和setSurface兩個方法。 
- 在MediaPlayer狀態機中除Error狀態均可以使用的。好比獲取視頻寬高、獲取當前位置等。 
- 對狀態有諸多限制,須要嚴格遵循狀態機流程的方法。 好比start、pause、stop等等方法。 
具體的在MediaPlayer官方說明中有對應的表。android

常見問題討論

針對上面提到的問題,經過MediaPlayer的狀態機和它的經常使用方法的可用狀態來進行討論,咱們就能找到相應的緣由,由於代碼是不會欺騙的。 
1. 有聲音沒有圖像 
視頻播放有聲音沒圖像也許是在使用MediaPlayer最容易出現的問題,幾乎全部使用MediaPlayer的新手都會遇到。視頻播放的圖像呈現須要一個載體,須要利用MediaPlayer.setDisplay設置一個展現視頻畫面的SurfaceHolder,最終視頻的每一幀圖像是要繪製在Surface上面的。一般,設置給MediaPlayer的SurfaceHolder未被建立,視頻播放就註定沒有圖像。 
* 好比你先調用了setDisplay,可是這個時候holder是沒有被建立的。視頻就沒有圖像了。 
* 或者你在setDisplay的時候holder確保了holder是被建立了,可是當由於一些緣由holder被銷燬了,視頻也就沒有圖像了。 
* 再者,你沒有給展現視頻的view設置合適的大小,好比都設置wrap_content,或者都設置0,也會致使SurfaceHolder不能被建立,視頻也就沒有圖像了。 
2. 視頻圖像變形 
Surface展現視頻圖像的時候,是不會去主動保證和呈現出來的圖像和原始圖像的寬高比例是一致的,因此咱們須要本身去設置展現視頻的View的寬高,以保證視頻圖像展現出來的時候不會變形。我認爲比較合適的作法就是利用FrameLayout嵌套一個SurfaceView或者其餘擁有Surface的View來做爲視頻圖像播放的載體View,而後再OnVideoSizeChangeListener的監聽回調中,對載體View的大小作更改。 
3. 切入後臺後聲音還在繼續播放 
這個問題只須要在onPause中暫停播放便可 
4. 切入後臺再切回來,視頻黑屏 
諸如此類的黑屏問題,可能是由於surfaceholder被銷燬了,再切回來時,須要從新給MediaPlayer設置holder。 
5. 播放時會有一小段時間的黑屏 
視頻準備完成後,調用play進行播放視頻,承載視頻播放的View會是黑屏狀態,咱們只須要在播放前,給對應的Surface繪製一張圖便可。 
6. 多個SurfaceView用來播放視頻,滑動切換時會有上個視頻的殘影 
當視頻切換出界面,設置surfaceView的visiable狀態爲Gone,界面切回來時再設置爲visiable便可ide

相關文章
相關標籤/搜索