当前位置:   article > 正文

【Android入门到项目实战-- 11.4】—— ExoPlayer视频播放器框架的详细使用

exoplayer

目录

什么是ExoPlayer

一、基本使用

 1、添加依赖项

 2、布局

3、Activity

二、自定义播放暂停

1、首先如何隐藏默认的开始暂停和快进?

2、自定义

三、控制视频画面旋转和比例调整

四、全屏放大和缩小

1、双击视频放大缩小

2、按钮放大缩小

五、完整的实现代码

XML

Activity


什么是ExoPlayer

        ExoPlayer是由Google开发的媒体播放器库,支持播放本地和网络视频。以下是使用ExoPlayer播放视频的详细步骤和代码示例。

一、基本使用

        下面实现如下图所示的两个播放器的效果:

 1、添加依赖项

build.gradle添加:

  1. implementation 'com.google.android.exoplayer:exoplayer-core:2.15.1'
  2. implementation 'com.google.android.exoplayer:exoplayer-ui:2.15.1'

声明网络权限

    <uses-permission android:name="android.permission.INTERNET" />

 2、布局

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">
  6. <com.google.android.exoplayer2.ui.PlayerView
  7. android:id="@+id/player_view"
  8. android:layout_width="match_parent"
  9. android:layout_height="0dp"
  10. android:layout_weight="1"/>
  11. <com.google.android.exoplayer2.ui.PlayerView
  12. android:id="@+id/player_view2"
  13. android:layout_width="wrap_content"
  14. android:layout_height="0dp"
  15. android:layout_weight="1"/>
  16. </LinearLayout>

3、Activity

  1. public class MainActivity extends AppCompatActivity {
  2. private SimpleExoPlayer mPlayer;
  3. private SimpleExoPlayer mPlayer2;
  4. private PlayerView mPlayerView;
  5. private PlayerView mPlayerView2;
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10. mPlayerView = findViewById(R.id.player_view);
  11. mPlayerView2 = findViewById(R.id.player_view2);
  12. // 创建媒体播放器
  13. mPlayer = new SimpleExoPlayer.Builder(this).build();
  14. mPlayer2 = new SimpleExoPlayer.Builder(this).build();
  15. mPlayerView.setPlayer(mPlayer);
  16. mPlayerView2.setPlayer(mPlayer2);
  17. // 设置数据源
  18. String videoUrl = "https://v2.kwaicdn.com/upic/2023/04/14/13/BMjAyMzA0MTQxMzA3MDhfNDgwOTQ5MTg2XzEwMDU1NzkwNjgxMV8yXzM=_b_B4856a8b07ea4dbc4ad503f04681b5ec8.mp4?pkey=AAW-JkY6q-BoTEXl2FArO1ReMGt965IaFcPl0NGX7cYTVhLtgZVdld15RtYUAWwkkEmBjjKBPE2yDFb0kigIji2xGTYcxXU-rCTrXNQiN4N4_RpUja5SPyx99Eh46Cixcag&tag=1-1684724589-unknown-0-0eoiahcqin-0a0841bce7d498e5&clientCacheKey=3xt93xmd7emzv6k_b.mp4";
  19. String videoUrl2 = "https://v2.kwaicdn.com/upic/2023/05/20/16/BMjAyMzA1MjAxNjAyMjhfMTM2MDg5NzAyNl8xMDM1MjIwNDgzMjFfMl8z_b_B0d97abd06757be9906cd83e0571dcd7d.mp4?pkey=AAX4DgH_Q4KBjVVQpeITMyNxi34_0KOD7Dp80qxpwuNV4BfONaasSnAkBrFPEdGKbfj0m9Jd_VGG-isTQxiQGOlUQ6e2OKuPO2f72pFUVdxdEJkqCVpijL4zsJu3mMtoBfc&tag=1-1684724589-unknown-0-hilddj6arr-772b90a0f590e795&clientCacheKey=3xhd9ng5fbii652_b.mp4";
  20. MediaItem mediaItem = MediaItem.fromUri(videoUrl);
  21. MediaItem mediaItem2 = MediaItem.fromUri(videoUrl2);
  22. mPlayer.setMediaItem(mediaItem);
  23. mPlayer2.setMediaItem(mediaItem2);
  24. mPlayer.prepare();
  25. mPlayer2.prepare();
  26. }
  27. // 以下是生命周期管理
  28. @Override
  29. protected void onStart() {
  30. super.onStart();
  31. mPlayerView.onResume();
  32. }
  33. @Override
  34. protected void onStop() {
  35. super.onStop();
  36. mPlayerView.onPause();
  37. }
  38. @Override
  39. protected void onDestroy() {
  40. super.onDestroy();
  41. mPlayer.release();
  42. }
  43. // 注意:在使用ExoPlayer时,需要在Activity中保持屏幕常亮以避免视频播放过程中屏幕自动关闭。
  44. @Override
  45. protected void onResume() {
  46. super.onResume();
  47. getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  48. }
  49. @Override
  50. protected void onPause() {
  51. super.onPause();
  52. getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  53. }
  54. }

