• #DAYU200#OpenHarmony 视频播放器


    作者:徐建国

    Video
    由于使用本地视频文件会影响 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. }

    复制

    其中仅 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 和 VideoController 单独拎出来做一个解释。

    PlaybackSpeed 类型接口说明

    1. declare enum PlaybackSpeed {
    2. Speed_Forward_0_75_X,
    3. Speed_Forward_1_00_X,
    4. Speed_Forward_1_25_X,
    5. Speed_Forward_1_75_X,
    6. Speed_Forward_2_00_X,
    7. }

    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. declare enum SeekMode {
    2. PreviousKeyframe,
    3. NextKeyframe,
    4. ClosestKeyframe,
    5. Accurate,
    6. }

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

     

  • 相关阅读:
    GESP一级 - 第一章 - 第3节 - 计算机软件系统 - 习题
    【机器学习——决策树算法——Python实现——信用评级】
    .net 温故知新:【7】IOC控制反转,DI依赖注入
    开关电源泄漏电流测试方法| 万用表测量开关电源漏电流的方法及接线方式分享
    pyinstaller 操作以及常见问题解决
    第10章:调试程序
    Java项目:SSM演唱会售票管理系统
    Vim实用技巧_7.模式匹配和查找
    可持续建筑分论坛精彩回顾 | 第二届始祖数字化可持续发展峰会
    硬件开发笔记(六): 硬件开发基本流程,制作一个USB转RS232的模块(五):创建USB封装库并关联原理图元器件
  • 原文地址:https://blog.csdn.net/weixin_47070198/article/details/126875925