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