chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

鴻蒙ArkUI開發(fā)-Video組件的使用

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-01-23 16:59 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

概述

手機、平板或是智慧屏這些終端設(shè)備上,媒體功能可以算作是我們最常用的場景之一。無論是實現(xiàn)音頻的播放、錄制、采集,還是視頻的播放、切換、循環(huán),亦或是相機的預(yù)覽、拍照等功能,媒體組件都是必不可少的。以視頻功能為例,在應(yīng)用開發(fā)過程中,我們需要通過ArkUI提供的Video組件為應(yīng)用增加基礎(chǔ)的視頻播放功能。借助Video組件,我們可以實現(xiàn)視頻的播放功能并控制其播放狀態(tài)。常見的視頻播放場景包括觀看網(wǎng)絡(luò)上的較為流行的短視頻,也包括查看我們存儲在本地的視頻內(nèi)容。

本文將結(jié)合《簡易視頻播放器(ArkTS)》這個Codelab,對Video組件的參數(shù)、屬性及事件進行介紹,然后通過組件的屬性調(diào)用和事件回調(diào)闡明Video組件的基本使用方法,最后結(jié)合Video組件使用過程中的常見問題講解自定義控制器的使用。

Video組件用法介紹

Video組件參數(shù)介紹 Video組件的接口表達形式為:

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

其中包含四個可選參數(shù),src、currentProgressRate、previewUri和controller。

  • src表示視頻播放源的路徑,可以支持本地視頻路徑和網(wǎng)絡(luò)路徑。使用網(wǎng)絡(luò)地址時,如https,需要注意的是需要在module.json5文件中申請網(wǎng)絡(luò)權(quán)限。在使用本地資源播放時,當(dāng)使用本地視頻地址我們可以使用媒體庫管理模塊medialibrary來查詢公共媒體庫中的視頻文件,示例代碼如下:
import mediaLibrary from '@ohos.multimedia.mediaLibrary';
 
async queryMediaVideo() {
 let option = {
 // 根據(jù)媒體類型檢索
 selections: mediaLibrary.FileKey.MEDIA_TYPE + '=?',
 // 媒體類型為視頻
 selectionArgs: [mediaLibrary.MediaType.VIDEO.toString()]
  };
 let media = mediaLibrary.getMediaLibrary(getContext(this));
 // 獲取資源文件
 const fetchFileResult = await media.getFileAssets(option);
 // 以獲取的第一個文件為例獲取視頻地址
 let fileAsset = await fetchFileResult.getFirstObject();
 this.source = fileAsset.uri
}

為了方便功能演示,示例中媒體資源需存放在resources下的rawfile文件夾里。

  • currentProgressRate表示視頻播放倍速,其參數(shù)類型為number,取值支持0.75,1.0,1.25,1.75,2.0,默認值為1.0倍速;
  • previewUri表示視頻未播放時的預(yù)覽圖片路徑;
  • controller表示視頻控制器。

參數(shù)的具體描述如下表:

參數(shù)名參數(shù)類型必填
srcstringResource
currentProgressRatenumberstring
previewUristringPixelMap8+
controllerVideoController

說明

視頻支持的規(guī)格是:mp4、mkv、webm、TS。 下面我們通過具體的例子來說明參數(shù)的使用方法,我們選擇播放本地視頻,視頻未播放時的預(yù)覽圖片路徑也為本地,代碼實現(xiàn)如下:

@Component
export struct VideoPlayer {
 private source: string | Resource;
 private controller: VideoController;
 private previewUris: Resource = $r('app.media.preview');
  ...
 
 build() {
 Column() {
      Video({
 src: this.source,
 previewUri: this.previewUris,
 controller: this.controller
      })
        ...
      VideoSlider({ controller: this.controller })
    }
  }
}

效果如下:

Video組件屬性介紹

除了支持組件的尺寸設(shè)置、位置設(shè)置等通用屬性外,Video組件還支持是否靜音、是否自動播放、控制欄是否顯示、視頻顯示模式以及單個視頻是否循環(huán)播放五個私有屬性。

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

其中,objectFit 中視頻顯示模式包括Contain、Cover、Auto、Fill、ScaleDown、None 6種模式,默認情況下使用ImageFit.Cover(保持寬高比進行縮小或者放大,使得圖片兩邊都大于或等于顯示邊界),其他效果(如自適應(yīng)顯示、保持原有尺寸顯示、不保持寬高比進行縮放等)可以根據(jù)具體使用場景/設(shè)備來進行選擇。 在Codelab示例中體現(xiàn)了controls、autoplay和loop屬性的配置,示例代碼如下:

