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

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

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

OpenHarmony視頻播放器

ArkUI詳解 ? 來源:鴻蒙實(shí)驗(yàn)室 ? 作者:鴻蒙實(shí)驗(yàn)室 ? 2022-08-16 15:06 ? 次閱讀

OpenHarmony視頻播放器

作者“堅(jiān)果,華為云享專家,InfoQ簽約作者,潤和軟件KOL專家,電子發(fā)燒友鴻蒙MVP,51CTO博客專家博主,阿里云博客專家,開源項(xiàng)目gin-vue-admin成員之一

由于視頻資源在項(xiàng)目中使用較為頻繁,于是有了這個(gè)教程,本教程在最后也是實(shí)現(xiàn)了一個(gè)簡單的播放器。

效果預(yù)覽

Video

由于使用本地視頻文件會(huì)影響App的包大小,所以通常我們的視頻文件來源于網(wǎng)絡(luò)地址,需要在config或者module.json對(duì)應(yīng)的"abilities"中添加網(wǎng)絡(luò)使用權(quán)限ohos.permission.INTERNET。我是為了測試方便用的本地視頻,大家別嫌棄。

"abilities":[

{

"permissions": ["ohos.permission.INTERNET"],

}

]

在使用的時(shí)候一個(gè)VideoController對(duì)象可以控制一個(gè)或多個(gè)video。

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

controller: VideoController = new VideoController();

接口

declare interface VideoOptions {

src?: string | Resource;

?

currentProgressRate?: number | string | PlaybackSpeed;

previewUri?: string | PixelMap | Resource;

?

controller?: VideoController;

}

其中僅src( 視頻播放源的路徑 )這個(gè)參數(shù)是必填的。

支持本地視頻路徑和網(wǎng)絡(luò)路徑。

支持在resources下面的video或rawfile文件夾里放置媒體資源。

支持dataability://的路徑前綴,用于訪問通過Data Ability提供的視頻路徑

currentProgressRate:number 視頻播放倍速,支持0.75,1.0,1.25,1.75,2.0。

previewUri:string 預(yù)覽圖片的路徑,可以作為視頻未播放時(shí)的封面。

controller:VideoController 控制器。一個(gè)VideoController對(duì)象可以控制一個(gè)或多個(gè)video。如果需要通過代碼控制視頻的播放、暫停等,可以給Video組件設(shè)置這個(gè)參數(shù),然后通過控制器的如下接口控制視頻播放狀態(tài):

這兒我需要將PlaybackSpeed和VideoController單獨(dú)拎出來做一個(gè)解釋。

PlaybackSpeed類型接口說明

Speed_Forward_0_75_X 0.75倍速播放。
Speed_Forward_1_00_X 1倍速播放。
Speed_Forward_1_25_X 1.25倍速播放。
Speed_Forward_1_75_X 1.75倍速播放。
Speed_Forward_2_00_X 2倍速播放。
名稱 描述

declare

enum

PlaybackSpeed

{

?

Speed_Forward_0_75_X

,

?

Speed_Forward_1_00_X

,

?

Speed_Forward_1_25_X

,

?

?

Speed_Forward_1_75_X

,

?

Speed_Forward_2_00_X

,

}

VideoController

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

start() : void 開始播放。

pause() : void 暫停播放。

stop() : void 停止播放。

setCurrentTime(value: number, seekMode: SeekMode)指定視頻播放的進(jìn)度位置,并指定跳轉(zhuǎn)模式。value是進(jìn)度,seekMode是跳轉(zhuǎn)模式

requestFullscreen() : boolean() 請(qǐng)求全屏播放,true是橫屏,false豎屏。

exitFullscreen() : void 退出全屏。

在這兒,我同樣需要將setCurrentTime單獨(dú)拎出

setCurrentTime8+

setCurrentTime(value: number, seekMode: SeekMode)

指定視頻播放的進(jìn)度位置,并指定跳轉(zhuǎn)模式。

參數(shù)

SeekMode8+類型接口說明

?

declare enum SeekMode {

?

PreviousKeyframe,

?

?

NextKeyframe,

?

?

ClosestKeyframe,

?

Accurate,

}

?

Video屬性

muted(是否靜音)、autoPlay(自動(dòng)播放)、controls(控制欄)、objectFit(顯示模式)、loop(是否循環(huán)播放)。其中,objectFit參數(shù)設(shè)置值為ImageFit.Cover則鋪滿整個(gè)容器。

詳細(xì)介紹

.muted(boolean) 默認(rèn)值false 是否靜音。

.autoPlay(boolean) 默認(rèn)值false 是否自動(dòng)播放。

.controls(boolean) 默認(rèn)值true 控制視頻播放的控制欄是否顯示。

