是否可以使用AVPlayer缓存HLS段?

Nat*_*yer 27 avfoundation video-streaming http-live-streaming ios avplayer

根本问题

在iOS中搜索时,我们的视频会缓冲很多.它比我们的网络播放器缓冲得更多,它可以在临时存储中保存已经观看的片段的副本.

期望的解决方案

在设备的磁盘上本地缓存视频片段.我们很好地缓存单一质量并且总是重播它.

拦截器

我们找不到在AVFoundation/AVPlayer中执行缓存的方法.

我们尝试过什么

使用AVPlayer拦截网络请求的两种方法.

  1. 符合AVAssetResourceLoaderDelegate并手动处理媒体加载

不适用于HLS.您可以通过实现AVAssetResourceLoaderDelegate来加载m3u8文件,它允许您通过身份验证或解密响应,但无法加载.ts文件.这是我们尝试的代码:https: //gist.github.com/nathanhillyer/84e46152d7c4c88183b6

  1. 实现NSURLProtocol以捕获.ts文件请求.

AVURLAsset实际上避免被截获.不知何故,网络请求只是没有被捕获.(不知道为什么)

Liv*_*u R 10

让我们从真正的好消息开始 - iOS 10及更高版本 - 开箱即用.不再需要黑客入侵.有关更多详细信息,请参阅以下WWDC16会话,了解HTTP Live Streaming中的新功能:https: //developer.apple.com/videos/play/wwdc2016/504/

现在回到当前的状态 - iOS 9及更低版本:使用AVPlayer,没有.但您可以通过本地HTTP服务器缓存HLS段并使用AVPlayer播放本地流.

处理HLS播放时,AVPlayer和AVAsset不包含必要的信息(例如,它与MP4静态文件的行为不同).

TL; DR - 您需要使用HTTP请求来获取段并使用本地HTTP Server为它们提供服务.

一些公司,包括我正在为之工作的公司,都在使用这种策略.

使用连接以您想要的质量下载段,重建清单并将其全部展平为一个目录和一个质量,然后使用应用程序内的本地http服务器将其提供给AVPlayer(AVPlayer只能播放服务的HLS流HTTP - 不是来自文件资产).

有边缘情况,例如,如果要在一次运行中播放和下载,正确重建m3u8清单以及具有磁盘读取的不同AVPlayer状态,则进行缓冲.

我从第一手资料中发现了这一点,无论是在其生产5年,其他视频产品在使用相同的解决方案在App Store这样的系统 - 在总服务许多用户.

这也是我们为Android找到的最佳解决方案.

  • 非常感谢您的观点,我们确实代理了本地HLS流。原始问题“是否可以使用AVPlayer缓存HLS段?” 但是,答案不正确。答案是“否”,但是可以使用本地HTTP服务器缓存HLS段。如果您更新答案,我会接受。 (2认同)