鸿蒙系列--组件介绍之Video

接口

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

参数:

  • src:视频播放源的路径。支持本地路径和网络路径
  • currentProgressRate:视频播放倍速,其参数类型为number,取值支持0.75,1.0,1.25,1.75,2.0,默认值为1.0倍速
  • previewUri:视频未播放时的预览图片路径
  • controller:视频控制器

属性:

  • muted:是否静音,默认值:false
  • autoPlay:是否自动播放,默认值:false
  • controls:控制视频播放的控制栏是否显示,默认值:true
  • objectFit:设置视频显示模式,默认值:Cover
    • Contain
    • Cover
    • Auto
    • Fill
    • ScaleDown
    • None 
  • loop:是否单个视频循环播放,默认值:false

事件:

  • onStart(event:() => void):播放时触发
  • onPause(event:() => void):暂停时触发
  • onFinish(event:() => void):播放结束时触发
  • onError(event:() => void):播放失败时触发
  • onPrepared(callback:(event?: { duration: number }) => void):视频准备完成时触发,通过duration可以获取视频时长,单位为s
  • onSeeking(callback:(event?: { time: number }) => void):操作进度条过程时上报时间信息,单位为s
  • onSeeked(callback:(event?: { time: number }) => void):操作进度条完成后,上报播放时间信息,单位为s
  • onUpdate(callback:(event?: { time: number }) => void):播放进度变化时触发该事件,单位为s,更新时间间隔为250ms
  • onFullscreenChange(callback:(event?: { fullscreen: boolean }) => void):在全屏播放与非全屏播放状态之间切换时触发该事件

视频支持格式:

  • mp4、mkv、webm、TS

使用案例:

  1. Video最原始样式,调用VideoPlayer组件,传入一个source,这样就能让一个视频播放起来了
  2. 为了使页面美观,同时能让用户预览内容,可以增加一个previewUris,给视频增加一个未播放时的预览图,也可以使用网络和本地地址
  3. 在播放过程中发现视频被拉伸,显示不全,可以通过设置 .objectFit(ImageFit.Contain) 使视频保持宽高比例进行缩放,从而保证视频原有的显示效果
@Component
export struct VideoPlayer {
  private source: string | Resource;
  private previewUris: Resource = $r('app.media.preview');

  build() {
    Column() {
      Video({
        src: this.source,
        previewUri: this.previewUris
      })
        .width('100%')
        .height('100%')
        .objectFit(ImageFit.Contain)
    }
  }
}

注意:

  • 使用网络播放路径时,需要注意的是需要在module.json5文件中申请网络权限

  • 本地视频地址可以使用媒体库管理模块medialibrary来查询公共媒体库中的视频文件

自定义视频播放控制器:

  1. 当Video组件的原生控制器的样式和功能不能满足业务需求时,此时需要隐藏原生控制器         .controls(false)
  2. 自定义控制器包括的功能:控制视频播放、暂停、显示视频总时长、播放起始时间以及控制和显示播放速度
  3. 增加一个参数 VideoController对象controller,用于控制视频的播放、暂停等功能
  4. 自定义一个视频播放器的控制栏VideoSlider组件,并将controller传递进去
  5. 在ViewSlider组件中来控制视频的播放和进度显示

VideoPlayer

import { Event } from '@ohos.worker';
import Prompt from '@system.prompt';
import { ALL_PERCENT, COMMON_NUM_DOUBLE, COMMON_NUM_MINUTE, SPLIT, STRING_PERCENT, ZERO_STR } from './Constants';
import { changeSliderTime } from './VideoControll';
import { VideoSlide } from './VideoSlide';

@Component
export struct VideoPlayer {
  private source: string | Resource;
  private previewUris: Resource = $r('app.media.preview');
  private controller: VideoController
  isPlay: boolean = false
  @Provide durationTime: number = 0
  @Provide durationStringTime: string = '00:00'
  @Provide currentTime: number = 0
  @Provide currentStringTime: string = '00:00'

  build() {
    Column() {
      Video({
        src: this.source,
        previewUri: this.previewUris,
        controller: this.controller
      })
        .width(ALL_PERCENT)
        .height(STRING_PERCENT.NINETY_PERCENT)
        .objectFit(ImageFit.Contain)
        .controls(false)
        .onPrepared((event) => {
          this.prepared.call(this, event?.duration)
        })
        .onUpdate((event) => {
          if (event) {
            this.currentTime = event.time
            this.currentStringTime = changeSliderTime(this.currentTime)
          }
        })
        .onFinish(() => {
          //视频播放完成回调
          this.finish.call(this)
        })
        .onError(() => {
          //视频播放出错回调
          Prompt.showToast({ duration: 5000, message: '错误提示' })
        })
      //自定义视频播放控制器组件
      VideoSlide({ controller: this.controller })
    }
  }

