You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

})

Shaka Player播放状态截图:显示已加载但无音频时长

排查建议

  • 检查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:30:41