ExoPlayer网速估计方法
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网速估计方法相关推荐
- Android获取网速的方法
Android获取网速的方法 Android获取网速的方法 posted on 2018-08-23 11:54 时空观察者9号 阅读(...) 评论(...) 编辑 收藏
- Win7系统局域网抢网速的方法
Win7旗舰版局域网怎么抢占网速?最近有很多使用Win7系统的用户问小编,反应自己在局域网下玩游戏的时候很卡,因为很多人在用网络,导致自己的游戏.看电影很不爽.那么遇到这样的问题怎么办呢?下面,就给大 ...
- ubuntu中显示实时网速的方法
ubuntu中显示实时网速的方法:1.打开ubuntu系统终端:2.输入"sudo add-apt-repository ppa:fossfreedom/indicator-sysmonit ...
- 提高网速软件测试工程师,提供3个立刻提高网速的方法
51Testing软件测试网g#w$dXM'^;^&` ] 提供3个立刻提高网速的方法51Testing软件测试网WV2s;Y{E6oJzi3g51Testing软件测试网8N0c%L]+WC ...
- 计算机网络mtu值设置,Win7修改本地连接MTU值来提高网速的方法
mtu值通信术语为最大传输单位,mtu值对于网速来说影响较大,我们可以通过修改mtu值来提高网速.但是如何修改本机的MTU值呢?下面装机之家分享一下Win7修改本地连接MTU值来提高网速的方法. Wi ...
- ubuntu 12.04 提高更新网速的方法
ubuntu 12.04 提高更新网速的方法 ubuntu用户经常会在终端下使用sudo apt-get update对软件源进行更新,但从默认的下载服务器下载速度只有不及正常网速的1/5.下面介绍更 ...
- win10解除限制网速的方法【系统天地】
相信有很多用户都清楚,在win10系统当中默认限制20%的网速的,这也就导致了我们上网的速度不能达到100%,那么win10怎么解除限制网速呢?今天为大家分享win10解除限制网速的操作步骤. 解除限 ...
- 测量RJ45网速的方法
在痛苦挣扎了一周之后,测量网速这个问题依旧没有搞定,老大还有更长远的计划.按照我之前的文章来看,我就是用字节除以时间,后来我才发现,测量网速这个是有公式的.带log这种,不过因为老板说不需要太精确,我 ...
- 4g网络设置dns地址_手机4G网络太慢?教你三招提高网速的方法,网速马上提升...
随着互联网的进步,从零几年开始移动手机在全国开始普及起来,网速也像火箭一样快速飙升,从2G发展到了现在的5G.不过,有很多网友表示,刚从2G或者3G升级到4G时,网速体验非常好,但近两年来的4G网速越 ...
最新文章
- 事件源event.target
- scrapy获取a标签的连接_Python爬虫 scrapy框架初探及实战!
- 组合数学 算法导论 具体数学 博弈论 计算机科学数学
- java abstract类和abstract方法
- linux下定时网站文件备份和数据备份以及删除旧备份标准代码
- adminlte中datatable中自定义搜索和导出按钮
- python中支持双向索引的有哪些_解决Python中展示tkinter不支持的图片格式
- solidworks图纸模板添加_「solidworks工程图模板」solidworks怎么添加置工程图模板? - seo实验室...
- 如何快速找回丢失的数据?
- 不同大小硬盘对拷oracle,硬盘对拷方式克隆时必须注意一个大问题
- QQ语音通话通过蓝牙发送语音给耳机的一些问题(Android O)
- Excel 如何排序与多关键字排序
- html鼠标悬停改变背景,js设置鼠标悬停改变背景色实现详解_哒哒_前端开发者
- 5款最流行的笔记软件全方位横测
- Java基础学习之Servlet 运用学习
- DSm安装mysql_群晖Synology DSM系统安装教程
- 使用python生成随机中奖姓名和电话号码并存入excel
- 中国大学moocpython_中国大学MOOC(慕课)_Python 语言程序设计_测试题及答案
- 扒一扒数据黑色产业链:猖獗内鬼、黑客联盟,你中招了吗?
- 第十八篇:稳定性之长尾延迟
热门文章
- react.js实现的时间轴js特效
- 一眼就看懂;Android App 开发前景介绍及学习路线规划
- python第五次笔记
- 2022夏暑假每日一题(八)
- 2022KDD预讲 | 11位一作学者带你提前解锁优秀论文
- Android实现搜索手机内的PDF文件
- 用Qt画圣诞树——要画就画最丑的圣诞树
- linux网站ip访问量查询,如何统计网站每天PV和IP访问量排行
- 记一次windows 10启动报错 An operat ing system wasn‘t found. Try disconnecting any drives that don‘t con问题
- click事件不生效