WHCSRL 技术网

保利威视频播放器功能抽取,仅作为播放课程资源使用,去除多余功能

由于项目中所使用的场景,除了直播和回放,还有一个就是简单的课程资源播放器,然后取出整体的冗余,使用一个较为简单播放器来进行播放操作。保利威直播的demo和开发文档,在实际调试过程中,让人非常头疼,在github(https://github.com/polyv)上进行查看整理后,才大致进行了抽取工作。

 

效果如下:

 

 

首先是布局代码:

  1. <RelativeLayout
  2. android:id="@+id/question_answer_data_view_layout"
  3. android:layout_width="match_parent"
  4. android:layout_height="@dimen/top_center_player_height"
  5. android:layout_marginTop="10dp"
  6. android:background="@drawable/shape_bg_video_view"
  7. android:visibility="gone">
  8. <com.easefun.polyvsdk.video.PolyvVideoView
  9. android:id="@+id/question_answer_data_video_view"
  10. android:layout_width="match_parent"
  11. android:layout_height="match_parent">
  12. </com.easefun.polyvsdk.video.PolyvVideoView>
  13. <com.easefun.polyvsdk.player.PolyvPlayerMediaController
  14. android:id="@+id/question_answer_data_media_controller"
  15. android:layout_width="match_parent"
  16. android:layout_height="match_parent"
  17. android:visibility="gone" />
  18. <com.easefun.polyvsdk.player.PolyvPlayerPreviewView
  19. android:id="@+id/question_answer_data_first_start_view"
  20. android:layout_width="match_parent"
  21. android:layout_height="match_parent"
  22. android:background="@drawable/shape_bg_video_view"
  23. android:visibility="visible" />
  24. </RelativeLayout>

代码布局中比较简单,主要包含一个PolyvVideoView组件,一个PolyvPlayerMediaController控制器组件,一个PolyvPlayerPreviewView默认图组件,三个基础的布局组合成一个基础的播放窗体,包含视频缩略图,视频控制器,和视频播放器。

对应的播放逻辑代码如下:

  1. /**
  2. * 播放视频
  3. */
  4. fun play(
  5. vid: String, //视频资源id
  6. mediaController: PolyvPlayerMediaController, //控制器
  7. videoView: PolyvVideoView,
  8. viewLayout: RelativeLayout,
  9. firstView: PolyvPlayerPreviewView //预览图
  10. ) {
  11. val danmuFragment: PolyvPlayerDanmuFragment = PolyvPlayerDanmuFragment();
  12. videoView.release();
  13. firstView.hide()
  14. videoView.setAutoPlay(true)
  15. mediaController.setDanmuFragment(danmuFragment);
  16. mediaController.initConfig(viewLayout)
  17. mediaController.hindMenuView()
  18. videoView.mediaController = mediaController
  19. videoView.setVid(vid)
  20. videoView.setOnPreparedListener(IPolyvOnPreparedListener2 {
  21. mediaController.preparedView()
  22. })
  23. videoView.setOnVideoStatusListener { status ->
  24. if (status < 60) {
  25. // Toast.makeText(
  26. // this,
  27. // "状态错误 $status",
  28. // Toast.LENGTH_SHORT
  29. // ).show()
  30. } else {
  31. Log.d(
  32. "yxy",
  33. String.format("状态正常 %%%%d", status)
  34. )
  35. }
  36. }
  37. //视频不播放,先显示一张缩略图
  38. firstView.setCallback(PolyvPlayerPreviewView.Callback { //在播放视频时设置viewerId方法使用示例
  39. videoView.setVid(vid)
  40. })
  41. firstView.show(vid)
  42. videoView.setOnPlayPauseListener(object : IPolyvOnPlayPauseListener {
  43. override fun onPause() {
  44. mediaController.updatePictureInPictureActions(
  45. R.drawable.polyv_btn_play_port,
  46. "pause",
  47. 1,
  48. 1
  49. )
  50. }
  51. override fun onPlay() {
  52. mediaController.updatePictureInPictureActions(
  53. R.drawable.polyv_btn_pause_port,
  54. "start",
  55. 2,
  56. 2
  57. )
  58. }
  59. override fun onCompletion() {
  60. mediaController.updatePictureInPictureActions(
  61. R.drawable.polyv_btn_play_port,
  62. "pause",
  63. 1,
  64. 1
  65. )
  66. }
  67. })
  68. }

由于在控制器中进行了部分操作的封装,所以此处屏蔽了一些非必要的操作。  mediaController.hindMenuView()

至此一个基础的保利威播放逻辑就算处理好了,仅引用了最基础的播放和控制器的功能,其他的功能都没用到。

推荐阅读