当前位置: 首页 > 工具软件 > ExoMedia > 使用案例 >

Exoplayer+Exomedia视频播放事件监听

李奕
2023-12-01

转载自:https://blog.csdn.net/xunshishi/article/details/74171379

说明

  • 视频播放事件包括两个部分:1.播放器本身的事件(开始、暂停、结束播放等) 2.用户动作触发的事件(拖拽进度条、点击屏幕等)
  • 播放事件监听的途径主要是通过视频播放框架(或开发者自定义)的控制器来实现的。
  • 控制器是指操作播放器的组件(按钮、进度条等)的容器。
  • 事件的监听经常与视频当前时间配合使用。
  • 本文基于Exoplayer+Exomedia实现视频事件监听。

关键点

VideoView与视频时间、播放进度相关的主要方法。

  1. 获取视频当前时间
long getCurrentPosition()
  1. 获取视频总时长
long getDuration()
  1. 控制播放进度
void seekTo(long millis)

实现接口

包含VideoView的Activity请实现接口,全部接口及回调如下所示,实际使用中请挑选所需接口实现(若有遗漏请谅解).

 
  1. public class XunshiVideoDemoActivity extends AppCompatActivity

  2. implements

  3. ExoPlayerListener,

  4. VideoControlsSeekListener,

  5. VideoControlsButtonListener,

  6. VideoControlsVisibilityListener,

  7. OnCompletionListener,

  8. OnPreparedListener,

  9. OnBufferUpdateListener {

  10.  
  11. @Override

  12. public void onStateChanged(boolean playWhenReady, int playbackState) {

  13.  
  14. }

  15.  
  16. @Override

  17. public void onError(ExoMediaPlayer exoMediaPlayer, Exception e) {

  18.  
  19. }

  20.  
  21. @Override

  22. public void onVideoSizeChanged(int width, int height, int unAppliedRotationDegrees, float pixelWidthHeightRatio) {

  23.  
  24. }

  25.  
  26. @Override

  27. public void onBufferingUpdate(@IntRange(from = 0, to = 100) int percent) {

  28.  
  29. }

  30.  
  31. @Override

  32. public void onCompletion() {

  33.  
  34. }

  35.  
  36. @Override

  37. public void onPrepared() {

  38.  
  39. }

  40.  
  41. @Override

  42. public void onSeekComplete() {

  43.  
  44. }

  45.  
  46. @Override

  47. public boolean onPlayPauseClicked() {

  48. return false;

  49. }

  50.  
  51. @Override

  52. public boolean onPreviousClicked() {

  53. return false;

  54. }

  55.  
  56. @Override

  57. public boolean onNextClicked() {

  58. return false;

  59. }

  60.  
  61. @Override

  62. public boolean onRewindClicked() {

  63. return false;

  64. }

  65.  
  66. @Override

  67. public boolean onFastForwardClicked() {

  68. return false;

  69. }

  70.  
  71. @Override

  72. public boolean onSeekStarted() {

  73. return false;

  74. }

  75.  
  76. @Override

  77. public boolean onSeekEnded(long seekTime) {

  78. return false;

  79. }

  80.  
  81. @Override

  82. public void onControlsShown() {

  83.  
  84. }

  85.  
  86. @Override

  87. public void onControlsHidden() {

  88.  
  89. }

  90. }

设置监听

 
  1. //1.控制器的监听

  2. mVideoView.getVideoControls().setVisibilityListener(this);

  3. mVideoView.getVideoControls().setSeekListener(this);

  4. mVideoView.getVideoControls().setButtonListener(this);

  5.  
  6. //2.播放器的监听

  7. mVideoView.setOnCompletionListener(this);

  8. mVideoView.setOnSeekCompletionListener(this);

  9. mVideoView.setOnPreparedListener(this);

  10. mVideoView.setOnBufferUpdateListener(this);

这里的参数this是因为Activity实现了接口,也可以直接传匿名函数如下:

 
  1. mVideoView.setOnBufferUpdateListener(new OnBufferUpdateListener() {

  2. @Override

  3. public void onBufferingUpdate(@IntRange(from = 0, to = 100) int percent) {

  4. //do something

  5. }

  6. });

详细说明

播放器监听类

  1. ExoPlayerListener
    与Exoplayer的addListener回调类似,监听了视频播放状态变化、报错、尺寸变化、进度条拖拽结束。
mVideoView.setOnSeekCompletionListener(this);
 
  1. @Override

  2. public void onStateChanged(boolean playWhenReady, int playbackState) {

  3. //视频播放状态

  4. }

  5.  
  6. @Override

  7. public void onError(ExoMediaPlayer exoMediaPlayer, Exception e) {

  8. //报错

  9. }

  10.  
  11. @Override

  12. public void onVideoSizeChanged(int width, int height, int unAppliedRotationDegrees, float pixelWidthHeightRatio) {

  13. //尺寸

  14. }

  15.  
  16. @Override

  17. public void onSeekComplete() {

  18. //拖拽进度条结束

  19. }

  1. OnCompletionListener
    视频加载并且播放完毕时回调.
