鸿蒙 ArkUI Video 组件实战:自定义本地视频播放器完整教程
一、前言
在鸿蒙应用开发中,视频播放是非常常见的业务需求,课程播放、短视频、宣传视频等场景都会用到Video组件。ArkUI 提供了原生 Video 视频组件,搭配VideoController控制器,可以脱离系统自带播放控制栏,自定义播放、暂停按钮,灵活实现播放器样式。 本篇提供可直接运行的完整代码,逐行拆解参数、属性、控制器方法,讲解资源存放规范与开发注意事项,适合实训作业与新手学习。
二、完整可运行代码
arkts
@Entry
@Component
struct Index {
// 创建视频控制器,用于控制播放、暂停等操作
private controller: VideoController = new VideoController();
// 网络视频地址(示例,本次案例未使用)
private videpSrc: string = 'http://www.w3school.com.cn/example/html5/mov_bbb.mp4'
build() {
Column({ space: 20 }) {
Text("本地视频播放器")
.fontSize(24)
.width('100%')
.textAlign(TextAlign.Center)
// 视频核心组件
Video({
// rawfile本地视频资源,存放于entry/src/main/resources/rawfile/下
src: $rawfile('sd.mp4'),
// 绑定控制器
controller: this.controller,
// 视频未播放时展示的封面图
previewUri: $r("app.media.cover")
})
.width('100%')
.height(200)
.muted(false) // 不静音,正常播放声音
.controls(false) // 关闭系统自带播放控制条
.loop(true) // 开启循环播放
.autoPlay(false) // 进入页面不自动播放
.objectFit(ImageFit.Contain) // 视频等比例完整显示,不拉伸裁剪
// 播放、暂停控制按钮组
Row({ space: 30 }) {
Button("播放")
.width(140)
.height(50)
.backgroundColor(Color.Blue)
.fontSize(20)
.borderRadius(18)
.onClick(() => {
// 点击调用控制器播放方法
this.controller.start()
})
Button("暂停")
.width(140)
.height(50)
.backgroundColor(0xf53f3f)
.fontSize(20)
.borderRadius(18)
.onClick(() => {
// 点击调用控制器暂停方法
this.controller.pause()
})
}
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
.alignItems(HorizontalAlign.Center)
}
}
三、前置资源配置(必看,否则视频无法加载)
3.1 本地视频文件存放
代码中使用$rawfile('sd.mp4')读取本地视频,存放路径: entry/src/main/resources/rawfile/
- 没有 rawfile 文件夹则手动新建;
- 将视频文件
sd.mp4放入该目录; - 文件名全部小写,不包含中文、空格、特殊符号。
3.2 封面图片存放
previewUri: $r("app.media.cover")为视频封面图: 图片路径:entry/src/main/resources/base/media/ 把图片命名为 cover.png/jpg 放入 media 文件夹。
3.3 网络视频额外配置(代码中预留字段)
如果要使用网络 url 视频,需要申请网络权限: module.json5 -> module.requestPermissions 添加网络权限
json
{
"name": "ohos.permission.INTERNET"
}
四、代码分层详细解析
4.1 控制器定义
arkts
private controller: VideoController = new VideoController();
VideoController是 Video 组件的操作控制器,是控制视频播放的核心对象,必须实例化并绑定给 Video 组件,提供播放、暂停、跳转、停止等方法。
4.2 Video 构造入参说明
Video 组件接收一个对象参数,包含三个核心参数:
src:视频资源地址$rawfile("文件名"):读取 rawfile 下本地短视频;- 字符串 url:网络在线视频;
controller:绑定创建好的 VideoController 实例,实现外部按钮控制;previewUri:视频加载完成前、未播放时展示的封面图片。
4.3 Video 组件常用属性详解
width / height:设置播放器宽高,支持百分比与固定数值。muted:设置是否静音播放,false 为正常播放声音,true 为静音。controls:是否展示系统自带播放控制条,false 为隐藏,实现自定义按钮控制。loop:是否开启循环播放,true 视频播放完毕自动重播。autoPlay:是否页面加载自动播放,false 需要手动点击按钮触发播放。objectFit:视频画面适配方式,Contain 代表等比例完整展示视频,不会拉伸、裁剪画面。
4.4 自定义控制按钮逻辑
两个按钮通过onClick点击事件调用控制器内置方法:
this.controller.start():开始 / 继续播放视频;this.controller.pause():暂停当前播放视频。
4.5 页面布局
外层 Column 占满全屏,使用justifyContent(FlexAlign.Center)垂直居中,alignItems(HorizontalAlign.Center)水平居中,整体页面内容居中展示。
五、VideoController 拓展常用方法
除了案例中的 start、pause,控制器还有更多实用方法,适配大部分视频开发场景:
controller.stop():停止播放,回到视频开头;controller.setCurrentTime(10):跳转到指定播放秒数;getCurrentTime():实时获取当前播放时间;getDuration():获取视频总时长。
六、常见问题与报错解决
- 黑屏不播放视频
- 检查 rawfile 文件夹是否存在、视频文件名匹配;
- 视频编码不兼容,更换 mp4 标准格式视频;
- 封面图不显示 media 文件夹图片名称与 $r 内名称完全一致,区分大小写;
- 网络视频加载失败 未添加 INTERNET 网络权限,或者模拟器无网络;
- 点击按钮无反应 Video 组件未绑定 controller 字段,控制器实例丢失。
七、开发总结
- 本地短视频优先使用
$rawfile方式加载,无需网络权限,加载速度更快; controls(false)是自定义播放器的核心,隐藏系统控件后可自由设计播放按钮、进度条;- 所有播放操作均通过
VideoController控制器完成,组件与控制逻辑分离,代码解耦; - 开发前规范存放图片、视频资源,文件名避免中文和特殊字符,减少资源加载异常问题
更多推荐


所有评论(0)