  prepared(duration: number) {
    this.durationTime = duration;
    let second: number = duration % COMMON_NUM_MINUTE;
    let min: number = Number.parseInt((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}`;
  }

  finish() {
    this.isPlay = false
  }
}

ViewSlider

import { ALL_PERCENT } from './Constants'
@Component
export struct VideoSlide {
  private controller: VideoController
  private isPlay: boolean = false
  @Consume durationTime: number
  @Consume durationStringTime: string
  @Consume currentTime: number
  @Consume currentStringTime: string

  build() {
    Row({ space: 12 }) {
      //视频播放/暂停控制
      Image(this.isPlay
        ? $r('app.media.ic_pause')
        : $r('app.media.ic_play'))
        .onClick(() => {
          this.iconOnclick()
        })
        .width(50)
        .height(50)

      //显示当前播放时间
      Text(this.currentStringTime)
        .fontColor(Color.White)

      //控制和播放进度
      Slider({ value: this.currentTime, min: 0, max: this.durationTime, step: 1 })
        .width(180)
        .onChange((value: number, mode: SliderChangeMode) => {
          this.slideOnChange.call(this, value, mode)
        })

      //显示视频时长
      Text(this.durationStringTime)
        .fontColor(Color.White)
    }.backgroundColor(Color.Green)
    .width(ALL_PERCENT)
  }

  iconOnclick() {
    if (this.isPlay) {
      this.controller.pause()
      this.isPlay = false
    } else {
      this.controller.start()
      this.isPlay = true
    }
  }

  slideOnChange(value: number, mode: SliderChangeMode) {
    this.currentTime = parseInt(value.toString())
    this.controller.setCurrentTime(this.currentTime, SeekMode.Accurate)
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/301359.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络安全保险发展起始阶段的挑战及应对措施

文章目录 前言一、网络安全保险的有序发展二、当前我国网络安全保险发展的初期态势&#xff08;一&#xff09;网络安全风险类型&#xff08;二&#xff09;网络安全保险的作用&#xff08;三&#xff09;与外国网络安全保费的规模对比 三、我国网络安全保险发展初期面临的挑战…

MYSQL双主节点–更换ip

MYSQL双主节点–更换ip 一、更换双主节点ip 1.停止mysql服务 #安装了supervisor supervisorctl stop mysql #未安装 systemctl stop mysqld2.修改网卡配置信息 注&#xff1a;ens33是网卡名称&#xff0c;可能网卡不叫ens33 vi /etc/sysconfig/network-scripts/ifcfg-ens333…

ConcurrentHashMap的原理分析学习

ConcurrentHashMap 的初步使用及场景 CHM 的使用 ConcurrentHashMap 是 J.U.C 包里面提供的一个线程安全并且高效的 HashMap&#xff0c;所以ConcurrentHashMap 在并发编程的场景中使用的频率比较高&#xff0c;那么这一节课我们就从ConcurrentHashMap 的使用上以及源码层面来…

亚马逊鲲鹏系统:点赞提升评论排名的得力助手

作为一个卖家&#xff0c;我深知在亚马逊和其他电商平台上&#xff0c;用户评论对商品销售的重要性。在这个竞争激烈的市场中&#xff0c;点赞已经成为提升评论排名、吸引更多顾客的有效手段之一。在我经营店铺的过程中&#xff0c;亚马逊鲲鹏系统给予了我巨大的帮助&#xff0…

msckf-vio 跑Euroc数据集,并用evo进行评估

所需材料&#xff1a; Euroc数据集主页&#xff1a;https://projects.asl.ethz.ch/datasets/doku.php?idkmavvisualinertialdatasetsevo评估工具代码&#xff1a;https://github.com/MichaelGrupp/evo向msckf-vio中添加保存位姿的代码&#xff0c;可参考https://blog.csdn.ne…

SpringBoot整合Activiti7——终止结束事件(十三)

文章目录 终止结束事件终止结束事件代码实现xml文件测试流程流程执行步骤 终止结束事件 终止结束事件 主要是对流程进行终止的事件&#xff0c;可以在一个复杂的流程中&#xff0c;如果某方想要提前中断这个流程&#xff0c;可以采用这个事件来处理。terminateAll属性&#xf…

mysql服务多实例运行

1、官网下载mysql安装包 https://downloads.mysql.com/archives/community/ 2、解压安装包 tar -zxvf mysql-8.1.0-linux-glibc2.28-aarch64.tar.xz -C /usr/localmv /usr/local/mysql-8.1.0-linux-glibc2.28-aarch64 /usr/local/mysql 3、创建mysql用户组 groupadd…

某月瓜网站js盾动态调试方案

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;若有侵权&#xff0c;请添加&#xff08;wx&#xff1a;wyqlxl99&#xff09;联系删除 本文章同步微…

express框架

目录 一、express介绍二、express 使用2.1 express下载2.2 express初体验 三、express 路由3.1 路由的使用3.2 获取参数3.3 获取路由参数 四、express响应设置五、express中间件5.1 什么是中间件5.2 中间件的作用5.3 中间件的类型5.3.1 定义全局中间件5.3.2 多个全局中间件5.3.…

一种创新的白细胞检测方法:多级特征融合与变形自注意力DETR(MFDS-DETR)

论文&#xff1a;https://arxiv.org/abs/2401.00926 引言 在标准的医院血液检查中&#xff0c;传统的流程需要医生通过显微镜手动从患者的血液显微图像中分离白细胞&#xff0c;然后通过自动白细胞分类器对分离的白细胞进行分类&#xff0c;以确定血样中不同类型白细胞的数量…

ooTD I 撞色插肩长T真的怎么搭都好看

这款撞色插肩长T真的很难不爱 三种色调&#xff0c;每种撞色都清新自然 青春活力感十足&#xff0c;真的很好看 它用的是32S紧密双纱绒面料 手感细腻柔软&#xff0c;有弹力上身也很舒适 衣服上的印花图案精致又可爱 小朋友穿简直不要太好看 撞色插肩的设计又有弱化肩部…

【REST2SQL】04 REST2SQL第一版Oracle版实现

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 REST2SQL的第一个版本&#xff0c;只支持Oracle数据库&#xff0c;以后会逐步加入其它数据看的支持。 项目文件组织如下&#xff1a; 1 REST2SQL为项目主目录 …

005-Zynq基操之如何去玩EMIO接口(走过路过千万不要错过)

文章目录 前言一、EMIO是啥含义二、两种EMIO的使用1.PS端外设引出来的EMIO2.正常的EMIO口3.PS端驱动源码 总结 前言 今天分享这个主要原因是&#xff0c;把最基础的EMIO接口弄清楚咋操作的&#xff0c;咱们就可以做一些由PS端控制PL端的器件小功能&#xff0c;最常见的就是我们…

SqueezeNet:通过紧凑架构彻底改变深度学习

一、介绍 在深度学习领域&#xff0c;对效率和性能的追求往往会带来创新的架构。SqueezeNet 是神经网络设计的一项突破&#xff0c;体现了这种追求。本文深入研究了 SqueezeNet 的复杂性&#xff0c;探讨其独特的架构、设计背后的基本原理、应用及其对深度学习领域的影响。 在创…

vue项目中的录屏插件recordrtc且带声音

vue项目中的录屏插件recordrtc且带声音 一、效果图二、安装插件三、直接上代码 一、效果图 其中窗口录屏不带声音&#xff0c;chrome标签和整个屏幕的录屏是带声音的 二、安装插件 npm i recordrtc 三、直接上代码 <template><div class"record-page">…

Qt优秀开源项目之二十:RedPanda-CPP(小熊猫C++)

小熊猫C是跨平台、轻量易用的开源C/C集成开发环境。 官网&#xff1a;http://royqh.net/redpandacpp github&#xff1a;https://github.com/royqh1979/RedPanda-CPP 小熊猫C&#xff08;原名小熊猫Dev-C 7)是基于Qt开发的Dev-C替代版本。和经典的Dev-C 5.11、新的Embarcadero …

Minio部署在服务器上,分享图片等文件提示,签名不对

问题描述: 上传没问题 下载没问题 就是分享有问题,签名有问题 找了很多解释,什么nginx代理问题啊,什么端口问题啊 什么防火墙问题啊 都是扯淡,一点用没有 最后发现,我的分享链接是127.0.0.1的地址,并不是我的服务器本机的地址 我访问图片都是要把ip改了再去访问,但是一开始并没…

C#,数值计算,求平方根之巴比伦算法(Babylonian algorithm)的源代码

平方根的巴比伦算法。 1 巴比伦算法介绍一 巴比伦算法可能算是最早的用于计算$sqrt{S}$的算法之一&#xff0c;因为其可以用牛顿法导出&#xff0c;因此在很多地方也被成为牛顿法。其核心思想在于为了计算x的平方根&#xff0c;可以从某个任意的猜测值g开始计算。在真实的运算…

【docker】centos 使用 Nexus Repository 搭建私有仓库

Nexus Repository 是一种流行的软件仓库管理工具&#xff0c;它可以帮助您搭建私有仓库&#xff0c;以便在内部网络或私有云环境中存储、管理和分发各种软件包和组件。 它常被用于搭建Maven的镜像仓库。本文演示如何用Nexus Repository搭建docker 私有仓库。 使用Nexus Repos…

【AIGC工具】我找到了使用大模型问答的最短路径!

大家好&#xff0c;我是豆小匠~ 好久没介绍提高效率的工具啦&#xff0c;这次来介绍一个UTools的骚操作&#xff0c;可以极速打开LLM进行提问&#xff01; 完成后的效果是&#xff1a; 快捷键调出输入框&#xff1b;2. 输入问题&#xff1b;3. 选择模型&#xff1b;4. 回车提…