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

写在前面的话

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

相关链接

exoplayer

  • exoplayer https://github.com/google/ExoPlayer
  • exoplayer 官方开发指导 https://google.github.io/ExoPlayer/guide.html
  • exoplayer 文档 http://google.github.io/ExoPlayer/doc/reference/

exomedia

  • exomedia https://github.com/brianwernick/ExoMedia
  • exomedia 文档 https://devbrackets.com/dev/libs/docs/exomedia/4.0.0/index.html

基本使用

添加依赖

 
  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. <!--exomedia-->

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

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

  11. android:layout_width="match_parent"

  12. android:layout_height="match_parent"

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

  14. app:useDefaultControls="true"/>

  15. </RelativeLayout>

Java

Application级

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

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

 
  1. public class XunshiVideoDemoApplication extends Application {

  2. @Override

  3. public void onCreate() {

  4. super.onCreate();

  5. //兼容性配置

  6. configureExoMedia();

  7. }

  8. /**

  9. * 机型适配

  10. */

  11. private void configureExoMedia() {

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

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

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

  15. @NonNull

  16. @Override

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

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

  19. }

  20. });

  21. }

  22. }

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

Activity级

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

  2. @Override

  3. protected void onCreate(Bundle savedInstanceState) {

  4. super.onCreate(savedInstanceState);

  5. //声明VideoView

  6. VideoView mVideoView;

  7. //反射

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

  9. //设置播放路径

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

  11. //开始播放

  12. mVideoView.start();

  13. }

  14. }

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

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

  3. protected void onStart() {

  4. super.onStart();

  5. if (mVideoView != null) {

  6. if (pausedInOnStop) {

  7. mVideoView.start();

  8. pausedInOnStop = false;

  9. }

  10. }

  11. }

  12. @Override

  13. protected void onStop() {

  14. super.onStop();

  15. if (mVideoView != null) {

  16. if (mVideoView.isPlaying()) {

  17. pausedInOnStop = true;

  18. mVideoView.pause();

  19. }

  20. }

  21. }

  22. @Override

  23. protected void onDestroy() {

  24. super.onDestroy();

  25. if (mVideoView != null) {

  26. mVideoView.release();

  27. }

  28. }

Exoplayer+Exomedia打造自定义视频播放器相关推荐

  1. Exoplayer+Exomedia打造自定义视频播放器(一)

    写在前面的话 对App视频播放模块进行扩展,需要自定义播放器的样式.监听视频播放过程中各种事件(播放开始.暂停.重新播放.结束.拖拽进度条.横竖屏切换等).横竖屏切换.手动控制播放进度等. 自定义功能 ...

  2. Exoplayer+Exomedia打造自定义播放器(二)

    Exomedia源码分析 VideoControls 播放器基类 继承自RelativeLayout,播放器基类.作用是提供一些默认的播放器基本组件:提供反射控制器布局.显示加载进度.播放器隐藏显示动 ...

  3. HTML5+CSS3+JQuery打造自定义视频播放器

    简介 HTML5的<video>标签已经被目前大多数主流浏览器所支持,包括还未正式发布的IE9也声明将支持<video>标签,利用浏览器原生特性嵌入视频有很多好处,所以很多开发 ...

  4. 使用CSS3+JQuery打造自定义视频播放器

    简介HTML5的<video>标签已经被目前大多数主流浏览器所支持,包括还未正式发布的IE9也声明将支持<video>标签,利用浏览器原生特性嵌入视频有很多好处,所以很多开发者 ...

  5. Android 自定义视频播放器

    由于录像之后,原先选用的腾讯VOD点播播放器显示出来竖屏都变横屏了,虽然选中了现在的腾讯VOD点播,还是把Android视频播放器了解了一番. Android自定义视频播放器有以下三种: 一.Medi ...

  6. Android进阶:自定义视频播放器开发(下)

    上一篇文章我们主要讲了视频播放器开发之前需要准备的一个知识,TextureView,用于对图像流的处理.这篇文章开始构建一个基础的视频播放器. 一.准备工作 在之前的文章已经说过了,播放器也是一个vi ...

  7. Android开发笔记(一百二十五)自定义视频播放器

    视频播放方式 在Android中播放视频的方式有两种: 1.使用MediaPlayer结合SurfaceView进行播放.其中通过SurfaceView显示视频的画面,通过MediaPlayer来设置 ...

  8. 一步步自定义视频播放器——TextureView+MediaPlayer自定义视频播放器

    本篇参考封装一个视频播放器,原文已经写的非常棒了,本篇加入了个人对其内容的理解.秉承不重复造轮子的良好理念,接下来开始拆解轮子.内容非常多,我都差点放弃写,有耐心的请往下看 github上非常棒的视频 ...

  9. Android自定义视频播放器(三)

    参看:Android自定义视频播放器(一):https://blog.csdn.net/zxd1435513775/article/details/81507909 参看:Android自定义视频播放 ...

最新文章

  1. 【建站系列教程】2.2、fiddler手机抓包教程
  2. 关于Yii2中CSS,JS文件的引入心得
  3. oracledb_npm包的使用
  4. 在Unity实现游戏命令模式
  5. asp.net web常用控件FileUpload(文件上传控件)
  6. 如何单元测试Java的private方法
  7. [转载] 详解Java中静态方法
  8. model.train() model.eval()
  9. wget下载网络图片
  10. GHOST自动恢复说明
  11. 【SegMap: 3D Segment Mapping using Data-Driven Descriptors】
  12. python二元一次方程组用鸡兔同笼的思路来写编程_二元一次方程组的应用一鸡兔同笼问题...
  13. 淘特,阿里在下沉市场的一把好刀
  14. 如何在html页面集成markdown编辑器
  15. dns服务器修改失败,dns错误重新设置方法
  16. ip地址、子网掩码及ip地址的相关计算
  17. 数字信号与模拟信号的区别
  18. 2021年北京高新技术企业认定补贴及政策要求
  19. opencv3学习:reshape函数
  20. function介绍

热门文章

  1. 从离散到分布,盘点常见的文本表示方法
  2. Latex插入图片或pdf
  3. PADS灌注(flood)和填充(hatch)(总结)
  4. 什么软件可以将win窗口进行置顶_有了它们,我把所有截图、录 GIF、录屏软件都卸了...
  5. 鲍曼技术大学的计算机专业好不好,除了莫斯科鲍曼技术大学理工强 俄罗斯还有加里宁工程学院...
  6. C语言快速排序算法及三种优化方式
  7. 4. 面对对象进阶笔记
  8. Python 逻辑运算符优先级(not,and,or)
  9. 折半查找判定树的高度-思路分享
  10. 【算法】Candy 分发糖果