@Component
export struct VideoPlayer {
 private source: string | Resource;
 private controller: VideoController;
  ...
 build() {
 Column() {
      Video({
 controller: this.controller
      })
        .controls(false) //不顯示控制欄 
        .autoPlay(false) // 手動點擊播放 
        .loop(false) // 關(guān)閉循環(huán)播放 
        ...
    }
  }
}

效果如下:

Video組件回調(diào)事件介紹

Video組件能夠支持常規(guī)的點擊、觸摸等通用事件,同時也支持onStart、onPause、onFinish、onError等事件,具體事件的功能描述見下表:

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

在Codelab中我們以更新事件、準(zhǔn)備事件、失敗事件以及點擊事件為回調(diào)為例進行演示,代碼實現(xiàn)如下:

Video({ ... })
  .onUpdate((event) = > {
 this.currentTime = event.time;
 this.currentStringTime = changeSliderTime(this.currentTime); //更新事件 
  })
  .onPrepared((event) = > {
    prepared.call(this, event); //準(zhǔn)備事件 
  })
  .onError(() = > {
    prompt.showToast({
      duration: COMMON_NUM_DURATION, //播放失敗事件 
      message: MESSAGE
    });
  ...
  })

其中,onUpdate更新事件在播放進度變化時觸發(fā),從event中可以獲取當(dāng)前播放進度,從而更新進度條顯示事件,比如視頻播放時間從24秒更新到30秒。onError事件在視頻播放失敗時觸發(fā),在CommonConstants.ets中定義了常量類MESSAGE,所以在視頻播放失敗時會顯示“請檢查網(wǎng)絡(luò)”。

  1. const MESSAGE: string = '請檢查網(wǎng)絡(luò)'

自定義控制器的組成與實現(xiàn)

自定義控制器的組成

Video組件的原生控制器樣式相對固定,當(dāng)我們對頁面的布局色調(diào)的一致性有所要求,或者在拖動進度條的同時需要顯示其百分比進度時,原生控制器就無法滿足需要了。如下圖右側(cè)的效果需要使用自定義控制器實現(xiàn),接下來我們看一下自定義控制器的組成。

為了實現(xiàn)自定義控制器的進度顯示等功能,我們需要通過Row容器實現(xiàn)控制器的整體布局,然后借由Text組件來顯示視頻的播放起始時間、進度時間以及視頻總時長,最后通過滑動進度條Slider組件來實現(xiàn)視頻進度條的效果,代碼如下:

@Component
export struct VideoSlider {
  ...
 build() {
 Row(...) {
 Image(...)
 Text(...)
 Slider(...)
 Text(...)
    }
    ...
  }
}

自定義控制器的實現(xiàn)

自定義控制器容器內(nèi)嵌套了視頻播放時間Text組件、滑動器Slider組件以及視頻總時長Text組件 3個橫向排列的組件,其中Text組件在之前的基礎(chǔ)組件課程中已經(jīng)有過詳細介紹,這里就不再進行贅述。需要強調(diào)的是兩個Text組件顯示的時長是由Slider組件的onChange(callback: (value: number, mode: SliderChangeMode) => void)回調(diào)事件來進行傳遞的,而Text組件的數(shù)值與視頻播放進度數(shù)值value則是通過@Provide與 @Consume裝飾器進行的數(shù)據(jù)聯(lián)動,實現(xiàn)效果可見圖片下方黑色控制欄部分,具體代碼步驟及代碼如下: 獲取/計算視頻時長

export function prepared(event) {
 this.durationTime = event.duration;
 let second: number = event.duration % COMMON_NUM_MINUTE;
 let min: number = parseInt((event.duration / COMMON_NUM_MINUTE).toString());
 let head = min < COMMON_NUM_DOUBLE ? `${ZERO_STR}${min}` : min;
 let end = second < COMMON_NUM_DOUBLE ? `${ZERO_STR}${second}` : second;
 this.durationStringTime = `${head}${SPLIT}${end}`;
  ...
};

設(shè)置進度條參數(shù)及屬性

Slider({
 value: this.currentTime,
 min: 0,
 max: this.durationTime,
 step: 1,
 style: SliderStyle.OutSet
})
 .blockColor($r('app.color.white'))
 .width(STRING_PERCENT.SLIDER_WITH)
 .trackColor(Color.Gray)
 .selectedColor($r('app.color.white'))
 .showSteps(true)
 .showTips(true)
 .trackThickness(this.isOpacity ? SMALL_TRACK_THICK_NESS : BIG_TRACK_THICK_NESS)
 .onChange((value: number, mode: SliderChangeMode) = > {...})

