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