使用GSYVideoPlayer增加显示实时网速
先看效果图

问题来源
项目中接入了这个视频播放框架,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 在动画下面加上显示网速的文本框就好了
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:gravity="center">
<moe.codeest.enviews.ENDownloadView
android:id="@+id/loading"
android:layout_width="28dp"
android:layout_height="28dp"
android:visibility="invisible" />
<TextView
android:id="@+id/tv_netSpeed"
android:visibility="invisible"
android:textColor="@color/colorWhite"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
//重写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<Long, String>() {
@Override
public String apply(Long aLong) throws Exception {
return getNetSpeedText();//获取网速的方法
}
})
.subscribeOn(Schedulers.io())//这里不清楚获取网速是不是耗时操作就丢在子线程了
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
//在主线程更新UI
tvNetSpeed.setText(s);
}
});
}
//重写正在播放显示播放中的布局的方法
protected void changeUiToPlayingShow() {
super.changeUiToPlayingShow();
//隐藏网速
setViewShowState(tvNetSpeed,INVISIBLE);
//取消定时任务
if (disposable!=null && !disposable.isDisposed()) {
disposable.dispose();
}
}
好了 代码基本就是这样了。只要熟悉播放器的各个回调,就可以自定义在什么时候显示什么内容了
第一次发博客,有什么不对的,还请指教。O(∩_∩)O哈哈~