5

我有一个应用程序可以传输受 FairPlay DRM 保护的音频。它最初AVAssetResourceLoaderDelegate用于交付 FairPlay 密钥,但现在我正在更新它以AVContentKeySession用于iOS 11.2 及更高版本。旁注:如果您尝试这样做并且对缺少文档感到沮丧,请在此处的“FairPlay Streaming Server SDK (4.2.0)”链接中提供示例代码

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

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

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

-(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);

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

4

0 回答 0