• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 基于AVPlayer播放DRM节目(ArkTS)
2
3开发者可以调用DRM Kit和Media Kit的ArkTS接口实现AVPlayer播放器,完成DRM节目播放。
4
5## 开发步骤
6
71. 导入DRM Kit和Media Kit接口。
8
9   ```ts
10   import { drm } from '@kit.DrmKit'
11   import { media } from '@kit.MediaKit'
12   ```
13
142. 导入BusinessError模块抛出Drm Kit接口的错误码。
15
16   ```ts
17   import { BusinessError } from '@kit.BasicServicesKit'
18   ```
19
203. 创建AVPlayer实例并设置DRM信息监听事件。
21
22   ```ts
23   let playerHandle: media.AVPlayer = await media.createAVPlayer()
24   playerHandle.on('mediaKeySystemInfoUpdate', async (mediaKeySystemInfo: drm.MediaKeySystemInfo[]) => {
25     console.info('player has received drmInfo signal: ' + JSON.stringify(mediaKeySystemInfo))
26     // 处理DRM信息。
27     // 设置解密session。
28   })
29   ```
30
314. 根据DRM信息中的uuid创建MediaKeySystem和MediaKeySession实例。
32
33   ```ts
34   let mediaKeySystem: drm.MediaKeySystem
35   let mediaKeySession: drm.MediaKeySession
36   let drmInfoArr: drm.MediaKeySystemInfo[] = mediaKeySystemInfo
37   for (let i = 0; i < drmInfoArr.length; i++) {
38     console.info('drmInfoArr - uuid: ' + drmInfoArr[i].uuid)
39     console.info('drmInfoArr - pssh: ' + drmInfoArr[i].pssh)
40     let description: drm.MediaKeySystemDescription[] = drm.getMediaKeySystems();
41     let solutionName: string = "com.clearplay.drm"
42     for (let item of description) {
43       if (drmInfoArr[i].uuid == item.uuid) {
44         solutionName = item.name
45         }
46       }
47       let isSupported: boolean = drm.isMediaKeySystemSupported(solutionName, "video/mp4");
48       if (isSupported) {
49         mediaKeySystem = drm.createMediaKeySystem(solutionName);
50         mediaKeySession = mediaKeySystem.createMediaKeySession();
51     }
52     // 媒体密钥请求与处理。
53   }
54   ```
55
565. 根据DRM信息中的pssh信息生成媒体密钥请求并处理媒体密钥响应。
57
58   ```ts
59   let initData: Uint8Array = new Uint8Array(drmInfoArr[i].pssh);
60   const optionsData: drm.OptionsData[] = [{
61     name: "optionalDataName",
62     value: "optionalDataValue"
63   }]
64   mediaKeySession.generateMediaKeyRequest("video/mp4", initData, drm.MediaKeyType.MEDIA_KEY_TYPE_ONLINE, optionsData).then(async (licenseRequest) => {
65     console.info("generateMediaKeyRequest success", licenseRequest.mediaKeyRequestType, licenseRequest.data, licenseRequest.defaultURL);
66     // 将媒体密钥请求返回的licenseRequest.data通过网络请求发送给DRM服务获取媒体密钥响应,并处理。
67     let licenseResponse = new Uint8Array([0x00, 0x00, 0x00, 0x00]);
68     mediaKeySession.processMediaKeyResponse(licenseResponse).then((mediaKeyId: Uint8Array) => {
69       console.info("processMediaKeyResponse success");
70     }).catch((err:BusinessError) =>{
71       console.info("processMediaKeyResponse err end", err.code);
72     });
73   }).catch((err:BusinessError) =>{
74     console.info("generateMediaKeyRequest err end", err.code);
75   });
76   ```
77
786. 在处理媒体密钥响应成功后设置解密session。
79
80   ```ts
81   let svp: boolean = mediaKeySession.requireSecureDecoderModule('video/avc');
82   playerHandle.setDecryptionConfig(mediaKeySession, svp)
83   ```
84
857. 销毁AVPlayer实例并根据released事件监听销毁MediaKeySession和MediaKeySystem实例。
86
87   ```ts
88   playerHandle.on('stateChange', async (state: string, reason: media.StateChangeReason) => {
89     if (state == 'released') {
90       mediaKeySession.destroy();
91       mediaKeySystem.destroy();
92     }
93   }
94   await this.playerHandle.release()
95   ```
96