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