我正在尝试使用AVAssetDownloadTask
离线下载和播放 FairPlay 加密的音频内容。我不断收到这样的错误urlSession:task:didCompleteWithError:
:
Error Domain=AVFoundationErrorDomain Code=-11863 "Operation Stopped" UserInfo={NSLocalizedFailureReason=此内容不再可用。, NSLocalizedDescription=Operation Stopped}
我的流程是:
AVURLAsset
使用类似的 URL创建一个https://my.cdn.com/playlist.m3u8
- 设置其资源加载器的委托
- 以
AVPlayerItem
- 使用 中的方法,
AVAssetResourceLoaderDelegate
查找以方案开头的 URLskd
,下载 CKC,获取可持久化的表单,并将其交给资源加载器请求
所有这些都有效,并且以与 Apple 的HLSCatalog 示例代码相同的方式完成。但是下载仍然会给我上述错误,即使将相同的播放列表和关键 URL 插入示例代码可以正常下载。
我最终发现的是,它AVAssetDownloadTask
只会下载一个已经流式传输并给出其解密密钥(通过)且与播放器无关的AVURLAsset
实例。AVAssetResourceLoaderDelegate
我不能只AVURLAsset
使用与已经播放的 URL 相同的 URL 制作新的并下载它。所以看来,为了下载任意 FairPlay 内容,我必须:
- 做一个
AVURLAsset
- 制作一个
AVPlayer
并将其音量设置为0 - 给它资产并播放它
- 等到它从资源加载器请求它的密钥并开始播放
- 将其交给下载任务并将其与播放器解除关联
但这似乎很可怕。这不可能是真的。
所以,我的问题是:我如何下载一个 FairPlay 加密的 AVURLAsset 而之前没有流式传输它的特定实例?