Exoplayer+Exomedia打造自定义视频播放器

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

 

写在前面的话

  1. 对App视频播放模块进行扩展,需要自定义播放器的样式、监听视频播放过程中各种事件(播放开始、暂停、重新播放、结束、拖拽进度条、横竖屏切换等)、横竖屏切换、手动控制播放进度等。
  2. 自定义功能性、扩展性较好的视频播放模块。初次技术选型时利用github上比较流行的JieCaoVideoPlayer进行二次开发,基本实现了功能需求,但缺点也比较明显:1.机型及视频兼容性差,2.扩展性不佳,3.bug较多,故放弃之。
  3. 最后选用Google"亲儿子"视频播放框架Exoplayer,配合第三方库Exomedia进行扩展开发,完全实现了项目需求,并达到了较好的兼容性及播放效果。

相关链接

exoplayer

exomedia

基本使用

添加依赖

 
  1. compile 'com.google.android.exoplayer:exoplayer:r2.4.1'

  2. compile 'com.devbrackets.android:exomedia:4.0.2'

AndroidManifest

  1. 权限 联网/更改设置
 
  1. <uses-permission android:name="android.permission.INTERNET"/>

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

  1. Activity 横竖屏切换/默认竖屏
 
  1. <activity

  2. android:name=".ui.activity.XunshiVideoDemoActivity"

  3. android:configChanges="orientation|screenSize|keyboardHidden"

  4. android:screenOrientation="portrait">

  5. </activity>

XML

 
  1. <?xml version="1.0" encoding="utf-8"?>

  2. <RelativeLayout

  3. xmlns:android="http://schemas.android.com/apk/res/android"

  4. xmlns:app="http://schemas.android.com/apk/res-auto"

  5. xmlns:tools="http://schemas.android.com/tools"

  6. android:layout_width="match_parent"

  7. android:layout_height="match_parent">

  8.  
  9. <!--exomedia-->

  10. <com.devbrackets.android.exomedia.ui.widget.VideoView

  11. android:id="@+id/exomedia_videoview"

  12. android:layout_width="match_parent"

  13. android:layout_height="match_parent"

  14. android:background="@color/black"

  15. app:useDefaultControls="true"/>

  16.  
  17. </RelativeLayout>

Java

Application级

  1. 兼容性问题解决
    从github下载Exoplayer-release.zip,将extensions中的okhttp扩展文件夹中的OkHttpDataSourse.java和OkHttpDataSourceFactory.java文件考入自己的工程中.

  2. 自定义Application继承父类,调用兼容性解决方法.

 
  1. public class XunshiVideoDemoApplication extends Application {

  2.  
  3. @Override

  4. public void onCreate() {

  5. super.onCreate();

  6. //兼容性配置

  7. configureExoMedia();

  8. }

  9.  
  10. /**

  11. * 机型适配

  12. */

  13. private void configureExoMedia() {

  14. // 把MediaSources注册使用Okhttp客户端,而不是apache标准

  15. // OkHttpDataSourceFactory指的是---->Exoplayer扩展库的`extension-okhttp`

  16. ExoMedia.setHttpDataSourceFactoryProvider(new ExoMedia.HttpDataSourceFactoryProvider() {

  17. @NonNull

  18. @Override

  19. public HttpDataSource.BaseFactory provide(@NonNull String userAgent, @Nullable TransferListener<? super DataSource> listener) {

  20. return new OkHttpDataSourceFactory(new OkHttpClient(), userAgent, listener);

  21. }

  22. });

  23. }

  24. }

  1. 配置完毕后解决大多数机型兼容性问题.

Activity级

  1. 注意VideoView导包
import com.devbrackets.android.exomedia.ui.widget.VideoView;
  1. 调用
 
  1. public class XunshiVideoDemoActivity extends AppCompatActivity {

  2.  
  3. @Override

  4. protected void onCreate(Bundle savedInstanceState) {

  5. super.onCreate(savedInstanceState);

  6.  
  7. //声明VideoView

  8. VideoView mVideoView;

  9.  
  10. //反射

  11. mVideoView = (VideoView) findViewById(R.id.exomedia_videoview);

  12.  
  13. //设置播放路径

  14. mVideoView.setVideoURI(Uri.parse("http://www.asdfzxcv.cn/demovideo.mp4"));

  15.  
  16. //开始播放

  17. mVideoView.start();

  18. }

  19. }

此时已经可以加载并观看视频了.

  1. 横竖屏切换
  • 声明一个Button用于横竖屏切换
Button btnOrient;
  • 在Activity的回调函数onConfigurationChanged()中配置横竖屏切换.
 
  1. @Override

  2. public void onConfigurationChanged(Configuration newConfig) {

  3. if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {

  4. //切换到了横屏

  5. //按钮的图标变化

  6. btnOrient.setBackground(getResources().getDrawable(R.drawable.fullscreen_exit));

  7. } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {

  8. //切换到了竖屏

  9. //按钮的图标变化

  10. btnOrient.setBackground(getResources().getDrawable(R.drawable.fullscreen));

  11. }

  12. super.onConfigurationChanged(newConfig);

  13. }

生命周期相关

  1. 播放器声明周期
  • 开始播放
void mVideoView.start();
  • 重新播放(不释放资源)
void mVideoView.restart();
  • 暂停播放(不释放资源)
void mVideoView.pause();
  • 销毁
void mVideoView.release();
  • 是否正在播放中
boolean mVideoView.isPlaying();
  1. 与Activity生命周期配合使用
 
  1. boolean pausedInOnStop = false;

  2.  
  3. @Override

  4. protected void onStart() {

  5. super.onStart();

  6. if (mVideoView != null) {

  7. if (pausedInOnStop) {

  8. mVideoView.start();

  9. pausedInOnStop = false;

  10. }

  11. }

  12. }

  13.  
  14. @Override

  15. protected void onStop() {

  16. super.onStop();

  17. if (mVideoView != null) {

  18. if (mVideoView.isPlaying()) {

  19. pausedInOnStop = true;

  20. mVideoView.pause();

  21. }

  22. }

  23. }

  24.  
  25. @Override

  26. protected void onDestroy() {

  27. super.onDestroy();

  28. if (mVideoView != null) {

  29. mVideoView.release();

  30. }

  31. }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值