1. 程式人生 > >Android 廣告視訊迴圈播放 & 快取 處理方案

Android 廣告視訊迴圈播放 & 快取 處理方案

基於Android系統的裝置上投放廣告視訊,比如:地鐵廣告屏、自助服務機器上的廣告位,取號機廣告等。

最近兩天做了一個叫號機端的系統,內部有一塊迴圈播放視訊廣告的處理,於是乎有了此篇小結

先來了解下視訊廣告的幾個的特點

一、網路視訊快取處理

二、迴圈播放功能

三、動態更新視訊廣告

四、時效性的保證

一、網路視訊快取處理

顯然不可能每次播放都去載入網路,太耗費流量,哪怕是WIFI 情況下,也需要快取起來。

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();// 監聽視訊一的播放完成事件,播放完畢就播放視訊二 遞迴 } //在播放錯誤的監聽回撥中也最好做上面監聽內的 操作,並且還要注意 在 onPause() 和 onResume() 回撥中處理視訊的停止和播放! }); }

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;
                        }
                    }
                });
            }
        });

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後拼接 起始或終止日期 即可。

按日期+時段更新:

綜合上面的日期區間、一天當中的時間區間來播放不同廣告:拼接 終止日期+時段的終止時間 即可。

實時更新:
如果要保證每次播放都是新的,可以拼接隨機數。

相關推薦

Android 廣告視訊迴圈播放 & 快取 處理方案

基於Android系統的裝置上投放廣告視訊,比如:地鐵廣告屏、自助服務機器上的廣告位,取號機廣告等。 最近兩天做了一個叫號機端的系統,內部有一塊迴圈播放視訊廣告的處理,於是乎有了此篇小結 先來了解下視訊廣告的幾個的特點 一、網路視訊快取處理 二、迴圈播放功能 三

Android多個視訊迴圈播放

這個功能應該有很多人做過,不過有些效果並不理想。 下面貼一個我自己的。 public List<VideoPathQuery> p_video_path = new ArrayList<VideoPathQuery>();//p_video_pat

