我有一个应用程序可以传输受 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 的音频下载速度非常慢,所以我一次启动多个,每个都生成一个密钥请求。