我正在尝试使用 AVAssetDownloadTask
离线下载和播放经过FairPlay加密的音频内容。我在 urlSession:task:didCompleteWithError:
中不断收到这样的错误:
错误域= AVFoundationErrorDomain代码= -11863“操作已停止” UserInfo = {NSLocalizedFailureReason =此内容不再可用。NSLocalizedDescription=操作已停止}
我的流程是:
AVURLAsset
的URL创建https://my.cdn.com/playlist.m3u8
AVPlayerItem
的形式将其提供给玩家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];