NiceVieoPlayer

项目地址:xiaoyanger0825/NiceVieoPlayer 

简介:MediaPlayer+TextureView,完美切换全屏、小窗口的 Android 视频播放器

  

Features

  • 用 IjkPlayer/MediaPlayer + TextureView 封装,可切换 IjkPlayer、MediaPlayer.
  • 支持本地和网络视频播放.
  • 完美切换小窗口、全屏,可在 RecyclerView 中无缝全屏.
  • 手势滑动调节播放进度、亮度、声音.
  • 支持清晰度切换.
  • 可自定义控制界面.

Usage

下载 niceviewoplayer 库,在 AndroidStudio 中作为 Mudule 添加依赖。

或者在 Gradle 中添加依赖:

allprojects {repositories {...maven { url 'https://jitpack.io' }}
}dependencies {compile 'com.github.xiaoyanger0825:NiceVieoPlayer:v2.2'
}

在对应视频界面所在的 Activity 的 Manifest.xml 中需要添加如下配置:

android:configChanges="orientation|keyboardHidden|screenSize"

1.在 Activity 中使用

在 Activity 中使用时,该 Activity 需要继承自AppCompatActivity,在 onStop 中需要释放播放器,并且要在 onBackPress 中处理按下返回键的逻辑:

private void init() {mNiceVideoPlayer = (NiceVideoPlayer) findViewById(R.id.nice_video_player);mNiceVideoPlayer.setPlayerType(NiceVideoPlayer.TYPE_IJK); // or NiceVideoPlayer.TYPE_NATIVEmNiceVideoPlayer.setUp(mVideoUrl, null);TxVideoPlayerController controller = new TxVideoPlayerController(this);controller.setTitle(mTitle);controller.setImage(mImageUrl);mNiceVideoPlayer.setController(controller);
}@Override
protected void onStop() {super.onStop();// 在 onStop 时释放掉播放器NiceVideoPlayerManager.instance().releaseNiceVideoPlayer();
}
@Override
public void onBackPressed() {// 在全屏或者小窗口时按返回键要先退出全屏或小窗口,// 所以在 Activity 中 onBackPress 要交给 NiceVideoPlayer 先处理。if (NiceVideoPlayerManager.instance().onBackPressd()) return;super.onBackPressed();
}

详细可参考 demo 中的TinyWindowPlayActivityChangeClarityActivityRecyclerViewActivity.

2.在 Fragment 中使用

在 Fragment 中使用时,该 Fragment 外层的 Activity 需要继承自AppCompatActivity,并且也要处理返回键按下逻辑:

