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

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

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

鴻蒙上制作一個視頻播放器

OpenHarmony技術(shù)社區(qū) ? 來源:OST開源開發(fā)者 ? 作者:OST開源開發(fā)者 ? 2023-04-11 09:56 ? 次閱讀

媒體子系統(tǒng)是 OpenHarmony 中重要的子系統(tǒng),可以提供音視頻播放能力。

媒體子系統(tǒng)為開發(fā)者提供一套簡單且易于理解的接口,使得開發(fā)者能夠方便接入系統(tǒng)并使用系統(tǒng)的媒體資源。

媒體子系統(tǒng)提供以下常用功能如下:

①音視頻播放(AVPlayer9+),AudioPlayer6+ 和 VideoPlayer8+ 整合,升級了狀態(tài)機(jī)和錯誤碼,推薦使用。

②音視頻錄制(AVRecorder9+),AudioRecorder6+ 和 VideoRecorder9+ 整合,推薦使用。

音頻播放(AudioPlayer6+),AVPlayer9+ 發(fā)布后停止維護(hù),請使用 AVPlayer9+。

視頻播放(VideoPlayer8+),AVPlayer9+ 發(fā)布后停止維護(hù),請使用 AVPlayer9+。

⑤音頻錄制(AudioRecorder6+),AVRecorder9+ 發(fā)布后停止維護(hù),請使用 AVRecorder9+。

⑥視頻錄制(VideoRecorder9+),AVRecorder9+ 發(fā)布后停止維護(hù),請使用 AVRecorder9+。

從 3.2 開始 OpenHarmony 推出了 AVPlayer 和 AVRecorder 接口,之前的 VideoPlayer、AudioPlayer 這些接口會停止維護(hù),所以我們今天學(xué)習(xí)下怎么使用 AVPlayer 接口。

導(dǎo)入模塊

importmediafrom'@ohos.multimedia.media';

創(chuàng)建 avplayer:

this.avPlayer=awaitmedia.createAVPlayer()

如上,我們使用的是 promise 接口,對應(yīng)的接口定義為:

/**
*CreatesanAVPlayerinstance.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@paramcallbackCallbackusedtoreturnAVPlayerinstanceiftheoperationissuccessful;returnsnullotherwise.
*@throws{BusinessError}5400101-Nomemory.Returnbycallback.
*/
functioncreateAVPlayer(callback:AsyncCallback):void;

