Shaka Player集成FairPlay与Azure DRM无法加载音频请求排查
Shaka Player FairPlay DRM 音频加载失败排查求助
我已完成Shaka Player的FairPlay DRM相关配置,但无法加载音频。此前已成功集成Widevine并正常播放,且无任何报错信息。我们使用Azure DRM服务转码资产并生成播放链接,该链接可在Azure Media Player正常播放,但在Shaka Player中无法播放,恳请协助排查问题。
shaka.polyfill.installAll(); if (shaka.Player.isBrowserSupported()) { this.videoElement = this.videoElementRef?.nativeElement; this.videoContainerElement = this.videoContainerRef?.nativeElement; this.initPlayer(); } else { console.error('Browser not supported!'); } this.player = new shaka.Player(this.videoElement); console.log(this.player) // this.player.configure({ // drm: { // servers: { // // 'com.widevine.alpha': '', // 'com.apple.fps.1_0':'' // }, // }, // }); this.player.getNetworkingEngine().registerRequestFilter( (type:any, request:any) => { console.log("registerRequestFilter called") if (type == shaka.net.NetworkingEngine.RequestType.LICENSE) { request.headers['authorization'] = ""; request.url = this.serverProcessSPCPath console.log("getting license") } }); try { const req = await fetch('URL'); this.hlsCertificate = await req.arrayBuffer(); console.log(this.hlsCertificate) } catch (error) { console.log('ERROR', 'Load FairPlay Certificate Error: ' + error) } this.player.configure('drm.initDataTransform', (initData:any,content:any,third:any) => { //const processedData = String.fromCharCode.apply(null, (new Uint16Array(d)) as ArrayBuffer) .substring(1); const processedData = String.fromCharCode.apply(null,Array.from<number>(new Uint8Array(initData.buffer))) ; const contentId = new URL(processedData.substring(1)).hostname; const cert = this.player.drmInfo().serverCertificate; this.serverProcessSPCPath = processedData.substring(1).replace('skd://', 'https://'); return shaka.util.FairPlayUtils.initDataTransform(initData, contentId, cert); }); this.player.configure('drm.advanced.com\\.apple\\.fps\\.1_0.serverCertificate', new Uint8Array(this.hlsCertificate)); let videoUrl = "URL"; console.log(this.videoElement?.duration) console.log(this.player.getConfiguration()) this.player.addEventListener('error', this.ErrHandler.bind(this)) this.player.load(videoUrl).then(() => { }).catch((error: any) => { console.log('ERROR', 'Load Manifest Error: ' + error) })

排查建议
- 检查
initDataTransform中的Content ID处理逻辑:你从skd://链接提取hostname作为contentId,但Azure DRM的FairPlay可能需要完整的contentId而非hostname,建议对比Azure Media Player的请求参数,确认contentId格式是否正确。 - 调整证书配置顺序:当前先注册
initDataTransform再配置证书,可能导致this.player.drmInfo().serverCertificate获取到空值。建议先加载证书并完成配置,再设置initDataTransform。 - 验证License请求的有效性:确保
this.serverProcessSPCPath替换后的URL是Azure DRM的正确License端点,同时检查authorization头是否需要填充Azure要求的验证信息(当前为空,可能导致License请求失败)。 - 开启Shaka详细日志:添加
shaka.log.setLevel(shaka.log.Level.DEBUG);,查看DRM初始化、License请求的详细日志,很多无报错的异常会在调试日志中体现。 - 验证Manifest的音频轨道:用HLS解析工具加载该videoUrl,确认音频轨道存在且可正常解析,排除Manifest本身的问题。
内容的提问来源于stack exchange,提问作者Parth Sheth
相关产品推荐
相关产品推荐