計算當(dāng)前進度播放時間及添加onUpdate回調(diào) 最后,在我們播放視頻時還需要更新顯示播放的時間進度,也就是左側(cè)的Text組件。在視頻開始播放前,播放時間默認為00:00,隨著視頻播放,時間需要不斷更新為當(dāng)前進度時間。所以左側(cè)的Text組件我們不僅需要讀取時間,還需要為其添加數(shù)據(jù)聯(lián)動。這里,我們就是通過為Video組件添加onUpdate事件來實現(xiàn)的,在視頻播放過程中會不斷調(diào)用changeSliderTime方法獲取當(dāng)前的播放時間并進行計算及單位轉(zhuǎn)化,從而不斷刷新進度條的值,也就是控制器左側(cè)的播放進度時間Text組件。

Video({...})
  ...
  .onUpdate((event) = > {
 this.currentTime = event.time;
 this.currentStringTime = changeSliderTime(this.currentTime)
  })
export function changeSliderTime(value: number): string {
 let second: number = value % COMMON_NUM_MINUTE;
 let min: number = parseInt((value / COMMON_NUM_MINUTE).toString());
 let head = min < COMMON_NUM_DOUBLE ? `${ZERO_STR}${min}` : min;
 let end = second < COMMON_NUM_DOUBLE ? `${ZERO_STR}${second}` : second;
 let nowTime = `${head}${SPLIT}${end}`;
 return nowTime;
};

指定視頻播放進度及添加onChange事件回調(diào) 如需手動進行進度條的拖動,則需要在Slider組件中指定播放進度,并為Slider組件添加onChange事件回調(diào)。Slider滑動時就會觸發(fā)該事件回調(diào),從而實現(xiàn)將視頻定位到進度條當(dāng)前刷新位置,完成時長組件渲染與視頻播放進度數(shù)據(jù)聯(lián)動。

Slider({...})
 .onChange((value: number, mode: SliderChangeMode) = > {
 sliderOnchange.call(this, value, mode);
  })
export function sliderOnchange(value: number, mode: SliderChangeMode) {
 this.currentTime = parseInt(value.toString());
 this.controller.setCurrentTime(parseInt(value.toString()), SeekMode.Accurate);
  ...
};

到這里我們就實現(xiàn)了自定義控制器的構(gòu)建,兩個Text組件顯示的時長是由Slider組件的onChange回調(diào)事件來進行傳遞的,而Text組件的數(shù)值與視頻播放進度數(shù)值value則通過是onUpdate與onChange事件并借由@Provide @Consume裝飾器進行的數(shù)據(jù)聯(lián)動。

