鸿蒙(API 12 Beta3版)【DRM会话管理(C/C++)】数字版权保护开发

DRM会话管理(MediaKeySession)支持媒体密钥管理及媒体解密等,MediaKeySession实例由系统管理里的MediaKeySystem实例创建和销毁。

开发步骤

  1. 导入NDK接口,接口中提供了DRM相关的属性和方法,导入方法如下。
 #include "multimedia/drm_framework/native_drm_common.h"#include "multimedia/drm_framework/native_drm_err.h"#include "multimedia/drm_framework/native_mediakeysession.h"#include "multimedia/drm_framework/native_mediakeysystem.h"
  1. 在CMake脚本中链接Drm NDK动态库。

     target_link_libraries(PUBLIC libnative_drm.so)
    
  2. 声明MediaKeySystem监听回调。

// 适用于单个MediaKeySystem实例的场景。
static Drm_ErrCode SessoinEventCallBack(DRM_EventType  eventType, uint8_t *info, int32_t infoLen, char *extra)
{return DRM_ERR_OK;
}static Drm_ErrCode SessoinKeyChangeCallBack(DRM_KeysInfo *keysInfo, bool newKeysAvailable)
{return DRM_ERR_OK;
}// 适用于多个MediaKeySystem实例的场景。
static Drm_ErrCode SessoinEventCallBackWithObj(MediaKeySession *mediaKeySessoin, DRM_EventType eventType, uint8_t *info, int32_t infoLen, char *extra)
{return DRM_ERR_OK;
}static Drm_ErrCode SessoinKeyChangeCallBackWithObj(MediaKeySession *mediaKeySessoin, DRM_KeysInfo *keysInfo, bool hasNewGoodKeys)
{return DRM_ERR_OK;
}
  1. 设置MediaKeySystem监听回调。
// 适用于单个MediaKeySystem实例的场景。
MediaKeySession_Callback sessionCallback = { SessoinEventCallBack, SessoinKeyChangeCallBack };
Drm_ErrCode ret = OH_MediaKeySession_SetMediaKeySessionCallback(mediaKeySession, &sessionCallback);
if (ret != DRM_ERR_OK) {printf("OH_MediaKeySession_SetMediaKeySessionCallback failed.");
}// 适用于多个MediaKeySystem实例的场景。
OH_MediaKeySession_Callback sessionCallback = { SessoinEventCallBackWithObj, SessoinKeyChangeCallBackWithObj };
ret = OH_MediaKeySession_SetCallback(mediaKeySession, &sessionCallback);
if (ret != DRM_ERR_OK) {printf("OH_MediaKeySession_SetCallback failed.");
}
  1. 生成媒体密钥请求,媒体密钥请求响应处理。
DRM_MediaKeyRequest mediaKeyRequest;
DRM_MediaKeyRequestInfo info;
// initData对应码流中的pssh数据,请按实际数据填入
unsigned char initData[128] = {0x00};
memset_s(&info, sizeof(DRM_MediaKeyRequestInfo), 0, sizeof(DRM_MediaKeyRequestInfo));
info.initDataLen = sizeof(initData);
info.type = MEDIA_KEY_TYPE_ONLINE;
memcpy_s(info.mimeType, sizeof("video/avc"), (char *)"video/avc", sizeof("video/avc"));
memcpy_s(info.initData, sizeof(initData), initData, sizeof(initData));
memcpy_s(info.optionName[0], sizeof("optionalDataName"), (char *)"optionalDataName", sizeof("optionalDataName"));
memcpy_s(info.optionData[0], sizeof("optionalDataValue"), (char *)"optionalDataValue", sizeof("optionalDataValue"));
info.optionsCount = 1;
ret = OH_MediaKeySession_GenerateMediaKeyRequest(mediaKeySession, &info, &mediaKeyRequest);
if (ret != DRM_ERR_OK) {printf("OH_MediaKeySession_GenerateMediaKeyRequest failed.");
}
/* 不同解决方案的离线媒体密钥标识组成不同,获取离线媒体密钥标识的方法有两种:1、应用调用OH_MediaKeySystem_GetOfflineMediaKeyIds接口获取离线媒体密钥标识;2、应用通过网络请求DRM服务,获取离线媒体密钥响应keySessionResponse,将响应传到OH_MediaKeySession_ProcessMediaKeyResponse解析出离线媒体密钥标识mediaKeyId;媒体密钥标识最大长度为128,如下代码所示,请根据实际的媒体密钥数据和长度传入;
*/
unsigned char mediaKeyId[26] = {0x00};
int32_t mediaKeyIdLen = 26;
// 媒体密钥请求响应长度最大为12288,请按实际数据输入
unsigned char mediaKeyResponse[12288] = {0x00};
int32_t mediaKeyResponseLen = 12288;
ret = OH_MediaKeySession_ProcessMediaKeyResponse(mediaKeySession, mediaKeyResponse,mediaKeyResponseLen, mediaKeyId, &mediaKeyIdLen);
if (ret != DRM_ERR_OK) {printf("OH_MediaKeySession_ProcessMediaKeyResponse failed.");
}
  1. (可选)检查当前MediaKeySession会话的媒体密钥状态。
