如何使用AVAssetDownloadTask下载尚未流式传输的FairPlay加密的AVURLAsset实例?

时间:2018-05-10 22:47:55

标签: ios avassetdownloadtask avassetresourceloaderdelegate

我尝试使用AVAssetDownloadTask离线下载和播放FairPlay加密的音频内容。我在urlSession:task:didCompleteWithError:

中一直收到这样的错误
  

错误域= AVFoundationErrorDomain代码= -11863"操作已停止" UserInfo = {NSLocalizedFailureReason =此内容不再可用。,NSLocalizedDescription =操作已停止}

我的流程是:

所有这一切都有效,并且与Apple的HLSCatalog sample code中的方式相同。但下载仍然会给我上述错误,即使将相同的播放列表和密钥URL插入到示例代码中也可以下载。

我最终想到的是AVAssetDownloadTask只会下载已经流式传输并提供其解密密钥的AVURLAsset 实例(通过AVAssetResourceLoaderDelegate并且这与玩家无关。我不能使用与正在播放的内容相同的网址制作新的AVURLAsset并下载它。因此,为了下载任意FairPlay内容,我必须:

  • 制作AVURLAsset
  • 制作AVPlayer并将其音量设为0
  • 给它资产并播放
  • 等到它从资源加载器请求其密钥并开始播放
  • 将其提供给下载任务并将其与播放器取消关联

但这似乎太可怕了。它不可能是真的。

所以,我的问题是:我如何下载FairPlay加密的AVURLAsset,而不是之前没有流式传输它的特定实例?

1 个答案:

答案 0 :(得分:2)

事实证明,您在资产的资源加载器上将preloadsEligibleContentKeys设置为true。然后你可以下载:

AVURLAsset *asset = [AVURLAsset assetWithURL:self.currDownload.url];
[asset.resourceLoader setDelegate:self queue:dispatch_get_main_queue()];
asset.resourceLoader.preloadsEligibleContentKeys = YES;
AVAssetDownloadTask *task = [self.downloadSession assetDownloadTaskWithURLAsset:asset assetTitle:self.currDownload.title assetArtworkData:nil options:@{AVAssetDownloadTaskMinimumRequiredMediaBitrateKey: @(265000)}];
task.taskDescription = self.currDownload.title;
[task resume];