1# 数字版权保护(ArkTS) 2 3开发者可以调用DRM Kit的ArkTS接口实现DRM证书管理、DRM许可证管理、DRM节目授权、DRM节目解密等数字版权保护功能。 4 5DRM Kit提供MediaKeySystem实现DRM证书管理、DRM许可证管理功能,并管理MediaKeySession实例;MediaKeySession实现DRM节目授权,并可支持Media Kit或Media Kit/AVCodec Kit实现DRM节目解密以实现DRM节目播放。 6 7## 开发步骤 8 9详细的API说明请参考[DRM API](../../reference/apis-drm-kit/arkts-apis-drm.md)。 10 111. 导入DRM Kit接口。 12 13 ```ts 14 import { drm } from '@kit.DrmKit'; 15 ``` 16 172. 导入BusinessError模块抛出Drm Kit接口的错误码。 18 19 ```ts 20 import { BusinessError } from '@kit.BasicServicesKit'; 21 ``` 22 233. (可选)调用[getMediaKeySystems](../../reference/apis-drm-kit/arkts-apis-drm-f.md#drmgetmediakeysystems12),获取设备支持的DRM解决方案名称和唯一标识的列表。 24 25 ```ts 26 let description: drm.MediaKeySystemDescription[] = drm.getMediaKeySystems(); 27 ``` 28 29 如果获取结果数组为空,说明该设备中不存在支持的DRM解决方案。 30 314. (可选)调用[isMediaKeySystemSupported](../../reference/apis-drm-kit/arkts-apis-drm-f.md#drmismediakeysystemsupported),查询设备是否支持对应DRM解决方案名称、媒体类型、安全保护级别的DRM解决方案。 32 33 ```ts 34 let isSupported: boolean = drm.isMediaKeySystemSupported("com.clearplay.drm", "video/mp4", drm.ContentProtectionLevel.CONTENT_PROTECTION_LEVEL_SW_CRYPTO); 35 ``` 36 37 如果查询结果为false,说明该设备不支持对应的DRM解决方案。 38 395. 调用[createMediaKeySystem](../../reference/apis-drm-kit/arkts-apis-drm-f.md#drmcreatemediakeysystem),创建MediaKeySystem实例。 40 41 ```ts 42 let mediaKeySystem: drm.MediaKeySystem = drm.createMediaKeySystem("com.clearplay.drm"); 43 ``` 44 45 如果创建失败则返回undefined,说明该设备不支持该DRM解决方案。 46 476. (可选)调用[on('keySystemRequired')](../../reference/apis-drm-kit/arkts-apis-drm-MediaKeySystem.md#onkeysystemrequired),设置MediaKeySystem状态监听事件。 48 49 通过注册keySystemRequired回调函数监听设备DRM证书请求事件。该事件在需要设备DRM证书时触发,此时建议完成设备DRM证书请求与处理流程。 50 51 ```ts 52 mediaKeySystem.on('keySystemRequired', (eventInfo: drm.EventInfo) => { 53 console.info('keySystemRequired' + 'extra:' + eventInfo.extraInfo + ' data:' + eventInfo.info); 54 // 设备DRM证书请求与处理。 55 }); 56 ``` 57 587. (可选)调用[getCertificateStatus](../../reference/apis-drm-kit/arkts-apis-drm-MediaKeySystem.md#getcertificatestatus),获取设备DRM证书状态。 59 60 ```ts 61 let certificateStatus: drm.CertificateStatus = mediaKeySystem.getCertificateStatus(); 62 ``` 63 648. (可选)调用[generateKeySystemRequest](../../reference/apis-drm-kit/arkts-apis-drm-MediaKeySystem.md#generatekeysystemrequest)和[processKeySystemResponse](../../reference/apis-drm-kit/arkts-apis-drm-MediaKeySystem.md#processkeysystemresponse),生成设备DRM证书请求与处理设备DRM证书响应。 65 66 如果设备DRM证书状态不是drm.CertificateStatus.CERT_STATUS_PROVISIONED,可以生成设备DRM证书请求,处理设备DRM证书响应。 67 68 ```ts 69 if(certificateStatus != drm.CertificateStatus.CERT_STATUS_PROVISIONED) { 70 mediaKeySystem.generateKeySystemRequest().then(async (drmRequest: drm.ProvisionRequest) => { 71 console.info("generateKeySystemRequest success", drmRequest.data, drmRequest.defaultURL); 72 }).catch((err:BusinessError) =>{ 73 console.error("generateKeySystemRequest err end", err.code); 74 }); 75 } else { 76 console.info("The certificate already exists."); 77 } 78 // 将设备DRM证书请求返回的drmRequest.data通过网络请求发送给DRM证书服务获取设备DRM证书响应,并处理。 79 let provisionResponseByte = new Uint8Array([0x00, 0x00, 0x00, 0x00]); // 设备DRM证书响应。 80 mediaKeySystem.processKeySystemResponse(provisionResponseByte).then(() => { 81 console.info("processKeySystemResponse success"); 82 }).catch((err:BusinessError) =>{ 83 console.error("processKeySystemResponse err end", err.code); 84 }); 85 ``` 86 879. 调用[createMediaKeySession](../../reference/apis-drm-kit/arkts-apis-drm-MediaKeySystem.md#createmediakeysession),创建MediaKeySession实例。 88 89 创建该DRM解决方案默认内容保护级别的MediaKeySession实例。 90 91 ```ts 92 let mediaKeySession: drm.MediaKeySession = mediaKeySystem.createMediaKeySession(); 93 ``` 94 9510. (可选)设置MediaKeySession状态监听事件。 96 97 监听MediaKeySession实例的事件,包括媒体密钥请求事件、媒体密钥过期事件、媒体密钥有效期更新事件、媒体密钥变换事件等。 98 99 - 使用[on('keyRequired')](../../reference/apis-drm-kit/arkts-apis-drm-MediaKeySession.md#onkeyrequired)接口监听媒体密钥请求事件,此时建议完成媒体密钥请求与处理流程。 100 101 ```ts 102 mediaKeySession.on('keyRequired', (eventInfo: drm.EventInfo) => { 103 console.info('keyRequired' + 'info:' + eventInfo.info + ' extraInfo:' + eventInfo.extraInfo); 104 // 媒体密钥请求与处理。 105 }); 106 ``` 107 108 - 使用[on('keyExpired')](../../reference/apis-drm-kit/arkts-apis-drm-MediaKeySession.md#onkeyexpired)接口监听媒体密钥过期事件。 109 110 ```ts 111 mediaKeySession.on('keyExpired', (eventInfo: drm.EventInfo) => { 112 console.info('keyExpired' + 'info:' + eventInfo.info + ' extraInfo:' + eventInfo.extraInfo); 113 }); 114 ``` 115 116 - 使用[on('expirationUpdate')](../../reference/apis-drm-kit/arkts-apis-drm-MediaKeySession.md#onexpirationupdate)接口监听媒体密钥有效期更新事件。 117 118 ```ts 119 mediaKeySession.on('expirationUpdate', (eventInfo: drm.EventInfo) => { 120 console.info('expirationUpdate' + 'info:' + eventInfo.info + ' extraInfo:' + eventInfo.extraInfo); 121 }); 122 ``` 123 124 - 使用[on('keysChange')](../../reference/apis-drm-kit/arkts-apis-drm-MediaKeySession.md#onkeyschange)接口监听媒体密钥变换事件。 125 126 ```ts 127 mediaKeySession.on('keysChange', (keyInfo : drm.KeysInfo[], newKeyAvailable:boolean) => { 128 for(let i = 0; i < keyInfo.length; i++){ 129 console.info('keysChange' + 'info:' + keyInfo[i].keyId + ' extraInfo:' + keyInfo[i].value); 130 } 131 }); 132 ``` 133 13411. (可选)调用[requireSecureDecoderModule](../../reference/apis-drm-kit/arkts-apis-drm-MediaKeySession.md#requiresecuredecodermodule),查询是否需要安全解码。 135 136 ```ts 137 try { 138 let status: boolean = mediaKeySession.requireSecureDecoderModule("video/avc"); 139 } catch (err) { 140 let error = err as BusinessError; 141 console.error(`requireSecureDecoderModule ERROR: ${error}`); 142 } 143 ``` 144 14512. 调用[generateMediaKeyRequest](../../reference/apis-drm-kit/arkts-apis-drm-MediaKeySession.md#generatemediakeyrequest)和[processMediaKeyResponse](../../reference/apis-drm-kit/arkts-apis-drm-MediaKeySession.md#processmediakeyresponse),生成媒体密钥请求与处理媒体密钥响应。 146 147 获取到DRM节目中的DRM信息时,可以生成媒体密钥请求,处理媒体密钥响应,以请求许可证完成DRM节目授权。 148 149 ```ts 150 // 根据DRM解决方案要求,基于DRM信息中的pssh生成initData。 151 let initData = new Uint8Array([0x00, 0x00, 0x00, 0x00]); 152 // 根据DRM解决方案要求设置可选数据的值。 153 let optionalData:drm.OptionsData[] = [{ 154 name: "optionalDataName", 155 value: "optionalDataValue" 156 }]; 157 // 在线媒体密钥请求和响应。 158 mediaKeySession.generateMediaKeyRequest("video/mp4", initData, drm.MediaKeyType.MEDIA_KEY_TYPE_ONLINE, optionalData).then(async (licenseRequest: drm.MediaKeyRequest) => { 159 console.info("generateMediaKeyRequest success", licenseRequest.mediaKeyRequestType, licenseRequest.data, licenseRequest.defaultURL); 160 // 将媒体密钥请求返回的licenseRequest.data通过网络请求发送给DRM服务获取媒体密钥响应,并处理。 161 let licenseResponse = new Uint8Array([0x00, 0x00, 0x00, 0x00]); // 媒体密钥响应。 162 mediaKeySession.processMediaKeyResponse(licenseResponse).then((mediaKeyId: Uint8Array) => { 163 console.info("processMediaKeyResponse success"); 164 }).catch((err:BusinessError) =>{ 165 console.error("processMediaKeyResponse err end", err.code); 166 }); 167 }).catch((err:BusinessError) =>{ 168 console.error("generateMediaKeyRequest err end", err.code); 169 }); 170 // 离线媒体密钥请求和响应。 171 let offlineMediaKeyId: Uint8Array; 172 mediaKeySession.generateMediaKeyRequest("video/mp4", initData, drm.MediaKeyType.MEDIA_KEY_TYPE_OFFLINE, optionalData).then((licenseRequest: drm.MediaKeyRequest) => { 173 console.info("generateMediaKeyRequest success", licenseRequest.mediaKeyRequestType, licenseRequest.data, licenseRequest.defaultURL); 174 // 将媒体密钥请求返回的licenseRequest.data通过网络请求发送给DRM服务获取媒体密钥响应,并处理。 175 let licenseResponse = new Uint8Array([0x00, 0x00, 0x00, 0x00]); // 媒体密钥响应。 176 mediaKeySession.processMediaKeyResponse(licenseResponse).then((mediaKeyId: Uint8Array) => { 177 offlineMediaKeyId = new Uint8Array(mediaKeyId); 178 console.info("processMediaKeyResponse success"); 179 }).catch((err:BusinessError) =>{ 180 console.error("processMediaKeyResponse err end", err.code); 181 }); 182 }).catch((err:BusinessError) =>{ 183 console.error("generateMediaKeyRequest err end", err.code); 184 }); 185 ``` 186 18713. (可选)调用[restoreOfflineMediaKey](../../reference/apis-drm-kit/arkts-apis-drm-MediaKeySession.md#restoreofflinemediakeys),恢复离线媒体密钥。 188 189 ```ts 190 mediaKeySession.restoreOfflineMediaKeys(offlineMediaKeyId).then(() => { 191 console.info("restoreOfflineMediaKeys success."); 192 }).catch((err: BusinessError) => { 193 console.error(`restoreOfflineMediaKeys: ERROR: ${err}`); 194 }); 195 ``` 196 19714. (可选)调用[checkMediaKeyStatus](../../reference/apis-drm-kit/arkts-apis-drm-MediaKeySession.md#checkmediakeystatus),检查媒体密钥状态。 198 199 ```ts 200 let mediaKeyStatus: drm.MediaKeyStatus[] 201 try { 202 mediaKeyStatus = mediaKeySession.checkMediaKeyStatus() 203 } catch (err) { 204 let error = err as BusinessError; 205 console.error(`checkMediaKeyStatus: ERROR: ${error}`); 206 } 207 ``` 208 20915. (可选)调用[getOfflineMediaKeyIds](../../reference/apis-drm-kit/arkts-apis-drm-MediaKeySystem.md#getofflinemediakeyids)获取离线媒体密钥标识列表,调用[getOfflineMediaKeyStatus](../../reference/apis-drm-kit/arkts-apis-drm-MediaKeySystem.md#getofflinemediakeystatus)获取离线媒体密钥状态,调用[clearOfflineMediaKeys](../../reference/apis-drm-kit/arkts-apis-drm-MediaKeySystem.md#clearofflinemediakeys)删除离线媒体密钥。 210 211 媒体密钥标识用于对离线媒体密钥的管理媒体密钥标识用于对离线媒体密钥的管理。 212 213 ```ts 214 let offlineMediaKeyIds: Uint8Array[] = mediaKeySystem.getOfflineMediaKeyIds(); 215 try { 216 let offlineMediaKeyStatus: drm.OfflineMediaKeyStatus = mediaKeySystem.getOfflineMediaKeyStatus(offlineMediaKeyIds[0]); 217 } catch (err) { 218 let error = err as BusinessError; 219 console.error(`getOfflineMediaKeyStatus ERROR: ${error}`); 220 } 221 try { 222 mediaKeySystem.clearOfflineMediaKeys(offlineMediaKeyIds[0]); 223 } catch (err) { 224 let error = err as BusinessError; 225 console.error(`clearOfflineMediaKeys ERROR: ${error}`); 226 } 227 ``` 228 22916. 销毁MediaKeySession实例。 230 231 完成加密媒体解密,MediaKeySession实例不再使用时,销毁MediaKeySession实例。 232 233 ```ts 234 // MediaKeySession实例使用完需要进行资源释放。 235 mediaKeySession.destroy(); 236 ``` 237 23817. 销毁MediaKeySystem实例。 239 240 完成DRM功能使用,MediaKeySystem实例不再使用,销毁MediaKeySystem实例。 241 242 ```ts 243 // MediaKeySystem实例使用完需要进行资源释放。 244 mediaKeySystem.destroy(); 245 ```