/**
*CreatesanAVPlayerinstance.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@returnsAPromiseinstanceusedtoreturnAVPlayerinstanceiftheoperationissuccessful;returnsnullotherwise.
*@throws{BusinessError}5400101-Nomemory.Returnbypromise.
*/
functioncreateAVPlayer():Promise;
注冊 avplayer 回調(diào):
//注冊狀態(tài)變化回調(diào),不同狀態(tài)時做不同動作
avPlayer.on('stateChange',async(state,reason)=>{
……
})
//注冊時間變化回調(diào),方便更新進(jìn)度條時間
avPlayer.on('timeUpdate',(time:number)=>{
……
})
avplayer 播放流程:
graphLR
賦值avPlayer.url開始播放-->回調(diào)進(jìn)入initialized-->賦值avPlayer.surfaceId-->avPlayer.prepare-->回調(diào)進(jìn)入prepared-->avPlayer.play
//視頻播放偽代碼
asyncavPlayerDemo(){
this.avPlayer.on('stateChange',async(state,reason)=>{
switch(state){
case'idle'://成功調(diào)用reset接口后觸發(fā)該狀態(tài)機(jī)上報
console.info(TAG+'stateidlecalled')
this.avPlayer.release()//釋放avplayer對象
break;
case'initialized'://avplayer設(shè)置播放源后觸發(fā)該狀態(tài)上報
console.info(TAG+'stateinitializedcalled')
this.avPlayer.surfaceId=this.surfaceID//設(shè)置顯示畫面,當(dāng)播放的資源為純音頻時無需設(shè)置
this.avPlayer.prepare().then(()=>{
console.info(TAG+'preparesuccess');
},(err)=>{
console.error(TAG+'preparefiled,errormessageis:'+err.message)
})
break;
case'prepared'://prepare調(diào)用成功后上報該狀態(tài)機(jī)
console.info(TAG+'statepreparedcalled')
this.avPlayer.play()//調(diào)用播放接口開始播放
break;
case'playing'://play成功調(diào)用后觸發(fā)該狀態(tài)機(jī)上報
console.info(TAG+'stateplayingcalled')
if(this.count==0){
this.avPlayer.pause()//調(diào)用暫停播放接口
}else{
this.avPlayer.seek(10000,media.SeekMode.SEEK_PREV_SYNC)//前向seek置10秒處,觸發(fā)seekDone回調(diào)函數(shù)
}
break;
case'paused'://pause成功調(diào)用后觸發(fā)該狀態(tài)機(jī)上報
console.info(TAG+'statepausedcalled')
if(this.count==0){
this.count++
this.avPlayer.play()//繼續(xù)調(diào)用播放接口開始播放
}
break;
case'completed'://播放結(jié)束后觸發(fā)該狀態(tài)機(jī)上報
console.info(TAG+'statecompletedcalled')
this.avPlayer.stop()//調(diào)用播放結(jié)束接口
break;
case'stopped'://stop接口成功調(diào)用后觸發(fā)該狀態(tài)機(jī)上報
console.info(TAG+'statestoppedcalled')
this.avPlayer.reset()//調(diào)用reset接口初始化avplayer狀態(tài)
break;
case'released':
console.info(TAG+'statereleasedcalled')
break;
case'error':
console.info(TAG+'stateerrorcalled')
break;
default:
console.info(TAG+'unkownstate:'+state)
break;
}
})

//創(chuàng)建avPlayer實(shí)例對象
this.avPlayer=awaitmedia.createAVPlayer()
letfdPath='fd://'
letpathDir="/data/storage/el2/base/haps/entry/files"http://pathDir在FA模型和Stage模型的獲取方式不同,請參考開發(fā)步驟首行的說明,根據(jù)實(shí)際情況自行獲取。
//path路徑的碼流可通過"hdcfilesendD:xxxH264_AAC.mp4/data/app/el2/100/base/ohos.acts.multimedia.media.avplayer/haps/entry/files"命令,將其推送到設(shè)備上
letpath=pathDir+'/H264_AAC.mp4'
letfile=awaitfs.open(path)
fdPath=fdPath+''+file.fd
//賦值url后就會進(jìn)入stateChangecallback
this.avPlayer.url=fdPath
}
其他播放控制接口:
/**
*Prepareaudio/videoplayback,itwillrequestresourceforplaying.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@paramcallbackAcallbackinstanceusedtoreturnwhenpreparecompleted.
*@throws{BusinessError}5400102-Operationnotallowed.Returnbycallback.
*@throws{BusinessError}5400106-Unsupportformat.Returnbycallback.
*/
prepare(callback:AsyncCallback):void;

/**
*Prepareaudio/videoplayback,itwillrequestresourceforplaying.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@returnsAPromiseinstanceusedtoreturnwhenpreparecompleted.
*@throws{BusinessError}5400102-Operationnotallowed.Returnbypromise.
*@throws{BusinessError}5400106-Unsupportformat.Returnbypromise.
*/
prepare():Promise;

/**
*Playaudio/videoplayback.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@paramcallbackAcallbackinstanceusedtoreturnwhenplaycompleted.
*@throws{BusinessError}5400102-Operationnotallowed.Returnbycallback.
*/
play(callback:AsyncCallback):void;

/**
*Playaudio/videoplayback.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@returnsAPromiseinstanceusedtoreturnwhenplaycompleted.
*@throws{BusinessError}5400102-Operationnotallowed.Returnbypromise.
*/
play():Promise;

/**
*Pauseaudio/videoplayback.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@paramcallbackAcallbackinstanceusedtoreturnwhenpausecompleted.
*@throws{BusinessError}5400102-Operationnotallowed.Returnbycallback.
*/
pause(callback:AsyncCallback):void;

/**
*Pauseaudio/videoplayback.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@returnsAPromiseinstanceusedtoreturnwhenpausecompleted.
*@throws{BusinessError}5400102-Operationnotallowed.Returnbypromise.
*/
pause():Promise;

