基础封装视频播放器player,可以在ExoPlayer、MediaPlayer原生MediaPlayer可以自由切换内核;该播放器整体架构:播放器内核(自由切换) + 视频播放器 + 边播边缓存 + 高度定制播放器UI视图层。支持视频简单播放,列表播放,仿抖音滑动播放,自动切换播放,使用案例丰富,拓展性强。
|
4 years ago | |
---|---|---|
.idea | 4 years ago | |
Demo | 4 years ago | |
VideoCache | 4 years ago | |
VideoKernel | 4 years ago | |
VideoPlayer | 4 years ago | |
apk | 6 years ago | |
gradle | 6 years ago | |
image | 4 years ago | |
read | 4 years ago | |
.gitignore | 6 years ago | |
LICENSE | 6 years ago | |
README.md | 4 years ago | |
build.gradle | 6 years ago | |
gradle.properties | 4 years ago | |
gradlew | 7 years ago | |
gradlew.bat | 7 years ago | |
settings.gradle | 4 years ago |
播放器功能 | 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.1'
//视频缓存,如果不需要则可以不依赖
implementation 'cn.yc:VideoCache:3.0.0'
//视频内核层,必须有
implementation 'cn.yc:VideoKernel:3.0.1'
如果宽高比变形,则会有黑边
<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();
}
}
Copyright 2017 yangchong211(github.com/yangchong211)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.