跳转至

芒果DRM通用框架

Android端

集成时,需依赖芒果自研播放器,商业MultiDRM与芒果自研DRM(LightPlay)共用同一芒果DRM通用框架,通过不同配置参数使用不同类型DRM。

以下为芒果DRM通用框架的API使用方法

1.初始化DRMMgtvDrmManager,为全局单例,一般情况只需调用一次

if(!MgtvDrmManager.getInstance().isInited()) {
    //未初始化MgtvDrmManager
    MgtvDrmManager.getInstance().setOnInitListener(new IDrmManager.OnInitListener() {
        @Override
        public void onInitSuccess() {
            //初始化成功
        }

        @Override
        public void onInitError(String errCode, String msg) {
           //初始化失败
            // errCode -100626 设备root原因初始化失败
        }
    });
    MgtvDrmManager.getInstance().init(ImgoApplication.getApplication(), new IDrmManager.InitConfig(mFilePath, config.enableRoot));
} else {
    //已初始化MgtvDrmManager
}

2.每次播放前,生成DrmSession

/**
 * 生成一个DRM Session用于对应一次DRM流程,会话可以与播放器绑定
 * 一次播放对应一个Session
 *
 * @param config 用于生成drm session的配置
 * @return 生成的Session
 */
drmSession = MgtvDrmManager.getInstance().genDrmSession(new IDrmManager.SessionConfig(drmToken, drmCid, drmType, enableRoot, drmInfos));
drmSession.addOnProvisionSuccessListener(new IDrmSession.OnProvisionSuccessListener() {
    @Override
    public void onSuccess(final IDrmSession session) {
        ThreadUtil.postOnUiThread(new Runnable() {
            @Override
            public void run() {
        //drm session provision流程成功,如果调用了session.close则不会回调
        Log.i("drmtest", "ProvisionSuccess:" + session.hashCode());
        ToastUtil.showToastLong("ProvisionSuccess:" + session.hashCode());
            }
        });
    }
});
drmSession.addOnProvisionErrorListener(new IDrmSession.OnProvisionErrorListener() {
    @Override
    public void onError(IDrmSession session, final int errorCode, final String msg) {
        //drm session provision流程失败,如果调用了session.close则不会回调
        Log.i("drmtest", "ProvisionError " + errorCode + "-" + msg);

    }
});
drmSession.setOnReportListener(new IDrmSession.OnReportListener() {
    @Override
    public void onReport(String errorCode, String errorString, String lic) {
        //与之前一样进行DRM大数据上报
        Log.i("drmtest",  "ProvisionReport " + errorCode + "-" + errorString + "-" + lic);
        sendDrmReport(errorCode, errorString, lic);
    }

    @Override
    public void onExReport(String errorCode, String errorString, String lic, int firm) {

    }
});

// 在非代理DRM模式时, 初始化DRM SESSION同时,
// 并行可以进行播放,塞入地址为原始播放地址,不必使用makeurl来创建代理地址.
if (videoPlayer != null) {
    if (seamless && changeDef) {
        videoPlayer.switchSmoothSource(new SmoothMediaSource(MgtvMediaPlayer.READ_DATASOURCE_TYPE_NORMAL, getPlayUrl(), getPlayUrl()));
    } else {
        videoPlayer.startPlayer("", getPlayUrl(), null, null, mVideoId, drmSession);
    }
}

//3.drm异步provision(内部创建线程)
drmSession.provisionAsync();

/**
 * SessionConfig
 *
 * @param drmToken    intertrust使用
 * @param drmCid      intertrust使用
 * @param drmType     0-marlin 1-marlin-hls 2-cencdash 3-fairplay hls 4-cenc hls 5-sm4 hls
 * @param enableRoot  是否运行root
 * @param drmInfoList drm license url列表
 */
public SessionConfig(String drmToken, String drmCid,
                     String drmType, boolean enableRoot, List<MgtvDrmParams.DrmInfo> drmInfoList)

3.退出APP时释放

MgtvDrmManager.getInstance().release()