MediaPlayer+TextureView,完美切换全屏、小窗口的 Android 视频播放器
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 中的TinyWindowPlayActivity
、ChangeClarityActivity
、RecyclerViewActivity
.
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 中的UseInFragActivity
和DemoFragment
.
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 视频播放器相关推荐
- textureview 缩放_用MediaPlayer+TextureView封装一个完美实现全屏、小窗口的视频播放器...
原标题:用MediaPlayer+TextureView封装一个完美实现全屏.小窗口的视频播放器 本文作者 本文由xiaoyanger授权发布. xiaoyanger的博客地址: http://www ...
- android 播放器封装,Android视频播放最全总结:MediaPlayer+TextureView封装一个完美实现全屏、小窗视频播放器,附项目源码...
原标题:Android视频播放最全总结:MediaPlayer+TextureView封装一个完美实现全屏.小窗视频播放器,附项目源码 作者:xiaoyanger 来源:http://www.jian ...
- Unity打包exe设置全屏和窗口模式切换
using UnityEngine; /// <summary> /// 切换全屏和窗口模式 /// </summary> public class Fullscreen : ...
- Android视频播放器实现小窗口和全屏状态切换
Android视频播放器实现小窗口和全屏状态切换 实在是不好意思,楼下评论的兄弟久等了,这文章一直没写第一是没时间,第二是自己准备也不充足,最近才看了好几个Android视频播放器的开源项目,才对视频 ...
- 【温故而知新-Javascript】窗口效果 (全屏显示窗口、定时关闭窗口)
1.全屏显示窗口 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...
- 原生js实现点击按钮切换全屏!
使用fullScreen API实现全屏 <head><meta charset="UTF-8"><meta name="viewport& ...
- html5弹窗全屏,jQuery炫酷全屏模态窗口插件
这是一款jQuery炫酷全屏模态窗口插件.该插件通过和animate.css结合使用,可以制作多种打开全屏模态窗口的炫酷过渡动画效果. 使用方法 在页面中引入animate.min.css.jquer ...
- jquery3和layui冲突导,致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
项目中使用的jquery版本是jquery-3.2.1,在使用layui弹出全屏iframe窗口时,iframe窗口顶部总是出现一个152px高的滚动窗口无法实现真正全屏,代码如下: <!DOC ...
- QT for android 比较完美解决 全屏问题
QT for android 比较完美解决 全屏问题 参考文章: (1)QT for android 比较完美解决 全屏问题 (2)https://www.cnblogs.com/wuyaSama/p ...
最新文章
- The LMAX disruptor Architecture--转载
- Open Source: 开源软件许可的选择
- 【白话机器学习】算法理论+实战之Xgboost算法
- PostgreSQL函数如何返回数据集
- iOS9 白名单问题 -canOpenURL: failed for URL: xx - error:This app is not allowed to query for scheme x...
- 2020中国十大最丑建筑出炉,你觉得哪个更丑?
- 具有JDK 12精简数字格式的自定义精简数字模式
- Node.js「二」—— fs 模块 / async 与 await
- python代码段有什么用_25个超有用的Python代码段
- c语言 结构体 选择题,C语言结构体共用体选择题(新).doc
- 6 岁就成“大厂团宠”,这门编程语言竟引 Linux、谷歌、亚马逊共“折腰” !
- 三相四线怎样查漏电_漏电保护器的选用
- 制作Windows 10系统盘 全过程『手机版』
- 电话线配线架是110配线架吗?电话线配线架的接法详细介绍
- 实时消息传输协议 RTMP Real Time Messaging Protocol
- 2017-2018-2 20179215《密码与安全新技术》第1周作业
- 百度编辑器抓取微信图片并替换内容
- 混频锁相环相关拓扑,性能以及错锁问题梳理
- 网络安全全面防应对难察觉网络威胁!
- 如何更改计算机睿频,笔记本电脑如何关闭睿频功能来降低CPU温度
热门文章
- (*^__^*) 感恩相伴,祝福相随 (*^__^*)
- win10自带录屏怎么用?两种方法快来get
- 吴恩达机器学习笔记(五)正则化Regularization
- 牛客网-腾讯编程校招真题 编码 Java
- SQL Server 沿用上一日的数据
- linux中权限sudo,Linux中sudo权限(下)
- Cocostudio导入.fla文件注意事项
- “COMSOL 多场耦合仿真技术与应用”光电专题培训
- 牛鞭效应matlab代码,牛鞭效应在啤酒游戏中的运用.doc
- 印象笔记Evernote 教程