当前位置:   article > 正文

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

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) 使视频保持宽高比例进行缩放,从而保证视频原有的显示效果
  1. @Component
  2. export struct VideoPlayer {
  3. private source: string | Resource;
  4. private previewUris: Resource = $r('app.media.preview');
  5. build() {
  6. Column() {
  7. Video({
  8. src: this.source,
  9. previewUri: this.previewUris
  10. })
  11. .width('100%')
  12. .height('100%')
  13. .objectFit(ImageFit.Contain)
  14. }
  15. }
  16. }

注意:

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

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

自定义视频播放控制器:

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

VideoPlayer

  1. import { Event } from '@ohos.worker';
  2. import Prompt from '@system.prompt';
  3. import { ALL_PERCENT, COMMON_NUM_DOUBLE, COMMON_NUM_MINUTE, SPLIT, STRING_PERCENT, ZERO_STR } from './Constants';
  4. import { changeSliderTime } from './VideoControll';
  5. import { VideoSlide } from './VideoSlide';
  6. @Component
  7. export struct VideoPlayer {
  8. private source: string | Resource;
  9. private previewUris: Resource = $r('app.media.preview');
  10. private controller: VideoController
  11. isPlay: boolean = false
  12. @Provide durationTime: number = 0
  13. @Provide durationStringTime: string = '00:00'
  14. @Provide currentTime: number = 0
  15. @Provide currentStringTime: string = '00:00'
  16. build() {
  17. Column() {
  18. Video({
  19. src: this.source,
  20. previewUri: this.previewUris,
  21. controller: this.controller
  22. })
  23. .width(ALL_PERCENT)
  24. .height(STRING_PERCENT.NINETY_PERCENT)
  25. .objectFit(ImageFit.Contain)
  26. .controls(false)
  27. .onPrepared((event) => {
  28. this.prepared.call(this, event?.duration)
  29. })
  30. .onUpdate((event) => {
  31. if (event) {
  32. this.currentTime = event.time
  33. this.currentStringTime = changeSliderTime(this.currentTime)
  34. }
  35. })
  36. .onFinish(() => {
  37. //视频播放完成回调
  38. this.finish.call(this)
  39. })
  40. .onError(() => {
  41. //视频播放出错回调
  42. Prompt.showToast({ duration: 5000, message: '错误提示' })
  43. })
  44. //自定义视频播放控制器组件
  45. VideoSlide({ controller: this.controller })
  46. }
  47. }
  48. prepared(duration: number) {
  49. this.durationTime = duration;
  50. let second: number = duration % COMMON_NUM_MINUTE;
  51. let min: number = Number.parseInt((duration / COMMON_NUM_MINUTE).toString());
  52. let head = min < COMMON_NUM_DOUBLE ? `${ZERO_STR}${min}` : min;
  53. let end = second < COMMON_NUM_DOUBLE ? `${ZERO_STR}${second}` : second;
  54. this.durationStringTime = `${head}${SPLIT}${end}`;
  55. }
  56. finish() {
  57. this.isPlay = false
  58. }
  59. }

ViewSlider

  1. import { ALL_PERCENT } from './Constants'
  2. @Component
  3. export struct VideoSlide {
  4. private controller: VideoController
  5. private isPlay: boolean = false
  6. @Consume durationTime: number
  7. @Consume durationStringTime: string
  8. @Consume currentTime: number
  9. @Consume currentStringTime: string
  10. build() {
  11. Row({ space: 12 }) {
  12. //视频播放/暂停控制
  13. Image(this.isPlay
  14. ? $r('app.media.ic_pause')
  15. : $r('app.media.ic_play'))
  16. .onClick(() => {
  17. this.iconOnclick()
  18. })
  19. .width(50)
  20. .height(50)
  21. //显示当前播放时间
  22. Text(this.currentStringTime)
  23. .fontColor(Color.White)
  24. //控制和播放进度
  25. Slider({ value: this.currentTime, min: 0, max: this.durationTime, step: 1 })
  26. .width(180)
  27. .onChange((value: number, mode: SliderChangeMode) => {
  28. this.slideOnChange.call(this, value, mode)
  29. })
  30. //显示视频时长
  31. Text(this.durationStringTime)
  32. .fontColor(Color.White)
  33. }.backgroundColor(Color.Green)
  34. .width(ALL_PERCENT)
  35. }
  36. iconOnclick() {
  37. if (this.isPlay) {
  38. this.controller.pause()
  39. this.isPlay = false
  40. } else {
  41. this.controller.start()
  42. this.isPlay = true
  43. }
  44. }
  45. slideOnChange(value: number, mode: SliderChangeMode) {
  46. this.currentTime = parseInt(value.toString())
  47. this.controller.setCurrentTime(this.currentTime, SeekMode.Accurate)
  48. }
  49. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/580437
推荐阅读
相关标签
  

闽ICP备14008679号