【HarmonyOS-媒体技术-DRM Kit】数字版权保护开发指南

HarmonyOS开发者社区
发布于 2025-11-3 16:02
浏览
0收藏

一、概述

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

【HarmonyOS-媒体技术-DRM Kit】数字版权保护开发指南-鸿蒙开发者社区

核心功能



功能名称






功能描述






DRM插件管理


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



DRM证书管理


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



DRM许可证管理


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



DRM节目授权


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



DRM节目解密


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


二、DRM Kit 的核心亮点

  • 支持许可证及解密会话管理

      占用系统资源少(线程、内存),支持

  • 支持安全视频通路

      支持安全视频通路,实现安全解密、安全解码、安全渲染、安全输出等。​


三、DRM 工作流程

工作流程主要包括:

【HarmonyOS-媒体技术-DRM Kit】数字版权保护开发指南-鸿蒙开发者社区

工作流程主要包括:

​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 官方文档

基于AVPlayer播放DRM节目(ArkTS)

基于AVCodec播放DRM节目(C/C++)


六、结语

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


加入HarmonyOS 社区,共创未来!

​我们诚邀广大开发者一起参与HarmonyOS 技术生态建设,共建更开放、更智能的未来世界!

加入开发者社区,获取最新资讯和技术支持

HarmonyOS 官方社区


DRM Kit成为你开发路上的得力助手,开启你的音视频开发新纪元!

分类
标签
收藏
回复
举报
回复
    相关推荐