根问题
当我们在iOS中寻找时,我们的视频缓冲区很多。它比我们的网络播放器缓冲的更多,它在临时存储中保存了已经被监视的片段的副本。
想要的解决方案
在设备的磁盘上本地缓存视频段。我们可以缓存一个质量,并总是重播它。
储物柜
我们无法找到在AVFoundation/AVPlayer中执行缓存的方法。
我们尝试了什么,
2种使用AVPlayer拦截网络请求的方法。
不适用于HLS。您可以通过实现AVAssetResourceLoaderDelegate(允许通过身份验证或解密响应)加载m3u8文件,但是不能加载.ts文件。下面是我们尝试过的代码:https://gist.github.com/nathanhillyer/84e46152d7c4c88183b6
.ts文件的请求。AVURLAsset实际上避免被拦截。不知怎么的,网络请求没有被捕获。(不知道原因)
发布于 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找到的最好的解决方案。
发布于 2015-10-05 06:36:28
实际上,我们可以让AVPlayer从网络上播放一个视频,但是如果您想缓存下载的数据在本地播放,用AVPlayer播放它现在似乎是不可能的。
幸运的是,有一个很好的API是AVURLAsset中的AVURLAsset对象,您可以通过它向AVPlayer提供对远程音频文件的受控访问。这就像一个本地HTTP代理,但没有所有麻烦。
您可以找到关于https://gist.github.com/anonymous/83a93746d1ea52e9d23f的更多细节。
发布于 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的策略。
// Get the singleton
let storageManager = AVAssetDownloadStorageManager.shared()
// Set the policy
let newPolicy = AVMutableAssetDownloadStorageManagementPolicy()
newPolicy.expirationDate = myExpiryDate
newPolicy.priority = .important
storageManager.setStorageManagementPolicy(newPolicy, forURL: myDownloadStorageURL)https://stackoverflow.com/questions/29434682
复制相似问题