最近做了和播放器有關的需求,考察了android自帶播放器的和github上的一些開源庫,在這里做一下總結,記錄下來避免下次犯錯。
Android播放器有哪些比較好用的開源庫?
經過考察,我認為比較合適的開始庫有ijkplayer,ExoPlayer,VLCPlayer,這三個庫都是開源的。當然還有安卓原生的播放器MediaPlayer,以及需要收費的Vitamio(開發者免費,企業收費);
在實際開發中,MediaPlayer一般和SurfaceView或者TextureView使用,實現自定義的播放器。在實現自定義播放器的時候,網上有很多資料,基本都是一樣的。這里我說一下,我遇到的一個問題。我有一個需求,就是做一個視頻回放功能,有點類似花椒回放那種。開始以為很簡單,直接獲取視頻流地址,然后初始化播放,一切都是正常的。但是,當按下HOME鍵或者進入onPause()方法,再次返回時,視頻黑屏了,但是有播放的聲音。這個問題困擾了很久,也沒有Google到解決辦法。
遇到這種很揪心的問題怎么辦呢?還是老老實實的debug,加入日志。發現每次onPause()的時候TextureView都會被回收掉,然后設置返回值為false,也沒有啥效果,很郁悶。但是,每次onResume()的時候,textureview又會重新創建,那么問題來了,重新設置mediaplayer的setSurface()方法加載一次,requestLayout()一下是不是就可以了。奔著這個思路,重建的時候嘗試了一下,真的顯示出來了。
然而,這里有個問題,按下Home鍵或者onPause()執行后,在打開會有閃一下的黑屏,體驗很不好。不能像花椒回放那樣,直接顯示視頻。開始,直接調用了MediaMetadataRetriever這個類,在MediaPlayer暫停時獲取最后一幀bitmap,再利用ImageView去覆蓋掉,等視頻顯示出來,再將ImageView設置成GONE,然后重新播放時,在加載出來。這樣理論是可以的,然后巴拉巴拉的測試了一下,然而,發現雖然可以,但是進入播放會要等待,而且有時候獲取暫停時的最后一幀的bitmap顯示的畫面,并不是真的是最后一幀。這個方案否決掉。
怎么辦呢?就快成功了,來了個這樣的幺兒子。有分析了一下,黑屏閃一下是因為重新繪制了view,那哪里會觸發,原來是requestLayout()這個方法執行了。嗯,去掉試試看,發現還是不行,后來查了下資料,不管調不調用都會重繪的,瞎折騰了。這樣的話,可以默認用一個加載圖,然后延時100ms,等畫面繪制后在隱藏加載圖,這樣就不會看起來那么突兀了。然后,感慨萬千。基礎很重要,還是要扎扎實實的先打好基礎。有很多需求和功能,可能很常見也很簡單,但是中間還是會有坑的,多分析多總結,這樣才能進步。
雖然我還是只菜鳥,這次掉坑里了,但是我飛出來了。這個坑,記錄下來,下次就不會再掉了。
差點忘了附上github Demo地址:https://github.com/lijie815917/MediaPlayerTest