内容简介

本文介绍了如何使用ArkUI框架提供的video组件,实现一个具有简易播放器。通过VideoController控制器来控制倍速、全屏、进度调节等功能。

由于使用本地视频文件会影响App的包大小,所以通常我们的视频文件来源于网络地址,记得需要在config或者module.json对应的"abilities"中添加网络使用权限ohos.permission.INTERNET。

效果展示

添加权限(网络地址需要)

  1. "abilities":[
  2. {
  3. "permissions": ["ohos.permission.INTERNET"],
  4. }
  5. ]

  

使用一个VideoController对象可以控制一个或多个video。

  1. //一个VideoController对象可以控制一个或多个video。
  2. controller: VideoController = new VideoController();

  

接口

  1. declare interface VideoOptions {
  2. src?: string | Resource;
  3. currentProgressRate?: number | string | PlaybackSpeed;
  4. previewUri?: string | PixelMap | Resource;
  5. controller?: VideoController;
  6. }

  

  1. 其中仅src(视频播放源的路径)这个参数是必填的。

★支持本地视频路径和网络路径。

★支持在resources下面的video或rawfile文件夹里放置媒体资源。

★支持dataability://的路径前缀,用于访问通过Data Ability提供的视频路径

currentProgressRate:number视频播放倍速,支持0.75、1.0、1.25、1.75、2.0。

previewUri:string预览图片的路径,可以作为视频未播放时的封面。

controller:VideoController控制器。一个VideoController对象可以控制一个或多个video。如果需要通过代码控制视频的播放、暂停等,可以给Video组件设置这个参数,然后通过控制器的如下接口控制视频播放状态:

PlaybackSpeed类型接口说明

  1. declare interface VideoOptions {
  2. src?: string | Resource;
  3. currentProgressRate?: number | string | PlaybackSpeed;
  4. previewUri?: string | PixelMap | Resource;
  5. controller?: VideoController;
  6. }

  

  1.  

VideoController

一个VideoController对象可以控制一个或多个video。

★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)

指定视频播放的进度位置,并指定跳转模式。

★参数

★SeekMode8+类型接口说明

  1.  
  2. declare interface VideoOptions {
  3. src?: string | Resource;
  4. currentProgressRate?: number | string | PlaybackSpeed;
  5. previewUri?: string | PixelMap | Resource;
  6. controller?: VideoController;
  7. }

  

Video属性

muted(是否静音)、autoPlay(自动播放)、controls(控制栏)、objectFit(显示模式)、loop(是否循环播放)。其中,objectFit参数设置值为ImageFit.Cover则铺满整个容器。

详细介绍

.muted(boolean) 默认值false是否静音。

.autoPlay(boolean) 默认值false是否自动播放。

.controls(boolean) 默认值true控制视频播放的控制栏是否显示。

.loop(boolean) 是否单个视频循环播放。

.objectFit(ImageFit) 默认值Cover设置视频显示模式。ImageFit有如下枚举值可选

ImageFit枚举说明

事件:

onStart() => 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。

