鴻蒙運動開發實戰:打造專屬運動視頻播放器

##鴻蒙核心技術##運動開發##Media Kit(媒體服務)#

在當今數字化時代,運動健身已經成為許多人生活的一部分。今天我將在應用中添加視頻播放器,幫助用戶在運動前、運動后更好地進行熱身和拉伸。這篇文章將從代碼核心點入手,帶你一步步了解開發過程中的關鍵技術和實現細節。

在這里插入圖片描述

一、項目背景與需求分析

在開發任何應用之前,明確需求是至關重要的。對于運動視頻播放器,我們需要考慮以下幾個核心功能:

  1. 視頻播放:支持播放運動相關的視頻,如熱身、拉伸等。
  2. 用戶交互:提供簡單的按鈕操作,如播放、暫停、繼續等。

二、代碼核心點梳理與解析

接下來,我們將通過代碼的核心部分,逐步解析實現運動視頻播放器的關鍵步驟。

(一)頁面布局與導航

在鴻蒙開發中,頁面布局是用戶體驗的基礎。我們使用了LibNavLibPage來構建頁面的導航和內容布局。以下是代碼的核心部分:

@Component
export struct SportHelperPage {@BuilderpageNavBuilder(){LibNav({pageTitle: "運動助手"}).width("100%")}@BuilderpageContentBuilder(){Column() {Text('運動助手').fontSize(20).fontWeight(FontWeight.Bold).margin({ top: 20 })Button('跑前熱身').onClick(() => this.playVideo('https://video.111.com/p/bms/warmup_before_running.mp4')).margin({ top: 10 })Button('跑后拉伸').onClick(() => this.playVideo('https://video.111.com/p/bms/stretch_after_running.mp4')).margin({ top: 10 })Button('暫停播放').onClick(() => {this.avPlayer?.pause()})Button('繼續播放').onClick(() => {this.avPlayer?.play()})XComponent({ type: XComponentType.SURFACE, controller: mXComponentController }).width('100%').height(300)}.padding(20).backgroundColor(Color.White)}
}
  1. 頁面導航:通過LibNav設置頁面標題為“運動助手”,并將其寬度設置為100%,以確保導航欄能夠覆蓋整個屏幕頂部。
  2. 頁面內容:使用Column布局,將文本、按鈕和視頻播放組件(XComponent)依次排列。每個按鈕都綁定了點擊事件,用于觸發視頻播放或控制播放狀態。

(二)視頻播放器的初始化與控制

視頻播放是應用的核心功能,我們使用了鴻蒙的media.AVPlayer來實現。以下是初始化和播放控制的代碼:

async initPlay() {try {this.avPlayer = await media.createAVPlayer();this.setAVPlayerCallback(this.avPlayer);} catch (error) {console.error('初始化視頻失敗:', error);}
}async playVideo(url: string) {try {if(this.avPlayer){this.avPlayer.url = url;this.avPlayer.play();}} catch (error) {console.error('播放視頻失敗:', error);}
}
  1. 初始化播放器:通過media.createAVPlayer()創建一個AVPlayer實例,并注冊回調函數來監聽播放狀態的變化。
  2. 播放視頻:通過設置avPlayer.url屬性為視頻的URL,并調用play()方法開始播放。這里需要注意的是,視頻URL必須是有效的,否則會導致播放失敗。

(三)狀態機回調與錯誤處理

在視頻播放過程中,可能會出現各種狀態變化和錯誤。通過注冊回調函數,我們可以更好地管理這些情況:

setAVPlayerCallback(avPlayer: media.AVPlayer) {avPlayer.on('startRenderFrame', () => {console.info(`AVPlayer start render frame`);});avPlayer.on('seekDone', (seekDoneTime: number) => {console.info(`AVPlayer seek succeeded, seek time is ${seekDoneTime}`);});avPlayer.on('error', (err: BusinessError) => {console.error(`Invoke avPlayer failed, code is ${err.code}, message is ${err.message}`);avPlayer.reset();});avPlayer.on('stateChange', async (state: string, reason: media.StateChangeReason) => {switch (state) {case 'idle':avPlayer.release();break;case 'initialized':const id = mXComponentController.getXComponentSurfaceId();avPlayer.surfaceId = id;avPlayer.prepare();break;case 'prepared':avPlayer.play();break;case 'paused':console.info('AVPlayer state paused called.');break;case 'completed':avPlayer.stop();break;case 'stopped':avPlayer.reset();break;case 'released':console.info('AVPlayer state released called.');break;default:console.info('AVPlayer state unknown called.');break;}});
}
  1. 狀態回調:通過監聽stateChange事件,我們可以根據不同的狀態(如initializedpreparedplaying等)執行相應的操作。例如,在initialized狀態時,設置播放畫面的surfaceId,并調用prepare()方法準備播放。
  2. 錯誤處理:通過監聽error事件,捕獲播放過程中可能出現的錯誤,并調用reset()方法重置播放器狀態。

三、開發中的注意事項與優化建議

在開發過程中,我們需要注意以下幾個關鍵點,以確保應用的穩定性和用戶體驗:

  1. 視頻URL的有效性:在調用playVideo()方法時,必須確保傳入的URL是有效的。如果URL無效或網絡不可用,播放器將無法正常工作。建議在實際開發中,對視頻URL進行校驗,并提供友好的錯誤提示。
  2. 性能優化:為了減少視頻加載時間,可以考慮在應用啟動時預先加載視頻資源。此外,合理管理播放器的生命周期,避免在不需要時占用系統資源。
  3. 用戶體驗:在頁面布局中,按鈕和文本的排布要簡潔明了,避免過于復雜的操作。同時,可以考慮添加進度條、音量控制等功能,進一步提升用戶體驗。

四、總結

在實際開發中,開發者可以根據需求進一步擴展功能,例如添加更多運動視頻類別、支持離線下載等。

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

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

相關文章

一個包含15個界面高質量的電商APP客戶端UI解決方案

一個包含15個界面高質量的電商APP客戶端UI解決方案 您可以將其用于電商APP應用項目。包含一系列完整的界面設計元素,包括歡迎頁、登錄、注冊、首頁、產品分類、產品詳情、尺碼選擇、購物車、訂單、支付,覆蓋電商APP的大部分界面。每個部分都精心設計&…

執行 PGPT_PROFILES=ollama make run下面報錯,

執行 PGPT_PROFILESollama make run 下面報錯, File "/home/powersys/.cache/pypoetry/virtualenvs/private-gpt-ZIwX6JeM-py3.11/lib/python3.11/site-packages/qdrant_client/http/api_client.py", line 108, in send_inner raise ResponseHandling…

【Docker基礎】Docker核心概念:命名空間(Namespace)之User詳解

目錄 引言 1 基礎概念回顧 1.1 命名空間概述 1.2 命名空間的類型 2 User命名空間詳解 2.1 基本概念 2.2 工作原理 User命名空間的工作流程 User命名空間架構 3 應用場景 4 配置與使用 5 總結 引言 隨著容器化技術的廣泛應用,Docker已成為現代軟件開發、…

DIDCTF-應急響應

前言 最近在學長分享應急響應與電子取證的知識,又恰逢期末周沒有課,記錄自己在取證道路的成長。 linux-basic-command 下載附件,得到Apache 服務器訪問日志文件,根據題目要求找出排名前五的ip,題目提示寫腳本&#…

MybatisPlus深入學習

今天深入的學習了一下mp,從頭開始學習!哈哈哈哈哈 本節只講干的! 我們上來先看一段代碼,不知道你能不能看明白! package com.itheima.mp.mapper;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapp…

安卓9.0系統修改定制化____安卓9.0系統精簡 了解系統app組件構成 系統app釋義 常識篇 一

在安卓 9.0 系統的使用過程中,許多用戶都希望能夠對系統進行深度定制,讓手機系統更加貼合個人需求。而系統精簡作為定制化的重要一環,不僅能夠釋放手機存儲空間,還能提升系統運行速度,優化資源分配。想要安全有效地對安卓 9.0 系統進行精簡,深入了解系統 app 組件的構成是…

2.4 Windows Conan編譯FFmpeg 4.4.1

Conan的安裝與使用參考之前的文章:Conan簡單使用 一、Conan編譯ffmpeg 1.1 Conan的配置文件 創建配置文件:C:\Users\wujh\.conan2\profiles\vs2019 [settings] archx86_64 build_typeRelease compilermsvc compiler.cppstd14 compiler.runtimedynami…

社群經濟視域下開源鏈動2+1模式與AI智能名片賦能S2B2C商城小程序的創新發展研究

摘要:在數字經濟蓬勃發展的背景下,社群經濟作為連接用戶情感與價值反哺的新型經濟形態,正通過技術創新與模式重構實現深度演化。本文基于社群經濟“創造有價值連接”的本質特征,系統探討“開源鏈動21模式”“AI智能名片”與“S2B2…

【計算機網絡】——reactor模式高并發網絡服務器設計

🔥個人主頁🔥:孤寂大仙V 🌈收錄專欄🌈:計算機網絡 🌹往期回顧🌹:【計算機網絡】非阻塞IO——epoll 編程與ET模式詳解——(easy)高并發網絡服務器設計 🔖流水不…

Uniapp跨端兼容性全方位解決方案

在當今多端融合的移動互聯網時代,Uniapp作為一款優秀的跨平臺開發框架,已成為許多開發者的首選。然而,真正的挑戰在于如何優雅地處理不同平臺之間的差異。本文將全面剖析Uniapp跨端開發的兼容性處理方案,提供從基礎到高級的完整解…

迅為RK3576開發板NPUrknn-toolkit2環境搭建和使用docker環境安裝

開發板采用核心板底板結構,在我們的資料里提供了底板的原理圖工程以及PCB工程,可以實現真正意義上的裁剪、定制屬于自己的產品,滿足更多應用場合。 迅為針對RK3576開發板整理出了相應的開發流程以及開發中需要用到的資料,并進行詳…

什么是 OpenFeigin ?微服務中的具體使用方式

什么是Feign? Feign 是一種聲明式的 HTTP 客戶端框架,主要用于簡化微服務架構中服務之間的遠程調用,也可以通過定義接口和注解的方式調用遠程服務,無需手動構建 HTTP 請求或解析響應數據。Spring Cloud 對 Feign 進行了增強&…

對抗性提示:進階守護大語言模型

人工智能模型正快速進化 —— 變得更具幫助性、更流暢,并且更深入地融入我們的日常生活和商業運營中。但隨著其能力的提升,風險也在增加。在維護安全可信的人工智能方面,最緊迫的挑戰之一是對抗性提示:這是一種微妙且通常富有創意…

運營商頻段

以下是三大運營商(中國移動、中國電信、中國聯通)及中國廣電的 5G 主要頻段 及其所屬運營商的整理表格: 運營商頻段上行頻率 (MHz)下行頻率 (MHz)帶寬備注廣電n28703-733758-788230MHz移動共享n794900-4960-60MHz-移動n412515-2675-160MHz-n7…

項目拓展-Apache對象池,對象池思想結合ThreadLocal復用日志對象

優化日志對象創建以及日志對象復用 日志對象上下文實體類 traceId 請求到達時間戳 請求完成時間戳 請求總共耗費時長 get/post/put/delete請求方式 Http狀態碼 原始請求頭中的所有鍵值對 請求體內容 響應體內容 失敗Exception信息詳細記錄 是否命中緩存 package c…

Javaweb - Vue入門

Vue是一款用于構建用戶界面的漸進式的JavaScript框架。 使用步驟 引入Vue模塊,創建Vue的應用實例,定義元素,交給Vue控制。 一、引入Vue模塊 因為使用的是模塊化的JavaScript,因此在script標簽內要聲明一個屬性:typ…

C++ 標準模板庫各個容器的應用場景分析

C 標準模板庫(STL)中的容器分為序列式容器、關聯式容器和無序容器,各自適用于不同場景。以下是主要容器的應用場景及案例: 一、序列式容器 元素按插入順序存儲,支持線性訪問。 1. vector 場景:動態數組…

安裝前端vite框架,后端安裝fastapi框架

前期準備 首先新建一個文件夾,文件夾里面新建一個文件夾,用于安裝依賴 安裝vite框架 npm init -y 目的是安裝package.json配置文件 npm install vite --save-dev 安裝vite框架 安裝完是這個樣子 新建了一個文件夾和js文件 后端內容 main.js document.…

深度學習:基礎與概念(第1章:深度學習革命)

目錄 第1章:深度學習革命 1.1深度學習的影響 1.1.1醫療診斷 1.1.2蛋白質結構預測 1.1.3圖像合成 1.1.4大語言模型 1.2一個教學示例 1.2.1合成數據 1.2.2線性模型 1.2.3誤差函數 1.2.4模型復雜度 1.2.5正則化 1.2.6模型選擇 1.3機器學習簡史 1.3.1單層…

通過觸發器統計訪問數據庫的客戶端IP地址

通過觸發器統計訪問數據庫的客戶端IP地址 創建用戶登錄審計表創建登錄審計觸發器查看登錄審計結果禁用和啟用觸發器創建用戶登錄審計表 創建記錄表: create table appuser1.user_login_audit (login_time DATE,session_id number,username VARCHAR2(30),os_user VARCHAR2(30…