DRM_MediaKeyStatus mediaKeyStatus;
ret = OH_MediaKeySession_CheckMediaKeyStatus(mediaKeySession, &mediaKeyStatus);
if (ret != DRM_ERR_OK) {printf("OH_MediaKeySession_CheckMediaKeyStatus failed.");
}
  1. (可选)清理当前会话下所有媒体密钥。
ret = OH_MediaKeySession_ClearMediaKeys(mediaKeySession);
if (ret != DRM_ERR_OK) {printf("OH_MediaKeySession_ClearMediaKeys failed.");
}
  1. (可选)生成离线媒体密钥释放请求和处理离线媒体密钥释放响应。
uint8_t releaseRequest[MAX_MEDIA_KEY_REQUEST_DATA_LEN];
int32_t releaseRequestLen = MAX_MEDIA_KEY_REQUEST_DATA_LEN;
ret = OH_MediaKeySession_GenerateOfflineReleaseRequest(mediaKeySession,mediaKeyId, mediaKeyIdLen, releaseRequest, &releaseRequestLen);
if (ret != DRM_ERR_OK) {printf("OH_MediaKeySession_GenerateOfflineReleaseRequest failed.");
}
// keyReleaseResponse是使用请求体releaseRequest通过网络请求从DRM服务获取的离线媒体密钥释放响应,请根据实际值传入
unsigned char keyReleaseResponse[12288] = {0x00};
int32_t keyReleaseResponseLen = 12288;
ret = OH_MediaKeySession_ProcessOfflineReleaseResponse(mediaKeySession, mediaKeyId, mediaKeyIdLen,keyReleaseResponse, keyReleaseResponseLen);
if (ret != DRM_ERR_OK) {printf("OH_MediaKeySession_ProcessOfflineReleaseResponse failed.");
}
  1. (可选)恢复离线媒体密钥到当前会话。
// 将指定媒体密钥标识的媒体密钥加载到当前会话,被加载的媒体密钥可以是当前会话的也可以是其他会话的
ret = OH_MediaKeySession_RestoreOfflineMediaKeys(mediaKeySession, mediaKeyId, mediaKeyIdLen);
if (ret != DRM_ERR_OK) {printf("OH_MediaKeySession_RestoreOfflineMediaKeys failed.");
}
  1. (可选)调用MediaKeySession类中的OH_MediaKeySession_GetContentProtectionLevel方法获取当前会话的内容保护级别。
DRM_ContentProtectionLevel sessionContentProtectionLevel;
ret = OH_MediaKeySession_GetContentProtectionLevel(mediaKeySession,&sessionContentProtectionLevel);
if (ret != DRM_ERR_OK) {printf("OH_MediaKeySession_GetContentProtectionLevel failed.");
}
  1. (可选)获取是否需要安全解码。
bool requireSecureDecoder;
ret = OH_MediaKeySession_RequireSecureDecoderModule(mediaKeySession, "video/avc", &requireSecureDecoder);
if (ret != DRM_ERR_OK) {printf("OH_MediaKeySession_RequireSecureDecoderModule failed.");
}

