1. 程式人生 > >Exoplayer+Exomedia視訊播放事件監聽

Exoplayer+Exomedia視訊播放事件監聽

說明

  • 視訊播放事件包括兩個部分: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. @Override

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

  12. }

  13. @Override

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

  15. }

  16. @Override

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

  18. }

  19. @Override

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

  21. }

  22. @Override

  23. public void onCompletion() {

  24. }

  25. @Override

  26. public void onPrepared() {

  27. }

  28. @Override

  29. public void onSeekComplete() {

  30. }

  31. @Override

  32. public boolean onPlayPauseClicked() {

  33. return false;

  34. }

  35. @Override

  36. public boolean onPreviousClicked() {

  37. return false;

  38. }

  39. @Override

  40. public boolean onNextClicked() {

  41. return false;

  42. }

  43. @Override

  44. public boolean onRewindClicked() {

  45. return false;

  46. }

  47. @Override

  48. public boolean onFastForwardClicked() {

  49. return false;

  50. }

  51. @Override

  52. public boolean onSeekStarted() {

  53. return false;

  54. }

  55. @Override

  56. public boolean onSeekEnded(long seekTime) {

  57. return false;

  58. }

  59. @Override

  60. public void onControlsShown() {

  61. }

  62. @Override

  63. public void onControlsHidden() {

  64. }

  65. }

設定監聽

  1. //1.控制器的監聽

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

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

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

  5. //2.播放器的監聽

  6. mVideoView.setOnCompletionListener(this);

  7. mVideoView.setOnSeekCompletionListener(this);

  8. mVideoView.setOnPreparedListener(this);

  9. 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. @Override

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

  7. //報錯

  8. }

  9. @Override

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

  11. //尺寸

  12. }

  13. @Override

  14. public void onSeekComplete() {

  15. //拖拽進度條結束

  16. }

  1. OnCompletionListener
    視訊載入並且播放完畢時回撥.
mVideoView.setOnCompletionListener(this);
  1. @Override

  2. public void onCompletion() {

  3. }

  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. if (mVideoView.getDuration() - mVideoView.getCurrentPosition() < 1000) {

  5. //計算時長小於1000毫秒

  6. //視同視訊播放完畢

  7. return;

  8. }

  9. }

控制器監聽類

  1. VideoControlsSeekListener
    監聽進度條拖拽的開始與結束.
mVideoView.getVideoControls().setSeekListener(this);
  1. @Override

  2. public boolean onSeekStarted() {

  3. //開始拖拽時刻

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

  5. return false;

  6. }

  7. @Override

  8. public boolean onSeekEnded(long seekTime) {

  9. //結束拖拽時刻

  10. Log.d(TAG, "結束拖拽時刻=" + mVideoView.getCurrentPosition());

  11. return false;

  12. }

  1. VideoControlsButtonListener
    控制器按鈕點選事件監聽.
mVideoView.getVideoControls().setButtonListener(this);
  1. @Override

  2. public boolean onPlayPauseClicked() {

  3. //開始/暫停

  4. return false;

  5. }

  6. @Override

  7. public boolean onPreviousClicked() {

  8. //回退

  9. return false;

  10. }

  11. @Override

  12. public boolean onNextClicked() {

  13. return false;

  14. }

  15. @Override

  16. public boolean onRewindClicked() {

  17. //前進

  18. return false;

  19. }

  20. @Override

  21. public boolean onFastForwardClicked() {

  22. //快進

  23. return false;

  24. }

3.VideoControlsVisibilityListener
控制器可見性監聽.

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

  2. public void onControlsShown() {

  3. }

  4. @Override

  5. public void onControlsHidden() {

  6. }