二、自定义播放暂停

1、首先如何隐藏默认的开始暂停和快进?

        隐藏它们很简单,只需把use_controller设置成false即可。

  1. <com.google.android.exoplayer2.ui.StyledPlayerView
  2. android:id="@+id/videoView"
  3. android:layout_width="match_parent"
  4. android:layout_height="0dp"
  5. android:layout_weight="1"
  6. app:use_controller="false"/>

2、自定义

        ExoPlayer还提供了很多控制视频播放的API,如暂停、继续、快进、快退、调整音量、调整亮度等。下面将介绍如何实现视频的暂停和继续播放。

        在Activity中添加下面的代码:

  1. private boolean isPlaying = false;
  2. private void togglePlay() {
  3. if (isPlaying) {
  4. player.pause();
  5. } else {
  6. player.play();
  7. }
  8. isPlaying = !isPlaying;
  9. }

        利用isPlaying布尔变量记录当前视频的播放状态,使用player.pause()方法暂停视频,使用player.play()方法继续播放视频,并且通过isPlaying变量更新当前播放状态。

        在SimpleExoPlayerView中添加点击事件:

  1. playerView.setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(View view) {
  4. togglePlay();
  5. }
  6. });

这样就可以实现通过点击视频区域来暂停和继续视频的播放。        

三、控制视频画面旋转和比例调整

        xoPlayer支持旋转视频画面和调整视频比例的功能。下面将介绍如何使用ExoPlayer来实现这些功能。

        使用代码旋转视频画面,可以调用SimpleExoPlayerView.setUseController(false)方法隐藏内置的控制器,然后利用下面的代码实现视频旋转:

playerView.setKeepScreenOn(true);
playerView.setRotation(90);
playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FIT);

        通过playerView.setKeepScreenOn(true)方法保持屏幕常亮,playerView.setRotation(90)方法实现视频的旋转,playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FIT)方法调整视频的比例。

四、全屏放大和缩小

        实现视频画面的缩放,可以通过以下代码实现:

  1. private boolean isFullscreen = false;
  2. private void toggleFullscreen() {
  3. if (isFullscreen) {
  4. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  5. getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
  6. playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FIT);
  7. getSupportActionBar().show();
  8. } else {
  9. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  10. getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
  11. playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FILL);
  12. getSupportActionBar().hide();
  13. }
  14. isFullscreen = !isFullscreen;
  15. }

        利用isFullscreen布尔变量记录当前是否全屏状态,使用setRequestedOrientation()方法实现屏幕的旋转,使用getWindow().addFlags()和getWindow().clearFlags()方法实现全屏状态的切换,并且使用playerView.setResizeMode()方法调整视频的比例。在全屏状态下隐藏ActionBar,退出全屏状态后显示ActionBar。

1、双击视频放大缩小

        在SimpleExoPlayerView中添加双击事件

  1. playerView.setOnTouchListener(new View.OnTouchListener() {
  2. private GestureDetector gestureDetector = new GestureDetector(MainActivity.this,
  3. new GestureDetector.SimpleOnGestureListener() {
  4. @Override
  5. public boolean onDoubleTap(MotionEvent e) {
  6. toggleFullscreen();
  7. return super.onDoubleTap(e);
  8. }
  9. });
  10. @Override
  11. public boolean onTouch(View view, MotionEvent motionEvent) {
  12. gestureDetector.onTouchEvent(motionEvent);
  13. return true;
  14. }
  15. });

        这样就可以实现在双击视频区域时切换视频的全屏状态。

2、按钮放大缩小

  1. mBtnZoom.setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(View view) {
  4. toggleFullscreen();
  5. }
  6. });

五、完整的实现代码

        如果看不懂前面的操作,可以直接用下面的代码,有点击按钮和双击视频全屏放大缩小效果。

XML

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">
  6. <com.google.android.exoplayer2.ui.PlayerView
  7. android:id="@+id/player_view"
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content" />
  10. <Button
  11. android:id="@+id/btn_zoom"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:layout_alignParentBottom="true"
  15. android:layout_alignParentRight="true"
  16. android:layout_margin="16dp"
  17. android:backgroundTint="@color/white"
  18. android:text="Full Screen"
  19. android:textColor="@color/black"
  20. android:visibility="visible"
  21. android:onClick="onFullscreenButtonClick"/>
  22. </RelativeLayout>

