此项目中视频列表数据使用了开眼API,纯属Demo演示,无任何商业用途,禁止任何人将示例项目中的第三方API应用于商业用途,如果使用了,连带的法律责任与本作者无关!
一个封装基础视频播放器功能交互的SDK。
- 支持常规网络地址、本地Assets和Raw资源文件播放
- 支持手势识别改变屏幕亮度、音量、快进、快退
- 支持倍速、缩放模式、静音、镜像等调节设置
- 支持多播放器同时播放
- 支持自定义视频解码器
- 支持完全自定义UI控制器、手势识别控制器交互等
- SDK自带默认解码器+UI控制器交互
- 支持直播拉流
- 支持任意界面开启无权限Activity级别可拖拽小窗口播放
- 支持任意界面开启可拖拽全局悬浮窗窗口播放
- 支持任意界面直接启动全屏播放
- 支持连续播放视频列表
- 默认UI控制器支持片段试看交互
- Demo列表或组件之间无缝转场播放示例
- Demo悬浮窗窗口播放带参无缝跳转Activity示例
- Demo支持MediaPlayer、IjkPlayer、ExoPlayer三种解码器切换示例
- Demo仿抖音播放示例,支持视频缓存、秒播
- Demo弹幕交互示例
- Demo Android8.0+画中画示例
集成前请下载体验Demo,复杂场景集成请参考Demo
- 1.项目根build.gradle及模块build.gradle配置
//1.在你的根build.gradle中添加:
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
//2.在你的模块build.gradle中添加:
dependencies {
implementation 'androidx.appcompat:appcompat:1.2.0' // 或 implementation 'com.android.support:appcompat-v7:+'
//播放器SDK
implementation 'com.github.hty527:iPlayer:1.0.4.3'
}
- 2.在需要播放视频的xml中添加如下代码,或在适合的位置new VideoPlayer()
<com.android.iplayer.media.VideoPlayer
android:id="@+id/video_player"
android:layout_width="match_parent"
android:layout_height="200dp"
app:initController="true"/>
- 3.播放器准备工作
mVideoPlayer = (VideoPlayer) findViewById(R.id.video_player);//或者直接 new 一个VideoPlayer(context);对象
mVideoPlayer.getLayoutParams().height= getResources().getDisplayMetrics().widthPixels * 9 /16;//固定播放器高度
//监听播放器状态(如果需要自定义解码器必须设置此监听,在createMediaPlayer中初始化自己的解码器)
mVideoPlayer.setOnPlayerActionListener(new OnPlayerEventListener() {
@Override
public AbstractMediaPlayer createMediaPlayer() {
return null;//返回null时,SDK内部会自动使用系统MediaPlayer解码器,自定义解码器请参考Demo中的JkMediaPlayer或ExoMediaPlayer类
}
@Override
public void onPlayerState(PlayerState state, String message) {
//播放器内部工作状态
}
//更多回调请查阅OnPlayerEventListener
});
- 4.在需要播放的地方
mVideoPlayer.setTitle("测试地址播放");//视频标题(默认控制器横屏状态下可见)
mVideoPlayer.setDataSource("https://upload.dongfeng-nissan.com.cn/nissan/video/202204/4cfde6f0-bf80-11ec-95c3-214c38efbbc8.mp4");//设置播放源
mVideoPlayer.prepareAsync();//异步开始准备播放
- 5.生命周期处理
@Override
protected void onResume() {
super.onResume();
mVideoPlayer.onResume();
}
@Override
protected void onPause() {
super.onPause();
mVideoPlayer.onPause();
}
@Override
public void onBackPressed() {
if(mVideoPlayer.isBackPressed()){
super.onBackPressed();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
mVideoPlayer.onDestroy();
}
- 6.清单文件配置:如果播放器需要横屏播放,需要在Activity清单文件配置如下属性:
//在需要全屏播放的Activity清单文件中添加属性:android:configChanges="orientation|screenSize",防止横屏时Activity重绘
<activity
android:name="xxx.xxx.PlayerActivity"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize">
- 7.更多基础设置
mVideoPlayer.setZoomModel(IMediaPlayer.MODE_ZOOM_TO_FIT);//居中显示,定宽等高 (更多缩放模式请参考IMediaPlayer设置)
mVideoPlayer.setLoop(false);//是否循环播放
mVideoPlayer.setProgressCallBackSpaceMilliss(300);//设置进度条回调间隔时间(毫秒)
//..更多设置或功能API请参阅IVideoPlayerControl
//在声明播放器添加了属性app:initController="true 或mVideoPlayer.initController(); 或mVideoPlayer.setController(controller);之后
BaseController controller = mVideoPlayer.getController();
if(null!=controller){
controller.showBackBtn(false);//竖屏状态下是否显示返回按钮
controller.showMenus(false,true,true);//竖屏状态是否显示控制器右上角的功能菜单按钮,默认是显示的(横屏不显示所有菜单按钮)
controller.setCanTouchInPortrait(true);//竖屏状态下启用手势交互
//controller.setPreViewTotalDuration("3600");//注意:设置虚拟总时长(一旦设置播放器内部走片段试看流程),试看结束回调至OnControllerEventListener的onCompletion()方法
//监听控制器交互事件(设置开启了返回showBackBtn\菜单栏showMenus等功能后可设置监听,回调方法请参阅:OnControllerEventListener)
controller.setOnControllerListener(new BaseController.OnControllerEventListener(){
@Override
public void onMenu() {
//菜单点击
}
@Override
public void onGobalWindow() {
//可参考WindowGlobalPlayerActivity
boolean globalWindow = mVideoPlayer.startGlobalWindow(ScreenUtils.getInstance().dpToPxInt(3), Color.parseColor("#99000000"));//支持多参,这里给悬浮窗设置一个圆角和背景颜色
if(globalWindow){
finish();
}
}
});
}
- 8.其它播放器全局设置
//设置播放器是否拦截音频焦点丢失事件,如果设置了检测到音频焦点丢失会自动暂停播放
IVideoManager.getInstance().setInterceptTAudioFocus(true);
//设置移动网络下是否允许播放
IVideoManager.getInstance().setMobileNetwork(true);
- 1.请根据需要在您的AndroidManifest中声明权限
<!--播放网络视频需要声明此权限-->
<uses-permission android:name="android.permission.INTERNET" />
<!--如您的播放器需要支持移动网路提示用户的交互,需要申明此权限,SDK用来检测网络状态-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--如您的播放器需要支持全局悬浮窗窗口播放请申明此权限-->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<!--播放网络视频需要在application节点声明此属性-->
<application
android:usesCleartextTraffic="true">
</application>
- 1.无权限悬浮窗播放(Activity级别)
//开启小窗播放,此方法支持多参传入,请根据多参参数选择您的实际需求
mVideoPlayer.startWindow(ScreenUtils.getInstance().dpToPxInt(3f), Color.parseColor("#99000000"));//参数1:给窗口一个圆角,参数2:给窗口一个背景颜色
- 2.全局悬浮窗窗口播放
//1.开启全局悬浮窗窗口播放,请根据多参参数选择您的实际需求,SDK内部会检测悬浮窗窗口权限
boolean globalWindow = mVideoPlayer.startGlobalWindow(ScreenUtils.getInstance().dpToPxInt(3), Color.parseColor("#99000000"));//参数1:给窗口一个圆角,参数2:给窗口一个背景颜色
- 3.处理全局悬浮窗播放器的点击\跳转\参数传递
//1.在你的Application中设置全局悬浮窗窗口点击监听
IWindowManager.getInstance().setOnWindowActionListener(new OnWindowActionListener() {
@Override
public void onMovie(float x, float y) {
}
@Override
public void onClick(BasePlayer basePlayer, Object coustomParams) {
//点击了悬浮窗口播放器,coustomParams为自定义参数
}
@Override
public void onClose() {
//点击了悬浮窗口播放器的关闭按钮
IWindowManager.getInstance().quitGlobaWindow();//关闭悬浮窗播放器窗口
}
});
//2.在开启悬浮窗播放后用户点击悬浮窗之前,设置自定义参数
IWindowManager.getInstance().setCoustomParams(coustomParams);
//3.如何完美实现悬浮窗到Activity转场播放无感无缝衔接?
参考VideoDetailsActivity中的initPlayer方法中的代码示例
- 4.list列表播放转场无缝衔接播放
参考ListPlayerChangeFragment中的onItemClick、onActivityResult方法和VideoDetailsActivity中的initPlayer、onBackPressed、close、onDestroy方法示例代码
- 5.类似抖音功能,支持缓存秒播
参考PagerPlayerFragment中的示例代码,缓存参考PagerPlayerAdapter中的initItemView方法





