0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于ArkTS語(yǔ)言的OpenHarmony APP應(yīng)用開發(fā):多媒體管理2

福州市凌睿智捷電子有限公司 ? 2024-09-21 08:06 ? 次閱讀

1、程序介紹

本示例展示了視頻組件的基本功能,以及如何控制播放狀態(tài)的相關(guān)能力。包括視頻組件化,全屏化,窗口化,上下輪播視頻等。

本實(shí)例使用Video組件,具體如下:

進(jìn)入首頁(yè)點(diǎn)擊播放按鍵。

點(diǎn)擊視頻播放按鈕,視頻開始播放。再次點(diǎn)擊視頻進(jìn)入視頻全屏頁(yè)。

首頁(yè)下滑500vp后,視頻小窗口化。

4.點(diǎn)擊直播按鈕進(jìn)入直播頁(yè),上下滑動(dòng)視頻。

本案例已在OpenHarmony凌蒙派-RK3568開發(fā)板驗(yàn)證通過(guò)

API版本:9

2、知識(shí)準(zhǔn)備

2.1、Video

用于播放視頻文件并控制其播放狀態(tài)的組件。

使用網(wǎng)絡(luò)視頻時(shí),需要申請(qǐng)權(quán)限ohos.permission.INTERNET。

詳細(xì)請(qǐng)參考:官方文檔

2.1.1、接口

Video(value:{src?:string|Resource,currentProgressRate?:number|string|PlaybackSpeed,previewUri?:string|PixelMap|Resource,controller?:VideoController})

參數(shù)定義如下所示:

參數(shù)名參數(shù)類型必填參數(shù)描述
srcstring | Resource視頻播放源的路徑,支持本地視頻路徑和網(wǎng)絡(luò)路徑。支持在resources下面的video或rawfile文件夾里放置媒體資源。視頻支持的格式是:mp4、mkv、webm、ts。
currentProgressRatenumber | string | PlaybackSpeed視頻播放倍速。number取值僅支持:0.75,1.0,1.25,1.75,2.0
previewUristring | PixelMap | Resource視頻未播放時(shí)的預(yù)覽圖片路徑
controllerVideoController設(shè)置視頻控制器

其中,PlaybackSpeed定義如下所示:

名稱描述
Speed_Forward_0_75_X0.75倍速播放
Speed_Forward_1_00_X1倍速播放
Speed_Forward_1_25_X1.25倍速播放
Speed_Forward_1_75_X1.75倍速播放
Speed_Forward_2_00_X2倍速播放

2.1.2、屬性

除支持通用屬性外,還支持以下屬性:

名稱參數(shù)類型描述
mutedboolean是否靜音。默認(rèn)值:false
autoPlayboolean是否自動(dòng)播放。默認(rèn)值:false
controlsboolean控制視頻播放的控制欄是否顯示。默認(rèn)值:true
objectFitImageFit設(shè)置視頻顯示模式。默認(rèn)值:Cover
loopboolean是否單個(gè)視頻循環(huán)播放。默認(rèn)值:false

2.1.3、事件

除支持通用事件外,還支持以下事件:

名稱功能描述
onStart(event:() => void)播放時(shí)觸發(fā)該事件
onPause(event:() => void)暫停時(shí)觸發(fā)該事件
onFinish(event:() => void)播放結(jié)束時(shí)觸發(fā)該事件
onError(event:() => void)播放失敗時(shí)觸發(fā)該事件
onPrepared(callback:(event?: { duration: number }) => void)視頻準(zhǔn)備完成時(shí)觸發(fā)該事件,通過(guò)duration可以獲取視頻時(shí)長(zhǎng),單位為秒(s)
onSeeking(callback:(event?: { time: number }) => void)操作進(jìn)度條過(guò)程時(shí)上報(bào)時(shí)間信息,單位為s
onSeeked(callback:(event?: { time: number }) => void)操作進(jìn)度條完成后,上報(bào)播放時(shí)間信息,單位為s
onUpdate(callback:(event?: { time: number }) => void)播放進(jìn)度變化時(shí)觸發(fā)該事件,單位為s,更新時(shí)間間隔為250ms
onFullscreenChange(callback:(event?: { fullscreen: boolean }) => void)在全屏播放與非全屏播放狀態(tài)之間切換時(shí)觸發(fā)該事件,返回值為true表示進(jìn)入全屏播放狀態(tài),為false則表示非全屏播放

