• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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    ```