我有一个应用程序,可播放受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,因此我一次启动了许多速度,每个速度都会产生一个关键请求。