是否有可能使用AVPlayercachingHLS段?

根本问题

在iOS上search时,我们的videocaching很多。 它比我们的networking播放器缓冲了很多,它将已经观看的片段的副本保存在临时存储器中。

期望的解决scheme

在设备的磁盘上本地cachingvideo片段。 caching一个单独的质量,并且总是重放它,我们没事。

拦截器

我们无法在AVFoundation / AVPlayer中find执行caching的方法。

我们试过的

用AVPlayer拦截networking请求的两种方法。

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

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

  1. 实现NSURLProtocol来捕获.ts文件的请求。

AVURLAsset实际上避免被拦截。 networking请求不知何故被捕获。 (不知道为什么)

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

现在回到目前的状况 – iOS 9和更低:与AVPlayer,没有。 但您可以通过本地HTTP服务器cachingHLS段,并使用AVPlayer播放本地stream。

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

TL; DR – 您需要使用HTTP请求来获取这些段,并使用本地HTTP服务器来提供这些段。

包括我正在为之工作的一些公司正在使用这一策略。

使用连接以所需的质量下载段,重build清单并将其平铺到一个目录和一个质量,然后使用应用程序内部的本地http服务器将其提供给AVPlayer(AVPlayer只能播放通过服务器传送的HLSstreamHTTP – 不是来自文件资产)。

有一些边缘情况,例如,如果您想在一次运行中播放和下载,caching,正确重buildm3u8清单,以及不同的AVPlayer状态读取磁盘。

我从第一手知识中发现了这一点,它们都拥有5年生产的这样的系统,以及使用相同解决scheme的App Store中的其他video产品 – 总共为许多用户提供服务。

这也是我们find的最好的解决scheme。

实际上,我们可以让AVPlayer播放来自networking的video,但是如果您想要caching下载的数据以便在本地播放,那么现在使用AVPlayer似乎是不可能的。

幸运的是,AVURLAsset中的资源加载器对象是一个很好的API,您可以通过它提供对AVPlayer的远程audio文件的受控访问。 这就像一个本地的HTTP代理,但没有所有的麻烦。

你可以在https://gist.github.com/anonymous/83a93746d1ea52e9d23ffind更多的细节

关于NSURLProtocol :据我NSURLProtocol ,它自己的请求,所以你的自定义标签/字段/标记将被删除。

我做了其他的方式:redirect段请求一些自定义的urlscheme,只是在协议的canInitWithRequest方法检查scheme。

这样它的工作就好了。 (花了一个星期的时间把整个加工的东西拿出来…)