.loop(boolean) 是否單個(gè)視頻循環(huán)播放。

.objectFit(ImageFit) 默認(rèn)值Cover 設(shè)置視頻顯示模式。ImageFit有如下枚舉值可選

ImageFit枚舉說明

名稱 描述
Cover 保持寬高比進(jìn)行縮小或者放大,使得圖片兩邊都大于或等于顯示邊界。
Contain 保持寬高比進(jìn)行縮小或者放大,使得圖片完全顯示在顯示邊界內(nèi)。
Fill 不保持寬高比進(jìn)行放大縮小,使得圖片填充滿顯示邊界。
None 保持原有尺寸顯示。通常配合objectRepeat屬性一起使用。
ScaleDown 保持寬高比顯示,圖片縮小或者保持不變。

事件

onStart() => void 播放時(shí)觸發(fā)該事件。

onPause() => void 暫停時(shí)觸發(fā)該事件。

onFinish() => void 播放結(jié)束時(shí)觸發(fā)該事件。

onError() => void 播放失敗時(shí)觸發(fā)該事件。

onFullscreenChange(event?: { fullscreen: boolean }) => void) 視頻進(jìn)入和退出全屏?xí)r觸發(fā)該事件。

onPrepared(event?: { duration: number }) => void 視頻準(zhǔn)備完成時(shí)觸發(fā)該事件,通過duration可以獲取視頻時(shí)長,單位為秒(s)。

onSeeking(event?: { time: number }) => void 操作進(jìn)度條過程時(shí)上報(bào)時(shí)間信息,單位為s。

onSeeked(event?: { time: number }) => void 操作進(jìn)度條完成后,上報(bào)播放時(shí)間信息,單位為s。

onUpdate(event?: { time: number }) => void 播放進(jìn)度變化時(shí)觸發(fā)該事件,單位為s,更新時(shí)間間隔為250ms。

表格

名稱 功能描述
onStart() => void 播放時(shí)觸發(fā)該事件。
onPause() => void 暫停時(shí)觸發(fā)該事件。
onFinish() => void 播放結(jié)束時(shí)觸發(fā)該事件。
onError() => void 播放失敗時(shí)觸發(fā)該事件。
onPrepared(event?: { duration: number }) => void 視頻準(zhǔn)備完成時(shí)觸發(fā)該事件,通過duration可以獲取視頻時(shí)長,單位為秒(s)。
onSeeking(event?: { time: number }) => void 操作進(jìn)度條過程時(shí)上報(bào)時(shí)間信息,單位為s。
onSeeked(event?: { time: number }) => void 操作進(jìn)度條完成后,上報(bào)播放時(shí)間信息,單位為s。
onUpdate(event?: { time: number }) => void 播放進(jìn)度變化時(shí)觸發(fā)該事件,單位為s,更新時(shí)間間隔為250ms。

完整示例

@

Entry

@

Component

struct

Index

