• #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. }

     

  • 相关阅读:
    axis和axis2的一些发布差异(WSDL2Java)
    网络安全——cobalt Strike 之office钓鱼
    应该了解的数据库系统高性能利器-WAL
    docker部署完mysql无法连接
    华媒舍:怎样成为谷歌竞价排名羸家?10个方法
    2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校教师科研能力评定系统40n60
    如何解决前端上线之后用户页面不刷新的问题
    【CKA考试笔记】十五、安全管理:验证与授权
    springBoot实现发布订阅
    http2分片流内容整合呈现方法
  • 原文地址:https://blog.csdn.net/weixin_47070198/article/details/126875925