1.码率切换的前提
只有在播放的视频码流有多种码率选择时才能进行对应的码率切换。
2.码率切换的选择
我们在播放视频的过程中经常会看到
清晰度优先:一直播放高码率 【默认】
流畅度优先:一直播放低码率
自动切换:从高码率开始,依据网速切换到其他码率;从低码率开始,依据网速切换到其他码率。
3. 自动切换码率切换算法
代码位置:_get_best_bandwidth_index()
算法:根据下载速度得到当前匹配的码率,和当前的播放码率对比,并结合当前的缓存来决定最终的调整结果
699 #define CODEC_BUFFER_LOW_FLAG (20)
700 #define CODEC_BUFFER_HIGH_FLAG (30)
举例说明: 当前播放视频包含三个码率
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=700000
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1300000
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2300000
在播放hls视频的时候, 当设置了码率自适应之后, 在每次下载完一个切片的时候,会依据上个切片的下载速度(80%)来决定是否要切换码率, 如果当前下载速度分别为:
1M = 那么其80%速度为 800K, 低于1300K, 那么会下载700K的码率
2M = 其80%速度为 1600K, 高于1300k低于2300k, 会下载1300K的码率
3M = 其80%速度为 2400K, 高于2300k, 会下载2300K的码率
4. 单个切片下载逻辑
单个切片的下载比较复杂, 在下载单个切片的时候,如果下载失败默认会retry ,如果网速特别差的情况下的每次http请求超时是3s, 但由于一次tcp下载超时是1s, 因此每次http read的超时大约是3-4s,而由于每次如果下载到实际的数据又会重新开始计算超时时间, 因此并不能固定每次retry的间隔, 但极端情况下(比如限速1k)我们的超时是: 30*3 大约是90s。这里我们底层会尽量的等比较多的时间原因是为了点播断网续播的时候尽量的少丢数据。