CicadaPlayer与Aliplayer使用的都是同样的CicadaPlayer的播放内核,所以在GSYPlayer中不能同时存在,且接入与Aliplayer接入方式一类似。这里只针对普通的GSYPlayer播放内核的接入,具体与业务逻辑相关的实现不做赘述。
1.GSYPlayer播放内核实现图
2.CicadaPlayer接入实现
2.1、导入CicadaPlayer的库文件。
在主工程libs目录(如果没有,点击app右键New->Directory创建)下添加premierlibrary-corePlayer-debug.aar文件。
在主工程目录下找到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内核完成,其他的要根据业务需求来添加功能与接口。