怎么提高android播放器的网络带宽,使用GSYVideoPlayer增加显示实时网速
使用GSYVideoPlayer增加显示实时网速
先看效果图
image
问题来源
项目中接入了这个视频播放框架,GitHub中start中相对比较多,作者修复的频率不低,每层可扩展性高,果断接入。在做项目的时候发现播放器在加载视频的时候只有一个Loading加载动画,并没有显示网速或者百分比,用户体验较差,参考了作者的几个demo中,都没有显示实时网速的功能。查阅他的文档,有发现到player中ExoPlayer内核有提供getNetSpeedText()方法来获取实时的网速,有能获取网速的接口就好办了。
解决思路
自定义播放器UI在加载动画下方增加一个TextView来显示实时网速
查询开始缓冲中的回调
重写在开始缓冲中的回调 开启一个定时任务去获取网速再显示更新到UI上
查询缓冲结束或者准备播放的回调
重写在缓冲结束的时候关闭查询网速的定时任务
思路有了,那么就是实际的代码操作了
//继承标准的播放器
public class SampleCoverVideo extends StandardGSYVideoPlayer {}
//重写getLayoutId 设置自定义的布局
@Override
public int getLayoutId() {
return R.layout.video_layout_cover;
}
//布局的xml 在动画下面加上显示网速的文本框就好了
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:gravity="center">
android:id="@+id/loading"
android:layout_width="28dp"
android:layout_height="28dp"
android:visibility="invisible" />
android:id="@+id/tv_netSpeed"
android:visibility="invisible"
android:textColor="@color/colorWhite"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
//重写init方法 在init方法中findviewbyid
tvNetSpeed=(TextView)findViewById(R.id.tv_netSpeed);
//重写缓冲中显示缓冲布局的方法
protected void changeUiToPlayingBufferingShow() {
super.changeUiToPlayingBufferingShow();
//显示网速控件
setViewShowState(tvNetSpeed,VISIBLE);
//定时任务1秒钟获取实时网速,显示在UI上
disposable=Observable.interval(0, 1000, TimeUnit.MILLISECONDS)
.map(new Function() {
@Override
public String apply(Long aLong) throws Exception {
return getNetSpeedText();//获取网速的方法
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer() {
@Override
public void accept(String s) throws Exception {
//在主线程更新UI
tvNetSpeed.setText(s);
}
});
}
//重写正在播放显示播放中的布局的方法
protected void changeUiToPlayingShow() {
super.changeUiToPlayingShow();
//隐藏网速
setViewShowState(tvNetSpeed,INVISIBLE);
//取消定时任务
closeNetSpeedDisposable();
}
//写个取消任务的方法,记得在这个播放器的生命周期中最后也要执行这个方法取消任务,不然会导致内存泄露哦
private void closeNetSpeedDisposable(){
if (disposable!=null && !disposable.isDisposed()) {
disposable.dispose();
}
}
我设置的是Exo2Player内核,根据getNetSpeedText扒拉下去看,发现是使用TrafficStats类来获取应用当前网速的,这个类是流量监控的类。这边原理是根据两次接收数据总量的差除以两次接收时间差来算出网速的。如果使用其他播放器内核没有获取网速的方法,你可以参考这个方法来实现他。来,咱们看看具体实现方法我给加上注释:
private long getNetSpeed(Context context) {
//这里的context是获取getApplicationContext的
if (context == null) {
return 0;
}
//先使用getUidRxBytes方法获取该进程总接收量,如果没获取到就把当前接收数据总量设置为0,否则就获取接收的总流量并转为kb
long nowTotalRxBytes = TrafficStats.getUidRxBytes(context.getApplicationInfo().uid) == TrafficStats.UNSUPPORTED ? 0 : (TrafficStats.getTotalRxBytes() / 1024);//转为KB
//记录当前的时间
long nowTimeStamp = System.currentTimeMillis();
//上一次记录的时间-当前记录时间算出两次记录的时间差
long calculationTime = (nowTimeStamp - lastTimeStamp);
//如果时间差不变,直接返回0
if (calculationTime == 0) {
return calculationTime;
}
//两次的数据接收量的差除以两次数据接收的时间,就计算网速了。这边的时间差是毫秒,咱们需要转换成秒。
long speed = ((nowTotalRxBytes - lastTotalRxBytes) * 1000 / calculationTime);
//当前时间存到上次时间这个变量,供下次计算用
lastTimeStamp = nowTimeStamp;
//当前总接收量存到上次接收总量这个变量,供下次计算用
lastTotalRxBytes = nowTotalRxBytes;
return speed;
}
这种计算网速方式,需要时间的间隔越小,实时网速越准确。
好了 代码基本就是这样了。只要熟悉播放器的各个回调,就可以自定义在什么时候显示什么内容了
先发到掘金的,现在移到简书来
怎么提高android播放器的网络带宽,使用GSYVideoPlayer增加显示实时网速相关推荐
- java 视频边下边播,VideoViewDemo android 播放器,支持边下边播 238万源代码下载- www.pudn.com...
文件名称: VideoViewDemo下载 收藏√ [ 5 4 3 2 1 ] 开发工具: Java 文件大小: 194 KB 上传时间: 2014-09-19 下载次数: 5 详细说明:a ...
- ijk基于exo_github上十二款最著名的Android播放器开源项目
1.ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Android/iOS 视频播放器.实现了跨平台功能,API 易于集成:编译配置可裁剪,方便控制 ...
- github上十二款最著名的Android播放器开源项目
1.ijkplayer 项目地址: https://github.com/Bilibili/ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Andr ...
- android 音乐视频播放器(github上十二款最著名的Android播放器开源项目)
1.ijkplayer 项目地址: https://github.com/Bilibili/ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Andr ...
- android 著名播放器,【精华】十二大最著名的Android播放器开源项目
1.ExoPlayer https://github.com/google/ExoPlayer ExpPlayer是一个开源的,App等级的媒体API,它的开源项目包含了library和示例: Dem ...
- Android播放器开源项目,github常用视频音频播放器
需求: 搜集到的github常用的视频和音频播放器,其中前三个是比较常用的播放器. 第四个和第五个是比较直白的用法. 1.ijkplayer 项目地址: https://github.com/Bili ...
- android 播放器
今天花了一点时间,写了一个简单的android播放器,功能还不完善,会继续完善!
- android开源库 droidlib,十二大最著名的Android播放器开源项目
1.ExoPlayer https://github.com/google/ExoPlayer ExpPlayer是一个开源的,App等级的媒体API,它的开源项目包含了library和示例: - 这 ...
- play-audio 简单命令行Android播放器
play-audio 简单命令行Android播放器 安装播放器apt-get install play-audio -y 用wget下载音频(如某ftp服务器) wget ftp://192.168 ...
最新文章
- oracle 批处理 执行结果,在windows下怎么在批处理文件里面执行sqlplus并得到结果?...
- java中刷新页面的js,[Java教程]js页面刷新之实现框架内外刷新(整体、局部)
- oracle 如何数组变成表,Oracle从零开始19——表的管理09——嵌套表和可变数组
- VerilogHDL8位串行乘法器的分析(2)
- android 两足机器人,基于Android的双足机器人语音控制系统研究
- html5 canvas实现图片玻璃碎片特效
- 重新设计Videoland的登录页面— UX案例研究
- web开发 开发一个能发送邮件的应用
- Tomcat8.5.40启动后一直卡在日志At least one JAR was scanned for TLDs yet contained no TLDs
- 书单 | 月度畅销好书,助你技能满格,摆脱低效,走向财富人生
- android 调用百度地图,高德地图第三方APP进行导航
- 宾得k5ii_K5--K5II---K5IIs,该选哪个?(喜欢宾得机的摄友)各抒己见。
- 4.8 数值分析: 牛顿迭代法及收敛分析
- 地理空间数据云下载的dem数据(xxxdem.tif格式)中的栅格大小从度(0.000002)改成米(30)
- oracle 卸载(手动,无universal installer)
- linux命令弹出移动硬盘,usb设备(移动硬盘或U盘),弹出时提示“有进程或程序占用,无法弹出”。解决办法...
- 使用SYUGI快速创建类似于Office XP/2003 界面风格的应用程序
- L0,L1,L2正则化浅析
- QQ空间首页模仿制作——HTML布局练习
- 计算机存储器件中运行速度最快,选择题:下列存储器中,存取速度最快的是()...