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

  • 2025-11-04
    北京
  • 本文字数:2077 字

    阅读完需:约 7 分钟

一、概述

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

核心功能


二、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, 0sizeof(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 加密节目授权解密的功能,保护版权所有者的权利,防止未经授权的复制和传播。


加入 HarmonyOS 社区,共创未来!

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

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


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