我有一个可以播放视频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的视频,但可惜的是,完全加载测试片段(总大小为800kb)需要60秒。
我注意到的是,AVPlayer为所有列出的冗余播放列表发送了请求(每个带宽有5个)。如果我删除它们并在每个带宽上仅保留1个媒体播放列表-视频将在10秒内加载并且播放时不会出现打ic现象。
看起来AVPlayer尝试在处理主视频负载的同时并行处理所有冗余链接,并且很难进行扼杀。
有什么方法可以限制AVPlayer的这种行为,并仅在实际负载错误的情况下才强迫他使用冗余流?
知道为什么它尝试加载所有这些吗?也许某些HLS标签可以提供帮助?
有时它还会在控制台中显示如下错误:
{OptimizedCabacDecoder::UpdateBitStreamPtr} bitstream parsing error!!!!!!!!!!!!!!
我找不到很多有关它的信息
最佳答案
问题出在错误地设置了BANDWIDTH值,如果属性当前值与m3u8值不匹配,则AVPlayer的逻辑有些模糊,无法切换冗余流
关于ios - 具有HLS冗余流和不良网络的奇怪AVPlayer行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56805926/