最近做了下视频播放功能,基于饺子播放器对其UI进行了修改,期间也遇到一些bug,记录一下。
引入
我使用的是6.4.2版本,7.0版本之后的源码有一些变化,不过大同小异;将github上源码下载下来,以import module的方式将源码中的jiaozivideoplayer引入。
切换播放源
我使用的是ijkplay,首先添加需要的依赖和一些.so文件
//ijk播放内核
implementation 'tv.danmaku.ijk.media:ijkplayer-java:0.8.4'
implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.4'
添加如下.so文件:
jniLibs下载链接:https://download.csdn.net/download/qq_38356174/11826526
继续再build.gradle中添加如下代码:
android {
defaultConfig {
...
ndk {
abiFilters "armeabi-v7a", "x86"
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
packagingOptions {//加上这些代码
pickFirst 'lib/armeabi-v7a/libc++_shared.so'
pickFirst 'lib/armeabi-v8a/libc++_shared.so'
pickFirst 'lib/arm64-v8a/libc++_shared.so'
pickFirst 'lib/x86/libc++_shared.so'
pickFirst 'lib/x86_64/libc++_shared.so'
//exclude "lib/armeabi-v7a/librealmreact.so"
}
}
将github下载的源码中的cn.jzvd.demo包下的CustomMediaPlayer下的JZMediaIjkplayer类复制到自己的项目中
到这里集成就结束了。
自定义UI
饺子的文档也有说明,自定义UI需要集成JzvdStd,重写getLayout,传入自己的布局文件,重写onClick事件以及其他生命周期事件即可。
我们先把module中(也就是jiaozivideoplayer包下)的jz_layout_std.xml复制一份到自己的项目layout目录下,并且重命名,我这里就叫custom_jzvd.xml;修改布局文件,添加自己需要的控件即可。
新建CustomJzvd类,继承JzvdStd类,重写getLayout方法,将custom_jzvd.xml传入;
具体方法如下:
- 在init方法中findviewById获取自己添加的控件;
- 在onClick中添加单击事件;
- 通过currentScreen获取当前屏幕类型;
- 通过changeUrl方法切换播放链接(上下集、清晰度);
- JZMediaManager可以快进回退,播放暂停等;
- onAutoCompletion中切换播放链接实现自动播放下一集;
- startWindowFullscreen进入全屏时调用(此处有坑,我使用的6.4.2版本在进入全屏后控件id发生变化,有些事件拿不到,需要在父类中通过startWindowFullscreen方法中的jzvd重新findviewbyid去设置一些事件);
- playOnThisJzvd回到普通状态时触发;
- changeUiToXXX系列方法可以改变不同状态时的UI(如操作栏隐藏显示等);
- 不断补充中。。。
public class CustomJzvd extends JzvdStd {
Context mContext;
public CustomJzvd(Context context) {
super(context);
mContext = context;
}
public CustomJzvd(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
}
@Override
public int getLayoutId() {
//传入自定义布局
return R.layout.custom_jzvd;
}
@Override
public void init(Context context) {
super.init(context);
//拿到自己添加的控件 设置listener
}
@Override
public void onClick(View v) {
super.onClick(v);
//设置控件单击事件
}
@Override
public void setUp(JZDataSource jzDataSource, int screen) {
super.setUp(jzDataSource, screen);
//这两行设置播放时屏幕状态
Jzvd.FULLSCREEN_ORIENTATION = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
Jzvd.NORMAL_ORIENTATION = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
}
@Override
public void onAutoCompletion() {
super.onAutoCompletion();
//播放下一集 在这里切换url
}
@Override
public void startWindowFullscreenFocus(Jzvd jzvd) {
super.startWindowFullscreenFocus(jzvd);
//进入全屏时调用
}
@Override
public void playOnThisJzvd() {
super.playOnThisJzvd();
//退出全屏
//Toast.makeText(mContext, "退出全屏", Toast.LENGTH_SHORT).show();
}
}
使用
在xml布局中添加自定义的CustomJzvd
<com.xxx.jzplayer.CustomJzvd
android:id="@+id/customJzvd"
android:layout_width="match_parent"
android:layout_height="250dp"/>
在activity中设置播放源
LinkedHashMap<String,String> map = new LinkedHashMap<>();
map.put("程序员的自我修养 第1集","http://xxxx/test1.mp4");
map.put("程序员的自我修养 第2集","http://xxxx/test2.mp4");
map.put("程序员的自我修养 第3集","http://xxxx/test3.mp4");
map.put("程序员的自我修养 第4集","http://xxxx/test4.mp4");
map.put("程序员的自我修养 第5集","http://xxxx/test5.mp4");
JZDataSource dataSource = new JZDataSource(map,"程序员的自我修养");
dataSource.looping = true;
dataSource.currentUrlIndex = 0;
customJzvd.setUp(dataSource, JzvdStd.SCREEN_WINDOW_NORMAL);
customJzvd.startVideo();