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