完整示例

  1. @Entry
  2. @Component
  3. struct Index {
  4. @State message: string = '视频预览'
  5. @State previewUris: Resource = $r('app.media.openharmony'); //预览封面
  6. controller: VideoController = new VideoController();
  7. @State currentProgressRate: number = 1
  8. @State muted: boolean = false
  9. @State autoPlay: boolean = true
  10. @State controls: boolean = true
  11. @State startStatus: boolean = true
  12. @State loop: boolean = true
  13.  
  14. aboutToAppear() {
  15. this.controller.requestFullscreen(true)
  16. this.controller.start()
  17. }
  18.  
  19. build() {
  20.  
  21. Column() {
  22. Text(this.message)
  23. .fontSize(50)
  24. .fontWeight(FontWeight.Bold)
  25. Video({
  26. src: $r('app.media.video'),
  27. previewUri: this.previewUris, // 视频封面
  28. currentProgressRate: this.currentProgressRate, // 视频播放倍速
  29. controller: this.controller,
  30.  
  31. })
  32. .muted(this.muted) // 是否静音
  33. .autoPlay(this.autoPlay) // 是否自动播放
  34. .controls(this.controls) // 控制视频播放的控制栏是否显示
  35. .objectFit(ImageFit.Contain) // 视频显示模式
  36. .loop(this.loop) // 是否单个视频循环播放
  37. .height("60%")
  38. .onStart(() => {
  39. // 播放时触发该事件
  40. console.info('onStart');
  41. })
  42. .onPause(() => {
  43. // 暂停时触发该事件
  44. console.info('onPause');
  45. })
  46. .onFinish(() => {
  47. console.info('onFinish');
  48.  
  49. })
  50. .onError(() => {
  51. // 播放失败时触发该事件
  52. console.error('onError');
  53. })
  54. .onFullscreenChange((e) => {
  55. console.info('视频进入和退出全屏时触发该事件:' + e.fullscreen)
  56. })
  57. .onPrepared((e) => {
  58. console.info('视频准备完成时触发该事件:' + e.duration)
  59. })
  60. .onSeeking((e) => {
  61. console.info('操作进度条过程时上报时间信息:' + e.time)
  62. })
  63. .onSeeked((e)=>{
  64. console.info('操作进度条完成后,上报播放时间信息:'+ e.time)
  65. })
  66. .onUpdate((e)=>{
  67. console.info('播放进度变化时触发该事件:'+ e.time)
  68. })
  69. Row({}){
  70. Flex({ wrap:FlexWrap.Wrap, justifyContent:FlexAlign.SpaceAround, alignItems:ItemAlign.Center}){
  71. Button("播放")
  72. .onClick(()=>{
  73. this.controller.start()
  74. }).margin(8)
  75. Button("暂停")
  76. .onClick(()=>{
  77. this.controller.pause()
  78. })
  79. Button("循环播放")
  80. .onClick(()=>{
  81. this.loop=!this.loop
  82. })
  83. Button("2倍速")
  84. .onClick(()=>{
  85. this.currentProgressRate=2
  86. })
  87. Button("静音")
  88. .onClick(()=>{
  89. this.muted=!this.muted
  90. })
  91.  
  92. Button("停止")
  93. .onClick(()=>{
  94. this.controller.stop()
  95. })
  96.  
  97. Button("全屏播放")
  98. .onClick(()=>{
  99. this.controller.requestFullscreen(true)
  100. })
  101. Button("退出全屏")
  102. .onClick(()=>{
  103. this.controller.exitFullscreen()
  104. }).margin(8)
  105.  
  106. Button("控制栏是否显示")
  107. .onClick(()=>{
  108. this.controls =!this.controls
  109. }).margin(8)
  110.  
  111. Button("指定视频播放的进度")
  112. .onClick(()=>{
  113. this.controller.setCurrentTime(9)
  114. })
  115. }
  116. }
  117. }
  118. .width('100%').height('100%')
  119. }
  120. }

  

总结

本文介绍了如何使用ArkUI框架提供的video组件,实现一个具有视频播放、倍速控制、进度调节的播放器。通过VideoController控制器来控制倍速、全屏、进度调节等功能。当然,除了文中分享的视频播放器样例,开发者还可以通过拓展其他相关属性和方法,实现更多好玩的样例。

