保利威视频播放器功能抽取,仅作为播放课程资源使用,去除多余功能
由于项目中所使用的场景,除了直播和回放,还有一个就是简单的课程资源播放器,然后取出整体的冗余,使用一个较为简单播放器来进行播放操作。保利威直播的demo和开发文档,在实际调试过程中,让人非常头疼,在github(https://github.com/polyv)上进行查看整理后,才大致进行了抽取工作。
效果如下:
首先是布局代码:
-
- <RelativeLayout
- android:id="@+id/question_answer_data_view_layout"
- android:layout_width="match_parent"
- android:layout_height="@dimen/top_center_player_height"
- android:layout_marginTop="10dp"
- android:background="@drawable/shape_bg_video_view"
- android:visibility="gone">
-
- <com.easefun.polyvsdk.video.PolyvVideoView
- android:id="@+id/question_answer_data_video_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- </com.easefun.polyvsdk.video.PolyvVideoView>
-
- <com.easefun.polyvsdk.player.PolyvPlayerMediaController
- android:id="@+id/question_answer_data_media_controller"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:visibility="gone" />
-
- <com.easefun.polyvsdk.player.PolyvPlayerPreviewView
- android:id="@+id/question_answer_data_first_start_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@drawable/shape_bg_video_view"
- android:visibility="visible" />
- </RelativeLayout>
代码布局中比较简单,主要包含一个PolyvVideoView组件,一个PolyvPlayerMediaController控制器组件,一个PolyvPlayerPreviewView默认图组件,三个基础的布局组合成一个基础的播放窗体,包含视频缩略图,视频控制器,和视频播放器。
对应的播放逻辑代码如下:
- /**
- * 播放视频
- */
- 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,
- // "状态错误 $status",
- // Toast.LENGTH_SHORT
- // ).show()
- } else {
- Log.d(
- "yxy",
- String.format("状态正常 %%%%d", status)
- )
- }
- }
-
-
- //视频不播放,先显示一张缩略图
- firstView.setCallback(PolyvPlayerPreviewView.Callback { //在播放视频时设置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()
至此一个基础的保利威播放逻辑就算处理好了,仅引用了最基础的播放和控制器的功能,其他的功能都没用到。
推荐阅读