我们在iOS 8.4上使用AVPlayer播放HLS,AES加密视频.
我们的.m3u8文件包含许可证服务器的URL,例如:
EXT-X-KEY:METHOD = AES-128,URI = “https://开头……”
在我们的iOS应用程序中,我们使用的是AVAssetResourceLoaderDelegate方法
资源加载:shouldWaitForLoadingOfRequestedResource:
拦截AVPlayer(或AVFoundation中的某个对象)发送到许可证服务器的请求.在该方法中,我们将一个令牌(许可证服务器所需)添加到请求的queryString中.
许可证服务器使用令牌接收请求,返回加密密钥,并开始播放.
换句话说,一切都按预期工作.
但是,我们注意到(使用“Charles”http监视器),在创建AVPlayerItem之后,在调用resourceLoader:方法之前,AVFoundation向许可证服务器URL发送初始请求;一个没有通过方法resourceLoader“路由”的请求:此请求在服务器上被拒绝,因为我们的iOS代码在请求发出之前从未有机会附加令牌.
事件摘要:
•使用.m3u8索引文件的url创建并初始化AVPlayerItem / AVAsset.
•AVFoundation框架内的某些内容向.m3u8文件中指定的许可证服务器发出请求.此初始请求不会被方法recourceLoader拦截:shouldWaitForLoadingOfRequestedResource:并且未修改的请求会到达许可证服务器.由于请求在queryString中不包含必需的标记,因此它失败并且不返回加密密钥.
•AVFoundation向licesnse服务器发出第二个请求.此请求由recourceLoader捕获:…并进行适当修改.许可证服务器返回加密密钥并开始播放.
可以使用Apple的AVARLDelegateDemo应用程序复制此行为.
问题:
AVFoundation发送的初始http请求是否正常?
如果是这样,为什么它是必要的,为什么不通过resourceLoader:方法“路由”?
是否可以在发送之前抑制初始请求或修改它?
谢谢!
最佳答案 这个问题的简单答案是AVAssetResourceLoaderDelegate只处理无法以正常方式处理的URL请求.
在您的情况下,您的密钥的URL是普通的https:// URL,因此AVPlayer将尝试自己处理此请求.但是,如果没有令牌,您的服务器将拒绝此请求.因此,AVAssetResourceLoaderDelegate然后将请求传递给您的委托来处理它.
要避免“无关”请求,请修改播放列表,以使加密密钥URL具有无效方案.使用像crypt:// …而不是https:// ….
这样,您将在第一次尝试时收到资源加载程序调用,并且可以使用https://替换crypt://方案,并在以正常方式自行发出请求之前添加您的令牌.
我担心AVAssetResourceLoaderDelegate是如何工作的.
查看Apple的示例应用程序以获取更多详细信息:
https://developer.apple.com/library/ios/samplecode/sc1791/