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源码下载

原创粉丝点击