带有 HLS 冗余流和不良网络的奇怪 AVPlayer 行为

Posted

技术标签:

【中文标题】带有 HLS 冗余流和不良网络的奇怪 AVPlayer 行为【英文标题】:Strange AVPlayer behavior with HLS redundant streams and bad network 【发布时间】:2019-06-28 11:15:51 【问题描述】:

我有一个可以播放视频 HLS 流的应用。 HLS 主播放列表包含冗余流以提供备份服务

看起来像这样:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1500000,RESOLUTION=638x480
https://example.com/playlist.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1564000,RESOLUTION=638x480
https://example.com/playlist.m3u8?redundant=1
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1564000,RESOLUTION=638x480
https://example.com/playlist.m3u8?redundant=2
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1564000,RESOLUTION=638x480
https://example.com/playlist.m3u8?redundant=3

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=400000,RESOLUTION=638x480
https://example.com/playlist_lq.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=400000,RESOLUTION=638x480
https://example.com/playlist_lq.m3u8?redundant=1
....
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=400000,RESOLUTION=638x480
https://example.com/playlist_lq.m3u8?redundant=5

因此,我决定测试一下这种设置在网络状况不佳的情况下如何运行。为此,我使用了网络链接调节器的 3G 预设,它提供了 750kbs 的下载带宽。当然,我希望 400kbs 视频的播放相对流畅,但可惜的是,完全加载测试剪辑需要 60 秒(总大小为 800kb)。

我注意到 AVPlayer 发送所有列出的冗余播放列表的请求(每个带宽我有 5 个)。如果我删除它们并且每个带宽只保留 1 个媒体播放列表 - 视频会在 10 秒内加载,并且播放时不会出现卡顿。

看起来 AVPlayer 尝试在处理主视频负载的同时处理所有冗余链接,并且严重阻塞。

有没有什么办法可以限制 AVPlayer 的这种行为,并迫使他仅在实际加载错误的情况下才使用冗余流? 知道为什么它会尝试加载所有这些吗?也许一些 HLS 标签可以提供帮助?

它有时会在控制台中显示这样的错误:

OptimizedCabacDecoder::UpdateBitStreamPtr bitstream parsing error!!!!!!!!!!!!!!

我找不到太多关于它的信息

【问题讨论】:

【参考方案1】:

问题在于 BANDWIDTH 值设置不正确,如果当前属性与 m3u8 值不匹配,AVPlayer 有一些模糊逻辑会切换冗余流

【讨论】:

以上是关于带有 HLS 冗余流和不良网络的奇怪 AVPlayer 行为的主要内容,如果未能解决你的问题,请参考以下文章

推流和拉流的概念以及RTMP和HLS协议

TCP套接字流和带有Swift的SSL

HLS点播实现(H.264和AAC码流)

iOS 可以不使用 AVAssetDownloadURLSession 离线下载 HLS 吗?

如何测试服务器的稳定性?

Perl - 正则表达式匹配的输出非常奇怪,确实