{

@

State

message

:

string

=

'視頻預(yù)覽'

@

State

previewUris

:

Resource

=

$r

(

'app.media.openharmony'

);

//預(yù)覽封面

controller

:

VideoController

=

new

VideoController

();

@

State

currentProgressRate

:

number

=

1

@

State

muted

:

boolean

=

false

@

State

autoPlay

:

boolean

=

true

@

State

controls

:

boolean

=

true

@

State

startStatus

:

boolean

=

true

@

State

loop

:

boolean

=

true

?

aboutToAppear

() {

this

.

controller

.

requestFullscreen

(

true

)

this

.

controller

.

start

()

}

?

build

() {

?

Column

() {

Text

(

this

.

message

)

.

fontSize

(

50

)

.

fontWeight

(

FontWeight

.

Bold

)

Video

({

src

:

$r

(

'app.media.video'

),

previewUri

:

this

.

previewUris

,

// 視頻封面

currentProgressRate

:

this

.

currentProgressRate

,

// 視頻播放倍速

controller

:

this

.

controller

,

?

})

.

muted

(

this

.

muted

)

// 是否靜音

.

autoPlay

(

this

.

autoPlay

)

// 是否自動(dòng)播放

.

controls

(

this

.

controls

)

// 控制視頻播放的控制欄是否顯示

.

objectFit

(

ImageFit

.

Contain

)

// 視頻顯示模式

.

loop

(

this

.

loop

)

// 是否單個(gè)視頻循環(huán)播放

.

height

(

"60%"

)

.

onStart

(()

=>

{

// 播放時(shí)觸發(fā)該事件

console

.

info

(

'onStart'

);

})

.

onPause

(()

=>

{

// 暫停時(shí)觸發(fā)該事件

console

.

info

(

'onPause'

);

})

.

onFinish

(()

=>

{

console

.

info

(

'onFinish'

);

?

})

.

onError

(()

=>

{

// 播放失敗時(shí)觸發(fā)該事件

console

.

error

(

'onError'

);

})

.

onFullscreenChange

((

e

)

=>

{

console

.

info

(

'視頻進(jìn)入和退出全屏?xí)r觸發(fā)該事件:'

+

e

.

fullscreen

)

})

.

onPrepared

((

e

)

=>

{

console

.

info

(

'視頻準(zhǔn)備完成時(shí)觸發(fā)該事件:'

+

e

.

duration

)

})

.

onSeeking

((

e

)

=>

{

console

.

info

(

'操作進(jìn)度條過程時(shí)上報(bào)時(shí)間信息:'

+

e

.

time

)

})

.

onSeeked

((

e

)

=>

{

console

.

info

(

'操作進(jìn)度條完成后,上報(bào)播放時(shí)間信息:'

+

e

.

time

)

})

.

onUpdate

((

e

)

=>

{

console

.

info

(

'播放進(jìn)度變化時(shí)觸發(fā)該事件:'

+

e

.

time

)

})

Row

({}) {

Flex

({

wrap

:

FlexWrap

.

Wrap

,

justifyContent

:

FlexAlign

.

SpaceAround

,

alignItems

:

ItemAlign

.

Center

}) {

Button

(

"播放"

)

.

onClick

(()

=>

{

this

.

controller

.

start

()

}).

margin

(

8

)

Button

(

"暫停"

)

.

onClick

(()

=>

{

this

.

controller

.

pause

()

})

Button

(

"循環(huán)播放"

)

.

onClick

(()

=>

{

this

.

loop

=!

this

.

loop

})

Button

(

"2倍速"

)

.

onClick

(()

=>

{

this

.

currentProgressRate

=

2

})

Button

(

"靜音"

)

.

onClick

(()

=>

{

this

.

muted

=!

this

.

muted

})

?

Button

(

"停止"

)

.

onClick

(()

=>

{

this

.

controller

.

stop

()

})

?

Button

(

"全屏播放"

)

.

onClick

(()

=>

{

this

.

controller

.

requestFullscreen

(

true

)

})

Button

(

"退出全屏"

)

.

onClick

(()

=>

{

this

.

controller

.

exitFullscreen

()

}).

margin

(

8

)

?

Button

(

"控制欄是否顯示"

)

.

onClick

(()

=>

{

this

.

controls

=

!

this

.

controls

}).

margin

(

8

)

?

Button

(

"指定視頻播放的進(jìn)度"

)

.

onClick

(()

=>

{

this

.

controller

.

setCurrentTime

(

9

)

})

}

}

}

.

width

(

'100%'

).

height

(

'100%'

)

}

}

參考文檔

video

flex

名稱 描述
PreviousKeyframe 跳轉(zhuǎn)到前一個(gè)最近的關(guān)鍵幀。
NextKeyframe 跳轉(zhuǎn)到后一個(gè)最近的關(guān)鍵幀。
ClosestKeyframe 跳轉(zhuǎn)到最近的關(guān)鍵幀。
Accurate 精準(zhǔn)跳轉(zhuǎn),不論是否為關(guān)鍵幀。
參數(shù)名 參數(shù)類型 必填 默認(rèn)值 參數(shù)描述
value number - 視頻播放進(jìn)度位置。
seekMode SeekMode - 跳轉(zhuǎn)模式。
審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Video
    +關(guān)注

    關(guān)注

    0

    文章

    196

    瀏覽量

    45743
  • 視頻播放器
    +關(guān)注

    關(guān)注

    0

    文章

    33

    瀏覽量

    12011
  • OpenHarmony
    +關(guān)注

    關(guān)注

    27

    文章

    3835

    瀏覽量

    18175
