VLC网速估计算法
ExoPlayer是根据以往的下载速度来估计当前的网速

现介绍一下几个符号:

采样数组定义如下:

private final ArrayList<Sample> samples;

上述采样数组用于存储历史采样点。

采样点定义如下:

private static class Sample {public int index;public int weight;public float value;}

index存储的是当前采样点在采样数组的索引,它是用来还原采样数组顺序用的,可以忽略
weight存储的是每次下载数据大小的平方根,下载数据的单位是byte
value存储的是每次下载的速度,单位是bit/s(bps)

网速估计的过程

1.采样点的添加方法

  • 每下载一次数据,生成一个Sample,权重weight为每次下载到的数据的Bytes数的平方根;value为每次下载数据的bps

  • 将Sample按照时间顺序加入采样数组samples里

  • 采样数组samples的大小定义为totalWeight,totalWeight是所有采样点Sample中weight的和(注意这里采样数组大小的定义,不是以往的按照采样点来定义的),这个大小有个上限定义为maxWeight=2000

  • 当加入当前采样点后,如果totalWeight>maxWeight,把最先加入采样数组的sample移除,直到totalWeight<=maxWeight

2.网速估计方法:

  • 将采样数组按照采样点中的value值从小到大排序

  • 定义一个desiredWeight,desiredWeight=totalWeight/2

  • 从头遍历排序完的采样数组(从小value开始),依次累加各个样本的weight值,当累加值大于等于desiredWeight时,此时对应的value值为估计的网速。如果此时累加所有的采样点的值仍小于desiredWeight时,返回最近采样点的value值。

原理文档

其网速估计类名为SlidingPercetile.java,官网给出了该算法的原理链接,Wiki: Moving average, Wiki: Selection algorithm

个人理解

其实ExoPlayer的网速估计算法类似于移动平均,但是又不完全相同,没找到具体的讲ExoPlayer网速估计的算法文章了。个人理解,是这样的,假设每次下载的片段大小时一样的,那么这时候取的网速其实是所有网速的一个中位数,这样就去除了大值和小值的影响,这样预测出来的网速准确性未知,毕竟没找到相应的文章写这个算法的网速预测结果。

网速估计获取

上述Sample中的weight和value在ExoPlayer中按照如下方法计算所得:

  • DefaultBandwidthMeter::onTransferStart()用于记录下载起始时间sampleStartTimeMs。在DefaultHttpDataSource::open()调用(每次下载数据起始)
  • DefaultBandwidthMeter::onBytesTransferred()用于记录下载的总字节数sampleBytesTransferred。在DefaultHttpDataSource::read()中调用。
  • DefaultBandwidthMeter::onTransferEnd(),记录下载结束时间,同时生成本次下载过程的Sample(权重和bps),加入采样数组中,并调用上面的算法计算出当前的bitrateEstimate;最后清零sampleBytesTransferred,准备计算下个Sample。在DefaultHttpDataSource::close() 中调用。

注意:播放列表和音视频数据下载的Sample都会统计到计算中。

这一步完成之后,会得到当前的估计网速,bitrateEstimate。

