android 静态图片gif视频轮流播放
最近做了一个关于广告视频的项目,双屏异显,并且在数千台广告屏上运行这个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视频轮流播放相关推荐
- android 分享图片和视频
今天,简单讲讲如何调用手机的分享功能进行分享. 目前实现一键分享功能的方式有两种: 1.需要集成第三方官方SDK包,在获得官方授权后调用其API来完成一键分享功能,例如使用友盟分享等 优点:无 ...
- YUVPlayer: 基于Android平台的YUV视频原始数据播放器
基于Android平台的YUV视频原始数据播放器 编译环境 FFmpeg版本: 4.2.2 NDK版本:r17c 运行环境 x86(模拟器) arm64-v8a(64位手机) 功能点 从文件中读取YU ...
- android 静态图片自动切换,Android静态图片人脸识别的完整demo(附完整源码)
Android静态图片人脸识别的完整demo(附完整源码) 来源:互联网 作者:佚名 时间:2015-03-24 20:07 本文介绍了android静态识别人脸并进行标记人眼位置及人脸框的完整dem ...
- android 录制图片、视频插入系统相册视频相册列表中,视频mediaPlayer静音和mediaPlayer恢复静音,SurfaceView+mediaplayer视频播放,自定义任意view显示
video_duration = mediaPlayer.getDuration() / 1000 video_duration需要在prepare()监听中进行初始化 通知系统,将图片.视频更新到系 ...
- Android 实现图片、视频即时更新到相册
照片更新到相册: 用此方法即可.一行代码. sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_ ...
- 基于BP神经网络算法的实现静态图片和视频人脸识别、性别识别
资源下载地址:https://download.csdn.net/download/sheziqiong/85772066 资源下载地址:https://download.csdn.net/downl ...
- android微信朋友圈视频无法播放,微信朋友圈不能分享手机视频怎么回事?微信朋友圈大视频功能安卓不能用吗?...
微信朋友圈不能分享手机视频怎么回事?微信朋友圈大视频功能安卓不能用吗?最近微信更新,用户可以进行分享自己手机里的视频,这一举措受到很多人的喜欢.那么微信朋友圈不能分享手机视频怎么回事?微信朋友圈大视频 ...
- android 拍 上传视频无法播放,【报Bug】input type=file时无法使用相机拍摄视频
详细问题描述 需要上传视频,使用input type=file,在浏览器环境可以调起摄像头拍摄视频 ,在安卓app使用webview加载该页面时,没有拍摄视频选项. [内容] 重现步骤 [步骤] ht ...
- android 静态图片initlogo.bmp的大小要求,xboot-开机logo.bmp图片到initlogo.rle切换 - Powered by Discuz!...
本帖最后由 hanping1020911 于 2016-12-9 09:39 编辑 大家好,在修改android开机动画的时候,发现在开机logo.bmp图片到initlogo.rle切换之间会有一段 ...
最新文章
- 11kw星三角启动延时几秒_电机星三角降压启动原理图
- the job was canceled什么意思_什么第三人称单数形式?怎么用?
- 如何找tensorflow-gpu版本对应的cuda和cudnn
- c++ windows 蓝牙库_蓝牙翻页笔(PPT 控制器) | ESP32学习之旅-Arduino版
- sharepoint中使用xslt构建Spotlight(焦点图效果)
- HDOJ--2112--HDU Today
- 百度文库复制文字(一个按钮,关闭JS功能即可,浏览器100%有效)2021年
- Python做一个“盯盘机器人”,实时监控股票价格并通知你!
- 目前有哪些好用的测试管理工具?
- Java 试试多线程
- 前后端分离校园智能出行拼车系统
- 仿抖音短视频系统源码,android 时间戳转换
- 开发自己的操作系统(Hobby OS-deving)
- Android设置控件保持在软键盘上方
- 计算机配件及其参数,型号后缀看不懂 电脑核心硬件参数解读
- 神经网络与深度学习笔记汇总三
- SpringBoot 基础入门
- postgresql测试题_使用BenchmarkSQL测试PostgreSQL
- MPEG-7描述子(3)——颜色布局描述子CLD
- 深度强化学习控制移动机器人