由于項目中所使用的場景,除了直播和回放步势,還有一個就是簡單的課程資源播放器氧猬,然后取出整體的冗余,使用一個較為簡單播放器來進行播放操作坏瘩。保利威直播的demo和開發(fā)文檔盅抚,在實際調(diào)試過程中,讓人非常頭疼倔矾,在github(https://github.com/polyv)上進行查看整理后妄均,才大致進行了抽取工作。
效果如下:
首先是布局代碼:
代碼布局中比較簡單哪自,主要包含一個PolyvVideoView組件丰包,一個PolyvPlayerMediaController控制器組件,一個PolyvPlayerPreviewView默認圖組件提陶,三個基礎(chǔ)的布局組合成一個基礎(chǔ)的播放窗體烫沙,包含視頻縮略圖,視頻控制器隙笆,和視頻播放器锌蓄。
對應的播放邏輯代碼如下:
/**
? ? * 播放視頻
? ? */
? ? fun play(
? ? ? ? vid: String,? //視頻資源id
? ? ? ? mediaController: PolyvPlayerMediaController, //控制器
? ? ? ? videoView: PolyvVideoView,
? ? ? ? viewLayout: RelativeLayout,
? ? ? ? firstView: PolyvPlayerPreviewView? //預覽圖
? ? ) {
? ? ? ? val danmuFragment: PolyvPlayerDanmuFragment = PolyvPlayerDanmuFragment();
? ? ? ? videoView.release();
? ? ? ? firstView.hide()
? ? ? ? videoView.setAutoPlay(true)
? ? ? ? mediaController.setDanmuFragment(danmuFragment);
? ? ? ? mediaController.initConfig(viewLayout)
? ? ? ? mediaController.hindMenuView()
? ? ? ? videoView.mediaController = mediaController
? ? ? ? videoView.setVid(vid)
? ? ? ? videoView.setOnPreparedListener(IPolyvOnPreparedListener2 {
? ? ? ? ? ? mediaController.preparedView()
? ? ? ? })
? ? ? ? videoView.setOnVideoStatusListener { status ->
? ? ? ? ? ? if (status < 60) {
//? ? ? ? ? ? ? ? Toast.makeText(
//? ? ? ? ? ? ? ? ? ? this,
//? ? ? ? ? ? ? ? ? ? "狀態(tài)錯誤 $status",
//? ? ? ? ? ? ? ? ? ? Toast.LENGTH_SHORT
//? ? ? ? ? ? ? ? ).show()
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? Log.d(
? ? ? ? ? ? ? ? ? ? "yxy",
? ? ? ? ? ? ? ? ? ? String.format("狀態(tài)正常 %d", status)
? ? ? ? ? ? ? ? )
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? //視頻不播放,先顯示一張縮略圖
? ? ? ? firstView.setCallback(PolyvPlayerPreviewView.Callback { //在播放視頻時設(shè)置viewerId方法使用示例
? ? ? ? ? ? videoView.setVid(vid)
? ? ? ? })
? ? ? ? firstView.show(vid)
? ? ? ? videoView.setOnPlayPauseListener(object : IPolyvOnPlayPauseListener {
? ? ? ? ? ? override fun onPause() {
? ? ? ? ? ? ? ? mediaController.updatePictureInPictureActions(
? ? ? ? ? ? ? ? ? ? R.drawable.polyv_btn_play_port,
? ? ? ? ? ? ? ? ? ? "pause",
? ? ? ? ? ? ? ? ? ? 1,
? ? ? ? ? ? ? ? ? ? 1
? ? ? ? ? ? ? ? )
? ? ? ? ? ? }
? ? ? ? ? ? override fun onPlay() {
? ? ? ? ? ? ? ? mediaController.updatePictureInPictureActions(
? ? ? ? ? ? ? ? ? ? R.drawable.polyv_btn_pause_port,
? ? ? ? ? ? ? ? ? ? "start",
? ? ? ? ? ? ? ? ? ? 2,
? ? ? ? ? ? ? ? ? ? 2
? ? ? ? ? ? ? ? )
? ? ? ? ? ? }
? ? ? ? ? ? override fun onCompletion() {
? ? ? ? ? ? ? ? mediaController.updatePictureInPictureActions(
? ? ? ? ? ? ? ? ? ? R.drawable.polyv_btn_play_port,
? ? ? ? ? ? ? ? ? ? "pause",
? ? ? ? ? ? ? ? ? ? 1,
? ? ? ? ? ? ? ? ? ? 1
? ? ? ? ? ? ? ? )
? ? ? ? ? ? }
? ? ? ? })
? ? }
由于在控制器中進行了部分操作的封裝撑柔,所以此處屏蔽了一些非必要的操作瘸爽。? mediaController.hindMenuView()
至此一個基礎(chǔ)的保利威播放邏輯就算處理好了,僅引用了最基礎(chǔ)的播放和控制器的功能铅忿,其他的功能都沒用到剪决。