0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙上制作一个视频播放器

OpenHarmony技术社区 来源:OST开源开发者 作者:OST开源开发者 2023-04-11 09:56 次阅读

媒体子系统是 OpenHarmony 中重要的子系统,可以提供音视频播放能力。

媒体子系统为开发者提供一套简单且易于理解的接口,使得开发者能够方便接入系统并使用系统的媒体资源。

媒体子系统提供以下常用功能如下:

①音视频播放(AVPlayer9+),AudioPlayer6+ 和 VideoPlayer8+ 整合,升级了状态机和错误码,推荐使用。

②音视频录制(AVRecorder9+),AudioRecorder6+ 和 VideoRecorder9+ 整合,推荐使用。

音频播放(AudioPlayer6+),AVPlayer9+ 发布后停止维护,请使用 AVPlayer9+。

视频播放(VideoPlayer8+),AVPlayer9+ 发布后停止维护,请使用 AVPlayer9+。

⑤音频录制(AudioRecorder6+),AVRecorder9+ 发布后停止维护,请使用 AVRecorder9+。

⑥视频录制(VideoRecorder9+),AVRecorder9+ 发布后停止维护,请使用 AVRecorder9+。

从 3.2 开始 OpenHarmony 推出了 AVPlayer 和 AVRecorder 接口,之前的 VideoPlayer、AudioPlayer 这些接口会停止维护,所以我们今天学习下怎么使用 AVPlayer 接口。

导入模块

importmediafrom'@ohos.multimedia.media';

创建 avplayer:

this.avPlayer=awaitmedia.createAVPlayer()

如上,我们使用的是 promise 接口,对应的接口定义为:

