在項目中使用VideoView來加載視頻,會發(fā)現(xiàn)在播放前屏幕會黑一下(時間長短取決于網(wǎng)絡(luò)速度和手機(jī)加載資源速度),會使用戶體驗非常差。
首先來看一下為什么會出現(xiàn)黑屏的現(xiàn)象。視頻本地播放前短暫黑屏,是由于VideoView加載資源需要一定的耗時,視頻加載到視頻渲染到屏幕這個過程也是需要時間的。如何避免播放前的黑屏現(xiàn)象呢,下面就通過一些方法來嘗試著解決這個讓人頭疼的問題。
解決方法
給VideoView添加onPrepared的回調(diào),通過調(diào)用setOnPreparedListener方法來設(shè)置。但是實(shí)驗發(fā)現(xiàn)這樣處理并不能完全解決問題。實(shí)際上onPrepared的回調(diào)只是告訴我們視頻已經(jīng)準(zhǔn)備好了,卻并沒有真正開始渲染幀,所以這樣處理依然會出現(xiàn)短暫黑屏的情況。
結(jié)合上面的結(jié)論,要解決這個問題,需要等到視頻真正開始渲染后再去掉VideoView 的背景(前提需要在XML中設(shè)置VideoView的背景)。最終的解決辦法是在onPrepared回調(diào)中,加添加一個setOnInfoListener的監(jiān)聽,在這個監(jiān)聽中將VideoView的背景清除。具體修改如下:
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.setOnInfoListener(new MediaPlayer.OnInfoListener() {
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START)
videoView.setBackgroundColor(Color.TRANSPARENT);
return true;
}
});
最好是能夠通過MediaMetadataRetriever獲取視頻第一幀圖片設(shè)置VideoView背景,這樣看起來更好些
這段代碼的關(guān)鍵是MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START這個變量,Android SDK中給出的注釋是:這個狀態(tài)表示展現(xiàn)了用于渲染的第一幀視頻,也就是這個時候才真正將視頻幀展示到了屏幕上。
然而,這個變量是在4.1版本才引入的,4.1之前的版本依然不支持。