播放器功能 | 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 |
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);
}
/**
* 播放状态
* -1 播放错误
* 0 播放未开始
* 1 播放准备中
* 2 播放准备就绪
* 3 正在播放
* 4 暂停播放
* 5 正在缓冲(播放器正在播放时,缓冲区数据不足,进行缓冲,缓冲区数据足够后恢复播放)
* 6 暂停缓冲(播放器正在播放时,缓冲区数据不足,进行缓冲,此时暂停播放器,继续缓冲,缓冲区数据足够后恢复暂停
* 7 播放完成
* 8 开始播放中止
* @param playState 播放状态,主要是指播放器的各种状态
*/
@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;
}
}
/**
* 播放模式
* 普通模式,小窗口模式,正常模式三种其中一种
* MODE_NORMAL 普通模式
* MODE_FULL_SCREEN 全屏模式
* MODE_TINY_WINDOW 小屏模式
* @param playerState 播放模式
*/
@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();
```
@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();
}
}
```
public static HttpProxyCacheServer getProxy(Context context) {
return sharedProxy == null ? (sharedProxy = newProxy(context)) : sharedProxy;
}
private static HttpProxyCacheServer newProxy(Context context) {
return new HttpProxyCacheServer.Builder(context)
.maxCacheSize(512 * 1024 * 1024) // 512MB for cache
//缓存路径,不设置默认在sd_card/Android/data/[app_package_name]/cache中
//.cacheDirectory()
.build();
}
```
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。