华为 HarmonyOS NEXT 原生应用开发: Video实现在线离线视频播放、以及实现控制器控制视频操作。

news/2024/11/6 14:21:26 标签: harmonyos, 音视频, 华为

文章目录

  • 视频播放
      • 一、基础使用(在线、离线)
          • 代码示例:
      • 二、自定义video 视频播放
          • 代码示例:

视频播放

一、基础使用(在线、离线)

在这里插入图片描述

代码示例:
/**
 * 视频演示
 */
@Entry
@Component
struct PayIndex {
  build() {
    Column() {
      Tabs() {
        TabContent() {
          Video({
            src: "http://video19.ifeng.com/video09/2024/05/23/p7199260608686989961-0-122707.mp4"
          })
            .width("90%")
            .height("60%")
            .borderRadius(15)
            .autoPlay(true)
        }.tabBar("在线视频")
        TabContent() {
          Video({
            src: $rawfile("harmonyos_next_video.mp4")
          })
            .width("90%")
            .height("60%")
            .borderRadius(15)
            .autoPlay(true)
        }.tabBar("离线视频")
      }

    }
    .width("100%")
    .height("100%")
    .justifyContent(FlexAlign.Center)
  }
}

二、自定义video 视频播放

在这里插入图片描述

代码示例:
/**
 * 演示,自定义实现视频播放功能
 */
@Entry
@Component
struct PayIndex {
  // 创建视频组件控制器
  controllerVideo: VideoController = new VideoController()

  @State isFullScreen: boolean = false  // 是否全屏
  @State isMuted: boolean = false  // 是否静音
  @State SelectedSpeed: ResourceStr = "1"  // 用于默认展示选择的倍速
  @State currentIndex: number = 0  // 当前选择的倍速索引
  @State playTime: number = 0 // 当前播放的时长
  @State duration: number = 0  // 视频加载完毕的总时长

  build() {
    Column({ space: 10}) {
      Video({
        // 视频来源(在线 / 离线)
        src: $rawfile("harmonyos_next_video.mp4"),
        // video控制器
        controller: this.controllerVideo,
        // 控制倍速播放(搭配 Select选项值使用)
        currentProgressRate: this.SelectedSpeed.toString(),
        // 设置视频封面
        previewUri: $r("app.media.banner_pic2"),

      })
        .borderRadius(15)
        .width("100%")
        .height(500)
        .objectFit(ImageFit.Contain) // 控制展示的宽高比例方式
        .autoPlay(false)   // 自动播放
        .loop(true)    // 循环播放
        .controls(this.isFullScreen)   // 是否展示控制条
        .muted(this.isMuted)   // 静音播放
        .onFullscreenChange((screen) => {  // 控制全屏播放
          // 事件监听视频是否全屏的状态,返回Boolean值,将这个值赋值给状态变量,然后实现全屏出现控制器
          this.isFullScreen = screen.fullscreen
        })
        // 实时获取当前播放进度(实时触发)
        .onUpdate((time) => {
          this.playTime = time.time
        })
        // 视频加载完毕触发(获取视频总时长)
        .onPrepared((totalTime) => {
          this.duration = totalTime.duration
        })
      // -----------------------------------
      Row() {
        Button("播放")
          .onClick(() => {
            this.controllerVideo.start()
          })
        Button("暂停")
          .onClick(() => {
            this.controllerVideo.pause()
          })
        Button("停止")
          .onClick(() => {
            this.controllerVideo.stop()
          })
        Button("全屏")
          .onClick(() => {
            this.controllerVideo.requestFullscreen(true)
          })
        Button("静音")
          .onClick(() => {
            this.isMuted = ! this.isMuted
          })

        // 调整倍速
        Select([{value: "1"}, {value: "1.25"}, {value: "1.5"}, {value: "1.75"}, {value: "2"}])
          .selected(this.currentIndex)
          .value($$this.SelectedSpeed)
          .onSelect((index) => {
            this.currentIndex = index
          })
      }
      .width("100%")
      .justifyContent(FlexAlign.SpaceEvenly)

      // 进度控制条
      Row({ space: 15 }) {
        Text("进度")
        Slider({
          value: this.playTime,  // 当前播放进度
          min: 0,   // 视频最小值
          max: this.duration  // 视频总时长
        })
          .layoutWeight(1)
            // 滑块滑动触发回调,返回当前滑块所处的值,我们通过video控制器控制视频的播放进度
          .onChange((value) => {
            this.controllerVideo.setCurrentTime(value, SeekMode.Accurate)
          })
        // 展示当前播放时长和总时长
        Text(){
          Span(this.playTime + "/" + this.duration)
        }
      }
      .width("100%")
    }
    .width("100%")
    .height("100%")
    .justifyContent(FlexAlign.Center)
    .padding(10)
  }
}