在DAYU200上实现OpenHarmony视频播放器的更多相关文章

  1. 【Mac上的PotPlayer视频播放器】Movist Pro for Mac 2.1.2

    [简介] Movist 是Mac上最好用的视频播放器之一,功能齐全,类似Windows上的PotPlayer,今天和大家分享最新的 2.1.2 中文版本,Movist 支持几乎所有常见的视频格式,包括 ...

  2. Android 视频播放器切换到下个视频时残留上个视频画面的解决办法

    最近在做一个Android视频播放器,遇到一个问题:切换到下一个视频时,中间会停留上一个视频的残存画面.   这是怎么回事?   我在网上找了很多资料,终于找到了原因:我是用自定义一个surfacev ...

  3. WPF技术触屏上的应用系列(三): 视频播放器的使用及视频播放、播放、暂停、可拖动播放进度效果实现

    原文:WPF技术触屏上的应用系列(三): 视频播放器的使用及视频播放.播放.暂停.可拖动播放进度效果实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系统,5 ...

  4. android开发里跳过的坑——调用已安装视频播放器在有些机器上无效

    调用已安装视频播放器播放未修改之前的代码 private void startPlay(String fileName){ File file = new File(fileName); Intent ...

  5. 在Ubuntu18.04.2LTS上安装视频播放器smplayer/vlc

    在Ubuntu18.04.2LTS上安装视频播放器smplayer/vlc 一.前言 在Ubuntu上的视频播放器质量很差,没有解码器,非常的不方便,于是我们需要手动去安装适合我们的播放器,比如smp ...

  6. Python应用03 使用PyQT制作视频播放器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁任何形式转载. 最近研究了Python的两个GUI包,Tkinter和PyQT.这两个GUI包的底层分别是Tcl/ ...

  7. 建站技能get(1)— Asp.net MVC快速集成ckplayer网页视频播放器

    故事背景大概是这样的,我厂两年前给山西晋城人民政府做了一个门户网站(地址:http://jccq.cn/),运行了一年多固若金汤,duang的有一天市场部门过来说,新闻管理模块带视频的内容播放不了了. ...

  8. 打造自己的html5视频播放器

    前段时间重新学习了一下html5的video部分,以前只是停留在标签的使用上,这一次决定深入了解相关的API,并运用这些API打造一个简单的视频播放器.所谓“打造自己的”,就是要自己重写video标签 ...

  9. 一款开源免费跨浏览器的视频播放器--videojs使用介绍

    最近项目中的视频功能,需要做到浏览器全兼容,所以之前用html5实现的视频功能就需要进行改造了.在网上翻了个遍,试来试去,在所有的视频播放器中,就数它最实际了.首先我们来看看它的优点: 1.它是开源免 ...

  10. 分享一个基于HTML5实现的视频播放器

    什么是hivideo? 最近一段时间在使用PhoneGap开发一个App应用,App需要播放视频,本想直接使用html5的video,但使用它在全屏播放时不支持横屏播放,只能放弃.最终决定还是自己封装 ...

随机推荐

  1. http.Handler接口

    // 示例 // net/http package http type Handler interface{ ServeHTTP(w ResponseWriter, r *Request) } fun ...

  2. Singularity容器

    """参考文档 https://apptainer.org/user-docs/master/build_a_container.html ""&qu ...

  3. 基于java的个人博客

    基于java的个人博客 效果预览 首页 详情 文章管理 文章发布 分类管理 访问地址 前台地址http://localhost:8080 后台地址:http://localhost/admin/ 开发 ...

  4. AFNetworking整体框架简单整理

    一.AFNetworking整体框架是怎样的 1.UIKit集成模块 UIKit 2.请求序列化 Serialization 3.响应序列化 Serialization 4.会话 NSURLSessi ...

  5. RabbitMQ零碎整理,总有一天在你工作中会用到

    概念 MQ:消息队列(消息中间件),开源的基于AMQP协议的消息中间件,异步 解耦 削峰 核心作用:1.异步 2.解耦 3.消息通信 RabbitMQ 消息的类型:1.点对点 2.Worker 3.发 ...

  6. Zabbix“专家坐诊”第187期问答汇总

    问题一 Q:zabbix server 5.0有办法不通过脚本监控SSL证书到期时间么? A:目前还是流行通过脚本方式去获取. Q:如果是通配符证书应该怎么监控? A:通过解析域名获取对应的过期时间的 ...

  7. java学习 javaz-001 Helloworld 第一个demo

    java学习 javaz-001 Helloworld 第一个demo 目录 学习目标 前期准备 java sdk 1.8环境 编辑器IDE的选择 代码开发 目录结构 创建第一个java文件 创建第2 ...

  8. 金蝶中间件 前后台连不上 报跨域 前台解决方案: --user-data-dir="c:\ChromeDebug" --test-type --disable-web-security

    chrome 浏览器的快捷方式后面加参数 --user-data-dir="c:\ChromeDebug" --test-type --disable-web-security

  9. 基于ADS1299的可穿戴设备调试之接口含义简析

    前言    几个项目都用到了ADS1299,没想到中间会出那么多的问题.在解决问题的时候,这里面暴露了团队的不少不足之处.看来做技术,还是需要不断地积累.思维不能留盲点啊.要经常总结,做笔记.   接 ...

  10. CMake 用法总结(转载)

    原文地址 什么是 CMake All problems in computer science can be solved by another level of indirection. David ...