最近做了下視頻播放功能,基於餃子播放器對其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();