/**
*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 回调:
//注册状态变化回调,不同状态时做不同动作
avPlayer.on('stateChange',async(state,reason)=>{
……
})
//注册时间变化回调,方便更新进度条时间
avPlayer.on('timeUpdate',(time:number)=>{
……
})
avplayer 播放流程:
graphLR
赋值avPlayer.url开始播放-->回调进入initialized-->赋值avPlayer.surfaceId-->avPlayer.prepare-->回调进入prepared-->avPlayer.play
//视频播放伪代码
asyncavPlayerDemo(){
this.avPlayer.on('stateChange',async(state,reason)=>{
switch(state){
case'idle'://成功调用reset接口后触发该状态机上报
console.info(TAG+'stateidlecalled')
this.avPlayer.release()//释放avplayer对象
break;
case'initialized'://avplayer设置播放源后触发该状态上报
console.info(TAG+'stateinitializedcalled')
this.avPlayer.surfaceId=this.surfaceID//设置显示画面,当播放的资源为纯音频时无需设置
this.avPlayer.prepare().then(()=>{
console.info(TAG+'preparesuccess');
},(err)=>{
console.error(TAG+'preparefiled,errormessageis:'+err.message)
})
break;
case'prepared'://prepare调用成功后上报该状态机
console.info(TAG+'statepreparedcalled')
this.avPlayer.play()//调用播放接口开始播放
break;
case'playing'://play成功调用后触发该状态机上报
console.info(TAG+'stateplayingcalled')
if(this.count==0){
this.avPlayer.pause()//调用暂停播放接口
}else{
this.avPlayer.seek(10000,media.SeekMode.SEEK_PREV_SYNC)//前向seek置10秒处,触发seekDone回调函数
}
break;
case'paused'://pause成功调用后触发该状态机上报
console.info(TAG+'statepausedcalled')
if(this.count==0){
this.count++
this.avPlayer.play()//继续调用播放接口开始播放
}
break;
case'completed'://播放结束后触发该状态机上报
console.info(TAG+'statecompletedcalled')
this.avPlayer.stop()//调用播放结束接口
break;
case'stopped'://stop接口成功调用后触发该状态机上报
console.info(TAG+'statestoppedcalled')
this.avPlayer.reset()//调用reset接口初始化avplayer状态
break;
case'released':
console.info(TAG+'statereleasedcalled')
break;
case'error':
console.info(TAG+'stateerrorcalled')
break;
default:
console.info(TAG+'unkownstate:'+state)
break;
}
})

//创建avPlayer实例对象
this.avPlayer=awaitmedia.createAVPlayer()
letfdPath='fd://'
letpathDir="/data/storage/el2/base/haps/entry/files"//pathDir在FA模型和Stage模型的获取方式不同,请参考开发步骤首行的说明,根据实际情况自行获取。
//path路径的码流可通过"hdcfilesendD:xxxH264_AAC.mp4/data/app/el2/100/base/ohos.acts.multimedia.media.avplayer/haps/entry/files"命令,将其推送到设备上
letpath=pathDir+'/H264_AAC.mp4'
letfile=awaitfs.open(path)
fdPath=fdPath+''+file.fd
//赋值url后就会进入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;
其他回调接口:
/**
*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%')
//进度条
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
})
}
播放:
//根据视频文件获取视频源尺寸并生成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)}`)
}
}

小结

参考链接:

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

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    7640

    浏览量

    148509
  • 音视频
    +关注

    关注

    4

    文章

    414

    浏览量

    29579
  • 视频播放器
    +关注

    关注

    0

    文章

    33

    浏览量

    11783
  • 鸿蒙
    +关注

    关注

    55

    文章

    1637

    浏览量

    42120
  • OpenHarmony
    +关注

    关注

    23

    文章

    3304

    浏览量

    15159

原文标题:鸿蒙上制作一个视频播放器

文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony技术社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    鸿蒙开发-视频播放器方案

    ArkUI提供能力。 本开发指导将介绍如何使用AVPlayer开发视频播放功能,以完整地播放视频
    发表于 02-19 17:20

    灵活电影播放器视频/音频播放软件

    (Flexible Movie Player)视频/音频播放软件包。该软件将从2008年7月开始在日本上市。灵活电影播放器是适用于SH-Mobile的软件,它整合了支持H.264/MPEG-4AVC*2(以下
    发表于 03-06 19:52

    开源mjpeg播放器程序,STM32F407 avi视频播放

    之前看到日本人做的那个视频播放器,真是羡慕加妒忌呀,于是自己花时间做了这个,虽然效果相差甚远,但总算是对得起观众,我这个没有超频,所以只能是牺牲尺寸,有点小,将就着看视频,挺有成就感
    发表于 07-16 09:57

    【作品分享】制作MP3播放器,抛砖引玉,

    制作MP3播放器,抛砖引玉
    发表于 06-10 12:39

    个人制作的简易MP3音乐播放器

    本人是新手,制作的简易音乐播放器
    发表于 10-19 17:30

    【教学基地】07漂亮的视频播放器

    ` 本帖最后由 a156789156782 于 2018-6-2 13:28 编辑 【教学视频03007】labview视频播放器通过本节视频
    发表于 05-24 22:15

    基于LabVIEW的视频播放器

    利用LabVIEW制作视频播放器的主要方法都在这里了,高级版可以添加追踪,还包含未完成的小论文,可以拿去当课程设计
    发表于 06-27 19:50

    使用STM32F103RB芯片制作MP3播放器

    本文主要介绍了使用STM32F103RB芯片的32位闪存微控制为内核制作MP3播放器,此芯片是基于ARMCortex-M3为内核,具有
    发表于 09-03 14:45

    Labview制作Flash播放器

    Labview制作Flash播放器
    发表于 03-22 21:25

    播放器制作

    生气,周五回到家还是亟不可待地开工,花了整整周末多的时间筛选零件、焊板子、上电、调试,终于在上个周日完成了播放器制作。测电位、波形等都很好,功能验证也没问题...于是开声了,o(∩
    发表于 08-09 07:08

    如何制作单片机音乐播放器

    如何制作单片机音乐播放器
    发表于 10-15 08:08

    DistributedVideoPlayer分布式视频播放器的设计资料

    播放视频可以流转到TV端,并实现远端遥控的功能。内容比较多,会分两期给大家讲解,本期文章主要讲解的内容是手机端部分:1.实现视频
    发表于 03-22 11:55

    如何基于 OpenHarmony 制作简单视频播放器

    OpenHarmony视频播放器作者“坚果,华为云享专家,InfoQ签约作者,润和软件KOL专家,电子发烧友鸿蒙MVP,阿里云博客专家,开源项目gin-vue-admin成员之由于
    发表于 08-16 18:02

    网页视频播放器代码

    网页视频播放器代码
    发表于 01-10 11:23 102次下载
    网页<b class='flag-5'>视频</b><b class='flag-5'>播放器</b>代码

    关于VR电影视频播放器 盘点12款VR播放器

    VR电影和视频那个播放器好,哪些播放器更为实用,由于视频资源格式多样,在一个播放器播放不了的
    发表于 06-27 15:50 12.2w次阅读