2.1.4、VideoController

一個(gè)VideoController對(duì)象可以控制一個(gè)或多個(gè)video。

(1)導(dǎo)入對(duì)象

controller: VideoController = new VideoController()

(2)start

start(): void

開始播放。

(3)pause

pause(): void

暫停播放,顯示當(dāng)前幀,再次播放時(shí)從當(dāng)前位置繼續(xù)播放。

(4)stop

stop(): void

停止播放,顯示當(dāng)前幀,再次播放時(shí)從頭開始播放。

2.1.5、exitFullscreen

exitFullscreen()

退出全屏播放。

2.1.6、setCurrentTime

setCurrentTime(value: number)

指定視頻播放的進(jìn)度位置。

其中,參數(shù)定義如下:

參數(shù)名參數(shù)類型必填參數(shù)描述
valuenumber視頻播放進(jìn)度位置,單位為s

3、程序解析

本案例展示了視頻組件的基本功能,以及如何控制播放狀態(tài)的相關(guān)能力。包括視頻組件化,全屏化,窗口化,上下輪播視頻等。

本案例主要分為以下幾個(gè)部分:

(1)MainPage.ets,負(fù)責(zé)主頁(yè)面,通過(guò)調(diào)用其它自定義控件播放視頻;

(2)VideoPage.ets:負(fù)責(zé)上方輪播圖視頻播放和控制;

(3)SmallVideo.ets:負(fù)責(zé)小窗口視頻播放和控制;

(4)LivePage.ets:負(fù)責(zé)顯示直播頁(yè)面;

(5)FullPage.ets:全屏顯示視頻播放頁(yè)面;

3.1、申請(qǐng)權(quán)限

申請(qǐng)網(wǎng)絡(luò)視頻權(quán)限,在entry/src/main/module.json5文件中添加如下內(nèi)容:

"requestPermissions": [ { "name": "ohos.permission.INTERNET" }]

3.2、MainPage.ets

在entry/src/main/ets/pages/Index.ets文件中調(diào)用MainPage自定義組件。

import { MainPage } from "@ohos/video-component"
@Entry@Componentstruct Index { @State message: string = 'Hello World'
build() { Column() { MainPage() } .width('100%') .height('100%') }}

在VideoComponent/src/main/ets/components/pages/MainPage.ets文件中,首先設(shè)置媒體查詢的查詢條件。

listenerIsPhone = mediaQuery.matchMediaSync('(orientation:landscape)');

其次,對(duì)監(jiān)聽句柄進(jìn)行事件綁定。

async aboutToAppear() { this.portraitFunc = this.onPortrait.bind(this) // 綁定 this.listenerIsPhone.on('change', this.portraitFunc)}

再次,通過(guò)調(diào)用VideoPage顯示輪播圖視頻播放。

Swiper() { // 視頻界面,調(diào)用自定義的VideoPage.ets VideoPage({ isStart: $openFirst }) // 模擬Swiper數(shù)據(jù) LazyForEach(new MyDataSource(this.arrSwiper), (item) => { Text(item.toString()) .width('100%') .aspectRatio(1.12) .backgroundColor(0xAFEEEE) .textAlign(TextAlign.Center) .fontSize(20) }, item => item)}

再次,調(diào)用SmallVideo顯示小視頻播放。

Column() { SmallVideo({ isHidden: $isHidden, isCancel: $isCancel })}.width('100%').alignItems(HorizontalAlign.End)

最后,顯示直播視頻按鍵。

Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { Image($r('app.media.broadcast')) .objectFit(ImageFit.Contain) .width('24') .height('24') .margin({ top: 10 }) Text($r("app.string.in_live")) .fontSize(10) .fontColor('#000000') .margin({ top: 5 })}.width(58).height(58).backgroundColor('#FFFFFF').border({ color: 'rgba(0,0,0,0.2)' }).borderRadius(16).borderWidth(1.3).key('directVideo').onClick(() => { router.push({ url: 'pages/LivePage' })}).position({ x: '86%', y: '20%' })}.width('100%').height('100%').backgroundColor(0xDCDCDC)

注意:當(dāng)Flex觸發(fā)鼠標(biāo)按下事件,則通過(guò)router.push()跳轉(zhuǎn)到LivePage.ets頁(yè)面。

3.3、VideoPage.ets

首先,定義播放視頻的資源以及視頻播放控制器。

@State videoSrc: Resource = $rawfile('video_4.mp4') // 視頻播放文件detailVideoController:VideoController=newVideoController() //設(shè)置視頻播放的控制器,比如控制視頻開始,暫停等

其次,調(diào)用Video組件,并將視頻資源和視頻控制器代入。

Video({ src: this.videoSrc, // 設(shè)置視頻文件地址 controller: this.detailVideoController, // 設(shè)置視頻播放的控制器,比如控制視頻開始,暫停等})

最后,通過(guò)video組件的.onClick()響應(yīng)事件,控制視頻播放。

.onClick(() => { // 單擊按鈕事件 if (this.isPlayClick) { // 判斷play按鈕是否用過(guò),沒(méi)有用過(guò),進(jìn)入這層 if (this.firstClick) { // 第一次點(diǎn)擊視頻開始播放,再次點(diǎn)擊進(jìn)入全屏 this.detailVideoController.start() // Video開始播放 this.isHidden = !this.isHidden this.isStart = true this.firstClick = !this.firstClick } else { // 頁(yè)面跳轉(zhuǎn) router.push({ url: 'pages/FullPage', params: { videoSrc: this.videoSrc, videoTime: this.updateTime } }) } } else { // 頁(yè)面跳轉(zhuǎn) router.push({ url: 'pages/FullPage', params: { videoSrc: this.videoSrc, videoTime: this.updateTime } }) }})

其中,關(guān)于播放時(shí)間顯示(即變量updateTime)需要特別注意。在此不贅述。

3.4、SmallVideo.ets

SmallVideo自定義組件則負(fù)責(zé)小窗口視頻播放,通過(guò)調(diào)用Video播放視頻文件。

首先,定義視頻資源和視頻控制器。

@State smallVideoSrc: Resource = $rawfile('video_4.mp4') // 視頻數(shù)據(jù)源文件smallVideoController:VideoController=newVideoController() //設(shè)置視頻控制器

其次,將視頻資源和視頻控制器放入Video控件。

Video({ src: this.smallVideoSrc, // 視頻播放源的路徑,支持本地視頻路徑和網(wǎng)絡(luò)路徑 controller: this.smallVideoController // 設(shè)置視頻控制器}) .controls(false) .autoPlay(true) // 設(shè)置自動(dòng)播放 .muted(true) // 設(shè)置靜音 .onFinish(() => { // 播放結(jié)束時(shí)觸發(fā)該事件 this.isHidden = false })

注意:.onFinish()事件是在視頻播放完畢后觸發(fā)。

3.5、LivePage.ets

LivePage.ets負(fù)責(zé)顯示直播頁(yè)面。

首先,定義一個(gè)媒體查詢的監(jiān)聽句柄。

listenerIsPhone = mediaQuery.matchMediaSync('(orientation:landscape)');

其次,在aboutToAppear()中將視頻播放綁定,并通過(guò)http連接請(qǐng)求,獲取網(wǎng)絡(luò)視頻信息。

async aboutToAppear() { this.portraitFunc = this.onPortrait.bind(this) // bind current js instance this.listenerIsPhone.on('change', this.portraitFunc)
try { let a = await Live() // http連接請(qǐng)求 this.mData = JSON.parse(a.result.toString()) this.liveInfoList = this.mData.data } catch (error) { console.log('http resquest is fail:' + error) }}

最后,在build()中顯示網(wǎng)絡(luò)視頻直播。

ForEach(this.liveInfoList, (item, index) => { Stack() { if (this.active == index) { Video({ src: item.uri }) .autoPlay(true) .loop(false) .controls(false) .objectFit(ImageFit.Contain) .width('100%') .height('100%') } ...... } ......}

3.6、FullPage.ets

FullPage.ets負(fù)責(zé)全屏顯示視頻播放頁(yè)面。

首先,定義一個(gè)媒體查詢的監(jiān)聽句柄和視頻控制器。

listenerIsPhone = mediaQuery.matchMediaSync('(orientation:landscape)')fullVideoController:VideoController=newVideoController()

其次,在aboutToAppear()中綁定當(dāng)前用例。

aboutToAppear() { this.fullParams = router.getParams() this.fullSrc = this.fullParams['videoSrc'] this.playTime = this.fullParams['videoTime']
this.portraitFunc = this.onPortrait.bind(this) // bind current js instance this.listenerIsPhone.on('change', this.portraitFunc)}

最后,調(diào)用Video組件控制視頻播放。

Video({ src: this.fullSrc, controller: this.fullVideoController}) .width('100%') .height('100%') .autoPlay(true) .loop(true) .controls(false) .objectFit(ImageFit.Contain) .onPause(() => { this.isHidden = true }) .onFullscreenChange((e) => { this.isHidden = false }) .onStart(() => { this.isHidden = false }) .onPrepared((e) => { this.fullVideoController.setCurrentTime(this.playTime) this.maxValue = e.duration }) .onUpdate((e) => { this.nowValue = e.time }) .onClick(() => { this.fullVideoController.pause(); })

4、項(xiàng)目編譯

4.1、打開項(xiàng)目

打開DevEco Studio,再打開自定義通知項(xiàng)目。

4.2、編譯程序

點(diǎn)擊菜單欄上的“Build” -> "Rebuild Project"。如果出現(xiàn)無(wú)法編譯,則注意查看Event Log界面。如下所示:

4b33bf88-77ad-11ef-bb4b-92fbcf53809c.png

點(diǎn)擊Run 'npm install',讓DevEco Studio安裝相關(guān)依賴包。

重新點(diǎn)擊菜單欄上的“Build” -> "Rebuild Project"。出現(xiàn)如下錯(cuò)誤:

4b46d69a-77ad-11ef-bb4b-92fbcf53809c.png

點(diǎn)擊上圖紅色框部分,安裝相關(guān)服務(wù)。

重新點(diǎn)擊菜單欄上的“Build” -> "Rebuild Project",編譯成功。

4b5cea52-77ad-11ef-bb4b-92fbcf53809c.png

4.3、安裝程序

點(diǎn)擊“entry”按鈕,將項(xiàng)目程序安裝到設(shè)備端。如下圖所示:

4b688286-77ad-11ef-bb4b-92fbcf53809c.png

如果出現(xiàn)下述報(bào)錯(cuò),表示無(wú)法安裝。如圖所示:

4b7fcae0-77ad-11ef-bb4b-92fbcf53809c.png

點(diǎn)擊上圖紅色框的藍(lán)色字體,彈出"Project Structure"對(duì)話框,點(diǎn)擊"Apply",再點(diǎn)擊"OK"。如圖所示:

4b988210-77ad-11ef-bb4b-92fbcf53809c.png

重新點(diǎn)擊“entry”按鈕,將項(xiàng)目程序安裝到設(shè)備端。

4bb8516c-77ad-11ef-bb4b-92fbcf53809c.png

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 多媒體
    +關(guān)注

    關(guān)注

    0

    文章

    501

    瀏覽量

    37015
  • APP
    APP
    +關(guān)注

    關(guān)注

    33

    文章

    1575

    瀏覽量

    72606
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3730

    瀏覽量

    16424
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于ArkTS語(yǔ)言OpenHarmony APP應(yīng)用開發(fā):HelloOpenharmony

    1、程序簡(jiǎn)介 該程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)編寫的UI應(yīng)用類:HelloOpenHarmony。 本案例是基于API 9接口開發(fā)。 本案例已在OpenHarmony凌蒙派-
    發(fā)表于 09-14 12:47

    基于ArkTS語(yǔ)言OpenHarmony APP應(yīng)用開發(fā)多媒體管理

    1、程序介紹 本示例展示了視頻組件的基本功能,以及如何控制播放狀態(tài)的相關(guān)能力,包括視頻切換、封面切換、播放、暫停等。 本案例已在OpenHarmony凌蒙派-RK3568開發(fā)板驗(yàn)證通過(guò),具體代碼可
    發(fā)表于 09-19 15:50

    基于ArkTS語(yǔ)言OpenHarmony APP應(yīng)用開發(fā)多媒體管理2

    播放按鈕,視頻開始播放。再次點(diǎn)擊視頻進(jìn)入視頻全屏頁(yè)。 首頁(yè)下滑500vp后,視頻小窗口化。 4.點(diǎn)擊直播按鈕進(jìn)入直播頁(yè),上下滑動(dòng)視頻。 本案例已在OpenHarmony凌蒙派-RK3568開發(fā)板驗(yàn)證
    發(fā)表于 09-20 13:47

    基于WEB的多媒體素材管理庫(kù)的開發(fā)與應(yīng)用

    計(jì)算機(jī)專業(yè)畢業(yè)設(shè)計(jì)題目大全一、ASP類計(jì)算機(jī)專業(yè)畢業(yè)設(shè)計(jì)題目1.網(wǎng)絡(luò)留言薄2.客戶管理系統(tǒng)3.多媒體積件管理庫(kù)的開發(fā)與應(yīng)用4.基于WEB的
    發(fā)表于 07-19 09:30

    直播預(yù)告丨OpenHarmony標(biāo)準(zhǔn)系統(tǒng)多媒體子系統(tǒng)之音頻解讀

    今晚19點(diǎn),OpenHarmony開源開發(fā)者成長(zhǎng)計(jì)劃知識(shí)賦能第五期“掌握OpenHarmony多媒體的框架原理”的第四節(jié)直播課,即將開播!深開鴻資深技術(shù)專家苑春鴿老師,將在
    發(fā)表于 05-12 11:31

    直播預(yù)告丨OpenHarmony標(biāo)準(zhǔn)系統(tǒng)多媒體子系統(tǒng)之視頻解讀

    5月19日(周四)晚上19點(diǎn),OpenHarmony開源開發(fā)者成長(zhǎng)計(jì)劃知識(shí)賦能第五期“掌握OpenHarmony多媒體的框架原理”的第五節(jié)直播課,即將開播!深開鴻資深技術(shù)專家胡浩老師,
    發(fā)表于 05-18 10:16

    HarmonyOS/OpenHarmony應(yīng)用開發(fā)-ArkTS的聲明式開發(fā)范式

    軌跡。狀態(tài)與數(shù)據(jù)管理狀態(tài)數(shù)據(jù)管理作為基于ArkTS的聲明式開發(fā)范式的特色,通過(guò)功能不同的裝飾器給開發(fā)者提供了清晰的頁(yè)面更新渲染流程和管道。狀
    發(fā)表于 01-17 15:09

    HarmonyOS/OpenHarmony應(yīng)用開發(fā)-Stage模型ArkTS語(yǔ)言AbilityStage

    進(jìn)行初始化時(shí)回調(diào)。context接口示例:*附件:HarmonyOSOpenHarmony應(yīng)用開發(fā)-stage模型ArkTS語(yǔ)言AbilityStage.docx
    發(fā)表于 04-07 15:16

    HarmonyOS/OpenHarmony應(yīng)用開發(fā)-Stage模型ArkTS語(yǔ)言擴(kuò)展能力基類

    \'@ohos.app.ability.ExtensionAbility\'; 接口示例: *附件:HarmonyOSOpenHarmony應(yīng)用開發(fā)-stage模型ArkTS
    發(fā)表于 04-26 10:00

    HarmonyOS/OpenHarmony應(yīng)用開發(fā)-ArkTS語(yǔ)言基本語(yǔ)法說(shuō)明

    的封裝和復(fù)用UI描述。 @Extend/@Style:擴(kuò)展內(nèi)置組件和封裝屬性樣式,更靈活地組合內(nèi)置組件。 stateStyles:多態(tài)樣式,可以依據(jù)組件的內(nèi)部狀態(tài)的不同,設(shè)置不同樣式。*附件:HarmonyOSOpenHarmony應(yīng)用開發(fā)-
    發(fā)表于 06-01 10:25

    HarmonyOS優(yōu)選主力應(yīng)用開發(fā)語(yǔ)言-ArkTS概述

    ArkTS是HarmonyOS優(yōu)選的主力應(yīng)用開發(fā)語(yǔ)言。ArkTS圍繞應(yīng)用開發(fā)在TypeScript(簡(jiǎn)稱TS)生態(tài)基礎(chǔ)上做了進(jìn)一步擴(kuò)展,繼承
    發(fā)表于 06-09 10:52

    OpenHarmony ArkTS工程目錄結(jié)構(gòu)(Stage模型)

    一、應(yīng)用工程結(jié)構(gòu) 圖片來(lái)源:OpenHarmony官網(wǎng) AppScope > app.json5:應(yīng)用的全局配置信息。 entry:OpenHarmony工程模塊,編譯構(gòu)建生成一個(gè)
    發(fā)表于 09-18 15:23

    OpenHarmony 應(yīng)用開發(fā)SDK、API 與基礎(chǔ)工具

    。C API 也包含在鴻蒙SDK 中,方便開發(fā)者使用 C 或者 C++語(yǔ)言實(shí)現(xiàn)應(yīng)用相應(yīng)功能。 C API 只覆蓋了部分鴻蒙基礎(chǔ)底層能力,如 libc,圖形庫(kù),窗口系統(tǒng),多媒體,壓縮庫(kù)等,并沒(méi)有完全提供
    發(fā)表于 09-19 15:45

    全數(shù)字多媒體語(yǔ)言實(shí)驗(yàn)室的應(yīng)用與管理

    全數(shù)字多媒體語(yǔ)言實(shí)驗(yàn)室已成為高校外語(yǔ)教學(xué)實(shí)踐的重要基地,如何科學(xué)有效地管理與維護(hù),使之能更好地服務(wù)于教學(xué),是各高校面臨的重要問(wèn)題。首先介紹了本校全數(shù)字多媒體
    發(fā)表于 02-29 11:56 ?14次下載
    全數(shù)字<b class='flag-5'>多媒體</b><b class='flag-5'>語(yǔ)言</b>實(shí)驗(yàn)室的應(yīng)用與<b class='flag-5'>管理</b>

    基于ArkTS語(yǔ)言OpenHarmony APP應(yīng)用開發(fā):HelloOpenharmony

    1、程序簡(jiǎn)介該程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)編寫的UI應(yīng)用類:HelloOpenHarmony。本案例是基于API9接口開發(fā)。本案例已在OpenHarmony凌蒙派-RK35
    的頭像 發(fā)表于 09-15 08:09 ?432次閱讀
    基于<b class='flag-5'>ArkTS</b><b class='flag-5'>語(yǔ)言</b>的<b class='flag-5'>OpenHarmony</b> <b class='flag-5'>APP</b>應(yīng)用<b class='flag-5'>開發(fā)</b>:Hello<b class='flag-5'>Openharmony</b>