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



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

错误域

=AVFoundation错误域代码=-11863 "操作已停止" 用户信息={NSLocalizedFailureReason=此内容不再可用。NSLocalizedDescription=操作已停止}

我的流程是:

  • 使用类似https://my.cdn.com/playlist.m3u8的 URL 创建AVURLAsset
  • 设置其资源加载程序的委托
  • AVPlayerItem的形式将其交给玩家
  • 使用AVAssetResourceLoaderDelegate中的方法,查找以方案skd开头的 URL,下载 CKC,获取可持久化的形式,并将其交回资源加载器请求

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

我最终发现的是,AVAssetDownloadTask只会下载一个已经流式传输并给出解密密钥(通过AVAssetResourceLoaderDelegate(并且与播放器无关的AVURLAsset实例。我不能只使用与已经在播放的内容相同的 URL 制作新AVURLAsset并下载它。因此,似乎为了下载任意的公平竞争内容,我必须:

  • 做一个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];

相关内容

  • 没有找到相关文章

最新更新