是否有可能使用AVPlayercachingHLS段?
根本问题
在iOS上search时,我们的videocaching很多。 它比我们的networking播放器缓冲了很多,它将已经观看的片段的副本保存在临时存储器中。
期望的解决scheme
在设备的磁盘上本地cachingvideo片段。 caching一个单独的质量,并且总是重放它,我们没事。
拦截器
我们无法在AVFoundation / AVPlayer中find执行caching的方法。
我们试过的
用AVPlayer拦截networking请求的两种方法。
- 符合AVAssetResourceLoaderDelegate并手动处理媒体加载
不适用于HLS。 您可以通过实现AVAssetResourceLoaderDelegate来加载m3u8文件,这允许您通过身份validation或解密响应,但无法加载.ts文件。 以下是我们尝试的代码: https : //gist.github.com/nathanhillyer/84e46152d7c4c88183b6
- 实现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。
这样它的工作就好了。 (花了一个星期的时间把整个加工的东西拿出来…)