基础封装视频播放器player,可以在ExoPlayer、MediaPlayer原生MediaPlayer可以自由切换内核;该播放器整体架构:播放器内核(自由切换) + 视频播放器 + 边播边缓存 + 高度定制播放器UI视图层。支持视频简单播放,列表播放,仿抖音滑动播放,自动切换播放,使用案例丰富,拓展性强。
|
4 anni fa | |
---|---|---|
.idea | 4 anni fa | |
Demo | 4 anni fa | |
VideoCache | 4 anni fa | |
VideoKernel | 4 anni fa | |
VideoPlayer | 4 anni fa | |
apk | 6 anni fa | |
gradle | 6 anni fa | |
image | 4 anni fa | |
read | 4 anni fa | |
.gitignore | 6 anni fa | |
LICENSE | 6 anni fa | |
README.md | 4 anni fa | |
build.gradle | 6 anni fa | |
gradle.properties | 4 anni fa | |
gradlew | 7 anni fa | |
gradlew.bat | 7 anni fa | |
settings.gradle | 4 anni fa |
播放器功能 | MediaPlayer | ExoPlayer | IjkPlayer | RTC | TXPlayer |
---|---|---|---|---|---|
UI/Player/业务解耦 | 支持 | 支持 | 支持 | ||
切换视频播放模式 | 支持 | 支持 | 支持 | ||
视频无缝切换 | 支持 | 支持 | 支持 | ||
调节播放进度 | 支持 | 支持 | 支持 | ||
网络环境监听 | 支持 | 支持 | 支持 | ||
滑动改变亮度/声音 | 支持 | 支持 | 支持 | ||
设置视频播放比例 | 支持 | 支持 | 支持 | ||
自由切换视频内核 | 支持 | 支持 | 支持 | ||
记录播放位置 | 支持 | 支持 | 支持 | ||
清晰度模式切换 | 支持 | 支持 | 支持 | ||
重力感应自动进入 | 支持 | 支持 | 支持 | ||
锁定屏幕功能 | 支持 | 支持 | 支持 | ||
倍速播放 | 不支持 | 支持 | 支持 | ||
视频小窗口播放 | 支持 | 支持 | 支持 | ||
列表小窗口播放 | 支持 | 支持 | 支持 | ||
边播边缓存 | 支持 | 支持 | 支持 | ||
同时播放多个视频 | 支持 | 支持 | 支持 | ||
仿快手预加载 | 支持 | 支持 | 支持 | ||
基于内核无UI | 支持 | 支持 | 支持 | ||
添加弹幕 | 支持 | 支持 | 支持 | ||
全屏显示电量 | 支持 | 支持 | 支持 |
类型 | 功能说明 |
---|---|
项目结构 | VideoCache缓存lib,VideoKernel视频内核lib,VideoPlayer视频UIlib |
内核 | MediaPlayer、ExoPlayer、IjkPlayer,后期接入Rtc和TXPlayer |
协议/格式 | http/https、concat、rtsp、hls、rtmp、file、m3u8、mkv、webm、mp3、mp4等 |
画面 | 调整显示比例:默认、16:9、4:3、填充;播放时旋转画面角度(0,90,180,270);镜像旋转 |
布局 | 内核和UI分离,和市面GitHub上大多数播放器不一样,方便定制,通过addView添加 |
播放 | 正常播放,小窗播放,列表播放,仿抖音播放 |
自定义 | 可以自定义添加视频UI层,可以说UI和Player高度分离,支持自定义渲染层SurfaceView |
如下所示
//视频UI层,必须要有
implementation 'cn.yc:VideoPlayer:3.0.0'
//视频缓存,如果不需要则可以不依赖
implementation 'cn.yc:VideoCache:3.0.0'
//视频内核层,必须有
implementation 'cn.yc:VideoKernel:3.0.0'
如果宽高比变形,则会有黑边
<org.yczbj.ycvideoplayerlib.player.VideoPlayer
android:id="@+id/video_player"
android:layout_width="match_parent"
android:layout_height="240dp"/>
如下所示
//创建基础视频播放器,一般播放器的功能
BasisVideoController controller = new BasisVideoController(this);
//设置控制器
mVideoPlayer.setVideoController(controller);
//设置视频播放链接地址
mVideoPlayer.setUrl(url);
//开始播放
mVideoPlayer.start();
这两个变量控制全屏后和退出全屏的屏幕方向
<activity android:name=".VideoActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait"/>
代码如下所示,注意避免直接start(),因为有可能视频还没有初始化完成……
mVideoPlayer.postDelayed(new Runnable() {
@Override
public void run() {
mVideoPlayer.start();
}
},300);
首先创建一个自定义view,需要实现InterControlView接口,重写该接口中所有抽象方法,这里省略了很多代码,具体看demo。
public class AdControlView extends FrameLayout implements InterControlView, View.OnClickListener {
private ControlWrapper mControlWrapper;
public AdControlView(@NonNull Context context) {
super(context);
init(context);
}
private void init(Context context){
LayoutInflater.from(getContext()).inflate(R.layout.layout_ad_control_view, this, true);
}
@Override
public void onPlayStateChanged(int playState) {
switch (playState) {
case ConstantKeys.CurrentState.STATE_PLAYING:
mControlWrapper.startProgress();
mPlayButton.setSelected(true);
break;
case ConstantKeys.CurrentState.STATE_PAUSED:
mPlayButton.setSelected(false);
break;
}
}
@Override
public void onPlayerStateChanged(int playerState) {
switch (playerState) {
case ConstantKeys.PlayMode.MODE_NORMAL:
mBack.setVisibility(GONE);
mFullScreen.setSelected(false);
break;
case ConstantKeys.PlayMode.MODE_FULL_SCREEN:
mBack.setVisibility(VISIBLE);
mFullScreen.setSelected(true);
break;
}
//暂未实现全面屏适配逻辑,需要你自己补全
}
}
然后该怎么使用这个自定义view呢?很简单,在之前基础上,通过控制器对象add进来即可,代码如下所示
controller = new BasisVideoController(this);
AdControlView adControlView = new AdControlView(this);
adControlView.setListener(new AdControlView.AdControlListener() {
@Override
public void onAdClick() {
BaseToast.showRoundRectToast( "广告点击跳转");
}
@Override
public void onSkipAd() {
playVideo();
}
});
controller.addControlComponent(adControlView);
//设置控制器
mVideoPlayer.setController(controller);
mVideoPlayer.setUrl(proxyUrl);
mVideoPlayer.start();
如果是在Activity中的话,建议设置下面这段代码
@Override
protected void onResume() {
super.onResume();
if (mVideoPlayer != null) {
//从后台切换到前台,当视频暂停时或者缓冲暂停时,调用该方法重新开启视频播放
mVideoPlayer.resume();
}
}
@Override
protected void onPause() {
super.onPause();
if (mVideoPlayer != null) {
//从前台切到后台,当视频正在播放或者正在缓冲时,调用该方法暂停视频
mVideoPlayer.pause();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mVideoPlayer != null) {
//销毁页面,释放,内部的播放器被释放掉,同时如果在全屏、小窗口模式下都会退出
mVideoPlayer.release();
}
}
@Override
public void onBackPressed() {
//处理返回键逻辑;如果是全屏,则退出全屏;如果是小窗口,则退出小窗口
if (mVideoPlayer == null || !mVideoPlayer.onBackPressed()) {
super.onBackPressed();
}
}