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:001789

评论

发布
暂无评论

用最通俗简单的方式,带你全面理解Android事件传递机制,有一句废话你砍我

android 程序员 移动开发

疫情结束后,会影响程序员年后找工作吗?,安卓开发面试题自定义view

android 程序员 移动开发

移动应用遗留系统重构(9)- 路由篇,移动开发者大会

android 程序员 移动开发

移动开发的罗曼蒂克消亡史 _ InfoQ,网易云的朋友给我这份339页的Android面经

android 程序员 移动开发

移动开发程序员怎么优雅迈过30K+这道坎?成功入职字节跳动

android 程序员 移动开发

疫情之下,这真是一份完美的程序员宅家指南,androidsdk开发实例

android 程序员 移动开发

移动应用遗留系统重构(7)- 解耦重构演示篇(一),android开发环境的搭建视频

android 程序员 移动开发

程序员30岁+又怎么了呢?找准定位,kotlin可选参数

android 程序员 移动开发

程序员为什么越老贬值的越厉害?,面试官6个灵魂拷问

android 程序员 移动开发

知乎热榜第一破10w阅读-Android不行了?2021程序员的风口又要来了,你还不抓紧机会

android 程序员 移动开发

疫情下中年IT的焦虑,轻松拿下offer

android 程序员 移动开发

疫情下,每个职场人都要思考这4点,有了这些中高端面试专题-大厂还会远吗

android 程序员 移动开发

疫情过后打算跳槽阿里,本以为凉了没想到居然是它“救,2021年Android大厂面试分享

android 程序员 移动开发

看完此文,你对Gradle的理解又升级了!,万字总结

android 程序员 移动开发

看我一波,Android获取进程名函数,代码优化到极致的操作

android 程序员 移动开发

真的已经讲烂了!想彻底掌握-binder-机制,必须先搞懂这几个关键类

android 程序员 移动开发

由浅入深理解Android虚拟机—内存模型,垃圾回收机制是如何实现的

android 程序员 移动开发

疫情下,中年IT的焦虑,Android面试总结

android 程序员 移动开发

疫情让“灵活用工”浮出水面,一线互联网公司面经总结

android 程序员 移动开发

种草Dribbble:从未见过如此Q弹的Switcher,腾讯架构师深入讲解Android开发

android 程序员 移动开发

知乎3000多人关注!27w+阅读开发者进阶难题,2021安卓开发社招面试解答之性能优化

android 程序员 移动开发

破解 Kotlin 协程(1) - 入门篇,35岁以后的Android程序员出路在哪里

android 程序员 移动开发

移动开发的罗曼蒂克消亡史,android系统开发书籍

android 程序员 移动开发

程序员中年了40岁,公司里熬到中层年薪30w+,最新高频Android面试题目分享

android 程序员 移动开发

百万级日活 App 的屏幕录制功能是如何实现的,flutter小程序的onshow

android 程序员 移动开发

百度阿里腾讯头条面试Android高级岗必问!Handler源码解析!

android 程序员 移动开发

真的强!借助阿里技术博主分享的Android面试笔记,我拿到了字节跳动的offer

android 程序员 移动开发

移动端视频开发通过什么方式实现直播?十分钟带你快速了解

android 程序员 移动开发

程序员35岁之后该怎样规划自己的职业?,Android开发手册

android 程序员 移动开发

玩转Android事件分发机制,kotlinnative内存管理

android 程序员 移动开发

移动应用遗留系统重构(9)- 路由篇(1),kotlin版权

android 程序员 移动开发

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