我正在尝试使用 AVAssetDownloadTask 离线下载和播放经过FairPlay加密的音频内容。我在 urlSession:task:didCompleteWithError: 中不断收到这样的错误:

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

我的流程是:

  • 使用类似于AVURLAsset的URL创建https://my.cdn.com/playlist.m3u8
  • 设置其resource loaderdelegate
  • AVPlayerItem的形式将其提供给玩家
  • methods中使用 AVAssetResourceLoaderDelegate ,查找以方案skd开头的URL,下载CKC get the persist-able form,然后将其返回给资源加载器请求

  • 所有这些都有效,并且以与Apple的HLSCatalog sample code中相同的方式完成。但是下载仍然会出现上述错误,即使将相同的播放列表和关键URL插入示例代码中也可以很好地下载。

    我最终弄清楚的是,AVAssetDownloadTask将仅下载已经流传输并具有解密密钥(通过AVURLAsset)并且与播放器无关的AVAssetResourceLoaderDelegate实例。我不能只使用与正在播放的URL相同的URL来制作一个新的AVURLAsset并下载它。因此,为了下载任意的FairPlay内容,我似乎必须:
  • 制作一个AVURLAsset
  • 制作一个AVPlayer并将其音量设置为0
  • 给它资产并播放
  • 等待直到它从资源加载器请求其密钥并开始播放
  • 将其交给下载任务,并将其与播放器
  • 解除关联

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

    所以,我的问题是:如何在未流传输特定实例的情况下下载经过FairPlay加密的AVURLAsset?

    最佳答案

    原来,您在资产的资源加载器上将 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];
    

    07-26 09:38
    查看更多