use*_*931 5 objective-c avfoundation http-live-streaming ios avplayer
我们在 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: 方法“路由”它?
\n是否可以在发送之前抑制初始请求或对其进行修改?
\n谢谢你!
\n这个问题的简单答案是,只会AVAssetResourceLoaderDelegate处理无法以正常方式处理的 URL 请求。
在您的情况下,密钥的 URL 是普通的 https:// URL,因此 AVPlayer 将尝试自行处理此请求。如果没有令牌,该请求将被您的服务器拒绝。因此,他们AVAssetResourceLoaderDelegate会将请求传递给您的代表来处理。
为了避免“无关”请求,请修改您的播放列表,以便加密密钥 URL 具有无效方案。使用类似 crypt://... 而不是 https://...
这样,您将在第一次尝试时收到资源加载器调用,并且您可以将 crypt:// 方案替换为 https:// 并在以正常方式自行发出请求之前添加您的令牌。
AVAssetResourceLoaderDelegate恐怕这就是运作方式。请在此处查看 Apple 的示例应用程序以了解更多详细信息:
https://developer.apple.com/library/ios/samplecode/sc1791/
| 归档时间: |
|
| 查看次数: |
2596 次 |
| 最近记录: |