最后呢

很多开发朋友不知道需要学习那些鸿蒙技术?鸿蒙开发岗位需要掌握那些核心技术点?为此鸿蒙的开发学习必须要系统性的进行。

而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版OpenHarmony开发文档》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点

如果你是一名Android、Java、前端等等开发人员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。下面是鸿蒙开发的学习路线图。

在这里插入图片描述

针对鸿蒙成长路线打造的鸿蒙学习文档。话不多说,我们直接看详细鸿蒙(OpenHarmony )手册(共计1236页)与鸿蒙(OpenHarmony )开发入门视频,帮助大家在技术的道路上更进一步。

  • 《鸿蒙 (OpenHarmony)开发学习视频》
  • 《鸿蒙生态应用开发V2.0白皮书》
  • 《鸿蒙 (OpenHarmony)开发基础到实战手册》
  • OpenHarmony北向、南向开发环境搭建
  • 《鸿蒙开发基础》
  • 《鸿蒙开发进阶》
  • 《鸿蒙开发实战》

在这里插入图片描述

总结

鸿蒙—作为国家主力推送的国产操作系统。部分的高校已经取消了安卓课程,从而开设鸿蒙课程;企业纷纷跟进启动了鸿蒙研发。

并且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,未来将会支持 50 万款的应用。那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行! 自↓↓↓拿
1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/52179.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习嵌入式第二十九天

ipc进程间通信方式 PC,即进程间通信(Inter-Process Communication),是操作系统中不同进程之间交换数据的一种机制。以下是一些常见的IPC方式: 管道:用于父子进程或兄弟进程之间的通信。消息队列&#xff…

selenium-java实现自动登录跳转页面

如果要一直刷新一个网页,总不能人工一直去点,所以想到大学时候学过selenium技术,写个脚本来一直刷新,因为经常写java语言,所以选用java语言来写 实验环境 注意,需要先准备好Google浏览器和Chrome-Driver驱…

ffmpeg6.1集成Plus-OpenGL-Patch滤镜

可参考上一篇文章。ffmpeg6.1集成ffmpeg-gl-transition滤镜-CSDN博客 安装思路大致相同, 因为 Plus-OpenGL-Patch也是基于 ffmpeg 4.x 进行开发的,所以在高版本上安装会有很多报错。 这是我安装后的示例,需要安装教程或者改代码可私信我。 …

记录一次 Redis 优化发送数据(使用管道批量传送)

一 项目背景 此前的项目中,鉴于客户方服务器的安全配置对 MQ 中间件有所限制,我们只得采用 Redis 的 list 作为简易的 MQ 来传送报文数据。然而,近段时间客户关闭了相关端口,导致大量数据积压,需要进行补发。在补发过程…

大数据背景下基于Python的牛油果销售数据可视化分析

注:源码在最后,只是一次实验记录,不合理的地方自行修改。 一 研究背景及意义 21世纪以来,随着科学技术的进步,人们的生活水平也随之大幅提升提高。在科技和经济快速发展下,全球已经进入了大数据时代。大数…

8.21-部署eleme项目

1.设置主从从mysql57服务器 (1)配置主数据库 [rootmsater_5 ~]# systemctl stop firewalld[rootmsater_5 ~]# setenforce 0[rootmsater_5 ~]# systemctl disable firewalldRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.serv…

使用 Fyne 构建 GUI 应用:设置标签文本和自增计数器

引言 Fyne 是一个用 Go 语言编写的跨平台 GUI 框架,它提供了一套丰富的组件来帮助开发者快速构建出漂亮的用户界面。在本文中,我们将通过一个简单的案例来演示如何使用 Fyne 创建 GUI 应用程序,该程序包含设置标签文本和自增计数器的功能。 …

「字符串」前缀函数|KMP匹配:规范化next数组 / LeetCode 28(C++)

目录 概述 思路 核心概念:前缀函数 1.前缀函数 2.next数组 1.考研版本 2.竞赛版本 算法过程 构建next数组 匹配过程 复杂度 Code 概述 为什么大家总觉得KMP难?难的根本就不是这个算法本身。 在互联网上你可以见到八十种KMP算法的next数组…

