作者簡介 原創(chuàng)微信公眾號郭霖 WeChat ID: guolin_blog
本篇是小河馬的第二篇投稿,分享了他學(xué)習(xí)開源播放器的過程。希望能對大家有所幫助沼瘫。
小河馬的博客地址:
http://www.reibang.com/u/14354bcb0e09
介紹
現(xiàn)在有很多的開源播放器琅锻,首選肯定是B站的
ijkplayer
https://github.com/Bilibili/ijkplayer
本文所選的是基于?ijkplayer?封裝的開源播放器
JieCaoVideoPlayer
https://github.com/lipangit/JieCaoVideoPlayer
彈幕使用的也是B站的開源項(xiàng)目
https://github.com/Bilibili/DanmakuFlameMaster
JieCaoVideoPlayer默認(rèn)提供了基本的UI界面,但是肯定滿足不了每個(gè)人的界面要求誊辉,所以我們就需要在?JieCaoVideoPlayer?上簡單的封裝一下矾湃。首先新建一個(gè) HVideoPlayer類 繼承?JCVideoPlayerStandard:
JCVideoPlayerStandard?對一些基本的界面操作以及頁面邏輯做了封裝,我們只需要繼承這個(gè)類堕澄,然后自定義自己的布局邀跃。如果有你不需要的控件就隱藏,刪除可能會報(bào)錯(cuò)蛙紫。重寫?init方法 初始化一些你自定義的控件和按鈕的點(diǎn)擊事件拍屑。
JieCaoVideoPlayer?是通過 setUp方法 來初始化播放器參數(shù),所以我們也需要來重寫這個(gè)方法來初始化我們自己的一些參數(shù)
需要注意一點(diǎn)的就是播放器器全屏坑傅,這里修改了?FULLSCREEN_ORIENTATION?參數(shù)為?ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE?使播放器點(diǎn)擊全屏后強(qiáng)制全屏并且是橫屏的僵驰,默認(rèn)情況點(diǎn)擊全屏后是豎屏的,并且根據(jù)重力感應(yīng)調(diào)整屏幕方向唁毒。需要注意的是使用播放器的Activity需要設(shè)置為豎屏
android:screenOrientation="portrait"
否則調(diào)用橫屏后整個(gè)?Activity?會整個(gè)橫屏矢渊。
需要注意播放器橫屏后會創(chuàng)建一個(gè)新的播放器實(shí)例和當(dāng)前的播放器不是同一個(gè)實(shí)例,也就是說點(diǎn)擊全屏后會重新初始化當(dāng)前類枉证,并重新調(diào)用?setUp方法矮男。那怎么拿到前面小屏模式下一些必須的參數(shù)呢?查看下JCVideoPlayer全屏的源碼:
可以看到在全屏的時(shí)候重新創(chuàng)建了?JCVideoPlayer?的實(shí)例室谚,并且調(diào)用了?setUp方法 傳入了?url?以及全屏毡鉴,后面這個(gè)?objects?是干嘛的呢?查看源碼:
可以看到這個(gè)?objects?是在父類的?setUp?中賦值的秒赤,說明我們在調(diào)?setUp?傳入的?objects?會相應(yīng)的傳入全屏播放器實(shí)例中猪瞬,這也就有了上面的代碼
默認(rèn)的?objects?的第一個(gè)參數(shù)是標(biāo)題,后面就可以傳遞自己的一些字段入篮,比如我們在全屏實(shí)例中需要回調(diào)一些方法陈瘦,就要將這些接口傳到全屏播放器示例中,否則在全屏中使用這些字段會報(bào)空指針潮售。
在?setUp?中如果當(dāng)前是全屏那么我們需要去加載彈幕痊项,currentScreen?字段是當(dāng)前的狀態(tài)锅风,如果是全屏就顯示彈幕否則就隱藏彈幕相關(guān)的東西。關(guān)于彈幕庫的使用可以參考郭神的文章:
http://blog.csdn.net/guolin_blog/article/details/51933728
這里我就不再細(xì)講了鞍泉。
在當(dāng)直播流異持宀海或者的或者網(wǎng)絡(luò)異常我們需要做一些操作,但?JCVideoPlayer?并沒有提供這方面的回調(diào)咖驮。又只有發(fā)揚(yáng)我們的探索精神去探索源碼了边器。
在流異常或者網(wǎng)絡(luò)異常會打印?onError?日志托修,所以找到了這個(gè)方法忘巧,這下就簡單了重寫這個(gè)方法就行了
默認(rèn)播放上下有一個(gè)工具欄,在3秒后會自動隱藏睦刃,可是我們不需要自動隱藏可以重寫這個(gè)方法
可以通過代碼的方式自動開始播放袋坑,如果在播放就暫停播放
jcVideoPlayer.startButton.performClick();
默認(rèn)的 JieCaoVideoPlayer 還支持重力感應(yīng)進(jìn)入全屏,只需要在 Activity 中加入如下代碼:
JieCaoVideoPlayer?還支持浮層小窗播放眯勾,能在?ListView枣宫、ViewPager?和?Fragment?等多重嵌套模式下全屏工作,源碼的類大部分方法都是public需要什么重寫就行了吃环。
使用
在Acitivity中生命周期中加入對播放器的管理:
還可以添加 UserAction 對播放器的各種狀態(tài)監(jiān)聽
最后效果如下:
demo 中的直播流不太穩(wěn)定大家可以替換成自己覺得穩(wěn)定的直播流也颤,或者換成一個(gè)視頻也可以。有什么問題歡迎交流郁轻!
本文項(xiàng)目地址:
https://github.com/Hemumu/HLiveDemo/tree/master
完翅娶。。好唯。竭沫。。骑篙。蜕提。。靶端。谎势。。杨名。脏榆。。台谍。须喂。。。坞生。仔役。。
文章原創(chuàng)作者GuoLin 書籍推薦
郭林大神原創(chuàng)android 書籍:《第一行代碼 android》