mVideoView.setOnCompletionListener(this);
 
  1. @Override

  2. public void onCompletion() {

  3.  
  4. }

  1. OnPreparedListener
    视频准备完毕可以播放时回调.经常在这里获取视频播放长度.
mVideoView.setOnPreparedListener(this);
 
  1. @Override

  2. public void onPrepared() {

  3. Log.d(TAG, "视频时长=" + mVideoView.getDuration());

  4. }

  1. OnBufferUpdateListener
    视频缓冲时回调/视频播放中不断的回调,非常适合监听播放当前时刻--->getCurrentPosition()
mVideoView.setOnBufferUpdateListener(this);
 
  1. @Override

  2. public void onBufferingUpdate(@IntRange(from = 0L, to = 100L) int percent) {

  3. Log.d(TAG, "当前播放时刻=" + mVideoView.getCurrentPosition());

  4. }

  • OnBufferUpdateListener监听Log示例:
    06-30 16:46:44.570 15602-15602/com.xunshi.videodemo D/VideoActivity: onBufferingUpdate.getCurrentPosition():478
    06-30 16:46:45.570 15602-15602/com.xunshi.videodemo D/VideoActivity: onBufferingUpdate.getCurrentPosition():1479
    06-30 16:46:46.570 15602-15602/com.xunshi.videodemo D/VideoActivity: onBufferingUpdate.getCurrentPosition():2474
    06-30 16:46:47.570 15602-15602/com.xunshi.videodemo D/VideoActivity: onBufferingUpdate.getCurrentPosition():3477
    06-30 16:46:48.570 15602-15602/com.xunshi.videodemo D/VideoActivity: onBufferingUpdate.getCurrentPosition():4484
    06-30 16:46:49.570 15602-15602/com.xunshi.videodemo D/VideoActivity: onBufferingUpdate.getCurrentPosition():5469
    06-30 16:46:50.570 15602-15602/com.xunshi.videodemo D/VideoActivity: onBufferingUpdate.getCurrentPosition():6492
    06-30 16:46:51.570 15602-15602/com.xunshi.videodemo D/VideoActivity: onBufferingUpdate.getCurrentPosition():7492
    可以看出此getCurrentPosition()的值随播放时刻变化而变化,说明此回调是在持续进行监听的.

注意!

此方法在视频播放完毕后即停止监听,restart()视频也不会再次监听!如果想重新监听有两种方法:

  1. 释放视频资源,重新加载;
  2. 利用OnBufferUpdateListener持续监听的特性,在视频播放完毕前暂停,此时restart()视频即可再次监听了!总时间减去当前时间:getDuration() - getCurrentPosition()  >= 1000毫秒时说明视频没有播放完毕。
 
  1. @Override

  2. public void onBufferingUpdate(@IntRange(from = 0L, to = 100L) int percent) {

  3. Log.d(TAG, "onBufferingUpdate.getCurrentPosition():" + mVideoView.getCurrentPosition());

  4.  
  5. if (mVideoView.getDuration() - mVideoView.getCurrentPosition() < 1000) {

  6. //计算时长小于1000毫秒

  7. //视同视频播放完毕

  8. return;

  9. }

  10. }


控制器监听类

  1. VideoControlsSeekListener
    监听进度条拖拽的开始与结束.
mVideoView.getVideoControls().setSeekListener(this);
 
  1. @Override

  2. public boolean onSeekStarted() {

  3. //开始拖拽时刻

  4. Log.d(TAG, "开始拖拽时刻=" + mVideoView.getCurrentPosition());

  5. return false;

  6. }

  7.  
  8. @Override

  9. public boolean onSeekEnded(long seekTime) {

  10. //结束拖拽时刻

  11. Log.d(TAG, "结束拖拽时刻=" + mVideoView.getCurrentPosition());

  12. return false;

  13. }

  1. VideoControlsButtonListener
    控制器按钮点击事件监听.
mVideoView.getVideoControls().setButtonListener(this);
 
  1. @Override

  2. public boolean onPlayPauseClicked() {

  3. //开始/暂停

  4. return false;

  5. }

  6.  
  7. @Override

  8. public boolean onPreviousClicked() {

  9. //回退

  10. return false;

  11. }

  12.  
  13. @Override

  14. public boolean onNextClicked() {

  15. return false;

  16. }

  17.  
  18. @Override

  19. public boolean onRewindClicked() {

  20. //前进

  21. return false;

  22. }

  23.  
  24. @Override

  25. public boolean onFastForwardClicked() {

  26. //快进

  27. return false;

  28. }

3.VideoControlsVisibilityListener
控制器可见性监听.

mVideoView.getVideoControls().setVisibilityListener(this);
 
  1. @Override

  2. public void onControlsShown() {

  3.  
  4. }

  5.  
  6. @Override

  7. public void onControlsHidden() {

  8.  
  9. }

 类似资料: