当前位置: 首页 > 科技观察

OpenHarmonyVideoPlayer

时间:2023-03-14 13:39:09 科技观察

了解更多开源请访问:开源基础软件社区https://ost.51cto.com由于视频资源在项目中使用比较频繁,所以配合本教程,本教程还实现了一个最后是简单的播放器。效果预览视频使用的是本地视频文件,会影响App的包大小,所以通常我们的视频文件来自网络地址,需要在对应的“abilities”中添加网络使用权限ohos.permission配置或module.json。互联网。"abilities":[{"permissions":["ohos.permission.INTERNET"],}]使用时,VideoController对象可以控制一个或多个视频。//一个VideoController对象可以控制一个或多个视频。控制器:VideoController=newVideoController();interfacedeclareinterfaceVideoOptions{src?:string|}资源;currentProgressRate?:数字|字符串|播放速度;previewUri?:字符串|像素地图|播放源路径)必填参数。支持本地视频路径和网络路径。支持将媒体资源放置在resources下的video或rawfile文件夹中。支持dataability://的路径前缀,用于访问DataAbility提供的视频路径currentProgressRate:number视频播放速度,支持0.75、1.0、1.25、1.75、2.0。previewUri:string预览图的路径,可以在视频不播放时作为封面。控制器:VideoController控制器。VideoController对象可以控制一个或多个视频。如果需要通过代码控制视频播放、暂停等,可以给Video组件设置这个参数,然后通过controller的如下接口控制视频播放状态:这里我需要把PlaybackSpeed和VideoController分开寻求解释。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速度播放。名称描述declareenumPlaybackSpeed{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一个VideoController对象可以控制一个或多个视频。start():void开始播放。pause():void暂停播放。stop():void停止播放。setCurrentTime(value:number,seekMode:SeekMode)指定视频播放的进度位置,指定跳转方式。value为进度,seekMode为跳转模式requestFullscreen():boolean()请求全屏播放,true为横屏,false为竖屏。exitFullscreen():void退出全屏。在这里,我还需要分离出setCurrentTime。setCurrentTime8+setCurrentTime(value:number,seekMode:SeekMode)。指定视频播放的进度位置,指定跳转方式。参数参数名称参数类型必填默认值参数说明valuenumber为-视频播放进度位置。seekModeSeekMode是-搜索模式。SeekMode8+类型接口描述名称描述PreviousKeyframe跳转到上一个最近的关键帧。NextKeyframe跳转到下一个最近的关键帧。ClosestKeyframe跳转到最近的关键帧。准确跳转准确,不管是不是关键帧。declareenumSeekMode{PreviousKeyframe,NextKeyframe,ClosestKeyframe,Accurate,}视频属性muted(是否静音),autoPlay(自动播放),controls(控制条),objectFit(显示模式),loop(是否循环)。其中,如果objectFit参数设置值为ImageFit.Cover,则会覆盖整个容器。详细介绍:muted(boolean)默认值为false是否静音。autoPlay(boolean)默认值为false是否自动播放。controls(boolean)默认值为true以控制是否显示视频播放的控制栏。loop(boolean)是否循环播放单个视频。objectFit(ImageFit)默认值Cover设置视频显示模式。ImageFit有以下枚举值可选ImageFit枚举说明名称说明Cover保持宽高比缩小或放大,使图像的两边都大于或等于显示边界。Contain保持纵横比缩小或放大,使图片完全显示在显示边界内。Fill不保持宽高比进行放大和缩小,使图像填满显示边界。无保持原始大小显示。通常与objectRepeat属性一起使用。ScaleDown保持纵横比显示,图像缩小或保持不变。EventonStart()=>void播放时触发该事件。onPause()=>void暂停时触发此事件。onFinish()=>void播放结束时触发该事件。onError()=>void播放失败时触发该事件。onFullscreenChange(event?:{fullscreen:boolean})=>void)当视频进入和退出全屏时触发该事件。onPrepared(event?:{duration:number})=>void当视频准备完成时触发该事件。通过duration可以得到视频的时长,单位是秒(s)。onSeeking(event?:{time:number})=>void报告进度条运行时的时间信息,单位s。onSeeked(event?:{time:number})=>void操作进度条完成后,上报播放时间信息,单位s。onUpdate(event?:{time:number})=>void播放进度变化时触发该事件,单位s,更新间隔250ms。表名函数说明onStart()=>void播放时触发该事件。onPause()=>void暂停时触发此事件。onFinish()=>void播放结束时触发该事件。onError()=>void播放失败时触发该事件。onPrepared(event?:{duration:number})=>void当视频准备完成时触发该事件。通过duration可以得到视频的时长,单位是秒(s)。onSeeking(event?:{time:number})=>void报告进度条运行时的时间信息,单位s。onSeeked(event?:{time:number})=>void操作进度条完成后,上报播放时间信息,单位s。onUpdate(event?:{time:number})=>void播放进度变化时触发该事件,单位s,更新间隔250ms。完整示例@Entry@ComponentstructIndex{@Statemessage:string='Videopreview'@StatepreviewUris:Resource=$r('app.media.openharmony');//预览封面控制器:VideoController=newVideoController();@StatecurrentProgressRate:number=1@Statemuted:boolean=false@StateautoPlay:boolean=true@Statecontrols:boolean=true@StatestartStatus:boolean=true@Stateloop:boolean=trueaboutToAppear(){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)//静音或不自动播放(this.autoPlay)//是否自动播放。controls(this.controls)//是否显示控制视频播放的控制条。objectFit(ImageFit.Contain)//视频显示Mode.loop(this.loop)//是否为单个视频loops.height("60%").onStart(()=>{//播放时触发该事件console.info('onStart');}).onPause(()=>{//暂停时触发此事件console.info('onPause');}).onFinish(()=>{console.info('onFinish');}).onError(()=>{//播放失败时触发该事件console.error('onError');}).onFullscreenChange((e)=>{console.info('视频进入和退出全屏时触发该事件:'+e.fullscreen)}).onPrepared((e)=>{console.info('视频准备完成时触发事件:'+e.duration)}).onSeeking((e)=>{console.info('运行进度条上报过程中的时间信息:'+e.time)}).onSeeked((e)=>{console.info('运行进度条完成后上报播放时间信息:'+e.time)}).onUpdate((e)=>{console.info('播放进度变化时触发该事件:'+e.time)})Row({}){flex({包装:FlexWrap.Wrap,justifyContent:FlexAlign.SpaceAround,alignItems:ItemAlign.Center}){Button("播放").onClick(()=>{this.controller.start()}).margin(8)Button("暂停").onClick(()=>{this.controller.pause()})Button("Loop").onClick(()=>{this.loop=!this.loop})Button("2xspeed").onClick(()=>{this.currentProgressRate=2})Button("Mute").onClick(()=>{this.muted=!this.muted})Button("Stop").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("指定视频播放进度").onClick(()=>{this.controller.setCurrentTime(9)})}}}.width('100%').height('100%')}}了解更多开源信息,请访问:开源基础软件社区https://ost.51cto.com