AVPlayer在播放HLS / AES加密视频之前发出无关的http请求

时间:2015-07-30 14:53:46

标签: ios objective-c avfoundation avplayer http-live-streaming

我们在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 向ricesnse服务器发出第二个请求。此请求由recourceLoader捕获:...并进行适当修改。许可证服务器返回加密密钥并开始播放。

可以使用Apple的AVARLDelegateDemo应用程序复制此行为。

问题:

AVFoundation发送的初始http请求是否正常?

如果是这样,为什么它是必要的,为什么不通过resourceLoader:方法“路由”?

是否可以在发送之前抑制初始请求或修改它?

谢谢!

1 个答案:

答案 0 :(得分:2)

这个问题的简单答案是AVAssetResourceLoaderDelegate只会处理无法以正常方式处理的网址请求。

在您的情况下,您的密钥的URL是普通的https:// URL,因此AVPlayer将尝试自行处理此请求。但是,如果没有令牌,您的服务器将拒绝此请求。因此,AVAssetResourceLoaderDelegate会将请求传递给您的委托来处理它。

要避免“无关”请求,请修改播放列表,使加密密钥URL的方案无效。使用crypt:// ...代替https:// ....

这样,您将在第一次尝试时收到资源加载程序调用,并且可以使用https://替换crypt:// scheme并在以正常方式自行发出请求之前添加您的令牌。

这就是AVAssetResourceLoaderDelegate的工作方式,我很害怕。 查看Apple的示例应用程序以获取更多详细信息: https://developer.apple.com/library/ios/samplecode/sc1791/