我尝试使用AVAssetDownloadTask
离线下载和播放FairPlay加密的音频内容。我在urlSession:task:didCompleteWithError:
:
错误域= AVFoundationErrorDomain代码= -11863"操作已停止" UserInfo = {NSLocalizedFailureReason =此内容不再可用。,NSLocalizedDescription =操作已停止}
我的流程是:
AVURLAsset
https://my.cdn.com/playlist.m3u8
AVPlayerItem
AVAssetResourceLoaderDelegate
,查找以方案skd
开头的网址,下载CKC,get the persist-able form,然后将其移回资源加载程序请求< / LI>
所有这一切都有效,并且与Apple的HLSCatalog sample code中的方式相同。但下载仍然会给我上述错误,即使将相同的播放列表和密钥URL插入到示例代码中也可以下载。
我最终想到的是AVAssetDownloadTask
只会下载已经流式传输并提供其解密密钥的AVURLAsset
实例(通过AVAssetResourceLoaderDelegate
并且这与玩家无关。我不能使用与正在播放的内容相同的网址制作新的AVURLAsset
并下载它。因此,为了下载任意FairPlay内容,我必须:
AVURLAsset
AVPlayer
并将其音量设为0 但这似乎太可怕了。它不可能是真的。
所以,我的问题是:我如何下载FairPlay加密的AVURLAsset,而不是之前没有流式传输它的特定实例?
答案 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];