首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以用AVPlayer缓存HLS段?

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

Stack Overflow用户
提问于 2015-04-03 15:03:10
回答 4查看 12.6K关注 0票数 33

根问题​

当我们在iOS中寻找时,我们的视频缓冲区很多。它比我们的网络播放器缓冲的更多,它在临时存储中保存了已经被监视的片段的副本。

​想要的解决方案​

在设备的磁盘上本地缓存视频段。我们可以缓存一个质量,并总是重播它。

​储物柜​​

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

我们尝试了什么,

2种使用AVPlayer拦截网络请求的方法。

  1. 遵循​AVAssetResourceLoaderDelegate​并手动处理媒体加载

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

  1. 实现NSURLProtocol​以捕获对.ts文件的请求。

AVURLAsset实际上避免被拦截。不知怎么的,网络请求没有被捕获。(不知道原因)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-04-11 01:06:38

让我们从真正的好消息开始- iOS 10及以上-给出这个盒子。很快就不需要黑客了。有关HTTP流中的新内容的更多详细信息可以在以下WWDC16会话中找到:https://developer.apple.com/videos/play/wwdc2016/504/

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

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

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

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

使用连接以您想要的质量下载段,重新构建清单并将其全部压缩到一个目录和一个质量中,然后在应用程序中使用本地http服务器向AVPlayer提供服务(AVPlayer只能播放通过HTTP提供的HLS流--而不是从文件资产)。

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

我从第一手的知识中发现了这一点,无论是生产5年的这样一个系统,还是应用商店中使用相同解决方案的其他视频产品--总共为许多用户服务。

这也是我们为android找到的最好的解决方案。

票数 13
EN

Stack Overflow用户

发布于 2015-10-05 06:36:28

实际上,我们可以让AVPlayer从网络上播放一个视频,但是如果您想缓存下载的数据在本地播放,用AVPlayer播放它现在似乎是不可能的。

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

您可以找到关于https://gist.github.com/anonymous/83a93746d1ea52e9d23f的更多细节。

票数 3
EN

Stack Overflow用户

发布于 2020-10-05 09:00:25

从iOS 10开始,您可以使用AVFoundation在用户的设备上下载和存储HLS电影,而用户可以访问一个快速、可靠的网络,然后在没有网络连接的情况下观看它们。

AVAssetDownloadURLSession

这个2016/504/届会谈论的是Offline HLS。它是关于使用AVAssetDownloadURLSession ( URLSession的一个子类)下载和持久化资产,这里用于管理AVAssetDownloadTasks。本会话中提到的API可以在iOS10之后使用。

AVAggregateAssetDownloadTask

wwdc2017/504届会在iOS11中引入了AVAggregateAssetDownloadTask

一个AVAssetDownloadTask,用于在单个下载任务的保护伞下下载单个AVAsset的多个AVMediaSelections。

苹果提供了一个使用AVFoundation播放和Persist HTTP的示例项目。演示文档。演示项目使用AVAggregateAssetDownloadTask

AVAssetDownloadStorageManager

2017年/504还引入了一个新的API,AVAssetDownloadStorageManager,用于管理自动清除下载的AVAssets的策略。

  • 到期日
  • 优先级(重要,默认)
代码语言:javascript
复制
// Get the singleton
let storageManager = AVAssetDownloadStorageManager.shared()
// Set the policy
let newPolicy = AVMutableAssetDownloadStorageManagementPolicy() 
newPolicy.expirationDate = myExpiryDate
newPolicy.priority = .important 
storageManager.setStorageManagementPolicy(newPolicy, forURL: myDownloadStorageURL)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29434682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档