/**
*Stopaudio/videoplayback.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@paramcallbackAcallbackinstanceusedtoreturnwhenstopcompleted.
*@throws{BusinessError}5400102-Operationnotallowed.Returnbycallback.
*/
stop(callback:AsyncCallback):void;

/**
*Stopaudio/videoplayback.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@returnsAPromiseinstanceusedtoreturnwhenstopcompleted.
*@throws{BusinessError}5400102-Operationnotallowed.Returnbypromise.
*/
stop():Promise;

/**
*ResetAVPlayer,itwilltoidlestateandcansetsrcagain.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@paramcallbackAcallbackinstanceusedtoreturnwhenresetcompleted.
*@throws{BusinessError}5400102-Operationnotallowed.Returnbycallback.
*/
reset(callback:AsyncCallback):void;

/**
*ResetAVPlayer,itwilltoidlestateandcansetsrcagain.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@returnsAPromiseinstanceusedtoreturnwhenresetcompleted.
*@throws{BusinessError}5400102-Operationnotallowed.Returnbypromise.
*/
reset():Promise;

/**
*ReleasesresourcesusedforAVPlayer.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@paramcallbackAcallbackinstanceusedtoreturnwhenreleasecompleted.
*@throws{BusinessError}5400102-Operationnotallowed.Returnbycallback.
*/
release(callback:AsyncCallback):void;

/**
*ReleasesresourcesusedforAVPlayer.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@returnsAPromiseinstanceusedtoreturnwhenreleasecompleted.
*@throws{BusinessError}5400102-Operationnotallowed.Returnbypromise.
*/
release():Promise;