项目1 物流仓库管理系统

一、项目概述 本项目旨在开发一个功能全面的物流仓库管理系统,以数字化手段优化仓库作业流程,提高管理效率。系统集成了前端用户交互界面与后端数据处理逻辑,涵盖了从用户注册登录、订单管理、货单跟踪到用户信息维护等多个核心业务模块。通…

基于django的学生作业提交与管理系统,有管理后台,可作为课设使用

在本项目中,我们设计并实现了一个基于Django框架的学生作业提交与管理系统,旨在为教师和学生提供一个高效、便捷的作业管理平台。Django作为一个高效的Web框架,因其强大的功能和灵活的架构,使得本系统能够快速开发并扩展。 系统功…

Maven的简单使用

Maven使用 Maven的作用1. 自动构建标准化的java项目结构(1) 项目结构① 约定目录结构的意义② 约定大于配置 (2)项目创建坐标坐标的命名方法(约定) 2. 帮助管理java中jar包的依赖(1) 配置使用依赖引入属性配置 (2) maven指令(3) 依赖的范围(4) 依赖传递(…

【密码学】密钥管理:②密钥分配

一、密钥分配的定义 密钥分配是密钥管理生命周期中最重要的部分,密钥分配方案研究的是密码系统中密钥的分发和传送问题。从本质上讲,密钥分配为通信双方建立用于信息加密、解密签名等操作的密钥,以实现保密通信或认证签名等。 (1…

win10蓝牙只能发送,无法接收

给win10升了级,到22H2,蓝牙出了问题 以前接收,就是默认直接就可以接收。现在只能发送,无法接收。 在网上找了很多办法都没奏效,目前的方法是, 每次接收,都要操作一次,而不是自动接…

leetcode-538. 把二叉搜索树转换为累加树

题目描述 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下,二叉搜索树满足下列约束…

计量自动化终端上行通信规约

物理层 TCP 和 UDP 的传输接口 该类接口的登录链接和心跳检测采用链路测试服务,链路测试周期可设定。 参见 TCP/IP 协议规范。 串行通信传输接口 字节传输按异步方式进行,它包含 8 个数据位、1 个起始位“0”、1 个偶校验位 P 和 1 个停止位“1”。 …

Android Studio 动态表格显示效果

最终效果 一、先定义明细的样式 table_row.xml <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_h…

集团数字化转型方案(四)

集团数字化转型方案通过全面部署人工智能&#xff08;AI&#xff09;、大数据分析、云计算和物联网&#xff08;IoT&#xff09;技术&#xff0c;创建了一个智能化的企业运营平台&#xff0c;涵盖从业务流程自动化、实时数据监控、精准决策支持&#xff0c;到个性化客户服务和高…

实验七:独立按键实验

硬件电路图和题目; LED1-LD8是 P2口8个管脚 mian.c #include<reg52.h>sbit But1=P3^1 ; sbit But2=P3^0 ; sbit But3=P3^2 ; sbit But4=P3^3 ;sbit LED1 =P2^0 ; sbit LED2 =P2^1 ; sbit LED3 =P2^2 ; sbit LED4 =P2^3 ;#define PRESS_1 1 #define PRESS_…

CUTLASS 中的 47_ampere_gemm_universal_streamk 示例

前一篇文章介绍了 Stream-K: Work-centric Parallel Decomposition for Dense Matrix-Matrix Multiplication on the GPU 论文&#xff0c;下面对其代码实现进行分析。 cutlass 的 examples/47_ampere_gemm_universal_streamk 展示了 GEMM Stream-K 算法在 Ampere 架构上的使用…

JNPF 5.0升级钜惠,感恩回馈永远在路上

尊敬的JNPF用户们&#xff1a; 经过引迈团队数月的辛勤努力和不断的技术创新&#xff0c;JNPF快速开发平台迎来全新升级——5.0版本&#xff01;此次5.0版本的迭代革新&#xff0c;不仅代表着我们技术实力的进一步提升&#xff0c;是我们对用户需求的深度理解和积极回应。为了…