FairPlay DRM で保護されたオーディオをストリーミングするアプリがあります。当初は FairPlay キーを配信するために を使用して出荷されていましたが、現在はiOS 11.2 以降AVAssetResourceLoaderDelegate
で使用できるように更新しています。補足: これを実行しようとしていて、ドキュメントの不足に不満を感じている場合は、こちらの「FairPlay Streaming Server SDK (4.2.0)」リンクにサンプル コードがあります。AVContentKeySession
私のオーディオ製品はそれぞれ、多くのトラックに分割されています。オーディオ製品を開くと、 経由で複数のトラックをキューに入れますAVQueuePlayer
。これらの各トラックは、FairPlay キーの要求を生成します。永続キーがまだダウンロードされていない場合、これらの各要求はキー サーバーに送られ、キーをダウンロードし、永続キーを生成して保存します。各トラックには同じキーがあるため、最終的にはすべて同じ永続キー データになり、それぞれが最後のトラックを上書きして終了します。
キー サーバーのコストはキー リクエストの数に依存するため、最初のリクエストのみが実際にキー サーバーにヒットし、後続のリクエストでは永続キーが使用されるようにしたいと考えています。ただし、SPC データを取得してキー サーバーに渡すために使用されるメソッドmakeStreamingContentKeyRequestDataForApp
は、非同期完了ブロックを使用します。同等AVAssetResourceLoadingRequest
のメソッド onは同期です。
私の質問: セマフォを使用してこの呼び出しを強制的に同期させても安全ですか? このような:
-(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 を使用したオーディオのダウンロード速度は非常に遅いため、一度に多くを開始し、それぞれがキー リクエストを生成します。