基于Android系统的设备上投放广告视频,比如:地铁广告屏、自助服务机器上的广告位,取号机广告等。
最近两天做了一个叫号机端的系统,内部有一块循环播放视频广告的处理,于是乎有了此篇小结
先来了解下视频广告的几个的特点
一、网络视频缓存处理
二、循环播放功能
三、动态更新视频广告
四、时效性的保证
一、网络视频缓存处理
显然不可能每次播放都去加载网络,太耗费流量,哪怕是WIFI 情况下,也需要缓存起来。
这里可以使用通过第三方框架 AndroidVideoCache
1、添加依赖
implementation 'com.danikula:videocache:2.7.0’
2、初始化代理配置
public static HttpProxyCacheServer proxy; //視頻緩存代理
//創建视频播放緩存代理
proxy = new HttpProxyCacheServer.Builder(this)
.maxCacheSize(1024 * 1024 * 1024) //1Gb 緩存
.maxCacheFilesCount(5)//最大緩存5個視頻
.build();
二、循环处理 根据多个视频的数量,使用 取模的方式 进行递归调用
核心代码
public void playVideoOne() {
int urlSize = urlList.size();
index = index % urlSize;
MediaController mediaController = new MediaController(getThis());
//缓存起来这个 url 视频 提供缓存文件的名称默认情况下,AndroidVideoCache使用视频网址的MD5作为文件名
// String proxyUrl = App.proxy.getProxyUrl("[http://jzvd.nathen.cn/63f3f73712544394be981d9e4f56b612/69c5767bb9e54156b5b60a1b6edeb3b5-5287d2089db37e62345123a1be272f8b.mp4](http://jzvd.nathen.cn/63f3f73712544394be981d9e4f56b612/69c5767bb9e54156b5b60a1b6edeb3b5-5287d2089db37e62345123a1be272f8b.mp4)");
String proxyUrl = App.proxy.getProxyUrl(urlList.get(index));
videoView.setMediaController(mediaController);//如果设置Controller 点击时会有可交互模式,暂停快进或快退;不设置的话更适用于广告,不可交互,只进行展示
videoView.setVideoPath(proxyUrl); //為videoview設置播放路徑
videoView.start();
videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mPlayer) {
// mPlayer.start();
// //循环播放
// mPlayer.setLooping(true);
index++;
playVideoOne();// 監聽視頻一的播放完成事件,播放完畢就播放視頻二 递归
}
});
}
TIps:
1、如果是单个视频进行循环播放可在
videoView.setOnPreparedListener();
videoView.setOnCompletionListener();
//这两个方法回调中调用 ,均可达到循环播放单一视频的效果,建议写在 onCompletion 之后
mPlayer.start();
//循环播放
mPlayer.setLooping(true);
2、播放网络地址 Api
videoView.setVideoURI(Uri.parse("xxx"));//也可以达到播放网络视频的效果,
因为videoView.setVideoPath 内部调用的就是 videoView.setVideoURI
3、Xml 使用VideoView展示
<VideoView
android:id="@+id/videoView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
4、播放异常时候对VideoView 的处理
videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
videoView.stopPlayback(); //播放異常,則停止播放,防止彈窗使界面阻塞
return true;
}
});
5、关于 ViewView 的暂停和继续从上一次的位置进行播放
在OnPause你可以得到当前的位置。
stopLength=mVideoView.getCurrentPosition();
mVideoView.pause()
在OnResume()中使用。
mVideoView.seekTo(stopLength);
mVideoView.start()
如果给 ViedeView 设置 setVisibility GONE 隐藏的话,使用上面的方式进行恢复播放 则会从头开始播放!
场景:
根据一个远程服务器端的通知,在广告机上正在播放视频时 切换展示一个通知页面覆盖正在播放的视频区域。
解决方案:
可以使用 重叠布局「FrameLayout」的方式,ViedoView 放在图层底部,一直播放。动态控制 VideoView 上面的通知页面 隐藏展示。可直接不需要对VieoView 做暂停和恢复的操作。 当然你也可以处理暂停再继续播放。记得不允许给ViedeView设置隐藏!
6、调用 seekTo 方法跳转不准的问题
在seekTo完成的监听方法中再执行 VideoView.start();
// 设置 VideoView 的 OnPrepared 监听,拿到 MediaPlayer 对象。
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
//设置 MediaPlayer 的 OnSeekComplete 监听
mp.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
@Override
public void onSeekComplete(MediaPlayer mp) {
// seekTo 方法完成时的回调
if(isPause){
videoView.start();
isPause = false;
}
}
});
}
});
可参考 https://www.jianshu.com/p/f51b2febcfd2
7、视频切换在后台之后再次进入页面重新播放处理
/**
* 在onResume()方法控制视频继续播放
*/
@Override
protected void onResume() {
super.onResume();
if (videoView != null) {
videoView.seekTo(videoCurrentPosition);
videoView.start();
}
}
/**
* onPause() 控制视频暂停播放
*/
@Override
protected void onPause() {
super.onPause();
if (videoView != null) {
videoCurrentPosition = videoView.getCurrentPosition();
videoView.pause();
}
}
三、动态更新广告
方式有很多
1、接收推送时候重新做请求
2、定时轮询或者指定时间请求最新,要想保证时效性可在的链接地址后面做 日期截取处理判断
四、时效性的保证
广告需要定时更新,我们可以通过动态url来达到实时更新缓存内容的目的,至于更新的频率,就看怎么拼接url了。
按天更新:如果是按日期来更新广告,可以在图片、视频的url后面加上“年月日”,这样的话,就保证了url每日一变,而缓存框架只会在当天第一次加载时拉取数据,后面就直接从本地缓存加载数据了。而之前缓存的内容则会被自动清理掉。
按时段更新:如果是按照一天当中的不同时段来更换播放的广告,则应该先从服务器拉取有什么时段,然后根据当前时间处于那个时段之间,在url后拼接 时段的开始或结束时间 即可。
按日期区间更新:如果是按照日期跨度来更新,比如说2017/01/01~2017/02/03号播放某几个视频。其实这只不过是大概念的时段播放而已,同理,我们先从服务器查询出当前日期处于哪些视频的播放时段之间,然后在url后拼接 起始或终止日期 即可。
按日期+时段更新:综合上面的日期区间、一天当中的时间区间来播放不同广告:拼接 终止日期+时段的终止时间 即可。
实时更新:如果要保证每次播放都是新的,可以拼接随机数。
网友评论