标签: avcontentkeysession

AVContentKeySession makeStreamingContentKeyRequestDataForApp 可以安全地强制同步吗?

我有一个应用程序可以流式传输受 FairPlay DRM 保护的音频。它最初AVAssetResourceLoaderDelegate用于交付 FairPlay 密钥,但现在我将其更新为AVContentKeySession用于iOS 11.2 及更高版本。附注:如果你想做到这一点,在缺少文档感到沮丧,有一个在示例代码“FairPlay的流媒体服务器SDK(4.2.0)”链接在这里

我的每个音频产品都被分成了许多曲目。当我打开一个音频产品时,我通过AVQueuePlayer. 这些轨道中的每一个都会生成一个对 FairPlay 密钥的请求。在没有已下载的持久密钥的情况下,这些请求中的每一个都进入密钥服务器,下载密钥,生成持久密钥并保存它。每个轨道都有相同的密钥,因此它们最终都具有相同的持久密钥数据,并且每个轨道都覆盖最后一个以完成。

因为我的密钥服务器的成本取决于我发出的密钥请求的数量,所以我希望只有第一个请求实际到达密钥服务器,随后的请求使用持久密钥。但是用于将 SPC 数据传递给密钥服务器的方法makeStreamingContentKeyRequestDataForApp使用异步完成块。onAVAssetResourceLoadingRequest等效方法是同步的。

我的问题:使用信号量强制此调用同步是否安全?像这样:

-(void)handleOnlineRequest:(AVContentKeyRequest *)req
  NSData *appCert = [self _getAppCertData];
  NSData *assetId = [self _kidFromRequest:req];
  dispatch_semaphore_t sema = dispatch_semaphore_create(0);
  [req makeStreamingContentKeyRequestDataForApp:appCert
                              contentIdentifier:assetId
                                        options:nil
                                        completion:^
    NSData *contentKeyRequestData, NSError *error)
    {
      //request key data and respond to request

      dispatch_semaphore_signal(sema);
    }];
  dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
  dispatch_release(semaphore);
Run Code Online (Sandbox Code Playgroud)

下载以前未流式传输的音频时,效果尤其明显。使用 AVAssetDownloadTask 下载音频的速度非常慢,所以我一次启动很多,每个都会生成一个密钥请求。

avfoundation fairplay ios avcontentkeysession

5
推荐指数
0
解决办法
485
查看次数

标签 统计

avcontentkeysession ×1

avfoundation ×1

fairplay ×1

ios ×1