美文网首页Android零散知识
Android 广告视频循环播放 & 缓存 处理方案

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

作者: thisfeng | 来源:发表于2018-06-14 15:39 被阅读98次

    基于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后拼接 起始或终止日期 即可。

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

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

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

    相关文章

      网友评论

        本文标题:Android 广告视频循环播放 & 缓存 处理方案

        本文链接:https://www.haomeiwen.com/subject/dzsyeftx.html