審核編輯 黃宇

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

    關(guān)注

    13

    文章

    4533

    瀏覽量

    87468
  • 鴻蒙
    +關(guān)注

    關(guān)注

    60

    文章

    2620

    瀏覽量

    44063
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    鴻蒙開發(fā)ArkUI-X基礎(chǔ)知識:【ArkUI跨平臺設(shè)計總體說明】

    本文檔描述ArkUI開發(fā)框架跨平臺運行能力相關(guān)的總體技術(shù)方案。
    的頭像 發(fā)表于 05-24 15:41 ?2172次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>ArkUI</b>-X基礎(chǔ)知識:【<b class='flag-5'>ArkUI</b>跨平臺設(shè)計總體說明】

    鴻蒙開發(fā)ArkUI-X基礎(chǔ)知識:【ArkUI代碼工程及構(gòu)建介紹】

    ArkUI作為OpenHarmony的默認開發(fā)框架,在本項目(ArkUI-X)中需要做到一套代碼同時支持多平臺構(gòu)建,所以會采取共倉開發(fā)的方式,部分倉直接指向OpenHarmony相關(guān)開
    的頭像 發(fā)表于 05-25 16:45 ?2779次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>ArkUI</b>-X基礎(chǔ)知識:【<b class='flag-5'>ArkUI</b>代碼工程及構(gòu)建介紹】

    鴻蒙開發(fā)OpenHarmony組件復(fù)用案例

    ) } }, item => item) } } } 本文主要是對鴻蒙開發(fā)基礎(chǔ)當(dāng)中的OpenHarmony技術(shù)組件復(fù)用示例, 更多鴻蒙開發(fā)
    發(fā)表于 01-15 17:37

    鴻蒙開發(fā)-ArkUI 組件基礎(chǔ)

    1 組件介紹 組件(Component)是界面搭建與顯示的最小單位,HarmonyOS ArkUI聲明式開發(fā)范式為開發(fā)者提供了豐富多樣的UI
    發(fā)表于 01-17 19:31

    鴻蒙開發(fā)-ArkUI框架實戰(zhàn)【日歷應(yīng)用 】

    對于剛剛接觸OpenHarmony應(yīng)用開發(fā)開發(fā)者,最快的入門方式就是開發(fā)一個簡單的應(yīng)用,下面記錄了一個日歷應(yīng)用的開發(fā)過程,通過日歷應(yīng)用的開發(fā)
    發(fā)表于 01-17 21:37

    鴻蒙開發(fā)實戰(zhàn)-(ArkUI)List組件和Grid組件的使用

    一系列相同寬度的列表項,連續(xù)、多行呈現(xiàn)同類數(shù)據(jù),例如圖片和文本。常見的列表有線性列表(List列表)和網(wǎng)格布局(Grid列表): 為了幫助開發(fā)者構(gòu)建包含列表的應(yīng)用,ArkUI提供了List組件和Grid
    發(fā)表于 01-18 20:18

    編程小白也能快速掌握的ArkUI JS組件開發(fā)

    好評。特別是它的ArkUI JS組件在線預(yù)覽功能,不但可以從中學(xué)習(xí)基礎(chǔ)組件的使用,還可以在線體驗一鍵預(yù)覽的編譯效果。 通過Playground在線體驗,從前沒有接觸過編程的小白也可以分分鐘掌握
    發(fā)表于 08-31 11:09

    ArkUI新能力,助力應(yīng)用開發(fā)更便捷

    作者:niulihua,華為ArkUI技術(shù)專家;wanglei,華為ArkUI技術(shù)專家 ArkUI是一套構(gòu)建分布式應(yīng)用的聲明式UI開發(fā)框架。它具備簡潔自然的UI信息語法、豐富的UI
    的頭像 發(fā)表于 02-15 16:35 ?1075次閱讀

    鴻蒙ArkUI開發(fā)-Tabs組件的使用

    鴻蒙ArkUI開發(fā)-Tabs組件的使用
    的頭像 發(fā)表于 01-19 16:01 ?2746次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI</b><b class='flag-5'>開發(fā)</b>-Tabs<b class='flag-5'>組件</b>的使用

    鴻蒙ArkUI開發(fā)實戰(zhàn):eTS版【笑話app】

    制作一款笑話app,使用ArkUI。
    的頭像 發(fā)表于 03-25 16:04 ?760次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI</b><b class='flag-5'>開發(fā)</b>實戰(zhàn):eTS版【笑話app】

    鴻蒙ArkUI實例:【自定義組件

    組件是 OpenHarmony 頁面最小顯示單元,一個頁面可由多個組件組合而成,也可只由一個組件組合而成,這些組件可以是ArkUI
    的頭像 發(fā)表于 04-08 10:17 ?1094次閱讀

    鴻蒙ArkUI:【從代碼到UI顯示的整體渲染流程】

    方舟開發(fā)框架(簡稱ArkUI)是鴻蒙開發(fā)的UI框架,提供如下兩種開發(fā)范式,我們 **只學(xué)聲明式開發(fā)
    的頭像 發(fā)表于 05-13 16:06 ?1635次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI</b>:【從代碼到UI顯示的整體渲染流程】

    鴻蒙跨平臺框架:【ArkUi-X】創(chuàng)建工程

    鴻蒙推出了鴻ArkUi-X 框架所以就寫個文章分享一下
    的頭像 發(fā)表于 05-13 17:48 ?1554次閱讀
    <b class='flag-5'>鴻蒙</b>跨平臺框架:【<b class='flag-5'>ArkUi</b>-X】創(chuàng)建工程

    鴻蒙ArkUI-X跨平臺技術(shù):【開發(fā)準(zhǔn)備】

    本文檔適用于ArkUI跨平臺應(yīng)用開發(fā)的初學(xué)者。通過開發(fā)環(huán)境搭建、應(yīng)用工程創(chuàng)建、編譯和運行,熟悉ArkUI跨平臺應(yīng)用開發(fā)基本流程。
    的頭像 發(fā)表于 05-24 10:40 ?992次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI</b>-X跨平臺技術(shù):【<b class='flag-5'>開發(fā)</b>準(zhǔn)備】

    【HarmonyOS 5】金融應(yīng)用開發(fā)鴻蒙組件實踐

    【HarmonyOS 5】金融應(yīng)用開發(fā)鴻蒙組件實踐 ##鴻蒙開發(fā)能力 ##HarmonyOS SDK應(yīng)用服務(wù)##
    的頭像 發(fā)表于 07-11 18:20 ?289次閱讀
    【HarmonyOS 5】金融應(yīng)用<b class='flag-5'>開發(fā)</b><b class='flag-5'>鴻蒙</b><b class='flag-5'>組件</b>實踐