目錄:
引言
對於視訊播放器這個app大家都不陌生,在我們日常生活中隨處可見,但對於使用者而言,最重要的就是如何能節約流量,使用簡單,觀看視訊流暢等體驗。對於Android VideoCache 在各大網站的學習文件、教程已經很多,而且層出不窮,但是對於鴻蒙來講,還是一個新的領域,因此,鴻蒙版的VideoCache 順勢而為,華麗的誕生了。
功能介紹
鴻蒙VideoCache視訊快取元件,主要功能包括:視訊緩衝,線上播放視訊,邊下載邊快取,緩衝進度和播放進度同時進行,拖動播放,橫豎屏切換,音量調節等主要功能。模擬機效果圖如下:
1.豎屏狀態:
2.橫屏狀態
接下來得內容就是重中之重,對於開發者來講,如何簡單並且快速的使用該VideoCache視訊快取元件,這才是開發者最關注的問題。下面則詳細介紹VideoCache的使用以及開發指南。
VideoCache使用指南
Ø 新建工程, 新增元件Har包依賴
在應用模組中新增HAR,只需要將videocachelibrary-debug.har複製到entry\libs目錄下即可
Ø 修改配置檔案
1. 在entry下面的build.gradle新增library 的依賴,如圖所示:
1. 修改程式碼中的配置:
a. 在基類中例項化代理服務,核心程式碼如下:
httpProxyCacheServer =
new HttpProxyCacheServer.Builder(theApplication).headerInjector(new UserAgentHeadersInjector())
.maxCacheSize(1024 * 1024 * 1024)// 1 Gb for cache
.singleFileBandwidth(600)//單位KB,https需要1.5倍左右
.build();
b.在使用的地方初始化播放器,並呼叫代理服務將新生成的路徑傳入播放器,程式碼如下:
proxyUrl = BaseSlice.getProxy().getProxyUrl("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4");
BaseSlice.getProxy().registerCacheListener(mCacheListener, proxyUrl);//快取監聽
playerVideo = new PlayerVideo(this, proxyUrl, this, layout);
playerVideo.setDisplayMath(0, 1000);
c.其他相關設定方法,程式碼如下:
* 設定播放器的寬高
dependentLayout.setWidth(width);
dependentLayout.setHeight(height);
或者:
dependentLayout.setWidth(ComponentContainer.LayoutConfig.MATCH_PARENT);
dependentLayout.setHeight(ComponentContainer.LayoutConfig.MATCH_PARENT);
* 設定播放器的橫豎屏
//橫屏
abilitySlice.getAbility().setDisplayOrientation(AbilityInfo.DisplayOrientation.LANDSCAPE);
//豎屏
abilitySlice.getAbility().setDisplayOrientation(AbilityInfo.DisplayOrientation.PORTRAIT);
//系統判斷
abilitySlice.getAbility().setDisplayOrientation(AbilityInfo.DisplayOrientation.UNSPECIFIED);
//跟隨棧中應用
abilitySlice.getAbility().setDisplayOrientation(AbilityInfo.DisplayOrientation.FOLLOWRECENT);
* 初始化播放器
player = new Player(context);
surfaceProvider.pinToZTop(false);
java.util.Optional<ohos.agp.graphics.SurfaceOps> optional = surfaceProvider.getSurfaceOps();
SurfaceOps surfaceOps = optional.get();
surfaceOps.addCallback(new VideoSurfaceCallback(surfaceOps, loadUrl,
player, this
));
* 播放方法
player.play();
* 暫停播放方法
player.pause();
VideoCache開發指南
在上述中,已經大概說了VideoCache 的功能點,視訊緩衝,線上播放視訊,邊下載邊快取,緩衝進度和播放進度同時進行,拖動播放,橫豎屏切換,音量調節等主要功能,接下來一 一說明主要實現方法。
在視訊播放器中,最常見的就是緩衝進度條,進度條使用者可以很直觀的看到目前已經緩衝的視訊有多少,緩衝了多長時間,進度條設定程式碼如下:
progressBar.setMaxValue(100);
progressBar.setMinValue(0);
progressBar.setProgressValue(cacheProgress);
通過根據已經緩衝的位元組,即可計算出cacheProgress
MaxValue 值不是固定的100,也可以按照視訊的時長、位元組等設定,然後計算百分比即可,根據具體需求設計。
MinValue設定progress 的起始點,最初的起始點肯定是0,但是當視訊在播放中途,暫停,在開始的時候,則需要設定為暫停時的值,這樣不至於又回到0來觀看視訊。
最後,既然是視訊快取元件,那麼重中之重就是如何快取,接下來重點介紹
VideoCache主要通過代理策略將網路請求代理到本地服務,本地在決定是從本地快取拿資料還是發起網路請求,如果發起網路請求就先將資料寫入快取,再從本地提供視訊資料給視訊播放器,參考下圖
這樣就達到了邊播放邊快取的策略。
具體步驟如下:
1.在專案的基類初始化一個全域性的代理服務HttpProxyCacheServer,
2.生成快取檔名,預設是使用的 MD5 方式生成 key,考慮到一些業務邏輯,我們也可以繼承一個 FileNameGenerator 來實現自己的策略,具體程式碼如下:
3.本地代理實現策略,首先是構造一個本地127.0.0.1的ServerSocker,隨機分配了一個埠,然後啟動一個執行緒去執行WaitRequestsRunnable,在這裡面執行 waitForRequest,通過 accept() 方法監聽這個伺服器 socket 的入站連線,accept() 方法會一直阻塞,直到有一個客戶端嘗試建立連線。
1. FileCache類
類中規定了快取檔案的命名格式(後加.download)和儲存的路徑,完成了快取檔案的建立。
2. Files類
此類是對JAVA中原有的File類的封裝,原File類僅可處理一個檔案,Files類可同時對多個檔案進行處理。
如下程式碼中,getLruListFiles()方法的引數是一個directory,在方法中對directory(資料夾路徑)下的所有檔案進行拆分,返回了一個File引數型別的List列表,後續可對列表中的各個File檔案進行處理。
3. LruDiskUsage類
此類主要用於控制快取檔案的大小,它與Videocache平行開了一個執行緒,實時記錄快取檔案的數量、大小、儲存空間等,超過預設的閾值時,執行特定的優化操作。
4. Md5FileNameGenerator類
此類實現了為輸入檔案路徑,生成對應的MD5值的功能。MD5值是一種被"壓縮"的保密格式,可以確保資訊完整傳輸。
5. TotalCountLruDiskUsage類、TotalSizeLruDiskUsage類和UnlimitedDiskUsage類
LruDiskUsage類是標題中前兩個類的父類,同時控制快取檔案的大小和數量,需要判斷當前快取檔案的(總大小 & 總數量)未超過閾值時,才會快取新的檔案。 TotalCountLruDiskUsage類和TotalSizeLruDiskUsage類分別只對快取檔案總數量或者快取檔案總大小進行限制,滿足一個條件便可以快取新的檔案。
TotalCountLruDiskUsage類和TotalSizeLruDiskUsage類各有兩個方法:一個方法用於設定快取檔案的閾值;一個方法用於判斷當前快取資料是否超過了設定的閾值。
當不需要進行磁碟的快取限制時使用UnlimitedDiskUsage類,其本身是一個空的類,不對快取檔案的數量和大小做任何限制。
更多原創,請關注"軟通動力HarmonyOS學院https://harmonyos.51cto.com/column/30
作者:軟通田可輝
想了解更多內容,請訪問51CTO和華為合作共建的鴻蒙社群:harmonyos.51cto.com