public class XXXActivity extends AppCompatActivity {...@Overridepublic void onBackPressed() {// 在全屏或者小窗口时按返回键要先退出全屏或小窗口,// 所以在 Activity 中 onBackPress 要交给 NiceVideoPlayer 先处理。if (NiceVideoPlayerManager.instance().onBackPressd()) return;super.onBackPressed();}...
}

同时在 Fragment 中的 onStop 方法中释放播放器:

public class XXXFragenment extends Fragment {...@Overridepublic void onStop() {super.onStop();NiceVideoPlayerManager.instance().releaseNiceVideoPlayer();}...
}

详细可参考 demo 中的UseInFragActivityDemoFragment.

3.切换清晰度

如果需要切换清晰度,需要在controller中配置清晰度相关的等级和视频链接地址:

private void init() {mNiceVideoPlayer = (NiceVideoPlayer) findViewById(R.id.nice_video_player);mNiceVideoPlayer.setPlayerType(NiceVideoPlayer.TYPE_IJK); // IjkPlayer or MediaPlayerTxVideoPlayerController controller = new TxVideoPlayerController(this);controller.setTitle(mTitle);controller.setClarity(getClarites(), 0);    // 设置清晰度以及默认播放的清晰度Glide.with(this).load(mImageUrl).placeholder(R.drawable.img_default).crossFade().into(controller.imageView());mNiceVideoPlayer.setController(controller);
}public List<Clarity> getClarites() {List<Clarity> clarities = new ArrayList<>();clarities.add(new Clarity("标清", "270P", "http://play.g3proxy.lecloud.com/vod/v2/MjUxLzE2LzgvbGV0di11dHMvMTQvdmVyXzAwXzIyLTExMDc2NDEzODctYXZjLTE5OTgxOS1hYWMtNDgwMDAtNTI2MTEwLTE3MDg3NjEzLWY1OGY2YzM1NjkwZTA2ZGFmYjg2MTVlYzc5MjEyZjU4LTE0OTg1NTc2ODY4MjMubXA0?b=259&mmsid=65565355&tm=1499247143&key=f0eadb4f30c404d49ff8ebad673d3742&platid=3&splatid=345&playid=0&tss=no&vtype=21&cvid=2026135183914&payff=0&pip=08cc52f8b09acd3eff8bf31688ddeced&format=0&sign=mb&dname=mobile&expect=1&tag=mobile&xformat=super"));clarities.add(new Clarity("高清", "480P", "http://play.g3proxy.lecloud.com/vod/v2/MjQ5LzM3LzIwL2xldHYtdXRzLzE0L3Zlcl8wMF8yMi0xMTA3NjQxMzkwLWF2Yy00MTk4MTAtYWFjLTQ4MDAwLTUyNjExMC0zMTU1NTY1Mi00ZmJjYzFkNzA1NWMyNDc4MDc5OTYxODg1N2RjNzEwMi0xNDk4NTU3OTYxNzQ4Lm1wNA==?b=479&mmsid=65565355&tm=1499247143&key=98c7e781f1145aba07cb0d6ec06f6c12&platid=3&splatid=345&playid=0&tss=no&vtype=13&cvid=2026135183914&payff=0&pip=08cc52f8b09acd3eff8bf31688ddeced&format=0&sign=mb&dname=mobile&expect=1&tag=mobile&xformat=super"));clarities.add(new Clarity("超清", "720P", "http://play.g3proxy.lecloud.com/vod/v2/MjQ5LzM3LzIwL2xldHYtdXRzLzE0L3Zlcl8wMF8yMi0xMTA3NjQxMzkwLWF2Yy00MTk4MTAtYWFjLTQ4MDAwLTUyNjExMC0zMTU1NTY1Mi00ZmJjYzFkNzA1NWMyNDc4MDc5OTYxODg1N2RjNzEwMi0xNDk4NTU3OTYxNzQ4Lm1wNA==?b=479&mmsid=65565355&tm=1499247143&key=98c7e781f1145aba07cb0d6ec06f6c12&platid=3&splatid=345&playid=0&tss=no&vtype=13&cvid=2026135183914&payff=0&pip=08cc52f8b09acd3eff8bf31688ddeced&format=0&sign=mb&dname=mobile&expect=1&tag=mobile&xformat=super"));clarities.add(new Clarity("蓝光", "1080P", "http://play.g3proxy.lecloud.com/vod/v2/MjQ5LzM3LzIwL2xldHYtdXRzLzE0L3Zlcl8wMF8yMi0xMTA3NjQxMzkwLWF2Yy00MTk4MTAtYWFjLTQ4MDAwLTUyNjExMC0zMTU1NTY1Mi00ZmJjYzFkNzA1NWMyNDc4MDc5OTYxODg1N2RjNzEwMi0xNDk4NTU3OTYxNzQ4Lm1wNA==?b=479&mmsid=65565355&tm=1499247143&key=98c7e781f1145aba07cb0d6ec06f6c12&platid=3&splatid=345&playid=0&tss=no&vtype=13&cvid=2026135183914&payff=0&pip=08cc52f8b09acd3eff8bf31688ddeced&format=0&sign=mb&dname=mobile&expect=1&tag=mobile&xformat=super"));return clarities;
}

详细参考 demo 中的ChangeClarityActivity

4.在 RecyclerView 列表中使用

在 ReclerView 列表中使用时需要监听 itemView 回收,以此释放掉对应的播放器

mRecyclerView.setRecyclerListener(new RecyclerView.RecyclerListener() {@Overridepublic void onViewRecycled(RecyclerView.ViewHolder holder) {NiceVideoPlayer niceVideoPlayer = ((VideoViewHolder) holder).mVideoPlayer;if (niceVideoPlayer == NiceVideoPlayerManager.instance().getCurrentNiceVideoPlayer()) {NiceVideoPlayerManager.instance().releaseNiceVideoPlayer();}}
});

详细参考 demo 中的RecyclerViewActivity.

5.播放时 Home 键按下以及回到播放界面的处理

按照上面的做法,在 onStop 直接释放掉播放器,那么在播放时按下 Home 键播放器也会被释放掉,如果在此回到播放界面,播放器回到最初始的状态。如果需要在播放的时候按下 Home 键只是暂停播放器,重新回到播放界面时又继续播放,那么可以参考 demo 中的CompatHomeKeyActiivty,或者对应的 Activity 集成自CompatHomeKeyActiivty,详细参考 demo 中的ProcessHome1Activity。当然,如果是在 Fragment 中,参考CompatKeyFragment,或者继承自CompatKeyFragment(外层的 Activity 还是继承自 AppCompat,并处理 onBackPress),详细参考 demo 中的ProcessHome2Activity.

5.自定义控制界面

public class CustomController extends NiceVideoPlayerController {// 实现自己的控制界面...
}

Proguard

-keep class tv.danmaku.ijk.media.player.**{*;}

Demo

   

MediaPlayer+TextureView,完美切换全屏、小窗口的 Android 视频播放器相关推荐

