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/