一、概述

DRM Kit (Digital Rights Management Kit,数字版权保护服务)提供了 DRM 加密节目授权解密的功能,包括 DRM 插件管理、DRM 证书管理、DRM 许可证管理、DRM 节目授权、DRM 节目解密等功能,可实现 DRM 解决方案的集成、DRM 解决方案的证书下载、节目的授权及解密。

核心功能

功能名称

功能描述

DRM 插件管理

通过实现 DRM Kit 提供的 DRM HDI 接口,实现对不同的 DRM 解决方案的支持

DRM 证书管理

支持 DRM 解决方案的设备证书的请求、处理,实现对应 DRM 解决方案的证书下载(Provision)功能

DRM 许可证管理

支持离线许可证的请求、处理及删除等

DRM 节目授权

支持在线许可证请求及处理、离线许可证的加载、媒体密钥状态查询,并支持按照 DRM 许可证的权限要求对 DRM 节目授权

DRM 节目解密

支持的媒体协议:HLS、DASH;封装格式:MP4、TS;视频编码格式:H264、H265;音频编码格式:AAC

 


 

二、DRM Kit 的核心亮点

  • 支持许可证及解密会话管理
    占用系统资源少(线程、内存),支持 pipeline 拼装、插件化扩展(source/demuxer/codec)。
  • 支持安全视频通路
    支持安全视频通路,实现安全解密、安全解码、安全渲染、安全输出等。

 


 

三、DRM 工作流程

工作流程主要包括:


工作流程主要包括:

  1. 生成获取 mediaKeySystem 设备证书的请求。
  2. 处理获得的设备证书请求的响应。
  3. 生成媒体密钥请求。
  4. 处理媒体密钥响应。
  5. 将 MediaKeySession 设置到 Media Kit 或 AVCodec Kit,用于支持 DRM 节目解密。
  6. 采用 AVCodec Kit 时,可以设置视音频数据帧的 cencinfo,并设置到 AVBuffer 中,在调用 PushInputBuffer 的时候实现视音频数据帧的解密、解码。

 


 

四、开发示例

1. 创建 MediaKeySystem 实例

MediaKeySystem *mediaKeySystem = nullptr;
ret = OH_MediaKeySystem_Create("com.wiseplay.drm", &mediaKeySystem);
if (ret != DRM_ERR_OK || mediaKeySystem == nullptr) {
    printf("OH_MediaKeySystem_Create failed.");
}

2. 创建 MediaKeySession 实例

MediaKeySystem *mediaKeySystem = nullptr;
ret = OH_MediaKeySystem_Create("com.wiseplay.drm", &mediaKeySystem);
if (ret != DRM_ERR_OK || mediaKeySystem == nullptr) {
    printf("OH_MediaKeySystem_Create failed.");
}

3. 生成媒体密钥请求与处理媒体密钥响应

# define MAX_DRM_MEDIA_KEY_RESPONSE_BUF_SIZE 24576 // 24576: (2 * 12 * 1024)
DRM_MediaKeyRequest mediaKeyRequest;
DRM_MediaKeyRequestInfo info;
// initData 对应码流中的 pssh 数据,请按实际数据填入。
unsigned char initData[512] = {0x00};
memset(&info, 0, sizeof(DRM_MediaKeyRequestInfo));
info.initDataLen = sizeof(initData);
info.type = MEDIA_KEY_TYPE_ONLINE; // MEDIA_KEY_TYPE_ONLINE: 在线媒体密钥请求类型; MEDIA_KEY_TYPE_OFFLINE: 离线媒体密钥请求类型。 
if (sizeof("video/mp4") <= sizeof(info.mimeType)) {
memcpy(info.mimeType, "video/mp4", sizeof("video/mp4"));
}
if (info.initDataLen <= sizeof(info.initData)) {
memcpy(info.initData, initData, info.initDataLen);
}
if (sizeof("optionalDataName") <= sizeof(info.optionName[0])) {
memcpy(info.optionName[0], "optionalDataName", sizeof("optionalDataName"));
}

if (sizeof("optionalDataValue") <= sizeof(info.optionData[0])) {
memcpy(info.optionData[0], "optionalDataValue", sizeof("optionalDataValue"));
}
info.optionsCount = 1;
ret = OH_MediaKeySession_GenerateMediaKeyRequest(mediaKeySession, &info, &mediaKeyRequest);
if (ret != DRM_ERR_OK) {
    printf("OH_MediaKeySession_GenerateMediaKeyRequest failed.");
}
/*
  应用通过网络请求 DRM 服务,获取媒体密钥响应 mediaKeyResponse,将响应传到 OH_MediaKeySession_ProcessMediaKeyResponse,
  若是离线媒体密钥响应处理,则返回离线媒体密钥标识 mediaKeyId,请根据实际的数据和长度传入。
*/
unsigned char mediaKeyId[128] = {0x00};
int32_t mediaKeyIdLen = 128;
// 媒体密钥响应长度最大为 MAX_DRM_MEDIA_KEY_RESPONSE_BUF_SIZE,请按实际数据输入。
unsigned char mediaKeyResponse[MAX_DRM_MEDIA_KEY_RESPONSE_BUF_SIZE] = {0x00};
int32_t mediaKeyResponseLen = MAX_DRM_MEDIA_KEY_RESPONSE_BUF_SIZE;
ret = OH_MediaKeySession_ProcessMediaKeyResponse(mediaKeySession, mediaKeyResponse,
    mediaKeyResponseLen, mediaKeyId, &mediaKeyIdLen);
if (ret != DRM_ERR_OK) {
    printf("OH_MediaKeySession_ProcessMediaKeyResponse failed.");
}

4. 销毁 MediaKeySession 实例

ret = OH_MediaKeySession_Destroy(mediaKeySession);
if (ret != DRM_ERR_OK) {
    printf("OH_MediaKeySession_Destroy failed.");
}

5. 销毁 MediaKeySystem 实例

ret = OH_MediaKeySystem_Destroy(mediaKeySystem);
if (ret != DRM_ERR_OK) {
    printf("OH_MediaKeySystem_Destroy failed.");
}

 


 

五、参考资料

 


 

六、结语

DRM Kit 提供了 DRM 加密节目授权解密的功能,保护版权所有者的权利,防止未经授权的复制和传播。

 

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