我们在 iOS 8.4 上使用 AVPlayer 来播放 HLS、AES 加密的视频。
\n我们的 .m3u8 文件包含许可证服务器的 url,例如:
\n在我们的 iOS 应用程序中,我们使用 AVAssetResourceLoaderDelegate 方法\nresourceLoader:shouldWaitForLoadingOfRequestedResource:\n来拦截 AVPlayer(或 AVFoundation 中的某些对象)发送到许可证服务器的请求。在该方法中,我们将令牌(许可证服务器所需)添加到请求的查询字符串中。
\n许可证服务器接收带有令牌的请求,返回加密密钥,然后开始播放。\n换句话说,一切都按预期进行。
\n然而,我们注意到(使用“Charles”http监视器)\xc2\xa0在创建AVPlayerItem之后和\xc2\xa0在调用resourceLoader:方法之前,AVFoundation发送\xc2\xa0initial\xc2\xa0请求到许可证服务器 URL;未通过方法resourceLoader:“路由”的请求。该请求在服务器上被拒绝,因为我们的 iOS 代码永远没有机会在请求发出之前附加令牌。
\n事件概要:
\n\xe2\x80\xa2 AVPlayerItem/AVAsset 使用 .m3u8 索引文件的 url 创建并初始化。
\n\xe2\x80\xa2 AVFoundation 框架中的某些内容向 .m3u8 文件中指定的许可证服务器发出请求。\xc2\xa0 这个初始请求不会被方法 \xc2\xa0 reourceLoader:shouldWaitForLoadingOfRequestedResource: \xc2\xa0 拦截,并且未修改请求到达许可证服务器。\xc2\xa0 由于该请求在查询字符串中不包含所需的令牌,因此它会失败并且不会返回任何加密密钥。
\n\xe2\x80\xa2 A\xc2\xa0second\xc2\xa0 请求由 AVFoundation向许可证服务器发出。该请求由 reourceLoader:... 捕获并进行适当修改。许可证服务器返回加密密钥并开始播放。
\n可以使用 Apple 的 AVARLDelegateDemo 应用程序复制此行为。
\n问题:
\nAVFoundation发送的初始http请求是否正常?
\n如果是这样,为什么有必要以及为什么不通过 ResourceLoader: …