VideoView视频大小屏切换/缓冲/卡顿监听和处理
来源:互联网 发布:零基础学算法第一章 编辑:程序博客网 时间:2024/05/21 22:17
走一张效果图
正在加载的动画图从别人资源中copy的,在此感谢
VideoView缓冲/卡顿检测和处理
import javax.swing.Timer;
* 卡顿检测
* 卡顿处理
VideoView缓冲/卡顿检测
VideoView在播放网络视频的时候,由于网速原因,可能会出现卡顿情况,我们有2种方式进行检测。
- 使用VideoView的OnInfoListener监听
- 自定义监听
通过VideoView OnInfoListener监听卡顿
VideoView内部是使用MediaPlayer+SurfaceView进行播放的,上篇博客讲解了音频播放,知道MediaPlayer中维护了一个缓冲Buffer,当数据累计到一定程度,会开始播放。只需要监听下面2种情况,就可监听视频卡顿和卡顿结束。
MediaPlayer.MEDIA_INFO_BUFFERING_START //开始缓冲(可理解为: 开始卡顿)MediaPlayer.MEDIA_INFO_BUFFERING_END //缓冲结束(可理解为: 卡顿结束)
具体使用如下:
mVideoView.setOnInfoListener(new OnInfoListener(){ @Override public boolean onInfo(MediaPlayer mp, int what, int extra){ switch(what){ case MediaPlayer.MEDIA_INFO_BUFFERING_START: //开始卡顿-----需要做一些处理(比如:显示加载动画,或者当前下载速度) break ; case MediaPlayer.MEDIA_INFO_BUFFERING_END: //卡顿结束 (隐藏加载动画,或者加载速度) break ; } }}) ;
通过自定义监听卡顿
思路:
获取指定时间间隔的播放进度dis,如果正常播放,dis应该等于1000ms,如果小于1000ms,则有卡顿嫌疑,小于500ms基本可以断定卡顿严重。Ps:getCurrentPosition()获取的结果是毫秒ms, 500ms这个值可自己定义
实现代码:
//定义1s前播放位置private long lastPosition ;private Timer mTimer ;private void start(){ mTimer = new Timer() ; TimerTask task = new TimerTask() { @Override public void run() { long dis = getVideoViewDelay() ; /如果正常播放,dis应该等于1000ms,如果小于1000ms,则有卡顿的嫌疑,小于500ms基本可以断定卡顿严重 if(dis<500){ //视频卡顿,-------做一些卡顿处理(比如:显示加载动画,或者当前下载速度) }else{ //视频卡顿结束(判断加载动画是否显示,如果显示则隐藏) } } }; //开启检测前,先获取一次进度(主要是为了给lastPosition赋值) getVideoViewDelay() ; //1s之后开启检测 mTimer.schedule(task, 1000, 1000) ;}/** * [currentPosition 获取延时] * @type {[type]} */private long getVideoViewDelay(){ //获取当前播放位置 long currentPosition = mVideoView.getCurrentPosition() ; //计算指定时间间隔实际播放的进度 long dis = currentPosition - lastPosition ; lastPosition = currentPosition ; return delay ;}
VideoView卡顿处理
对于视频卡顿,一般都是通过显示加载动画和实时网速优化,告诉用户不是软件挂了,而是网速不给力,从而提高用户体验。
加载动画
加载动画比较容易实现,只简单的说下。本文最后有一个Demo,使用帧动画实现(动画图,copy的别人的)。
1.新建loading.xml,将准备好的几张图片放入loading.xml中。
2.通过:
//给ImageView设置背景动画(新建的loading.xml帧动画)loadImage.setBackgroundResource(R.drawable.loading);//开启动画((AnimationDrawable)(loadImage.getBackground())).start() ;//注意:不能再布局文件中编写ImageView,必须代码动态添加,不然动画会失真。
显示实时下载速度
获取实时下载速度需要用到TrafficStats类,TrafficStats可以获取总下载量,我们可以哦通过当前总量减去前1s或2s的总量,除以时间间隔得到实时下载速度。
核心代码:
//获取本app当前的下载总流量long currentSpeed = TrafficStats.getUidRxBytes(Process.myUid()) ;............//获取实时下载流量(下载速度)long dis = (currentTraff-lastTraff)/(currentTime-lastTime) ;//单位转化,Mb/s Kb/s
总结
本文主要讲解怎么给视频添加一个优美的缓冲和加载,避免黑屏等待和卡顿的等待,Demo中用的是一个继承自VideoView的控件,主要是为了可以随意的设置视频尺寸和大小瓶切换。下篇文章为讲解一下,Demo中大小屏切换的时遇到的问题。希望大家批评指正。
关于Demo源码
Demo内容:卡顿缓冲监听和过渡动画以及下载速度监听。双击小窗口视频—>全屏播放,全屏播放时按返回按钮回到小屏播放。PS:Demo中使用的是MyVideoView,其实和VideoView是一样的,本介绍的只是都适用VideoView,MyViewdeo只不过继承VideoView,可以随意的指定视频的大小,仅此而已。不喜欢VideoView,直接换成VideoView也是一样的。Demo还不够完善,需要的话,拿去修改修改自己用。不谢
Demo源码下载
- VideoView视频大小屏切换/缓冲/卡顿监听和处理
- 关于VideoView无法监听视频播放时缓冲或者卡顿状态的解决办法
- 关于VideoView无法监听视频播放时缓冲或者卡顿状态的解决办法
- Android使用VideoView和MediaController播放网络视频(包括横竖排切换的处理)
- 获取视频缓冲大小
- 安卓 监听网络视频播放 卡顿
- videoview 横竖屏切换
- VideoView播放本地、网络视频及其监听
- VideoView大小屏幕切换的总结
- VideoView大小屏幕切换的总结
- VideoView大小屏幕切换的总结
- 基于VideoView实现视频播放文件切换
- MPMoviePlayerController 获取视频缓冲大小
- VideoView和SurfaceView播放视频
- VideoView和SurfaceView视频播放
- videoView和mediaController视频播放
- 利用VideoView简单实现视频播放 包括 横竖屏切换 声音 亮度 暂停
- android关于VideoView或Vitamio视频播放器横竖屏切换
- 【Codeforces 608B】Hamming Distance Sum(前缀和)
- 2.Android灯光系统_编写HAL_lights.c
- java异常简介及架构
- SpringBoot_restful
- 数据库基础知识
- VideoView视频大小屏切换/缓冲/卡顿监听和处理
- 回文寻找
- 基于docker的codis3部署
- leetcode
- 《笨办法学python》加分习题7——我的答案
- 基本数据类型
- Windows下MySql错误代码1045的解决方法
- 发现一个好玩的网页
- Mac 忘记root密码解决方法--Star.hou