最近做了一个关于广告视频的项目,双屏异显,并且在数千台广告屏上运行这个APP,而且要同步,核心的功能是图片gif视频轮流播放的功能,在此做个总结:

1.静态图片gif视频轮播:

我用的都是原生的插件,可以使用插件来做也行,反正android归根都是底层播放器mediaplayer来播放视频的,gif本身android不支持,所以用的插件,用的是pl.droidsonroids.gif.GifImageView来播放gif的,代码如下

前端代码是用的LinearLayout包裹的三个控件,默认显示imageView,将videoView和gifView隐藏,在控件里加上这句话android:visibility="gone,后端代码

@SuppressLint("NewApi")
public synchronized void startShuffling(String filepath,long sposition,long remain){//方法,第一个参数是文件位置,第二个第三个参数是同步用的,第二个参数是理论上计算出已经消耗的时间,第三个参数是剩下要播放的时间
  gifView1.setVisibility(View.GONE);
 videoView1.setVisibility(View.GONE);
 imageView1.setVisibility(ImageView.VISIBLE);
  String field="";
try{
field=filepath.substring(filepath.lastIndexOf(".")+1, filepath.length());//文件后缀
}catch(ArrayIndexOutOfBoundsException e){
e.printStackTrace();
advertArea.callBack(null);
return;
}

Integer determineType=determineType(field);//这个是计算后缀,看播放的是那种类型的资源,gif还是静态图片还是视频
  if(determineType==1){//静态图片
  gifView1.setVisibility(GifView.GONE);
  videoView1.setVisibility(View.GONE);
imageView1.setVisibility(View.VISIBLE);
  imageView1.setImageURI(Uri.parse(uurl));
  int time=(int)remain;//(int) (Long.parseLong(durationGuestCopy.get(i))-sposition);
  imageView1.postDelayed(new Runnable() {
@Override
public void run() {

//do something
advertArea.callBack(null);//进行切换资源的方法,用的是线程的lock();unlock()方法,可以用其他方法进行代替
}
}, time);
  }else if(determineType==2){//gif图片
  videoView1.setVisibility(View.GONE);
  imageView1.setVisibility(View.GONE);
     gifView1.setVisibility(GifView.VISIBLE);
byte[] bytes =getGifBytesByUrl(uurl);
  Movie mMovie = Movie.decodeByteArray(bytes, 0, bytes.length);
  int dur=mMovie.duration();//gif图片播放时间
  if(dur==0){//如果gif没有的话,默认设置为1秒
    dur=5000;
  }
gifView1.setImageURI(Uri.parse(uurl));

gifView1.postDelayed(new Runnable() {
@Override
public void run() {

//do something
advertArea.callBack(null);//进行切换资源的方法,用的是线程的lock();unlock()方法,可以用其他方法进行代替
}
}, time);

}else if(determineType==3){//视频
  gifView1.setVisibility(View.GONE);
  imageView1.setVisibility(View.GONE);
  videoView1.setVisibility(VideoView.VISIBLE);
  videoView1.setZOrderOnTop(true);
        videoView1.setVideoURI(Uri.parse(uurl));
        videoView1.requestFocus();//焦点
        videoShufflingPos=(int) sposition;

videoView1.setOnPreparedListener(new OnPreparedListener() {
  public void onPrepared(MediaPlayer mp) {
  mp.setVolume(0f, 0f);//将视频调成静音
  videoView1.seekTo(videoShufflingPos);//断点播放
  videoView1.start();
  }
  });
 
 
  videoView1.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
//do something
advertArea.callBack(null);
}
});
 
  videoView1.setOnErrorListener(new OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
System.out.println("what="+what+",extra="+extra);
System.out.println("视频非正常结束");
switch (what){  
       case MediaPlayer.MEDIA_ERROR_UNKNOWN:  
           System.out.println("发生未知错误");
           break;  
       case MediaPlayer.MEDIA_ERROR_SERVER_DIED:  
           System.out.println("媒体服务器死机");
           break;  
       default:  
           System.out.println("onError="+what);
           break;  
            }  
videoView1.resume();//用这句话,在视频控件发生error时可以恢复控件,防止视频控件死掉
advertArea.callBack(null);

return true;//出错时不会弹出提示框,友好显示
}
});
  }else if(determineType==0){
  //do something
    advertArea.callBack(null);

return;
     }
 }
  }

主要的代码就是这些,需要注意几点:

1.视频轮播经常切换视频会出现形如error (100, 0),AudioFlinger server died!,MediaMetadataRetriever server died!media server died这类错误,这类错误出现大概有以下几个原因:a.视频太短切换比较频繁,b.android rom包问题,这类问题,可以被onerror捕捉到,上面代码已经写了如何恢复这个错误,但是不能完全避免还是有点麻烦,如果实在捕捉不到的话,利用setDefaultUncaughtExceptionHandler来捕捉吧,这个是android代码里面捕捉不到的异常可以用它来捕获到,可以在里面写一点方法做处理

2.demo里面进行切换时会有些些黑屏问题,android是单控件,暂时没有找到解决方法,也可以用其他插件进行更换,或许会更好。

