音视频缓存数学模型
2024年8月的笔记
音视频缓存数学模型 - Wesley’s Blog
播放器作为消费者,缓存作为生产者。
进入缓冲一次
设消费者速率为v1,生产者为v2,视频长度为l,x为生产者至少距离消费者多远才能保证在播完视频前两者重合。实际上就是一个追及问题。
v1t = v2t + x,即 l = v2*l/v1 + x,因为播放器速度是1,继续简化得 x = l(1 - v2)
如果v2大于1,即满足消费者需求时,可以流畅播放。
设l是一部45分钟的电视剧,即x = 4560(1 - v2)
如果v2是1,即1s可以缓存1s时长视频,则x = 0
v2是0.9,即1s可以缓存0.9s时长视频,则 x = 270,意味着要提前缓存270s的视频才可以后续不进入缓冲状态。
同理,v2=0.8,x= 540
…
v2 = 0.1,x=2430
斜率是-2700,意味着每变化百分之0.1,缓存长度都要增加270s。
拿v2=0.9,x= 270作为例子,要提前缓存270s,需要花费的时间是t=270/0.9=300s
同理,v2=0.8,x= 540,t=540/0.8=675s
…
v2 = 0.1,x=2430,t=2430/0.1=24300s=405分钟
进入缓冲多次
实际上,用户是不能容忍等这么久的,所以意味着播放开始后会反复进入缓冲状态。
假设缓存1s播1s,
v2=1,是可以正常播放
v2=0.9,则用户要等待时长为 1/0.9=1.1111s,先缓存1s,则平均1/(1-0.9)=10s进入缓冲状态,每次1.1111s
v2=0.8,则用户要等待时长为 1/0.8=1.25s,先缓存1s,则平均1/(1-0.8)=5s进入缓冲状态,每次1.25s
…
v2=0.1,则用户要等待时长为 1/0.1=10s,先缓存1s,则平均1/(1-0.1)=1.1111s进入缓冲状态,每次10s
同理每次缓存多1s再播放,都会增加一倍进入缓冲的时间和等待时间。
意味着,如果通过多线程不能显著提高v2速度超过1,对用户来说都是卡顿,无法忍受的。
当然,上面只是一个理论模型,实际上要复杂一些,因为每个ts包含的播放时间是不一样的。
情况分析
若带宽小于CDN速度,即v2总是小于v1,这样无论怎么优化都会卡顿。
若带宽大于CDN速度,若v2大于v1则可以正常播放;若单线程不能满足v2大于v1,多线程时v2大于v1,也可以正常播放。
缓存策略
对于下载时间小于ts文件时长的,则串行下载,不需要并发。
以下是针对CDN速度小于网络带宽的:
1. 初始下载设置
- 初始并发数:从1个文件开始下载。
- 监控下载速度:监控下载速度和记录最大下载速度。
2. 逐步增加并发
- 逐步增加:下载成功后,增加一个并发下载任务。
- 监控变化:每次增加并发后,观察单个文件的下载速度变化。
3. 检测瓶颈
- 观察限速:当下载速度达到某个稳定值(和最大下载速度相比不超过百分之十),或者单个文件下载速度显著下降时,说明可能触摸到了带宽上限或服务器限速。
- 回退优化:如果发现并发数增加反而导致下载速度下降,要减少并发数,找到一个最佳的下载量。