2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

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

    阅读完需:约 7 分钟

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

一、概述

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


加入 HarmonyOS 社区,共创未来!

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


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


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

2025-11-04 10:001

评论

发布
暂无评论

BAT面试必考Java面试题100+:Kafka,mysql连接查询原理

Java 程序员 后端

Choreographer机制和卡顿优化,mysql基础入门

Java 程序员 后端

详解低延时高音质:编解码篇

声网

编解码 音频体验 Opus

C语言AES算法实现(基于Mbedtls),java中高级面试题最新

Java 程序员 后端

【Java 原理剖析系列】深度分析 Semaphore工作原理分析

码界西柚

Java 并发编程 Semaphore 11月日更

BATJ互联网公司必问知识点:Spring十个面试专题及答案(1)

Java 程序员 后端

CentOS安装Redis,java程序员进阶路线

Java 程序员 后端

@RequestMapping详解,隔壁都馋哭了

Java 程序员 后端

APP性能优化系列-自定义启动器(三),阿里巴巴java面试几轮

Java 程序员 后端

ConcurrentHashMap扩容?lastRun到底是个啥?,理解透彻

Java 程序员 后端

在线文本去空行工具

入门小站

工具

BS-GX-018 基于SSM实现在校学生考试系统,linux系统架构和应用技巧pdf

Java 程序员 后端

CentOS7环境部署kubenetes1,数据库mysql面试题

Java 程序员 后端

AcWing 1532,java教程下载网盘

Java 程序员 后端

BATJ互联网公司面试必问知识点:Spring全家桶全解,java分布式框架技术方案

Java 程序员 后端

案例推荐|Apache Pulsar 助力金山云日志服务,日处理 200TB 数据

Apache Pulsar

开源 云原生 日志 中间件 Apache Pulsar 消息系统

一文了解 PG PITR 即时恢复

青云技术社区

数据库 postgresql 云计算

BATJ互联网公司必问知识点:Spring十个面试专题及答案,java技术面试总结评语

Java 程序员 后端

disruptor笔记之四:事件消费知识点小结,kalilinux教程pdf

Java 程序员 后端

BS-GX-016基于SSM实现教材管理系统,unixlinux编程实践教程

Java 程序员 后端

Chrome上的这些灵魂插件太猛了,碾压其他同款,美团二面惜败

Java 程序员 后端

Class文件结构介绍[字段表集合和方法表集合],kafka基础原理

Java 程序员 后端

B站,牛逼!,字节跳动算法工程师面试总

Java 程序员 后端

CAS之ABA问题的解决方法,深入理解Nginx及使用Nginx实现负载均衡

Java 程序员 后端

CentOS8安装Docker,经典实战教程

Java 程序员 后端

CentOS中VMware tools的安装以及安装失败的解决办法,java程序设计教程pdf

Java 程序员 后端

Ceph实战(三)-块设备的创建与映射,netty架构原理图

Java 程序员 后端

CompletableFuture异步编程,高级java开发笔试题

Java 程序员 后端

disruptor笔记之二:Disruptor类分析,java的学习网站

Java 程序员 后端

BATJ互联网月薪45K的Java岗面试题首次曝光,掌握这些Offer指定跑不了

Java 程序员 后端

Go语言,协程的深入剖析

微客鸟窝

Go 语言 11月日更

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