HarmonyOS三方件開發(fā)指南(16)-VideoCache 視頻緩存
引言
對于視頻播放器這個app大家都不陌生,在我們?nèi)粘I钪须S處可見,但對于用戶而言,最重要的就是如何能節(jié)約流量,使用簡單,觀看視頻流暢等體驗。對于Android VideoCache 在各大網(wǎng)站的學習文檔、教程已經(jīng)很多,而且層出不窮,但是對于鴻蒙來講,還是一個新的領域,因此,鴻蒙版的VideoCache 順勢而為,華麗的誕生了。
功能介紹
鴻蒙VideoCache視頻緩存組件,主要功能包括:視頻緩沖,在線播放視頻,邊下載邊緩存,緩沖進度和播放進度同時進行,拖動播放,橫豎屏切換,音量調(diào)節(jié)等主要功能。模擬機效果圖如下:
1.豎屏狀態(tài):
2.橫屏狀態(tài)
接下來得內(nèi)容就是重中之重,對于開發(fā)者來講,如何簡單并且快速的使用該VideoCache視頻緩存組件,這才是開發(fā)者最關注的問題。下面則詳細介紹VideoCache的使用以及開發(fā)指南。
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.在使用的地方初始化播放器,并調(diào)用代理服務將新生成的路徑傳入播放器,代碼如下:
- proxyUrl = BaseSlice.getProxy().getProxyUrl("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4");
- BaseSlice.getProxy().registerCacheListener(mCacheListener, proxyUrl);//緩存監(jiān)聽
- 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);
- //系統(tǒng)判斷
- 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();
- 1.
VideoCache開發(fā)指南
在上述中,已經(jīng)大概說了VideoCache 的功能點,視頻緩沖,在線播放視頻,邊下載邊緩存,緩沖進度和播放進度同時進行,拖動播放,橫豎屏切換,音量調(diào)節(jié)等主要功能,接下來一 一說明主要實現(xiàn)方法。
在視頻播放器中,最常見的就是緩沖進度條,進度條用戶可以很直觀的看到目前已經(jīng)緩沖的視頻有多少,緩沖了多長時間,進度條設置代碼如下:
progressBar.setMaxValue(100);
progressBar.setMinValue(0);
progressBar.setProgressValue(cacheProgress);
通過根據(jù)已經(jīng)緩沖的字節(jié),即可計算出cacheProgress
MaxValue 值不是固定的100,也可以按照視頻的時長、字節(jié)等設置,然后計算百分比即可,根據(jù)具體需求設計。
MinValue設置progress 的起始點,最初的起始點肯定是0,但是當視頻在播放中途,暫停,在開始的時候,則需要設置為暫停時的值,這樣不至于又回到0來觀看視頻。
最后,既然是視頻緩存組件,那么重中之重就是如何緩存,接下來重點介紹:
VideoCache主要通過代理策略將網(wǎng)絡請求代理到本地服務,本地在決定是從本地緩存拿數(shù)據(jù)還是發(fā)起網(wǎng)絡請求,如果發(fā)起網(wǎng)絡請求就先將數(shù)據(jù)寫入緩存,再從本地提供視頻數(shù)據(jù)給視頻播放器,參考下圖:
這樣就達到了邊播放邊緩存的策略。
具體步驟如下:
1.在項目的基類初始化一個全局的代理服務HttpProxyCacheServer,
2.生成緩存文件名,默認是使用的 MD5 方式生成 key,考慮到一些業(yè)務邏輯,我們也可以繼承一個 FileNameGenerator 來實現(xiàn)自己的策略,具體代碼如下:
3.本地代理實現(xiàn)策略,首先是構造一個本地127.0.0.1的ServerSocker,隨機分配了一個端口,然后啟動一個線程去執(zhí)行WaitRequestsRunnable,在這里面執(zhí)行 waitForRequest,通過 accept() 方法監(jiān)聽這個服務器 socket 的入站連接,accept() 方法會一直阻塞,直到有一個客戶端嘗試建立連接。
1. FileCache類
類中規(guī)定了緩存文件的命名格式(后加.download)和存儲的路徑,完成了緩存文件的創(chuàng)建。
2. Files類
此類是對JAVA中原有的File類的封裝,原File類僅可處理一個文件,F(xiàn)iles類可同時對多個文件進行處理。
如下代碼中,getLruListFiles()方法的參數(shù)是一個directory,在方法中對directory(文件夾路徑)下的所有文件進行拆分,返回了一個File參數(shù)類型的List列表,后續(xù)可對列表中的各個File文件進行處理。
3. LruDiskUsage類
此類主要用于控制緩存文件的大小,它與Videocache平行開了一個線程,實時記錄緩存文件的數(shù)量、大小、存儲空間等,超過預設的閾值時,執(zhí)行特定的優(yōu)化操作。
4. Md5FileNameGenerator類
此類實現(xiàn)了為輸入文件路徑,生成對應的MD5值的功能。MD5值是一種被"壓縮"的保密格式,可以確保信息完整傳輸。
5. TotalCountLruDiskUsage類、TotalSizeLruDiskUsage類和UnlimitedDiskUsage類
LruDiskUsage類是標題中前兩個類的父類,同時控制緩存文件的大小和數(shù)量,需要判斷當前緩存文件的(總大小 & 總數(shù)量)未超過閾值時,才會緩存新的文件。 TotalCountLruDiskUsage類和TotalSizeLruDiskUsage類分別只對緩存文件總數(shù)量或者緩存文件總大小進行限制,滿足一個條件便可以緩存新的文件。
TotalCountLruDiskUsage類和TotalSizeLruDiskUsage類各有兩個方法:一個方法用于設定緩存文件的閾值;一個方法用于判斷當前緩存數(shù)據(jù)是否超過了設定的閾值。
當不需要進行磁盤的緩存限制時使用UnlimitedDiskUsage類,其本身是一個空的類,不對緩存文件的數(shù)量和大小做任何限制。
更多原創(chuàng),請關注"軟通動力HarmonyOS學院https://harmonyos.51cto.com/column/30