/**
*Jumpstothespecifiedplaybackposition.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@paramtimeMsPlaybackpositiontojump,shouldbein[0,duration].
*@parammodeSee@SeekMode.
*/
seek(timeMs:number,mode?void;
其他回調(diào)接口:
/**
*Registerorunregisterlistensformediaplaybackevents.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@paramtypeTypeoftheplaybackeventtolistenfor.
*@paramcallbackCallbackusedtolistenfortheplaybackstateChangeevent.
*/
on(type:'stateChange',callback:(state:AVPlayerState,reason:StateChangeReason)=>void):void;
off(type:'stateChange'):void;
/**
*Registerorunregisterlistensformediaplaybackevents.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@paramtypeTypeoftheplaybackeventtolistenfor.
*@paramcallbackCallbackusedtolistenfortheplaybackvolumeevent.
*/
on(type:'volumeChange',callback:Callback):void;
off(type:'volumeChange'):void;
/**
*Registerorunregisterlistensformediaplaybackevents.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@paramtypeTypeoftheplaybackeventtolistenfor.
*@paramcallbackCallbackusedtolistenfortheplaybackendofstream
*/
on(type:'endOfStream',callback:Callback):void;
off(type:'endOfStream'):void;
/**
*Registerorunregisterlistensformediaplaybackevents.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@paramtypeTypeoftheplaybackeventtolistenfor.
*@paramcallbackCallbackusedtolistenfortheplaybackseekDoneevent.
*/
on(type:'seekDone',callback:Callback):void;
off(type:'seekDone'):void;
/**
*Registerorunregisterlistensformediaplaybackevents.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@paramtypeTypeoftheplaybackeventtolistenfor.
*@paramcallbackCallbackusedtolistenfortheplaybackspeedDoneevent.
*/
on(type:'speedDone',callback:Callback):void;
off(type:'speedDone'):void;
/**
*Registerorunregisterlistensformediaplaybackevents.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@paramtypeTypeoftheplaybackeventtolistenfor.
*@paramcallbackCallbackusedtolistenfortheplaybacksetBitrateDoneevent.
*/
on(type:'bitrateDone',callback:Callback):void;
off(type:'bitrateDone'):void;
/**
*LRegisterorunregisterlistensformediaplaybackevents.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@paramtypeTypeoftheplaybackeventtolistenfor.
*@paramcallbackCallbackusedtolistenfortheplaybacktimeUpdateevent.
*/
on(type:'timeUpdate',callback:Callback):void;
off(type:'timeUpdate'):void;
/**
*Registerorunregisterlistensformediaplaybackevents.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@paramtypeTypeoftheplaybackeventtolistenfor.
*@paramcallbackCallbackusedtolistenfortheplaybackdurationUpdateevent.
*/
on(type:'durationUpdate',callback:Callback):void;
off(type:'durationUpdate'):void;
/**
*Registerorunregisterlistensforvideoplaybackbufferingevents.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@paramtypeTypeoftheplaybackbufferingupdateeventtolistenfor.
*@paramcallbackCallbackusedtolistenforthebufferingupdateevent,returnBufferingInfoTypeandthevalue.
*/
on(type:'bufferingUpdate',callback:(infoType:BufferingInfoType,value:number)=>void):void;
off(type:'bufferingUpdate'):void;
/**
*Registerorunregisterlistensforstartrendervideoframeevents.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@paramtypeTypeoftheplaybackeventtolistenfor.
*@paramcallbackCallbackusedtolistenfortheplaybackeventreturn.
*/
on(type:'startRenderFrame',callback:Callback):void;
off(type:'startRenderFrame'):void;
/**
*Registerorunregisterlistensforvideosizechangeevent.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@paramtypeTypeoftheplaybackeventtolistenfor.
*@paramcallbackCallbackusedtolistenfortheplaybackeventreturnvideosize.
*/
on(type:'videoSizeChange',callback:(width:number,height:number)=>void):void;
off(type:'videoSizeChange'):void;
/**
*Registerorunregisterlistensforaudiointerruptevent,referto{@link#audio.InterruptEvent}
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@paramtypeTypeoftheplaybackeventtolistenfor.
*@paramcallbackCallbackusedtolistenfortheplaybackeventreturnaudiointerruptinfo.
*/
on(type:'audioInterrupt',callback:(info:audio.InterruptEvent)=>void):void;
off(type:'audioInterrupt'):void;
/**
*RegisterorunregisterlistensforavailablebitratelistcollectcompletedeventsforHLSprotocolstreamplayback.
*Thiseventwillbereportedafterthe{@link#prepare}called.
*@since9
*@syscapSystemCapability.Multimedia.Media.AVPlayer
*@paramtypeTypeoftheplaybackeventtolistenfor.
*@paramcallbackCallbackusedtolistenfortheplaybackeventreturnavailablebitratelist.
*/
on(type:'availableBitrates',callback:(bitrates:Array)=>void):void;
off(type:'availableBitrates'):void;

簡單樣例

界面:

build(){
Stack({alignContent:Alignment.Center}){
if(this.isShowMenu){
Column(){
//視頻名稱
PlayTitle({title:this.displayName,handleBack:this.handleBack})
Row(){
//播放控件
PreVideo({handleClick:this.handlePrevClick})
PlayButton({isPlaying:$isPlaying})
NextVideo({handleClick:this.handleNextClick})
}
.margin({top:'40%'})

Blank()
//時間刻度
Row(){
Text(getTimeString(this.currentTime))
.fontSize(25)
.fontColor(Color.White)
Blank()
Text(this.fileAsset?getTimeString(this.fileAsset.duration):'00:00')
.fontSize(25)
.fontColor(Color.White)
}
.width('95%')
//進(jìn)度條
Slider({value:this.fileAsset?this.currentTime/this.fileAsset.duration*100:0})
.width('92%')
.selectedColor(Color.White)
.onChange((value:number)=>{
Logger.info(TAG,'seektimechange')
this.currentTime=this.fileAsset.duration*value/100
this.videoPlayer.seek(this.currentTime)
})
}
.height('100%')
.zIndex(2)
}
Row(){
XComponent({
id:'componentId',
type:'surface',
controller:this.mxcomponentController
})
.onLoad(()=>{
Logger.info(TAG,'onLoadiscalled')
this.playVideo()
})
.width('100%')
.aspectRatio(this.ratio)
}
.height('100%')
.width('100%')
.justifyContent(FlexAlign.Center)
}
.width('100%')
.height('100%')
.backgroundColor(Color.Black)
.onClick(()=>{
this.isShowMenu=!this.isShowMenu
})
}
播放:
//根據(jù)視頻文件獲取視頻源尺寸并生成surface
//視頻文件的路徑在/storage/media/100/local/files/Videos
asyncprepareVideo(){
this.ratio=this.fileAsset.width/this.fileAsset.height
this.mxcomponentController.setXComponentsurfaceSize({
surfaceWidth:this.fileAsset.width,
surfaceHeight:this.fileAsset.height
})
this.surfaceId=this.mxcomponentController.getXComponentsurfaceId()
this.fd=awaitthis.fileAsset.open('Rw')
Logger.info(TAG,`fd://'${this.fd}`)
return'fd://'+this.fd
}
//初始化視頻文件并初始化avplayer
asyncplayVideo(){
Logger.info(TAG,'playVideo')
try{
awaitthis.getMediaList()
letfdPath=awaitthis.prepareVideo()
this.videoPlayer.on('timeUpdate',(time:number)=>{
console.info('timeUpdatesuccess,andnewtimeis:'+time)
this.currentTime=time;
})
awaitthis.videoPlayer.initVideoPlayer(fdPath,this.surfaceId)
this.isPlaying=true
}catch(error){
Logger.info(TAG,`playVideoerror${JSON.stringify(error)}`)
}
}

小結(jié)

參考鏈接:

https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-media.md#play9

審核編輯:湯梓紅

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

    關(guān)注

    33

    文章

    8357

    瀏覽量

    150517
  • 音視頻
    +關(guān)注

    關(guān)注

    4

    文章

    454

    瀏覽量

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

    關(guān)注

    0

    文章

    33

    瀏覽量

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

    關(guān)注

    57

    文章

    2288

    瀏覽量

    42630
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3607

    瀏覽量

    15959

原文標(biāo)題:鴻蒙上制作一個視頻播放器

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    在(Linux)ubuntu下通過GTK調(diào)用libvlc開發(fā)視頻播放器

    本項(xiàng)目實(shí)現(xiàn)了基于GTK和libvlc的視頻播放器。使用GTK創(chuàng)建GUI界面,使用libvlc播放視頻
    的頭像 發(fā)表于 06-01 15:42 ?1918次閱讀
    在(Linux)ubuntu下通過GTK調(diào)用libvlc開發(fā)<b class='flag-5'>視頻</b><b class='flag-5'>播放器</b>

    【教學(xué)基地】07漂亮的視頻播放器

    ` 本帖最后由 a156789156782 于 2018-6-2 13:28 編輯 【教學(xué)視頻03007】labview視頻播放器通過本節(jié)視頻
    發(fā)表于 05-24 22:15

    基于LabVIEW的視頻播放器

    利用LabVIEW制作視頻播放器的主要方法都在這里了,高級版可以添加追蹤,還包含未完成的小論文,可以拿去當(dāng)課程設(shè)計(jì)
    發(fā)表于 06-27 19:50

    如何制作單片機(jī)音樂播放器

    如何制作單片機(jī)音樂播放器?
    發(fā)表于 10-15 08:08

    如何基于 OpenHarmony 制作簡單視頻播放器?

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

    網(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視頻播放器代碼 代碼如下這里只是介紹幾個例子,現(xiàn)在把代碼公布下,大家可以參考著做,也可以把你喜歡的
    發(fā)表于 01-10 12:36 ?2041次閱讀

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

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

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

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

    使用Arduino和DFPlayer迷你MP3播放器模塊制作帶有LCD的MP3播放器

    首歌和下首歌的功能。 詳細(xì)的可以看附件視頻。 責(zé)任編輯:xj 原文標(biāo)題:如何使用Arduino和DFPlayer Mini制作帶LCD的MP3播放器 文章出處:【微信公眾號:電路設(shè)計(jì)
    的頭像 發(fā)表于 12-07 09:28 ?8293次閱讀

    基于Labview制作的音樂播放器源碼分享

    基于Labview制作的音樂播放器源碼分享
    發(fā)表于 12-01 10:07 ?70次下載

    如何利用Arduino UNO和SD卡制作音樂播放器

    前面用ATtiny85制作SD卡音樂播放器,本次主要利用Arduino UNO 和SD卡制作音樂播放器。這個播放器不需要添加多余的模塊,只需
    的頭像 發(fā)表于 04-13 16:45 ?7565次閱讀
    如何利用Arduino UNO和SD卡<b class='flag-5'>制作</b>音樂<b class='flag-5'>播放器</b>

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

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

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

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

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

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