【发布时间】:2023-03-22 03:48:01
【问题描述】:
根本问题
在 iOS 中搜索时,我们的视频会缓冲很多。它比我们的网络播放器缓冲更多,后者将已经观看的片段的副本保存在临时存储中。
所需的解决方案
在设备磁盘上本地缓存视频片段。我们可以缓存单个质量并始终重放它。
拦截器
我们找不到在 AVFoundation/AVPlayer 中执行缓存的方法。
我们的尝试
使用 AVPlayer 拦截网络请求的两种方法。
- 遵守 AVAssetResourceLoaderDelegate 并手动处理媒体的加载
不适用于 HLS。您可以通过实现 AVAssetResourceLoaderDelegate 来加载 m3u8 文件,这允许您通过身份验证或解密响应,但是无法加载 .ts 文件。 这是我们尝试的代码: https://gist.github.com/nathanhillyer/84e46152d7c4c88183b6
- 实现一个 NSURLProtocol 来捕获对
.ts文件的请求。
AVURLAsset 实际上避免了被拦截。不知何故,网络请求只是没有被捕获。 (不知道为什么)
【问题讨论】:
-
我正要实现一个 NSURLProtocol 来尝试缓存
.ts文件。 @narohi - 你有没有想过这个?我也很想在磁盘上缓存 HLS 段。很高兴在我浪费时间之前发现它不起作用。现在我倾向于放弃AVPlayer,并通过解析m3u8播放列表并使用AVQueuePlayer来编写我自己的HLS 播放器。 JWPlayer SDK for iOS 看起来很有希望,但他们的“联系我们了解我们的年度合同定价”听起来有点吓人。 -
啊,看起来我们遵循了完全相同的教程,并最终出现在同一个地方。在我根据请求调用
finishLoading()后,我也收到了AVPlayerItemStatus.Failed,错误只是:The operation could not be completed -
您可以代理 HLS 流 - 手动下载 ts 并将 m3u8 托管在设备上 (localhost/xxx.m3u8)
-
@nathan.f77 我们目前正在制作使用 CocoaHTTPServer 代理流的原型,结果很有希望
-
我写了一个反向代理服务器来缓存 HLS 段并且它工作。我工作的公司刚刚将此解决方案开源:github.com/StyleShare/HLSCachingReverseProxyServer
标签: ios video-streaming avfoundation avplayer http-live-streaming