本人小白一枚,欢迎各位大神进行指正,不剩感激,(* ̄︶ ̄)

android 静态图片gif视频轮流播放相关推荐

  1. android 分享图片和视频

    今天,简单讲讲如何调用手机的分享功能进行分享. 目前实现一键分享功能的方式有两种: 1.需要集成第三方官方SDK包,在获得官方授权后调用其API来完成一键分享功能,例如使用友盟分享等     优点:无 ...

  2. YUVPlayer: 基于Android平台的YUV视频原始数据播放器

    基于Android平台的YUV视频原始数据播放器 编译环境 FFmpeg版本: 4.2.2 NDK版本:r17c 运行环境 x86(模拟器) arm64-v8a(64位手机) 功能点 从文件中读取YU ...

  3. android 静态图片自动切换,Android静态图片人脸识别的完整demo(附完整源码)

    Android静态图片人脸识别的完整demo(附完整源码) 来源:互联网 作者:佚名 时间:2015-03-24 20:07 本文介绍了android静态识别人脸并进行标记人眼位置及人脸框的完整dem ...

  4. android 录制图片、视频插入系统相册视频相册列表中,视频mediaPlayer静音和mediaPlayer恢复静音,SurfaceView+mediaplayer视频播放,自定义任意view显示

    video_duration = mediaPlayer.getDuration() / 1000 video_duration需要在prepare()监听中进行初始化 通知系统,将图片.视频更新到系 ...

  5. Android 实现图片、视频即时更新到相册

    照片更新到相册:                          用此方法即可.一行代码. sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_ ...

  6. 基于BP神经网络算法的实现静态图片和视频人脸识别、性别识别

    资源下载地址:https://download.csdn.net/download/sheziqiong/85772066 资源下载地址:https://download.csdn.net/downl ...

  7. android微信朋友圈视频无法播放,微信朋友圈不能分享手机视频怎么回事?微信朋友圈大视频功能安卓不能用吗?...

    微信朋友圈不能分享手机视频怎么回事?微信朋友圈大视频功能安卓不能用吗?最近微信更新,用户可以进行分享自己手机里的视频,这一举措受到很多人的喜欢.那么微信朋友圈不能分享手机视频怎么回事?微信朋友圈大视频 ...

  8. android 拍 上传视频无法播放,【报Bug】input type=file时无法使用相机拍摄视频

    详细问题描述 需要上传视频,使用input type=file,在浏览器环境可以调起摄像头拍摄视频 ,在安卓app使用webview加载该页面时,没有拍摄视频选项. [内容] 重现步骤 [步骤] ht ...

  9. android 静态图片initlogo.bmp的大小要求,xboot-开机logo.bmp图片到initlogo.rle切换 - Powered by Discuz!...

    本帖最后由 hanping1020911 于 2016-12-9 09:39 编辑 大家好,在修改android开机动画的时候,发现在开机logo.bmp图片到initlogo.rle切换之间会有一段 ...

最新文章

  1. 11kw星三角启动延时几秒_电机星三角降压启动原理图
  2. the job was canceled什么意思_什么第三人称单数形式?怎么用?
  3. 如何找tensorflow-gpu版本对应的cuda和cudnn
  4. c++ windows 蓝牙库_蓝牙翻页笔(PPT 控制器) | ESP32学习之旅-Arduino版
  5. sharepoint中使用xslt构建Spotlight(焦点图效果)
  6. HDOJ--2112--HDU Today
  7. 百度文库复制文字(一个按钮,关闭JS功能即可,浏览器100%有效)2021年
  8. Python做一个“盯盘机器人”,实时监控股票价格并通知你!
  9. 目前有哪些好用的测试管理工具?
  10. Java 试试多线程
  11. 前后端分离校园智能出行拼车系统
  12. 仿抖音短视频系统源码,android 时间戳转换
  13. 开发自己的操作系统(Hobby OS-deving)
  14. Android设置控件保持在软键盘上方
  15. 计算机配件及其参数,型号后缀看不懂 电脑核心硬件参数解读
  16. 神经网络与深度学习笔记汇总三
  17. SpringBoot 基础入门
  18. postgresql测试题_使用BenchmarkSQL测试PostgreSQL
  19. MPEG-7描述子(3)——颜色布局描述子CLD
  20. 深度强化学习控制移动机器人

热门文章

  1. 图灵奖公布!计算机图形学先驱Hanrahan和Catmull获奖,祝贺两位好莱坞3D动画大片技术元老...
  2. 手机端战争迷雾的实现
  3. 对中国商业银行前中后台分离的反思
  4. javaSwing布局
  5. 弘辽科技:直通车和引力魔方组合拳打赢翻身仗
  6. 一阶系统开环传递函数表达式_我理解的现代控制系统 第4部分-开环与闭环系统的区别...
  7. layui之 给checkbox添加点击事件
  8. 第七章 IR接收器应用
  9. 微信小程序:流量主制作生成装逼工具
  10. 2021-2027全球与中国电子卷纸分配器市场现状及未来发展趋势