純血鴻蒙APP實戰開發——邊緩存邊播放案例

介紹

OhosVideoCache是一個支持邊播放邊緩存的庫,只需要將音視頻的url傳遞給OhosVideoCache處理之后再設置給播放器,
OhosVideoCache就可以一邊下載音視頻數據并保存在本地,一邊讀取本地緩存返回給播放器,使用者無需進行其他操作。

效果圖預覽

使用說明

  1. 進入頁面,自動播放視頻,點擊暫停,視頻停止播放,點擊播放,視頻繼續播放。
  2. 視頻播放完成之后,點擊播放按鈕,視頻重新播放。

實現思路

邊緩存播放功能主要是通過Xcomponent組件、@ohos.multimedia.media以及OhosVideoCache三方庫實現,XComponent組件主要用于繪制
視頻播放的窗口,頁面進來初始化服務器然后利用XComponent組件的onLoad函數來調用VideoPlayerManager
中的initPlayer方法創建一個音視頻管理實例,并通過setAVPlayerCallback函數和cacheAndPlayVideo函數來實現視頻狀態的監聽以及邊緩存邊播放功能。

  1. XComponent組件繪制視頻播放窗口。源碼參考VideoCacheView.ets。
XComponent({id: 'xcomponent',type: 'surface',controller: this.componentController
}).height(`${this.xComponentHeight}px`).width(`${this.xComponentWidth}px`).onLoad(() => {// 設置XComponent持有Surface的寬度和高度this.componentController.setXComponentSurfaceSize({surfaceWidth: SURFACE_WIDTH,surfaceHeight: SURFACE_HEIGHT});this.surfaceId = this.componentController.getXComponentSurfaceId();// 創建音視頻播放實例AvPlayManager.getInstance().initPlayer(getContext(this) as common.UIAbilityContext, this.surfaceId, (avPlayer: media.AVPlayer) => {avPlayer.on('timeUpdate', (time: number) => {this.currentTime = time;});this.videoDuration = handleTime(avPlayer.duration);this.total = avPlayer.duration;})})
  1. 初始化代理服務器,頁面一進來需要使用setServer方法來初始化代理服務器,以便后續調用此服務器處理url。源碼參考GlobalProxyServer.ets
import common from '@ohos.app.ability.common';
import { HttpProxyCacheServer } from '@ohos/video-cache';const CONTEXT_STR: string = 'context';
const SERVER_STR: string = 'server';export default class GlobalProxyServer {private static instance: GlobalProxyServer | null = null;private objects: Map<string, Object | null> = new Map<string, Object | null>();public static getInstance(): GlobalProxyServer {if (!GlobalProxyServer.instance) {GlobalProxyServer.instance = new GlobalProxyServer();}return GlobalProxyServer.instance;}/*** 獲取上下文信息* @returns*/getContext(): common.UIAbilityContext {return this.objects.get(CONTEXT_STR) as common.UIAbilityContext;}/*** 設置上下文信息* @param context*/setContext(context: common.UIAbilityContext): void {this.objects.set(CONTEXT_STR, context);}/*** 獲取服務器* @returns*/getServer(): HttpProxyCacheServer {return this.objects.get(SERVER_STR) as HttpProxyCacheServer;}/*** 設置服務器* @param objectClass*/setServer(objectClass: HttpProxyCacheServer): void {try {const currentServer: HttpProxyCacheServer = this.getServer();currentServer.shutdown();} catch (err) {}this.objects.set(SERVER_STR, objectClass);}
}
  1. media.createAVPlayer()創建播放管理類,用于管理和播放媒體資源。源碼參考VideoPlayerManager.ets
  async initPlayer(context: common.UIAbilityContext, surfaceId: string,callback: (avPlayer: media.AVPlayer) => void): Promise<void> {logger.info(TAG, `initPlayer==initCamera surfaceId== ${surfaceId}`);this.surfaceID = surfaceId;try {// 創建avPlayer實例對象this.avPlayer = await media.createAVPlayer();// 創建狀態機變化回調函數await this.setAVPlayerCallback(callback);// 邊緩存邊播放this.cacheAndPlayVideo(context);} catch (err) {logger.error(TAG, `initPlayer initPlayer err:${JSON.stringify(err)}`);}}
  1. 邊播放邊緩存,MyCacheListener監聽緩存進度,getProxyUrl(ORIGIN_URL)獲取視頻播放地址并設置給播放器。源碼參考VideoPlayerManager.ets
 /*** 邊緩存邊監聽函數* @param context 上下文信息* @returns*/async cacheAndPlayVideo(context: common.UIAbilityContext): Promise<void> {logger.info(TAG, `cacheAndPlayVideo start`);// TODO:知識點:監聽緩存進度class MyCacheListener implements CacheListener {onCacheAvailable(cacheFilePath: string, url: string, percentsAvailable: number): void {AppStorage.setOrCreate('currentCachePercent', percentsAvailable);}}GlobalProxyServer?.getInstance()?.getServer()?.registerCacheListener(new MyCacheListener(), ORIGIN_URL);// TODO:知識點:將原始的音視頻url交給OhosVideoCachelet proxyUrl: string | undefined = await GlobalProxyServer?.getInstance()?.getServer()?.getProxyUrl(ORIGIN_URL);// 由于avplayer不支持直接加載本地文件路徑 這里需要轉化為fd的路徑if (proxyUrl.startsWith(context.cacheDir)) {const file = fs.openSync(proxyUrl, fs.OpenMode.READ_ONLY);proxyUrl = `fd://${file.fd}`;}logger.info(TAG, `proxyUrl ${proxyUrl}`);// 將處理之后的url設置給播放器this.avPlayer.url = proxyUrl;}

高性能知識點

不涉及。

工程結構&模塊類型

videocache                                         // har類型
|---model
|   |---GlobalProxyServer.ets                      // 模型層-服務器管理
|   |---VideoPlayerManager.ets                     // 模型層-音視頻管理
|---utils
|   |---utils.ets                                  // 工具
|---view
|   |---VideoCacheView.ets                         // 視圖層-應用主頁面

模塊依賴

本實例依賴common模塊來實現日志的打印、資源
的調用、動態路由模塊來實現頁面的動態加載以及video-cache,版本為1.0.0。

參考資料

音視頻管理

鴻蒙全棧開發全新學習指南

為了讓大家都能學習到鴻蒙開發最新的技術,針對一些在職人員、0基礎小白、應屆生/計算機專業、鴻蒙愛好者等人群,整理了一套純血版鴻蒙(HarmonyOS Next)全棧開發技術的學習路線【包含了大廠APP實戰項目開發】

本路線共分為四個階段:

第一階段:鴻蒙初中級開發必備技能

在這里插入圖片描述

第二階段:鴻蒙南北雙向高工技能基礎:gitee.com/MNxiaona/733GH

第三階段:應用開發中高級就業技術

第四階段:全網首發-工業級南向設備開發就業技術:gitee.com/MNxiaona/733GH

《鴻蒙 (Harmony OS)開發學習手冊》(共計892頁)

如何快速入門?

1.基本概念
2.構建第一個ArkTS應用
3.……

開發基礎知識:gitee.com/MNxiaona/733GH

1.應用基礎知識
2.配置文件
3.應用數據管理
4.應用安全管理
5.應用隱私保護
6.三方應用調用管控機制
7.資源分類與訪問
8.學習ArkTS語言
9.……

基于ArkTS 開發

1.Ability開發
2.UI開發
3.公共事件與通知
4.窗口管理
5.媒體
6.安全
7.網絡與鏈接
8.電話服務
9.數據管理
10.后臺任務(Background Task)管理
11.設備管理
12.設備使用信息統計
13.DFX
14.國際化開發
15.折疊屏系列
16.……

鴻蒙開發面試真題(含參考答案):gitee.com/MNxiaona/733GH

鴻蒙入門教學視頻:

美團APP實戰開發教學:gitee.com/MNxiaona/733GH

寫在最后

  • 如果你覺得這篇內容對你還蠻有幫助,我想邀請你幫我三個小忙:
  • 點贊,轉發,有你們的 『點贊和評論』,才是我創造的動力。
  • 關注小編,同時可以期待后續文章ing🚀,不定期分享原創知識。
  • 想要獲取更多完整鴻蒙最新學習資源,請移步前往小編:gitee.com/MNxiaona/733GH

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/13820.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13820.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13820.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

NDIS小端口驅動(五)

在需要的時候&#xff0c;我們也許需要NDIS微型端口程序信息&#xff0c;下面會從多個方面來討論如何查詢NDIS微型端口驅動。 查詢無連接微型端口驅動程序 若要查詢無連接微型端口驅動程序維護的 OID&#xff0c;綁定協議調用 NdisOidRequest 并傳遞 一個NDIS_OID_REQUEST 結…

Mac 安裝 git

文章目錄 前言一、介紹二、下載三、驗證四、配置五、Git常用命令六、git提交和撤銷工作流程代碼提交和提交同步代碼撤銷和撤銷同步 FAQ1.homebrew 下載解決方法一&#xff08;強烈推薦&#xff09;&#xff1a;解決方法二&#xff1a; 總結 前言 Git 是一個開源的分布式版本控…

Java - Stream流式編程

Stream流式操作 Stream流式操作&#xff0c;就是學習java.util.stream包下的API&#xff0c;Stream不同于java的輸入輸出流&#xff0c;是實現對集合&#xff08;Collection&#xff09;的復雜操作&#xff0c;例如查找、替換、過濾和映射數據等&#xff0c;集合是一種靜態的數…

LeetCode547省份數量

題目描述 有 n 個城市&#xff0c;其中一些彼此相連&#xff0c;另一些沒有相連。如果城市 a 與城市 b 直接相連&#xff0c;且城市 b 與城市 c 直接相連&#xff0c;那么城市 a 與城市 c 間接相連。省份 是一組直接或間接相連的城市&#xff0c;組內不含其他沒有相連的城市。給…

第十一章 文件及IO操作

第十一章 文件及IO操作 文件的概述及基本操作步驟 文件&#xff1a; 存儲在計算機的存儲設備中的一組數據序列就是文件不同類型的文件通過后綴名進行區分 文本文件&#xff1a;由于編碼格式的不同&#xff0c;所占磁盤空間的字節數不同(例如GBK編碼格式中一個中文字符占2字…

cesium繪制三角網可視化及mesh網格數據解析

可視化運行效果(水質污染擴散) 實現運行效果 術語 Mesh網格數據解析 Mesh&#xff08;網格&#xff09;在不同領域有不同的應用和定義。在計算機網絡中&#xff0c;Mesh網絡指的是一種無中心的網狀結構&#xff0c;每個節點都與其他節點相連。而在3D計算機圖形學中&#…

云原生Kubernetes: K8S 1.26版本 部署KubeSphere

目錄 一、實驗 1.環境 2.K8S 1.26版本部署HELM 3.K8S 1.26版本 部署KubeSphere 4.安裝KubeSphere DevOps 二、問題 1.如何安裝Zadig 2.擴展插件Zadig安裝失敗 3.calico 如何實現不同node通信 4.如何清除docker占用的磁盤空間 5.如何強制刪除資源 6.namespace刪除不…

CGAL 點云生成高程模型數據(DSM)

點云生成高程模型 一、什么是DSM?二、C++代碼三、結果可視化一、什么是DSM? DSM(Digital Surface Model)是一種數字高程模型,通常用于描述地表地形的數字化表示。它是由一系列離散的高程數據點組成的三維地形模型,其中每個點都具有其相應的高程值。 ??DSM主要用于獲取和…

宿舍管理系統--畢業設計

畢業設計&#x1f4bc;MD5加密&#x1f512;SSM框架&#x1f3a8;Layui框架&#x1f384; 實現功能 管理員的登錄與登出 管理員,班級,學生,宿舍&#xff0c;衛生&#xff0c;訪客各模塊增刪改查 個別模塊關聯查詢 各個模塊數據導出Excel 一些截圖

[4]CUDA中的向量計算與并行通信模式

CUDA中的向量計算與并行通信模式 本節開始&#xff0c;我們將利用GPU的并行能力&#xff0c;對其執行向量和數組操作討論每個通信模式&#xff0c;將幫助你識別通信模式相關的應用程序&#xff0c;以及如何編寫代碼 1.兩個向量加法程序 先寫一個通過cpu實現向量加法的程序如…

軟件設計:基于 python 代碼快速生成 UML 圖

1. 官方文檔 PlantUML Language Reference Guide Comate | 百度研發編碼助手 百度 Comate (Coding Mate Powered by AI) 是基于文心大模型的智能代碼助手&#xff0c;結合百度積累多年的編程現場大數據和外部優秀開源數據&#xff0c;可以生成更符合實際研發場景的優質代碼。…

自動化測試里的數據驅動和關鍵字驅動思路的理解

&#x1f345; 視頻學習&#xff1a;文末有免費的配套視頻可觀看 &#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 初次接觸自動化測試時&#xff0c;對數據驅動和關鍵字驅動不甚理解&#xff0c;覺得有點故弄玄須…

GBDT、XGBoost、LightGBM算法詳解

文章目錄 一、GBDT (Gradient Boosting Decision Tree) 梯度提升決策樹1.1 回歸樹1.2 梯度提升樹1.3 Shrinkage1.4 調參1.5 GBDT的適用范圍1.6 優缺點 二、XGBoost (eXtreme Gradient Boosting)2.1 損失函數2.2 正則項2.3 打分函數計算2.4 分裂節點2.5 算法過程2.6 參數詳解2.7…

oracle中insert all的用法

1、簡述 使用insert into語句進行表數據行的插入&#xff0c;但是oracle中有一個更好的實現方式&#xff1a;使用insert all語句。 insert all語句是oracle中用于批量寫數據的 。insert all分又為 無判斷條件插入有判斷條件插入有判斷條件插入分為 Insert all when... 子句 …

利用 MongoDB Atlas 進行大模型語義搜索和RAG

節前&#xff0c;我們星球組織了一場算法崗技術&面試討論會&#xff0c;邀請了一些互聯網大廠朋友、參加社招和校招面試的同學. 針對算法崗技術趨勢、大模型落地項目經驗分享、新手如何入門算法崗、該如何準備、面試常考點分享等熱門話題進行了深入的討論。 匯總合集&…

基于英飛凌BGT60LTR11AIP E6327芯片具低功耗的脈沖多普勒操作模式常用于汽車應用的雷達上

芯片特征&#xff1a; 60 GHz收發器MMIC&#xff0c;帶一個發射器和一個接收器單元封裝天線&#xff08;AIP&#xff09;&#xff08;6.73.30.56 mm3)低功耗的脈沖多普勒操作模式自主模式用于運動和運動方向的集成檢測器運動檢測信號的直接輸出目標檢測范圍的15個可配置閾值檢測…

Android14之Binder調試(二百一十一)

簡介&#xff1a; CSDN博客專家&#xff0c;專注Android/Linux系統&#xff0c;分享多mic語音方案、音視頻、編解碼等技術&#xff0c;與大家一起成長&#xff01; 優質專欄&#xff1a;Audio工程師進階系列【原創干貨持續更新中……】&#x1f680; 優質專欄&#xff1a;多媒…

前端面試題日常練-day21 【面試題】

題目 希望這些選擇題能夠幫助您進行前端面試的準備&#xff0c;答案在文末。 AJAX 是什么的縮寫&#xff1f; a) Asynchronous JavaScript and XMLb) Asynchronous JavaScript and XHTMLc) Asynchronous Java and XMLd) Asynchronous Java and XHTML使用 AJAX 可以實現以下哪…

2024年5月20日優雅草蜻蜓API大數據服務中心v2.0.4更新

v2.0.4更新 v2.0.4更新 2024年5月20日優雅草蜻蜓API大數據服務中心v2.0.4更新-增加ai繪畫接口增加淘寶聯想詞接口底部增加聯系方式 更新日志 底部增加聯系方式 增加ai繪畫接口 增加淘寶聯想詞接口 增加用戶中心充值提示 用戶中心內頁顏色改版完成 截圖 部分具體更新接口信…

神經網絡優化器-從SGD到AdamW

優化器準則 凸優化基本概念 先定義凸集&#xff0c;集合中的兩個點連接的線還在集合里面&#xff0c;就是凸集&#xff0c;用數學語言來表示就是&#xff1a;對于集合中的任意兩個元素x&#xff0c;y以及任意實數 λ ∈ ( 0 , 1 ) \lambda \in (0,1) λ∈(0,1)&#xff0c;有…