thisfeng

有为,有不为,知足,知不足

Android 广告视频循环播放 & 缓存 处理方案

基于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

三、动态更新广告

方式有很多如:

1、接收推送时候重新做请求

2、定时轮询或者指定时间请求最新,要想保证时效性可在的链接地址后面做 日期截取处理判断

四、时效性的保证

广告需要定时更新,我们可以通过动态url来达到实时更新缓存内容的目的,至于更新的频率,就看怎么拼接url了。

按天更新:

如果是按日期来更新广告,可以在图片、视频的url后面加上“年月日”,这样的话,就保证了url每日一变,而缓存框架只会在当天第一次加载时拉取数据,后面就直接从本地缓存加载数据了。而之前缓存的内容则会被自动清理掉。

按时段更新:

如果是按照一天当中的不同时段来更换播放的广告,则应该先从服务器拉取有什么时段,然后根据当前时间处于那个时段之间,在url后拼接 时段的开始或结束时间 即可。

按日期区间更新:

如果是按照日期跨度来更新,比如说2017/01/01~2017/02/03号播放某几个视频。其实这只不过是大概念的时段播放而已,同理,我们先从服务器查询出当前日期处于哪些视频的播放时段之间,然后在url后拼接 起始或终止日期 即可。

按日期+时段更新:

综合上面的日期区间、一天当中的时间区间来播放不同广告:拼接 终止日期+时段的终止时间 即可。

实时更新:
如果要保证每次播放都是新的,可以拼接随机数。

时效性保证参考 http://www.cnblogs.com/ygj0930/p/7742996.html

阅读更多
版权声明:本文为博主原创文章,需转载请备名出处即可。 https://blog.csdn.net/a23006239/article/details/80693949
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