Activity

  1. public class MainActivity extends AppCompatActivity {
  2. private SimpleExoPlayer mPlayer;
  3. private PlayerView mPlayerView;
  4. private Button mBtnZoom;
  5. private boolean isFullscreen = false;
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10. mPlayerView = findViewById(R.id.player_view);
  11. mBtnZoom = findViewById(R.id.btn_zoom);
  12. // 创建媒体播放器
  13. mPlayer = new SimpleExoPlayer.Builder(this).build();
  14. mPlayerView.setPlayer(mPlayer);
  15. // 准备视频源
  16. String videoUrl = "https://v2.kwaicdn.com/upic/2023/04/14/13/BMjAyMzA0MTQxMzA3MDhfNDgwOTQ5MTg2XzEwMDU1NzkwNjgxMV8yXzM=_b_B4856a8b07ea4dbc4ad503f04681b5ec8.mp4?pkey=AAW-JkY6q-BoTEXl2FArO1ReMGt965IaFcPl0NGX7cYTVhLtgZVdld15RtYUAWwkkEmBjjKBPE2yDFb0kigIji2xGTYcxXU-rCTrXNQiN4N4_RpUja5SPyx99Eh46Cixcag&tag=1-1684724589-unknown-0-0eoiahcqin-0a0841bce7d498e5&clientCacheKey=3xt93xmd7emzv6k_b.mp4";
  17. String videoUrl2 = "https://v2.kwaicdn.com/upic/2023/05/20/16/BMjAyMzA1MjAxNjAyMjhfMTM2MDg5NzAyNl8xMDM1MjIwNDgzMjFfMl8z_b_B0d97abd06757be9906cd83e0571dcd7d.mp4?pkey=AAX4DgH_Q4KBjVVQpeITMyNxi34_0KOD7Dp80qxpwuNV4BfONaasSnAkBrFPEdGKbfj0m9Jd_VGG-isTQxiQGOlUQ6e2OKuPO2f72pFUVdxdEJkqCVpijL4zsJu3mMtoBfc&tag=1-1684724589-unknown-0-hilddj6arr-772b90a0f590e795&clientCacheKey=3xhd9ng5fbii652_b.mp4";
  18. MediaItem mediaItem = MediaItem.fromUri(videoUrl);
  19. MediaItem mediaItem2 = MediaItem.fromUri(videoUrl2);
  20. mPlayer.setMediaItem(mediaItem);
  21. mPlayer.prepare();
  22. // 按钮放大缩小
  23. mBtnZoom.setOnClickListener(new View.OnClickListener() {
  24. @Override
  25. public void onClick(View view) {
  26. toggleFullscreen();
  27. }
  28. });
  29. // 双击视频放大缩小
  30. mPlayerView.setOnTouchListener(new View.OnTouchListener() {
  31. private GestureDetector gestureDetector = new GestureDetector(MainActivity.this,
  32. new GestureDetector.SimpleOnGestureListener() {
  33. @Override
  34. public boolean onDoubleTap(MotionEvent e) {
  35. toggleFullscreen();
  36. return super.onDoubleTap(e);
  37. }
  38. });
  39. @Override
  40. public boolean onTouch(View view, MotionEvent motionEvent) {
  41. gestureDetector.onTouchEvent(motionEvent);
  42. return true;
  43. }
  44. });
  45. }
  46. // 视频放大缩小方法
  47. private void toggleFullscreen() {
  48. if (isFullscreen) {
  49. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  50. getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
  51. mPlayerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FIT);
  52. getSupportActionBar().show();
  53. } else {
  54. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  55. getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
  56. mPlayerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FILL);
  57. getSupportActionBar().hide();
  58. }
  59. isFullscreen = !isFullscreen;
  60. }
  61. // 以下是生命周期
  62. @Override
  63. protected void onStart() {
  64. super.onStart();
  65. mPlayerView.onResume();
  66. }
  67. @Override
  68. protected void onStop() {
  69. super.onStop();
  70. mPlayerView.onPause();
  71. }
  72. @Override
  73. protected void onDestroy() {
  74. super.onDestroy();
  75. mPlayer.release();
  76. }
  77. // 注意:在使用ExoP注意:在使用ExoPlayer时,需要在Activity中保持屏幕常亮以避免视频播放过程中屏幕自动关闭。layer时,需要在Activity中保持屏幕常亮以避免视频播放过程中屏幕自动关闭。
  78. @Override
  79. protected void onResume() {
  80. super.onResume();
  81. getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  82. }
  83. @Override
  84. protected void onPause() {
  85. super.onPause();
  86. getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  87. }
  88. }

最后不要忘记添加网络权限!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/295745
推荐阅读
相关标签
  

闽ICP备14008679号