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

时间:2019-04-29 15:45:59

标签: ios avfoundation fairplay avcontentkeysession

我有一个应用程序,可播放受FairPlay DRM保护的音频流。它最初使用AVAssetResourceLoaderDelegate交付以提供FairPlay密钥,但是现在我将其更新为将AVContentKeySession使用iOS 11.2 and later。旁注:如果您尝试这样做,但由于缺少文档而感到沮丧,请在“ FairPlay Streaming Server SDK(4.2.0)”链接here上找到示例代码。

我的每个音频产品都分为许多曲目。当我打开音频产品时,我会通过AVQueuePlayer排队多个音轨。这些轨道中的每一个都会生成一个对FairPlay键的请求。如果没有永久密钥已下载,则这些请求中的每个请求都会发送到密钥服务器,下载密钥,生成永久密钥并保存。每个磁道具有相同的密钥,因此它们最终都具有相同的持久密钥数据,并且每个磁道都会覆盖最后一个以完成。

因为我的密钥服务器的成本取决于我提出的密钥请求的数量,所以我只希望第一个请求实际命中密钥服务器,随后的请求使用永久密钥。但是用于获取SPC数据并传递到密钥服务器makeStreamingContentKeyRequestDataForApp的方法使用了异步完成块。 equivalent method 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进行音频下载的速度为very slow,因此我一次启动了许多速度,每个速度都会产生一个关键请求。

0 个答案:

没有答案