【鸿蒙实战开发】HarmonyOS中视屏/全屏播放实现

200 篇文章 7 订阅
200 篇文章 0 订阅

一、介绍
基于鸿蒙Next模拟视频播放,正常播放与全屏播放

二、场景需求
大多数视频播放器都会有一个全屏按钮,通常位于视频播放窗口的右下角。点击该按钮可以进入全屏模式

三、业务步骤
第一步:准备好播放的视屏,点击左下方播放按钮,播放视频
第二部:中间可以暂停或者开始
第三步:可以拖动进度条
第三步:可以点击右下角放大icon,进行全屏播放,或者恢复正常播放

●更多鸿蒙最新技术知识点,请移步前往小编:https://gitee.com/

四、效果展示
image.png

五:代码展示:

import promptAction from '@ohos.promptAction'
import { videoSlider } from "../view/videoSlider"

@Entry
@Component
struct VideoPlayer {
  @State videoSrc: string  = '/common/videos/v1.mp4'
  @State videoImg: string = '/common/videos/img1.png'
  @State videoTitle: string  = "视频标题"
  @State isSupport: boolean  = false
  @State currentProgressRate: number = 1
  @State isPlay: boolean = false; //是否播放视频
  @State isAmplify: boolean = false; //是否放大
  @State progressVal: number = 0; //
  @State outSetValueOne: string = "0"; //视频时常
  @State startTime: string = "00:00"; //开始时间
  @State endTime: number = 0; //结束时间
  @State endStringTime: string = "00:00"; //结束时间
  @State currentTime: number = 0; //当前时间

  private controller: VideoController = new VideoController(); // 视频控制器

  //当前页面销毁
  onPageHide() {
    this.controller.pause();
  }

