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框架層、原生代