GSYPlayer接入CicadaPlayer内核

455 阅读3分钟

CicadaPlayer与Aliplayer使用的都是同样的CicadaPlayer的播放内核,所以在GSYPlayer中不能同时存在,且接入与Aliplayer接入方式一类似。这里只针对普通的GSYPlayer播放内核的接入,具体与业务逻辑相关的实现不做赘述。

1.GSYPlayer播放内核实现图

image.png

2.CicadaPlayer接入实现

2.1、导入CicadaPlayer的库文件。

在主工程libs目录(如果没有,点击app右键New->Directory创建)下添加premierlibrary-corePlayer-debug.aar文件。

image.png

在主工程目录下找到build.gradle文件,在dependencies里添加依赖:

implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])

2.2、实现CicadaPlayer播放内核

2.2.1、CicadaMediaPlayer

创建CicadaMediaPlayer继承AbstractMediaPlayer并实现其中的方法。 这里借用一下ijkPlayer传递参数的方式,传递一下Cicada缓存相关的参数设置。

public class CicadaMediaPlayer extends AbstractMediaPlayer{
    ```
//设置缓存
public static final int OPT_CATEGORY_CACHE = 101;
public static  String OPT_CATEGORY_CACHE_MAXDURATION = "maxDuration";
public static  String OPT_CATEGORY_CACHE_ENABLE = "enable";
public static  String OPT_CATEGORY_CACHE_CACHEDIR = "cacheDir";
public static  String OPT_CATEGORY_CACHE_MAXSIZE = "maxSize";
public static  String OPT_CATEGORY_CACHE_SHAREDURATION = "shardDuration";

//缓存设置
protected CacheConfig mCacheConfig;
.
.
.

}

json转CacheConfig方法

//json 转缓存配置
public CacheConfig convertJsonToCacheConfig(String mapJsonStr)  {
    try {
        JSONObject jsonObject = new JSONObject(mapJsonStr);
        Iterator<String> keys = jsonObject.keys();
        CacheConfig config = new CacheConfig();
        while (keys.hasNext()) {
            String next = keys.next();
            String value = jsonObject.getString(next);
            if (next.equals(CicadaMediaPlayer.OPT_CATEGORY_CACHE_ENABLE)) {
                config.mEnable = Boolean.valueOf(value);
            }else if (next.equals(CicadaMediaPlayer.OPT_CATEGORY_CACHE_MAXDURATION)) {
                config.mMaxDurationS = Long.valueOf(value);
            }else if (next.equals(CicadaMediaPlayer.OPT_CATEGORY_CACHE_MAXSIZE)) {
                config.mMaxSizeMB = Integer.valueOf(value);
            }else if (next.equals(CicadaMediaPlayer.OPT_CATEGORY_CACHE_SHAREDURATION)) {
                config.mMaxShardDurationS = Long.valueOf(value);
            }else if (next.equals(CicadaMediaPlayer.OPT_CATEGORY_CACHE_CACHEDIR)) {
                config.mDir = value;
            }else {

            }
        }
        return config;
    }catch (Exception e) {

    }finally {

    }
    return null;
}

CicadaPlayer 初始化方法

protected void prepareAsyncInternal() {
        new Handler(Looper.myLooper()).post(
            new Runnable() {
                @Override
                public void run() {
                    boolean preferExtensionDecoders = true;
                    boolean useExtensionRenderers = true;//是否开启扩展
                    //创建播放器,dwonloadMode true 为下载模式(下载模式渲染回调)
                    mInternalPlayer = CicadaPlayerFactory.createCicadaPlayer(mAppContext,false);
//                    mInternalPlayer = AliPlayerFactory.createAliPlayer(mAppContext);
                    //Android播放器SDK提供了H.264、H.265的硬解码能力,同时提供了enableHardwareDecoder提供开关。默认开,并且在硬解初始化失败时,自动切换为软解,保证视频的正常播放。示例如下:
//                        //开启硬解。默认开启
//                        mInternalPlayer.enableHardwareDecoder(GSYVideoType.isMediaCodec());
                    //设置缓存信息
                    if (mCacheConfig != null) {
                        mInternalPlayer.setCacheConfig(mCacheConfig);
                    }
                    if (mSurface != null) {
                        mInternalPlayer.setSurface(mSurface);
                    }
                    //埋点日志上报功能默认开启,当traceId设置为DisableAnalytics时,则关闭埋点日志上报。当traceId设置为其他参数时,则开启埋点日志上报。
                    //建议传递traceId,便于跟踪日志。traceId为设备或用户的唯一标识符,通常为imei或idfa。
                    if (deviceId != null && deviceId.length() > 0) {
                        mInternalPlayer.setTraceId(deviceId);
                    }

                    // headers[0]="Host:xxx.com";//比如需要设置Host到header中。
                    // config.setCustomHeaders(headers);
                    if (mHeaders != null && mHeaders.size() > 0 && mInternalPlayer.getConfig() != null) {
                        String[] itemsArray = new String[mHeaders.size()];
                        int i = 0;
                        for (Map.Entry<String, String> entry : mHeaders.entrySet()) {
                            itemsArray[i] = entry.getKey() + ":" + entry.getValue();
                            i++;
                        }
                        mInternalPlayer.getConfig().setCustomHeaders(itemsArray);
                    }
                    //设置准备回调
                    mInternalPlayer.setOnPreparedListener(onPreparedListener);
                    //第一帧显示
                    mInternalPlayer.setOnRenderingStartListener(onRenderingStartListener);

                    //播放器出错监听
                    mInternalPlayer.setOnErrorListener(onErrorListener);
//                    //播放器加载回调
                    mInternalPlayer.setOnLoadingStatusListener(onLoadingStatusListener);
//                    mAliyunRenderView.setOnTrackReadyListenenr(new VideoPlayerOnTrackReadyListenner(this));
//                    //播放器状态
                    mInternalPlayer.setOnStateChangedListener(onStateChangedListener);
//                    //播放结束
                    mInternalPlayer.setOnCompletionListener(onCompletionListener);
//                    //播放信息监听
                    mInternalPlayer.setOnInfoListener(onInfoListener);
//                    //trackChange监听
//                    mAliyunRenderView.setOnTrackChangedListener(new VideoPlayerTrackChangedListener(this));
//                    //字幕显示和隐藏
//                    mAliyunRenderView.setOnSubtitleDisplayListener(new VideoPlayerSubtitleDeisplayListener(this));
//                    //seek结束事件
                    mInternalPlayer.setOnSeekCompleteListener(onSeekCompleteListener);
//                    //截图监听事件
//                    mAliyunRenderView.setOnSnapShotListener(new VideoPlayerOnSnapShotListener(this));
//                    //sei监听事件
//                    mAliyunRenderView.setOnSeiDataListener(new VideoPlayerOnSeiDataListener(this));
//                    mAliyunRenderView.setOnVerifyTimeExpireCallback(new VideoPlayerOnVerifyStsCallback(this));

                    //设置视频宽高变化监听
                    mInternalPlayer.setOnVideoSizeChangedListener(onVideoSizeChangedListener);


                    mInternalPlayer.setLoop(isLooping);


                    mInternalPlayer.setDataSource(mMediaSource);
                    mInternalPlayer.prepare();

//                    mInternalPlayer.setOnPreparedListener(new CicadaPlayer.OnPreparedListener() {
//                        @Override
//                        public void onPrepared() {
//                            if (mInternalPlayer == null) {
//                                return;
//                            }
//                        }
//                    });
//                    mInternalPlayer.setPlayWhenReady(false);
                }
            }
        );
    }

更多实现可以查看demo中的CicadaMediaPlayer.java的代码;

2.2.2、CicadaPlayerManager

创建CicadaPlayerManager继承BasePlayerManager,实现其中的方法。 通过使用optionModelList来传递CicadaPlayer缓存信息并设置。

public void initVideoPlayer(Context context, Message msg, List<VideoOptionModel> optionModelList, ICacheManager cacheManager){
    this.context = context.getApplicationContext();
    mediaPlayer = new CicadaMediaPlayer(context);
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    for (int i = 0; i < optionModelList.size(); i ++) {
        VideoOptionModel model = optionModelList.get(i);
        if (model.getCategory() == CicadaMediaPlayer.OPT_CATEGORY_CACHE) {
            String value = model.getValueString();
            if (value != null && !value.isEmpty()) {
                CacheConfig config =  mediaPlayer.convertJsonToCacheConfig(value);
                setCacheConfig(config);
            }
        }
    }

更多实现可以查看demo中的CicadaPlayerManager.java的代码;

3.3.3、demo中使用

使用Cicada内核并传递缓存相关信息:

PlayerFactory.setPlayManager(CicadaPlayerManager.class);
binding.changeCore.setText("Cicadaplayer 内核");

//TODO:设置cicada缓存信息(Android 28 以上的SDK只能选择Android指定的路径下)
List<VideoOptionModel> list = new ArrayList<>();
try {
    JSONObject jsonObject = new JSONObject();
    String cacheDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + Environment.DIRECTORY_DOCUMENTS + "/CicadaPlayer_test_cache_save";
    jsonObject.putOpt(CicadaMediaPlayer.OPT_CATEGORY_CACHE_ENABLE,"true");
    jsonObject.putOpt(CicadaMediaPlayer.OPT_CATEGORY_CACHE_MAXDURATION,"30000");
    jsonObject.putOpt(CicadaMediaPlayer.OPT_CATEGORY_CACHE_CACHEDIR,cacheDir);
    jsonObject.putOpt(CicadaMediaPlayer.OPT_CATEGORY_CACHE_MAXSIZE,"2000");
    jsonObject.putOpt(CicadaMediaPlayer.OPT_CATEGORY_CACHE_SHAREDURATION,"180");
    String json = jsonObject.toString();
    VideoOptionModel videoOptionModel = new VideoOptionModel(CicadaMediaPlayer.OPT_CATEGORY_CACHE,"cicadaPlayer-Cache",json);
    list.add(videoOptionModel);
    GSYVideoManager.instance().setOptionModelList(list);
}catch (Exception e) {

}

至些,GSYPlayer接入Cicada内核完成,其他的要根据业务需求来添加功能与接口。