  1. textureview 缩放_用MediaPlayer+TextureView封装一个完美实现全屏、小窗口的视频播放器...

    原标题:用MediaPlayer+TextureView封装一个完美实现全屏.小窗口的视频播放器 本文作者 本文由xiaoyanger授权发布. xiaoyanger的博客地址: http://www ...

  2. android 播放器封装,Android视频播放最全总结:MediaPlayer+TextureView封装一个完美实现全屏、小窗视频播放器,附项目源码...

    原标题:Android视频播放最全总结:MediaPlayer+TextureView封装一个完美实现全屏.小窗视频播放器,附项目源码 作者:xiaoyanger 来源:http://www.jian ...

  3. Unity打包exe设置全屏和窗口模式切换

    using UnityEngine; /// <summary> /// 切换全屏和窗口模式 /// </summary> public class Fullscreen : ...

  4. Android视频播放器实现小窗口和全屏状态切换

    Android视频播放器实现小窗口和全屏状态切换 实在是不好意思,楼下评论的兄弟久等了,这文章一直没写第一是没时间,第二是自己准备也不充足,最近才看了好几个Android视频播放器的开源项目,才对视频 ...

  5. 【温故而知新-Javascript】窗口效果 (全屏显示窗口、定时关闭窗口)

    1.全屏显示窗口 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...

  6. 原生js实现点击按钮切换全屏!

    使用fullScreen API实现全屏 <head><meta charset="UTF-8"><meta name="viewport& ...

  7. html5弹窗全屏,jQuery炫酷全屏模态窗口插件

    这是一款jQuery炫酷全屏模态窗口插件.该插件通过和animate.css结合使用,可以制作多种打开全屏模态窗口的炫酷过渡动画效果. 使用方法 在页面中引入animate.min.css.jquer ...

  8. jquery3和layui冲突导,致使用layui.layer.full弹出全屏iframe窗口时高度152px问题

    项目中使用的jquery版本是jquery-3.2.1,在使用layui弹出全屏iframe窗口时,iframe窗口顶部总是出现一个152px高的滚动窗口无法实现真正全屏,代码如下: <!DOC ...

  9. QT for android 比较完美解决 全屏问题

    QT for android 比较完美解决 全屏问题 参考文章: (1)QT for android 比较完美解决 全屏问题 (2)https://www.cnblogs.com/wuyaSama/p ...

最新文章

  1. The LMAX disruptor Architecture--转载
  2. Open Source: 开源软件许可的选择
  3. 【白话机器学习】算法理论+实战之Xgboost算法
  4. PostgreSQL函数如何返回数据集
  5. iOS9 白名单问题 -canOpenURL: failed for URL: xx - error:This app is not allowed to query for scheme x...
  6. 2020中国十大最丑建筑出炉,你觉得哪个更丑?
  7. 具有JDK 12精简数字格式的自定义精简数字模式
  8. Node.js「二」—— fs 模块 / async 与 await
  9. python代码段有什么用_25个超有用的Python代码段
  10. c语言 结构体 选择题,C语言结构体共用体选择题(新).doc
  11. 6 岁就成“大厂团宠”,这门编程语言竟引 Linux、谷歌、亚马逊共“折腰” !
  12. 三相四线怎样查漏电_漏电保护器的选用
  13. 制作Windows 10系统盘 全过程『手机版』
  14. 电话线配线架是110配线架吗?电话线配线架的接法详细介绍
  15. 实时消息传输协议 RTMP Real Time Messaging Protocol
  16. 2017-2018-2 20179215《密码与安全新技术》第1周作业
  17. 百度编辑器抓取微信图片并替换内容
  18. 混频锁相环相关拓扑,性能以及错锁问题梳理
  19. 网络安全全面防应对难察觉网络威胁!
  20. 如何更改计算机睿频,笔记本电脑如何关闭睿频功能来降低CPU温度

热门文章

  1. (*^__^*) 感恩相伴,祝福相随 (*^__^*)
  2. win10自带录屏怎么用?两种方法快来get
  3. 吴恩达机器学习笔记(五)正则化Regularization
  4. 牛客网-腾讯编程校招真题 编码 Java
  5. SQL Server 沿用上一日的数据
  6. linux中权限sudo,Linux中sudo权限(下)
  7. Cocostudio导入.fla文件注意事项
  8. “COMSOL 多场耦合仿真技术与应用”光电专题培训
  9. 牛鞭效应matlab代码,牛鞭效应在啤酒游戏中的运用.doc
  10. 印象笔记Evernote 教程