流媒体播放的数学原理
Posted zhanghui_cuc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了流媒体播放的数学原理相关的知识,希望对你有一定的参考价值。
这是本系列的第六篇文章
前五篇文章的链接如下:
自适应流媒体传输(一)——DASH媒体内容的生成
自适应流媒体传输(二)——为什么要使用fragmented MP4
自适应流媒体传输(三)——和TS格式说再见
自适应流媒体传输(四)——深入理解MPD
自适应流媒体传输(五)——正确认识码率切换
当我们抛开繁杂的业务代码,从纯数学的角度去理解流媒体传输\\播放的过程,会有全新的体会。
首先,无论是传统的渐进式下载(progressive download)还是现在流行的自适应传输(adaptive streaming),我们认为二者都是基于块(chunk)的下载模式。
渐进式下载
在传统的渐进式下载场景中,我们可以将总体思路提炼为:客户端以chunk为单位下载某一固定的媒体文件。如下图所示,图中的红点代表每一次针对chunk的http get请求
在这个过程中,我们可以提炼出以下几个变量
- 可用带宽 bandwidth
当前可用带宽是一个动态变化的随机变量,在[lo,hi](lo和hi代表最小和最大带宽)之间符合高斯分布,也可简化为均匀分布。 - 初始缓冲量start_cnt
缓冲区长度达到该值即可开始播放,比如可以假设初始缓冲区内有4个chunk时开始播放 - 缓冲区上限值max_buf_sz
假设缓冲区上限值为10s,当缓冲区长度达到此上限时暂停下载后续chunk;当缓冲区下溢时即进入重缓冲状态,此时下载chunk至可以再次播放 - 当前缓冲区长度cur_buf_sz
- 块长度chunk_len
一个chunk对应的视频时长 - 三种状态
Buffering & Steady & Wait
三种状态之间的转换关系如下图,图中同时说明了上述变量在状态转换过程中是如何变化的:
理解了上面的数学关系后,我们可以对渐进式流媒体传输的过程进行仿真。
假设视频源码率为10Mbps,可用带宽在9-11Mbps之间呈均匀分布,此时我们可以得出如下图的仿真结果。图中红色虚线代表可用带宽,蓝色点线代表当前缓冲区长度,黑色竖线代表发生了重缓冲事件。
扩大可用带宽的波动范围至5-13Mbps,此时的仿真结果如下图,重缓冲事件的发生频率明显增加
自适应流媒体传输
在渐进式下载的基础上,自适应流媒体传输场景中有以下新增变量
- 多级码率
- 预测带宽predict_bw
由前面chunk的下载速度预测接下来的可用带宽,有多种预测方法,包括取平均、加权求和等 - 缓冲区阈值buf_threshold
一般会设置一些缓冲区阈值,当低于对应的阈值时做出相应的反应
例如,当cur_buf_sz<=chunk_len
时,立即切换为最低码率的chunk
例如,当cur_buf_sz<=max_buf_sz / 2
时,切换为低一级码率的chunk
下面分别展示两种自适应策略下的流媒体状态转换图,为了便于理解,这里的两种策略都很粗暴,现实中不会有这么粗暴的策略。
一种保守策略
该策略即为前面举的例子:
- Steady状态下,选择与predict_bw最接近的码率级别
- 当
cur_buf_sz<=chunk_len
时,判定进入Panic状态,立即切换为最低码率的chunk - 当
cur_buf_sz<=max_buf_sz / 2
时,判定进入LowBuf状态,切换为低一级码率的chunk
状态转换图如下
基于这一策略,我们假设视频源可选码率级别为10, 5, 2.5, 1.2, 0.6, 0.3Mbps,可用带宽在9-10Mbps之间呈均匀分布,此时我们可以得出如下图的仿真结果。
第一张图展示的是可用带宽与所选择码率级别之间的关系,其中红色虚线代表可用带宽,蓝色点线代表当前选择的码率级别。
第二张图展示了缓冲区长度的变化情况,图中蓝色点线代表缓冲区长度。可以看到在这种简单粗暴的策略下,已经可以避免重缓冲事件发生。
一种激进策略
基于前面的保守策略做如下修改:
- Steady状态下,根据predict_bw选择确保不会导致cur_buf_sz <= 0的最高码率级别
- 当
cur_buf_sz<=chunk_len
时,判定进入Panic状态,立即切换为最低码率的chunk
此时的状态转换图如下
基于这一粗暴的策略,在同样的条件下进行仿真,我们可以得出下面的结果
首先是可用带宽与所选择码率级别之间的关系。可以看到相比前面的保守策略,确实做到了在更多时间内播放高码率级别的结果,但同时也导致了后期出现剧烈的码率级别变化。
对应的缓冲区变化情况如下图,可以看到缓冲区在300秒左右接近耗尽。
结语
从数学角度去理解流媒体播放\\传输的过程后,再去看那些播放器的代码,将会感觉更加轻车熟路。
不仅如此,我们也可以基于这些数学原理和状态转换去进行各种各样的仿真实验,基于这些仿真结果所设计的码率选择策略,与实际生产环境中的结果差距并不大,同样是可信的。
关注公众号,回复“传输仿真”,获取本文的matlab仿真代码,同时分享各类音视频、移动开发知识,以及名企内推信息~
文章帮到你了?可以扫描如下二维码进行打赏,打赏多少您随意~
以上是关于流媒体播放的数学原理的主要内容,如果未能解决你的问题,请参考以下文章
使用媒体播放器或声音池在片段内的 onClick 中播放声音