Android餃子播放器自定義

最近做了下視頻播放功能,基於餃子播放器對其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傳入;
具體方法如下:

  1. 在init方法中findviewById獲取自己添加的控件;
  2. 在onClick中添加單擊事件;
  3. 通過currentScreen獲取當前屏幕類型;
  4. 通過changeUrl方法切換播放鏈接(上下集、清晰度);
  5. JZMediaManager可以快進回退,播放暫停等;
  6. onAutoCompletion中切換播放鏈接實現自動播放下一集;
  7. startWindowFullscreen進入全屏時調用(此處有坑,我使用的6.4.2版本在進入全屏後控件id發生變化,有些事件拿不到,需要在父類中通過startWindowFullscreen方法中的jzvd重新findviewbyid去設置一些事件);
  8. playOnThisJzvd回到普通狀態時觸發;
  9. changeUiToXXX系列方法可以改變不同狀態時的UI(如操作欄隱藏顯示等);
  10. 不斷補充中。。。
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();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章