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