ExoPlayer网速估计方法相关推荐

  1. Android获取网速的方法

    Android获取网速的方法 Android获取网速的方法 posted on 2018-08-23 11:54 时空观察者9号 阅读(...) 评论(...) 编辑 收藏

  2. Win7系统局域网抢网速的方法

    Win7旗舰版局域网怎么抢占网速?最近有很多使用Win7系统的用户问小编,反应自己在局域网下玩游戏的时候很卡,因为很多人在用网络,导致自己的游戏.看电影很不爽.那么遇到这样的问题怎么办呢?下面,就给大 ...

  3. ubuntu中显示实时网速的方法

    ubuntu中显示实时网速的方法:1.打开ubuntu系统终端:2.输入"sudo add-apt-repository ppa:fossfreedom/indicator-sysmonit ...

  4. 提高网速软件测试工程师,提供3个立刻提高网速的方法

    51Testing软件测试网g#w$dXM'^;^&` ] 提供3个立刻提高网速的方法51Testing软件测试网WV2s;Y{E6oJzi3g51Testing软件测试网8N0c%L]+WC ...

  5. 计算机网络mtu值设置,Win7修改本地连接MTU值来提高网速的方法

    mtu值通信术语为最大传输单位,mtu值对于网速来说影响较大,我们可以通过修改mtu值来提高网速.但是如何修改本机的MTU值呢?下面装机之家分享一下Win7修改本地连接MTU值来提高网速的方法. Wi ...

  6. ubuntu 12.04 提高更新网速的方法

    ubuntu 12.04 提高更新网速的方法 ubuntu用户经常会在终端下使用sudo apt-get update对软件源进行更新,但从默认的下载服务器下载速度只有不及正常网速的1/5.下面介绍更 ...

  7. win10解除限制网速的方法【系统天地】

    相信有很多用户都清楚,在win10系统当中默认限制20%的网速的,这也就导致了我们上网的速度不能达到100%,那么win10怎么解除限制网速呢?今天为大家分享win10解除限制网速的操作步骤. 解除限 ...

  8. 测量RJ45网速的方法

    在痛苦挣扎了一周之后,测量网速这个问题依旧没有搞定,老大还有更长远的计划.按照我之前的文章来看,我就是用字节除以时间,后来我才发现,测量网速这个是有公式的.带log这种,不过因为老板说不需要太精确,我 ...

  9. 4g网络设置dns地址_手机4G网络太慢?教你三招提高网速的方法,网速马上提升...

    随着互联网的进步,从零几年开始移动手机在全国开始普及起来,网速也像火箭一样快速飙升,从2G发展到了现在的5G.不过,有很多网友表示,刚从2G或者3G升级到4G时,网速体验非常好,但近两年来的4G网速越 ...

最新文章

  1. 事件源event.target
  2. scrapy获取a标签的连接_Python爬虫 scrapy框架初探及实战!
  3. 组合数学 算法导论 具体数学 博弈论 计算机科学数学
  4. java abstract类和abstract方法
  5. linux下定时网站文件备份和数据备份以及删除旧备份标准代码
  6. adminlte中datatable中自定义搜索和导出按钮
  7. python中支持双向索引的有哪些_解决Python中展示tkinter不支持的图片格式
  8. solidworks图纸模板添加_「solidworks工程图模板」solidworks怎么添加置工程图模板? - seo实验室...
  9. 如何快速找回丢失的数据?
  10. 不同大小硬盘对拷oracle,硬盘对拷方式克隆时必须注意一个大问题
  11. QQ语音通话通过蓝牙发送语音给耳机的一些问题(Android O)
  12. Excel 如何排序与多关键字排序
  13. html鼠标悬停改变背景,js设置鼠标悬停改变背景色实现详解_哒哒_前端开发者
  14. 5款最流行的笔记软件全方位横测
  15. Java基础学习之Servlet 运用学习
  16. DSm安装mysql_群晖Synology DSM系统安装教程
  17. 使用python生成随机中奖姓名和电话号码并存入excel
  18. 中国大学moocpython_中国大学MOOC(慕课)_Python 语言程序设计_测试题及答案
  19. 扒一扒数据黑色产业链:猖獗内鬼、黑客联盟,你中招了吗?
  20. 第十八篇:稳定性之长尾延迟

热门文章

  1. react.js实现的时间轴js特效
  2. 一眼就看懂;Android App 开发前景介绍及学习路线规划
  3. python第五次笔记
  4. 2022夏暑假每日一题(八)
  5. 2022KDD预讲 | 11位一作学者带你提前解锁优秀论文
  6. Android实现搜索手机内的PDF文件
  7. 用Qt画圣诞树——要画就画最丑的圣诞树
  8. linux网站ip访问量查询,如何统计网站每天PV和IP访问量排行
  9. 记一次windows 10启动报错 An operat ing system wasn‘t found. Try disconnecting any drives that don‘t con问题
  10. click事件不生效