  build() {
    Column() {

      if (this.isAmplify){
        //视频内容-全屏
        Column() {
          Video({
            src: this.videoSrc,
            previewUri: this.videoImg,
            currentProgressRate:this.currentProgressRate,
            controller: this.controller
          })
            .width("100%")
            .height("92%")
            .controls(false)
            .autoPlay(false)
            .objectFit(ImageFit.Contain)
            .loop(false)
              //播放时触发该事件。
            .onStart(() => {})
              //暂停时触发该事件。
            .onPause(() => {})
              //播放结束时触发该事件。
            .onFinish(() => {
              this.isPlay = false
            })
              //播放失败时触发该事件。
            .onError(() => {
              promptAction.showToast({message:"播放失败"})
            })
              //视频准备完成时触发该事件。duration:当前视频的时长,单位为秒(s)。
            .onPrepared((e) => {
              let d_ = e.duration
              this.endTime = d_;
              let min: number = Number.parseInt((d_ / 60).toString());
              let second: number = d_ % 60;
              let m = min < 10 ? `${'0'}${min}` : min;
              let s = second < 10 ? `${'0'}${second}` : second;
              this.endStringTime = `${m}${':'}${s}`;
            })
              //操作进度条过程时上报时间信息。time:当前视频播放的进度,单位为s。
            .onSeeking((e) => {})
              //操作进度条完成后,上报播放时间信息。time:当前视频播放的进度,单位为s。
            .onSeeked((e) => {})
              //播放进度变化时触发该事件。time:当前视频播放的进度,单位为s。
            .onUpdate((e) => {
              if (e) {
                this.currentTime = e.time;
                let second: number = this.currentTime % 60;
                let min: number = Number.parseInt((this.currentTime / 60).toString());
                let start_m = min < 10 ? `${'0'}${min}` : min;
                let start_s = second < 10 ? `${'0'}${second}` : second;
                this.startTime = `${start_m}${':'}${start_s}`;
              }
            })
              //在全屏播放与非全屏播放状态之间切换时触发该事件。fullscreen:返回值为true表示进入全屏播放状态,为false则表示非全屏播放
            .onFullscreenChange(() => {})
          Blank()
          videoSlider({
            startTime:$startTime,
            endTime:$endTime,
            endStringTime:$endStringTime,
            currentTime: $currentTime,
            isPlay:$isPlay,
            isAmplify:$isAmplify,
            isSupport:$isSupport,
            controller: this.controller,
          })
          Blank()
        }.width("100%")
        .height("100%")
        .backgroundColor(0x999999)
      }else {
        //视屏内容
        Column() {
          Video({
            src: this.videoSrc,
            previewUri: this.videoImg,
            currentProgressRate:this.currentProgressRate,
            controller: this.controller
          })
            .height(383)
            .controls(false)
            .autoPlay(false)
            .objectFit(ImageFit.Contain)
            .loop(false)
              //播放时触发该事件。
            .onStart(() => {})
              //暂停时触发该事件。
            .onPause(() => {})
              //播放结束时触发该事件。
            .onFinish(() => {
              this.isPlay = false
            })
              //播放失败时触发该事件。
            .onError(() => {
              promptAction.showToast({message:"播放失败"})
            })
              //视频准备完成时触发该事件。duration:当前视频的时长,单位为秒(s)。
            .onPrepared((e) => {
              let d_ = e.duration
              this.endTime = d_;
              let min: number = Number.parseInt((d_ / 60).toString());
              let second: number = d_ % 60;
              let m = min < 10 ? `${'0'}${min}` : min;
              let s = second < 10 ? `${'0'}${second}` : second;
              this.endStringTime = `${m}${':'}${s}`;
            })
              //操作进度条过程时上报时间信息。time:当前视频播放的进度,单位为s。
            .onSeeking((e) => { })
              //操作进度条完成后,上报播放时间信息。time:当前视频播放的进度,单位为s。
            .onSeeked((e) => {})
              //播放进度变化时触发该事件。time:当前视频播放的进度,单位为s。
            .onUpdate((e) => {
              if (e) {
                this.currentTime = e.time;
                let second: number = this.currentTime % 60;
                let min: number = Number.parseInt((this.currentTime / 60).toString());
                let start_m = min < 10 ? `${'0'}${min}` : min;
                let start_s = second < 10 ? `${'0'}${second}` : second;
                this.startTime = `${start_m}${':'}${start_s}`;
              }
            })
              //在全屏播放与非全屏播放状态之间切换时触发该事件。fullscreen:返回值为true表示进入全屏播放状态,为false则表示非全屏播放
            .onFullscreenChange(() => {})

          //进度条
          videoSlider({
            startTime:$startTime,
            endTime:$endTime,
            endStringTime:$endStringTime,
            currentTime: $currentTime,
            isPlay:$isPlay,
            isAmplify:$isAmplify,
            isSupport:$isSupport,
            controller: this.controller,
          })

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

写在最后

●如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
●点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
●关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
●更多鸿蒙最新技术知识点,请移步前往小编:https://gitee.com/

在这里插入图片描述

Spring Boot 是一个用于快速构建基于 Spring 框架的应用程序的开源框架。要实现一个视频播放系统,我们可以使用 Spring Boot 来提供后台服务和管理业务逻辑。 首先,我们需要定义视频的数据模型,包括视频的名称、描述、作者、上传时间等信息。使用 Spring Boot 的 JPA 或者 MyBatis 可以很方便地与数据库进行交互,我们可以使用这些工具来创建视频模型并存储到数据库。 接下来,我们可以使用 Spring Boot 的 MVC 功能来处理用户的请求。通过创建控制器类,我们可以定义不同的路由和请求处理方法,比如上传视频、删除视频、查找视频等。 为了实现视频播放,我们可以利用 Spring Boot 提供的静态资源映射功能,将视频文件存储在指定的文件夹,然后在 HTML 页面通过 URL 来引用这些视频文件。 此外,我们可以使用开源的视频播放器库(如 video.js 或者 jwplayer)来实现视频播放界面的设计和功能,可以将这些库添加到前端页面,并使用 Spring Boot 提供的 Thymeleaf 或者 FreeMarker 模板引擎来生成动态页面。 对于流媒体的处理,我们可以使用 FFmpeg 或者 Gstreamer 等开源库来处理视频流。结合 Spring Boot 的异步处理和流媒体处理的库,我们可以实现视频的实时转码、流式传输等功能。 最后,为了提高系统的性能和可用性,我们可以使用 Spring Boot 的缓存和负载均衡功能。使用缓存可以减少对数据库的访问,提高系统的响应速度;而负载均衡可以将请求分发到多个服务器上,提高系统的并发处理能力。 综上所述,使用 Spring Boot 可以方便地实现一个视频播放系统,包括数据存储、业务处理、静态资源管理、流媒体处理、前端页面设计等功能。Spring Boot 提供了丰富的功能和组件,能够帮助我们快速开发出高效、可靠的视频播放系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值