鸿蒙HarmonyOS实战—如何使用Video组件播放视频

1.视频播放

鸿蒙系统中,关于视频播放,可以使用上层视频组件Video。

参数如下

  • src

    • 支持file:///data/storage路径前缀的字符串,用于读取应用沙箱路径内的资源。需要保证目录包路径下的文件有可读权限。 说明:视频支持的格式是:mp4、mkv、webm、TS。

    • 视频播放源的路径,支持本地视频路径和网络路径。 支持在resources下面的video或rawfile文件夹里放置媒体资源。 支持dataability://的路径前缀,用于访问通过Data Ability提供的视频路径,具体路径信息详见 DataAbility说明。

  • currentProgressRate

    • 视频播放倍速。 说明: number取值仅支持:0.75,1.0,1.25,1.75,2.0。 默认值:1.0 | PlaybackSpeed.Speed_Forward_1_00_X

  • previewUri

    • 视频未播放时的预览图片路径,默认不显示图片。

  • controller

    • 设置视频控制器,可以控制视频的播放状态。

2.视频资源

  • 本地视频资源

    • 存放在resources/rawfile目录下,例如:本文使用test.mp4文件,那本地视频文件路径可指定为localVideo: Resource = $rawfile('test.mp4')

  • 网络视频资源

    • 提供url视频文件地址即可,本文不提供,读者自行选择即可

3.示例代码

import router from '@ohos.router';

@Entry
@Component
struct VideoPage {
    TAG = 'VideoPage'
    localVideoController: VideoController = new VideoController()
    netVideoController: VideoController = new VideoController()
    localVideo: Resource = $rawfile('test.mp4')
    videoUrl = 'https://cmsvideo4.pg0.cn/group4/M00/13/0B/CgoN4mDdkX6AUcEYAESOlJKkmcM401.mp4'
    @State currentTime: number = 0;
    @State durationTime: number = 0;

    @Builder
    navigationTitle() {
        Column() {
            Text('视频播放')
                .fontColor('#182431')
                .fontSize(30)
                .lineHeight(41)
                .fontWeight(700)
        }.alignItems(HorizontalAlign.Start)
    }

    @Builder
    buildPage() {

        List() {
            ListItem() {
                Column({ space: 10 }) {
                    Video({
                        src: this.localVideo,
                        controller: this.localVideoController
                    }).autoPlay(true)
                        .width('90%')
                        .height(200)

                    Button('开始播放')
                        .onClick((event) => {
                            console.info(`${this.TAG}  onClick `)
                            this.localVideoController.start();
                        })
                        .width('80%')

                    Video({
                        src: this.videoUrl,
                        controller: this.netVideoController
                    })
                        .muted(false)//设置是否静音
                        .controls(true)//设置是否显示默认控制条
                        .autoPlay(false)//设置是否自动播放
                        .loop(false)//设置是否循环播放
                        .objectFit(ImageFit.Contain)//设置视频适配模式
                        .width('90%')
                        .height(200)
                        .onPrepared((event) => {
                            if (event) {
                                console.info(`${this.TAG} onSeeked duration:${event.duration}`)
                                this.durationTime = event.duration
                            }
                        })
                        .onStart(() => {
                            console.info(`${this.TAG} onStart `)
                        })
                        .onSeeked((event) => {
                            if (event) {
                                console.info(`${this.TAG}  onSeeked time:${event.time}`)
                            }
                        })
                        .onUpdate((event) => {
                            if (event) {
                                console.info(`${this.TAG}  onUpdate time:${event.time}`)
                                this.currentTime = event.time
                            }
                        })
                        .onPause(() => {
                            console.info(`${this.TAG}  onPause `)
                        })
                        .onFinish(() => {
                            console.info(`${this.TAG}  onFinish `)
                        })
                        .onError(() => {
                            console.info(`${this.TAG}  onError `)
                        })

                    Row() {
                        Text(JSON.stringify(this.currentTime) + 's')
                        Slider({
                            value: this.currentTime,
                            min: 0,
                            max: this.durationTime
                        })
                            .onChange((value: number, mode: SliderChangeMode) => {
                                this.netVideoController.setCurrentTime(value);
                            }).width("80%")
                        Text(JSON.stringify(this.durationTime) + 's')
                    }.alignItems(VerticalAlign.Center)
                    .justifyContent(FlexAlign.Center)
                    .opacity(0.8)
                    .width("90%")

                    Button('开始播放')
                        .onClick((event) => {
                            console.info(`${this.TAG}  onClick `)
                            this.netVideoController.start();
                        })
                        .width('80%')

                    Button('播放视频')
                        .onClick((event) => {
                            router.pushUrl({
                                url: 'pages/CommonWidget/FullPage',
                                params: { videoSrc: this.videoUrl, videoTime: this.currentTime }
                            })
                        })
                        .width('80%')

                }.width('100%')
                .alignItems(HorizontalAlign.Center)
                .justifyContent(FlexAlign.Center)
            }
        }
    }

