一、概述
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 工作流程
工作流程主要包括:
工作流程主要包括:
- 生成獲取mediaKeySystem設備證書的請求。
- 處理獲得的設備證書請求的響應。
- 生成媒體密鑰請求。
- 處理媒體密鑰響應。
- 將MediaKeySession設置到Media Kit或AVCodec Kit,用於支持DRM節目解密。
- 採用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成為你開發路上的得力助手,開啓你的音視頻開發新紀元!