騰訊視訊本地播放快取獲取方法

 方法如下: 1) 開啟騰訊視訊的快取資料夾:"選單/設定/快取設定",如 D:\8d8473176dffc4cd088dc749ed6ca71e\vodcache; 2) 按時間排序,找到時間與你播放時對應的那個資料夾(不知道就清空整個快取資料夾重新觀看一次想要儲

android 獲取視訊縮圖終極解決方案(ffmpeg)

前些天有個師弟(在做一個仿LinkInEyes行車記錄儀的app)問我怎麼獲取視訊縮圖,起初以為很簡單,就找了個常用的解決方案(使用者獲取正常的視訊檔案的縮圖): 方案1: private void initView() { imgPic = (

HTML5 video的多視訊迴圈播放

在做播放歷史視訊的時候,有連續播放視訊的需求,分享一下實現方法。 html程式碼: <div class="video">     <div class="container">     

基於UDP實現的android區域網視訊同步播放

前段時間給公司的專案實現了一個區域網視訊同步播放的功能,最近稍微空閒一些,所以稍微整理下,分享給大家學習下,文末附有下載地址。 一.概述 實現區域網視訊同步播放,首先需要這些裝置都有

Android鍵盤面板衝突 佈局閃動處理方案

這次主要是根據核心思想的實踐,實踐原理是通過CustomRootLayout佈局變化,來獲知是否是鍵盤引起的真正的佈局變化,進而處理到接下來PanelLayout的onMersure中。 新演算法不再動態修改View#LayoutParams,而是更加簡單明瞭的方式最新程式碼在原基礎上自動動態適配面

[小白裝逼]Android 語音錄製及播放處理---AudioH

AudioH Android 語音錄製及播放的處理,基於MediaPlayer(播放) 和MediaRecorder (錄製) 實現功能 1.實現Android語音錄製的功能(目前封裝只支援AMR格式); 2.實現Android語音播放功能(聽筒和揚

Android 實現視訊錄製播放

   實現類似微信的小視訊功能,可以錄製一個視訊然後播放該視訊。    視訊錄製,使用一個自定義控制元件。 <span style="font-size:14px;">/** * 視訊錄製控制元件 * * @author lip * * @date

分析Android-Universal-Image-Loader的快取處理機制

    最近看了UIL中的快取實現,才發現其實這個東西不難,沒有太多的程序排程,沒有各種記憶體讀取控制機制、沒有各種異常處理。反正UIL中不單程式碼寫的簡單,連處理都簡單。但是這個類庫這麼好用,又有這麼多人用,那麼非常有必要看看他是怎麼實現的。先了解UIL中快取流程的原理

Android-VideoView視訊播放視訊第一幀,迴圈播放,隱藏播放條、橫屏生命週期、快取問題)

大綱 * VideoView播放網路視訊、播放本地視訊 * 實現邊播邊快取 * 獲取視訊的第一幀圖片作為封面 * 實現類似朋友圈小視訊迴圈播放 * 隱藏播放條 * 互動,點選螢幕退出播放 * 解決橫屏生命週期重新載入的問題 * 載入時進度條的顯示與消失監聽 p

Android 實時視訊採集/編碼/傳輸/解碼/播放方案調研

實時視訊流採集 方案一:  通過Android Camera拍攝預覽中設定setPreviewCallback實現onPreviewFrame介面,實時擷取每一幀視訊流資料  方案二:  通過Android的MediaRecorder,在SetoutputFile函式中繫

android進階4step2:Android視訊處理——音視訊錄製與播放

錄音 MediaRecoder Android有一個內建的麥克風,通過它可以捕獲音訊和儲存,或在手機進行播放。 有很多方法可以做到這一點,但最常見的方法是通 過MediaRecorder類。 MediaRecoder常用方法 方法名 描述

android進階4step2:Android視訊處理——視訊播放

視訊播放 視訊播放的實現方式 1、使用系統中已安裝的播放器app 2、使用VideoView配合MediaController實現 (系統的控制鍵) 3、使用SurfaceView配合MediaPlayer實現(可自定義控制鍵,靈活度最高) 1、使用Int

android 多執行緒下載+GreenDao儲存狀態+ijkplayer播放快取後的視訊

今天我們要做的是一個多執行緒下載,然後用GreenDao去儲存多執行緒中的一些資訊.下載完成之後,利用IJKplayer播放我們快取好的視訊 該我上場表演啦,哈哈哈 第一步.匯入依賴 GreenDao: project的build.gradle中新增

android視訊指南-處理音訊輸出的變化

翻譯自Handling changes in audio output 使用者希望能夠控制音量的音訊應用。標準行為包括使用音量控制的能力(裝置上的按鈕或旋鈕或滑塊在UI中),並避免突然大聲播放如果外圍像耳機斷開連線時使用 使用音量控制 當用戶在遊戲或音樂應用程式中按下音量鍵時,音量應該會發生變

Android SurfaceView+MediaPlayer實現幾個不同的視訊輪流播放

MediaPlayer 1)如何獲得MediaPlayer例項: 可以使用直接new的方式: MediaPlayer mp = new MediaPlayer(); 也可以使用create的方式,如: MediaPlayer mp = MediaPlayer.create(t

記憶體佔用過高,快取不釋放導致宕機處理方案

故障現象: 1、某分行部署的某臺伺服器記憶體佔用過高,導致宕機; 2、程式碼層面檢查暫未發現問題,伺服器硬重啟持續一段時間後(3-5天)再次佔滿。 發現問題: 趕往現場後進行檢查,當時是一切正常的,今有DB2程序佔用18%,在正常範圍內; 在crontab 中發現有兩個指

Android 利用傳送Intent播放本地視訊和網路視訊 (轉載)

http://blog.sina.com.cn/s/blog_a000da9d01011y85.html Android中除了利用VideoView、Mediaplayer播放視訊檔案外,還可以用傳送Intent來呼叫視訊播放模組。   方法如下: &nb

Android MediaPlayer 視訊中的Audio部分的播放

本文轉自: http://blog.csdn.net/myzhzygh/article/details/7429687 1 Android多媒體框架結構 Android 多媒體系統縱向跨越了Android系統的所有4個層次: Java應用程式層、Java框架層、原生代