收藏 人收藏

    評(píng)論

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

    如何基于 OpenHarmony 制作一個(gè)簡單視頻播放器?

    OpenHarmony視頻播放器作者“堅(jiān)果,華為云享專家,InfoQ簽約作者,潤和軟件KOL專家,電子發(fā)燒友鴻蒙MVP,阿里云博客專家,開源項(xiàng)目gin-vue-admin成員之一由于視頻
    發(fā)表于 08-16 18:02

    #DAYU200#OpenHarmony 視頻播放器

    0.75,1.0,1.25,1.75,2.0。previewUri:string 預(yù)覽圖片的路徑,可以作為視頻播放時(shí)的封面。controller:VideoController 控制。一個(gè)
    發(fā)表于 09-15 17:25

    在DAYU200上實(shí)現(xiàn)OpenHarmony視頻播放器

    內(nèi)容簡介本文介紹了如何使用ArkUI框架提供的video組件,實(shí)現(xiàn)一個(gè)具有簡易播放器。通過VideoController控制來控制倍速、全屏、進(jìn)度調(diào)節(jié)等功能。由于使用本地視頻文件會(huì)影響App的包
    發(fā)表于 10-14 12:12

    網(wǎng)頁視頻播放器代碼

    網(wǎng)頁視頻播放器代碼
    發(fā)表于 01-10 11:23 ?102次下載
    網(wǎng)頁<b class='flag-5'>視頻</b><b class='flag-5'>播放器</b>代碼

    flv視頻播放器代碼

    flv視頻播放器代碼 FlV視頻播放器代碼 代碼如下這里只是介紹幾個(gè)例子,現(xiàn)在把代碼公布一下,大家可以參考著做,也可以把你喜歡的視頻連接
    發(fā)表于 01-10 12:36 ?2151次閱讀

    基于FPGA NiosII的MPEG-4視頻播放器

    基于FPGA NiosII的MPEG-4視頻播放器介紹Altera FPGA SOPC平臺(tái)上MPEG-4視頻播放器的實(shí)現(xiàn)。以NiosII用戶自定義指令方式實(shí)現(xiàn)IQ、IDCT
    發(fā)表于 10-09 14:46 ?1766次閱讀
    基于FPGA NiosII的MPEG-4<b class='flag-5'>視頻</b><b class='flag-5'>播放器</b>

    MP4播放器視頻播放格式有哪些?

    MP4播放器視頻播放格式有哪些?        
    發(fā)表于 12-21 15:51 ?2.5w次閱讀

    LXE播放器

    lxe視頻播放器軟件是免費(fèi)軟件,可以完全免費(fèi)使用、可以自由傳播,exe視頻播放器用于播放屏幕錄像專家錄制的LXE和EXE格式的錄像文件,安裝
    發(fā)表于 11-23 16:14 ?0次下載

    關(guān)于VR電影視頻播放器 盤點(diǎn)12款VR播放器

    VR電影和視頻那個(gè)播放器好,哪些播放器更為實(shí)用,由于視頻資源格式多樣,在一個(gè)播放器播放不了的
    發(fā)表于 06-27 15:50 ?12.8w次閱讀

    基于開源項(xiàng)目fenster組件適配移植的視頻播放器教程

    .簡易視頻播放器功能 支持暫停和播放,播放進(jìn)度顯示,快進(jìn)和快退功能
    發(fā)表于 04-02 14:57 ?2次下載

    在DAYU200上實(shí)現(xiàn)OpenHarmony視頻播放器

    何使用ArkUI框架提供的video組件,實(shí)現(xiàn)一個(gè)具有簡易播放器。通過VideoController控制來控制倍速、全屏、進(jìn)度調(diào)節(jié)等功能。 由于使用本地視頻文件會(huì)影響App的包大小,所以通常我們
    的頭像 發(fā)表于 10-27 10:19 ?1231次閱讀

    【大咖分享】OpenHarmony元能力子系統(tǒng)分享

    開發(fā)板免費(fèi)體驗(yàn) 國產(chǎn)龍芯 LoongArch 平臺(tái)已初步支持OpenHarmony操作系統(tǒng) 在DAYU200上實(shí)現(xiàn)OpenHarmony視頻播放器
    的頭像 發(fā)表于 10-24 12:20 ?1053次閱讀

    HarmonyOS開發(fā)案例:【視頻播放器

    基于video、swiper和slider組件,實(shí)現(xiàn)簡單的視頻播放器,可支持海報(bào)輪播、視頻播放等功能。
    的頭像 發(fā)表于 04-22 21:06 ?891次閱讀
    HarmonyOS開發(fā)案例:【<b class='flag-5'>視頻</b><b class='flag-5'>播放器</b>】

    HarmonyOS開發(fā)案例:【視頻播放器

    使用ArkTS語言實(shí)現(xiàn)視頻播放器,主要包括主界面和視頻播放界面,
    的頭像 發(fā)表于 04-23 17:25 ?1133次閱讀
    HarmonyOS開發(fā)案例:【<b class='flag-5'>視頻</b><b class='flag-5'>播放器</b>】

    HarmonyOS開發(fā)案例:【視頻播放器

    使用ArkTS語言實(shí)現(xiàn)視頻播放器,主要包括主頁面和視頻播放頁面
    的頭像 發(fā)表于 04-24 14:52 ?1312次閱讀
    HarmonyOS開發(fā)案例:【<b class='flag-5'>視頻</b><b class='flag-5'>播放器</b>】

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品