Stories

Detail Return Return

【HarmonyOS-媒體技術-DRM Kit】數字版權保護開發指南 - Stories Detail

一、概述

DRM Kit (Digital Rights Management Kit,數字版權保護服務)提供了DRM加密節目授權解密的功能,包括DRM插件管理、DRM證書管理、DRM許可證管理、DRM節目授權、DRM節目解密等功能,可實現DRM解決方案的集成、DRM解決方案的證書下載、節目的授權及解密。

image.png

核心功能

功能名稱 功能描述
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 工作流程

工作流程主要包括:

image.png

工作流程主要包括:

  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成為你開發路上的得力助手,開啓你的音視頻開發新紀元!

Add a new Comments

Some HTML is okay.