http://www.niftyadmin.cn/n/5740964.html

相关文章

FPGA跨时钟域处理方法

跨时钟域处理(Cross-Clock Domain Crossing, CDC)是FPGA和数字电路设计中的一个常见问题。它主要是指在不同频率或不同相位的时钟域之间传输数据时所面临的挑战。由于时钟之间的不同,数据可能会在时钟边缘上被读取,从而可能导致亚稳态(Metastability)或数据丢失。 跨时钟…

ArcGIS/QGIS按掩膜提取或栅格裁剪后栅格数据的值为什么变了?

问题描述: 现有一栅格数据,使用ArcGIS或者QGIS按照矢量边界进行按掩膜提取或者栅格裁剪以后,其值的范围发生了变化,如下: 可以看到,不论是按掩膜提取还是进行栅格裁剪后,其值的范围均与原来栅…

在软件工程开发中,瀑布式开发和螺旋式开发的优缺点比较

在软件工程开发中,瀑布式开发和螺旋式开发是两种常见的软件开发模型,它们各自具有独特的优缺点,并在实际应用中展现出不同的特点。 瀑布式开发的优缺点 优点: 阶段划分清晰:瀑布模型将软件开发过程划分为一系列有序…

Stable Diffusion 绘画技巧分享,适合新手小白的技巧分享

在数字艺术领域,Stable Diffusion 是一种强大的 AI 绘画工具,能够帮助艺术家们创作出惊艳的作品。对于新手小白来说,掌握一些绘画技巧可以大大提升创作效率和作品质量。本文将分享一些 Stable Diffusion 绘画的实用技巧,帮助你快速…

C#语言发展历史

前言 C#是微软公司在2000年6月发布的一种新的编程语言,主要由安德斯海尔斯伯格(Anders Hejlsberg)主持开发,它是第一个面向组件的编程语言,其源码会编译成msil再运行。 C#最初有个更酷的名字,叫做COOL。微软…

Linux历史命令history增加执行时间显示

Centos系统默认历史命令显示如下 为了更好的溯源,获取执行命令的准确时间,需要增加一些配置 设置环境变量 vim /etc/profile 在最下面添加以下环境配置 export HISTTIMEFORMAT"%Y-%m-%d %H:%M:%S " 立即刷新该环境变量 source /etc/pro…

数字身份发展趋势前瞻:身份韧性与安全

身份韧性与安全是身份与访问管理IAM发展的重要趋势,身份既是防御者的盾牌,也是攻击者的目标。面对日益复杂的网络威胁和不断增长的身份盗窃风险,身份韧性与安全不仅仅涉及产品的防御能力,还包括应对突发事件、快速恢复的弹性和灵活…

11.5学习swing

在Java中,setBounds 方法用于设置组件的大小和位置。这个方法通常在Swing或AWT组件中使用,用于布局管理。setBounds 方法属于 Component 类,因此所有继承自 Component 的类都可以使用这个方法。 setBounds 方法有以下几种重载形式&#xff1a…