    build() {
        Column() {
            Navigation() {
                this.buildPage()
            }.title(this.navigationTitle())
            .titleMode(NavigationTitleMode.Full)

        }.width('100%')
        .height('100%')
    }
}

4.效果

5.其它

5.1.应用权限问题

遗憾的是上述示例,并不能播放视频,问题出现在哪里呢?

本地视频播放,需要ohos.permission.MODIFY_AUDIO_SETTINGSohos.permission.READ_MEDIA两个权限

网络视频播放,需要ohos.permission.INTERNET网络权限

在module.json5文件添加即可

 "requestPermissions": [
      {
        "name": "ohos.permission.INTERNET",
        "usedScene": {
          "when": "always"
        },

      },
      {
        "name": "ohos.permission.MODIFY_AUDIO_SETTINGS",
        "usedScene": {
          "when": "always"
        }
      },
      {
        "name": "ohos.permission.READ_MEDIA",
        "usedScene": {
          "when": "always"
        }
      }
    ]

最后

如果你想快速提升鸿蒙技术,那么可以直接领取这份包含了:【OpenHarmony多媒体技术、Stage模型、ArkUI多端部署、分布式应用开发、音频、视频、WebGL、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战】等技术知识点。

鸿蒙Next全套VIP学习资料←点击领取!(安全链接,放心点击

1.鸿蒙核心技术学习路线

2.大厂面试必问面试题

3.鸿蒙南向开发技术

 4.鸿蒙APP开发必备

 5.HarmonyOS Next 最新全套视频教程

 6.鸿蒙生态应用开发白皮书V2.0PDF

这份全套完整版的学习资料已经全部打包好,朋友们如果需要可以点击→鸿蒙Next全套VIP学习资料免费领取(安全链接,放心点击

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/679544.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

opencv-python(四)

读取图像文件 image cv2.imread(path, flag) flag:1. 默认值,依原图像读取图像,保留Alpha透明度通道。2.IMREAD_GRAYSCALE:将图像转为灰度再读取。3.IMREAD_COLOR:将图像转为三通道BGR彩色再读取。 可读取的图像格…

猫头虎分享已解决Bug || Error: ‘fetch‘ is not defined

原创作者: 猫头虎 作者微信号: Libin9iOak 作者公众号: 猫头虎技术团队 更新日期: 2024年6月6日 博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: &…

HBuildX创建uni-app项目

新建项目 输入项目名称,选择存放位置、项目模板、vue版本 创建成功后左边会显示项目目录 安装插件:工具-》插件安装,根据所选vue版本安装编译器 点击运行,选择你需要运行的地方即可

Java面试题:ArrayList底层实现原理、HashMap的实现原理、HashMap的jdk1.7和jdk1.8有什么区别

文章目录 一、List相关面试题1.1 ArrayList源码分析(底层实现)1.2 ArrayList底层的实现原理是什么1.3 ArrayList listnew ArrayList(10)中的list扩容几次1.4 如何实现数组和List之间的转换1.5 ArrayList 和 LinkedList 的区别是什么 二、HashMap相关面试…

[协议]TCP协议

TCP,UDP协议工作在传输层 TCP基于连接; UDP基于非连接 TCP三次握手 UDP:不能保证丢包,传输稳定性不如TCP;

【SVG 生成系列论文(十一)】如何定制化地生成 SVG 图案?Text-Guided Vector Graphics Customization

SVG 生成系列论文(一) 和 SVG 生成系列论文(二) 分别介绍了 StarVector 的大致背景和详细的模型细节。SVG 生成系列论文(三)和 SVG 生成系列论文(四)则分别介绍实验、数据集和数据增…

《2024年DDoS趋势报告》:DDoS攻击规模飙升233.33%

2023年,数字领域面临着分布式拒绝服务(DDoS)攻击的变革浪潮,攻击速度创纪录地达到了每秒700 Gbps和8000万数据包。这些事件跨越了从游戏到金融服务的各个行业,突显了DDoS是一种普遍存在的风险。 值得注意的是&#xf…

关于家储用防逆流电流互感器AKH-0.66/K K-φ16 100A/40mA详细介绍-安科瑞 蒋静

1.产品特点 产品外形美观,安装、接线方便,专用于通讯机房 100A 及以下配电系统改造,可与 AMC16 多回路监控仪表配合使用。 2.型号说明 3.外形尺寸(公差:2mm) 4.规格参数对照表 5.使用环境 (1)额定工作…

2024年能源、电力电气与机电工程国际学术会议(ICEPEME 2024)

全称:2024年能源、电力电气与机电工程国际学术会议(ICEPEME 2024) 2024 International Conference on Civil Engineering and Architectural Planning 会议网址:http://www.icepeme.com会议时间:2024/7/10截稿时间:20…

【传知代码】时序预测:多头注意力+宽度学习(论文复现)

前言:近年来,随着人工智能技术的飞速发展,尤其是深度学习领域的突破,时序预测领域也迎来了新的变革。传统的预测方法,如线性回归、时间序列分析等,虽然在某些场景下表现良好,但在面对复杂、非线…

FPGA - 4位数值比较器电路

4位数值比较器电路 描述 某4位数值比较器的功能表如下。 请用Verilog语言采用门级描述方式,实现此4位数值比较器 输入描述: input [3:0] A , input [3:0] B 输出描述: output wire…

嵌入式科普(20)2024瑞萨技术交流日

没有来参加技术交流日的一天,可能就是决定一生的一天。 分享2024瑞萨技术交流日MVP结算画面: 强烈建议点击b站小程序,听背景音乐,感受九子夺嫡结算MVP,四爷王上加白。从此以后写代码再也不出bug 嵌入式科普(20)2024瑞…

深度学习-07-反向传播的自动化

深度学习-07-反向传播的自动化 本文是《深度学习入门2-自製框架》 的学习笔记,记录自己学习心得,以及对重点知识的理解。如果内容对你有帮助,请支持正版,去购买正版书籍,支持正版书籍不仅是尊重作者的辛勤劳动&#xf…

解决 clickhouse jdbc 偶现 failed to respond 问题

背景 Clickhouse集群版本为 Github Clickhouse 22.3.5.5, clickhouse-jdbc 版本为 0.2.4。 问题表现 随着业务需求的扩展,基于Clickhouse 需要支持更多任务在期望的时效内完成,于是将业务系统和Clickhouse交互的部分都提交给可动态调整核心…

Python中如何打开网页

幸好思念无声,可惜思念无声 ——24.6.4 Python打开前端网页 1.导入webbrowser库 用webbrowser.open(传入网址),打开网页 import webbrowser webbrowser.open("Index.html") 2.用flask框架 from wsgiref.simple_server import make_serve…

九、从0开始卷出一个新项目之瑞萨RZN2L生产烧录固件(jflash擦写读外挂flash)

目录 七、生产烧录固件(jflash擦/写/读外挂flash) 7.1 flash母片读写 7.2 jflash擦/写/读外挂flash 九、从0开始卷出一个新项目之瑞萨RZN2L 七、生产烧录固件(jflash擦写读外挂flash) 七、生产烧录固件(jflash擦/写/读外挂flash) 7.1 flash母片读写 略 7.2 jflash擦/写/读…

文件上传漏洞之upload-labs

前提: 本文中的以xshell命名的均为以密码为admin的一句话木马,而shell命名的则是由冰蝎工具生成的木马。 pass-01:js前端验证 测试性的上传一个一句话木马,发现被拦截了,而且根据推测大概率是前端检测,于…

uniapp小程序开发 | 从零实现一款影视类app (横向滚动和下拉刷新的实现)

uniapp小程序开发实战系列,完整介绍从零实现一款影视类小程序。包含小程序前端和后台接口的全部完整实现。系列连载中,喜欢的可以点击收藏。 这里介绍下我的电影小程序的完整实现过程。这个系列将会详细讲解每个步骤,包括接口设计、数据结构优…

720云「3D空间漫游」功能爆发!户型标注、自动导览、切换视图…

一、新增 [开场封面] 支持图片、视频开场 作品第一印象必须惊艳!使用频率极高的功能,终于给3D漫游安排上啦~你可以自定义上传一张图片或一段视频,支持对桌面端、移动端分别进行设置并预览,完美适配不同终端。 二、升级模型交互体验…

Docker安装MySQL8.0报错记录

Linux已知有docker MySQL5.6版本,再安装MySQL8.0,报错信息记录如下 Docker安装MySQL8.0报错记录 Linux已知有docker MySQL5.6版本,再安装MySQL8.0,报错信息记录如下 问题1 :ls: cannot access ‘/docker-entrypoint…