首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVAssetResourceLoader (和AVAssetResourceLoaderDelegate)可以用来限制流的选择以提高质量吗?

AVAssetResourceLoader (和AVAssetResourceLoaderDelegate)可以用来限制流的选择以提高质量吗?
EN

Stack Overflow用户
提问于 2022-04-03 01:45:32
回答 1查看 150关注 0票数 3

iOS (似乎特别是在iOS 15中)并不总是最擅长使用具有多个播放质量选项的HLS m3u8播放列表,并选择最佳播放选项。例如,即使有了很好的互联网连接,iOS通常也会从可用的选项中选择一个质量较低的选项,并且需要相当一段时间才能过渡到高质量的选项。用户对此不太满意,也可以理解,因为我可以将到播放列表(没有音频)中的高质量视频流的直接链接粘贴到Safari中,当我手动加载它时,它会立即加载,而不是使用较慢的AVPlayer实现。

是否可以使用AVAssetResourceLoader来拦截HLS播放列表并删除一些质量较低的选项,从而阻止iOS更多地选择低质量选项?

我在苹果开发者论坛这是由一名雇员指出的,这可能是可能的。上注意到了这个问题,但是除了苹果的演示代码之外,我一直找不到一个明确的方法来做到这一点。

一个例子可能是以下HLS清单:

代码语言:javascript
复制
#EXTM3U
#EXT-X-VERSION:4
#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=308000,AVERAGE-BANDWIDTH=279000,RESOLUTION=162x288,CODECS="avc1.42001e"
HLS_224.m3u8
#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=522000,AVERAGE-BANDWIDTH=481000,RESOLUTION=180x320,CODECS="avc1.42001e"
HLS_270.m3u8
#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=969000,AVERAGE-BANDWIDTH=886000,RESOLUTION=244x432,CODECS="avc1.4d001e"
HLS_360.m3u8
#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=1529000,AVERAGE-BANDWIDTH=1388000,RESOLUTION=360x640,CODECS="avc1.4d001f"
HLS_540.m3u8
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=20113,RESOLUTION=162x288,CODECS="avc1.42001e",URI="HLS_224-iframe.m3u8"
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=29898,RESOLUTION=180x320,CODECS="avc1.42001e",URI="HLS_270-iframe.m3u8"
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=51637,RESOLUTION=244x432,CODECS="avc1.4d001e",URI="HLS_360-iframe.m3u8"
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=79210,RESOLUTION=360x640,CODECS="avc1.4d001f",URI="HLS_540-iframe.m3u8"

其中,我想去掉224和227选项,留下360和540选项。当然,假设HLS播放列表托管在我无法隐式访问的服务器上,因此我无法直接编辑文件。

EN

回答 1

Stack Overflow用户

发布于 2022-09-05 07:29:08

苹果发展论坛上的答案有点旧。好消息是iOS 15引入了一些新的API来处理多变量播放列表中的比特率。加载视频时,请按照您的建议使用AVURLAssetAVAssetResourceLoader。加载资产后,通过添加调用AVURLAsset.variants的所有变体获得系统选择的播放列表变体,当前通过调用AVPlayerItem上的代码选择变体

代码语言:javascript
复制
if let lastEvent = self.playerItem?.accessLog()?.events.last {
    let selectedBitRate = lastEvent.indicatedAverageBitrate
    selectedAverageBitRate = selectedBitRate
    selectedIndex = variants.firstIndex(where: {$0.averageBitRate ?? 0 == selectedBitRate})
}

对于设置播放列表变体偏好,可以使用:

代码语言:javascript
复制
playerItem?.variantPreferences

另一方面,如果您想以某种方式限制首选比特率,请使用以下方法:

代码语言:javascript
复制
playerItem?.preferredPeakBitRate
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71722388

复制
相关文章

相似问题

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