OpenHarmony开发者论坛

标题: 拆·应用丨第2期:基于开源鸿蒙的AVPlayer视频播控开发样例 [打印本页]

作者: 开源鸿蒙知行录    时间: 2026-1-21 17:28
标题: 拆·应用丨第2期:基于开源鸿蒙的AVPlayer视频播控开发样例
[md]> 【拆·应用】是为开源鸿蒙应用开发者打造的技术分享平台,是汇聚开发者的技术洞见与实践经验、提供开发心得与创新成果的展示窗口。诚邀您踊跃发声,期待您的真知灼见与技术火花!

# 样例简介

在开源鸿蒙生态建设中,多媒体能力是构建丰富用户体验的核心要素。本开发样例基于 `AVPlayer`实现,`AvPlayer`支持流媒体和本地资源解析、媒体资源解封装、视频解码和渲染功能,适用于对媒体资源进行端到端播放的场景,可直接播放mp4、mkv等格式的视频文件,为开发者提供标准化视频功能实现路径,助力构建高性能、可定制的多媒体应用。

# 使用说明

**操作面板唤起**:首页点击播放按钮,视频开始播放;再次点击画面进入全屏模式点击视频界面,唤起视频操作面板,再次点击操作面板消失,如果不做任何操作,操作界面会5s自动消失。

![1.png](https://forums-obs.openharmony.c ... xz7l8hf6j71wej7.png "1.png")

**视频播控**:点击暂停/播放按钮,控制视频暂停播放。

![2.png](https://forums-obs.openharmony.c ... 4hc49689stho712.png "2.png")

**滑动进度条**:视频跳转到指定位置播放,在中间区域显示时间进度。

![3.png](https://forums-obs.openharmony.c ... ii1jzujiy5nqon4.png "3.png")

**倍速切换**:可以选择1.0、1.25、1.75、2.0进行倍速调节。

![4.png](https://forums-obs.openharmony.c ... gkqleaq5i2cfl9l.png "4.png")

**视频切换**:连接网络能在本地视频和网络视频进行切换。

> **注意**:
> `network`是网络视频,检测到没有连接网络会退出应用。

![5.png](https://forums-obs.openharmony.c ... 0una0ntuz9pynt0.png "5.png")

**音轨切换**:点击 `AudioTrack`音轨列表选择框,可以选择音轨进行切换。

![6.png](https://forums-obs.openharmony.c ... v3ewtaeacecbezx.png "6.png")

**缩略图获取**:点击进入获取缩略图界面,可以获取视频的缩略图。
![7.png](https://forums-obs.openharmony.c ... rre5q7wbpw7kvbe.png "7.png")

**外挂字幕**:点击 `Subtitle`开关列表选择框,可以切换外挂字幕是否显示。
![8.png](https://forums-obs.openharmony.c ... yoyctak4zztg03z.png "8.png")

# 样例代码拆解

下面是各个功能模块代码逻辑详细分解。可在此处下载[样例源码](https://gitcode.com/openharmony/ ... ure/Media/VideoPlay "样例源码下载链接")。

## 播控模块:包括视频播放、暂停、定点播放、倍速播放等。

1. 视频播放

- 视频播放窗口在 `CoverXComponent`自定义组件中实现。![9.png](https://forums-obs.openharmony.c ... 75i7ded777i6zwq.png "9.png")
- `CoverXComponent`中创建 `XComponent`组件,并在 `onLoad`中初始化视频。
  ![10.png](https://forums-obs.openharmony.c ... rta1066lec6c810.png "10.png")
- 初始化视频中创建视频播放器,并监听播放状态变化。
  ![11.png](https://forums-obs.openharmony.c ... vvmpzjlvvmttwuk.png "11.png")
- 在监听播放状态中,等到达 `prepared`状态时,调用 `avPlayer.play()`播放视频
  ![12.png](https://forums-obs.openharmony.c ... j9ceww2jfc426c9.png "12.png")

2. 视频暂停

- 暂停按钮绘制在 `VideoOperate`组件中。
  ![13.png](https://forums-obs.openharmony.c ... quwvf0u0evf2083.png "13.png")
- 使用 `Image`组件绘制播放、暂停按钮图标,点击调用视频暂停、播放接口。
  ![14.png](https://forums-obs.openharmony.c ... qo4ls426x30yup2.png "14.png")

3. 视频定点播放

- 使用 `Slider`组件绘制视频进度条,并设置拖动或点击时触发事件回调。
  ![15.png](https://forums-obs.openharmony.c ... 455u2g39gwggn8g.png "15.png")
- 在回调事件中,调用 `avPlayer.seek`接口进行视频定点播放。
  ![16.png](https://forums-obs.openharmony.c ... cmmocjjjmzuccmd.png "16.png")

4. 视频倍速设置

- 使用 `Button`组件作为倍速选择按钮,点击后打开倍速选择弹框。
  ![17.png](https://forums-obs.openharmony.c ... 99m8noum88d80yn.png "17.png")
- 通过 `CustomDialogController`自定义弹框实现倍速选择。
  ![18.png](https://forums-obs.openharmony.c ... wbvnycw2j3n7wic.png "18.png")
- `SpeedDialog`组件中通过 `List`实现1.0X、1.25X、1.75X、2.0X倍速选择。
  ![19.png](https://forums-obs.openharmony.c ... 55hs4sw4n7s7shb.png "19.png")
- `List`点击事件中,设置视频播放具体倍速。
  ![20.png](https://forums-obs.openharmony.c ... r098g89om8ngmq9.png "20.png")
- 调用 `avPlayer.setSpeed()`设备倍速。
- ![21.png](https://forums-obs.openharmony.c ... xn7oo0bjw7n7o50.png "21.png")
- ![22.png](https://forums-obs.openharmony.c ... exb1gibieb9lila.png "22.png")

## 视频切换:设备联网后,本地视频和网络视频都可以播放。

- 首先是 `Row`容器组件,组件中包含列表图标,播放的视频名称,和列表下拉图标。并在点击事件中设置 `isShow为true或false`,控制视频列表 `VideoPanel`是否展示。
  ![23.png](https://forums-obs.openharmony.c ... mmzv8v2cl2222pp.png "23.png")
- 通过 `VideoPanel`绘制视频列表,点击切换视频。
  ![24.png](https://forums-obs.openharmony.c ... 859spj8jj8jiipj.png "24.png")
- `VideoPanel`中通过 `List`组件绘制视频列表,包括视频名称、是否当前播放,点击后调用 `VideoChoose`切换视频播放。
  ![25.png](https://forums-obs.openharmony.c ... udw4bbllwbywu34.png "25.png")
- 如下图所示,`VideoChoose`中调用 `videoReset`,即 `avPlayer.reset`重置视频。
  ![26.png](https://forums-obs.openharmony.c ... w29fh860gc9ee0g.png "26.png")

  ![27.png](https://forums-obs.openharmony.c ... w34w9ptrwyf4dzb.png "27.png")

## 音轨切换:视频音轨切换,即视频有多种语言配音可进行音轨切换。

- 通过 `Select`组件绘制,并通过 `onSelect`调用 `setAudioTrack`接口设置音轨。
  ![28.png](https://forums-obs.openharmony.c ... c77njcqzh74q45h.png "28.png")
- `setAudioTrack`中,通过 `deselectTrack`和 `selectTrack`进行音轨切换。
  ![29.png](https://forums-obs.openharmony.c ... yzinntvdwzk8xsk.png "29.png")

## 字幕展示:设备联网后,点击字幕开,在视频下方展示外挂字幕。

- 通过 `Select`组件绘制,并在 `onSelect`调用 `setSubtitleState`打开、关闭字幕。
  ![30.png](https://forums-obs.openharmony.c ... 8o55k5dsu54mii5.png "30.png")
- `setSubtitleState`中设置当前的字幕状态。
  ![31.png](https://forums-obs.openharmony.c ... d2993cy1bwyczwb.png "31.png")
- 通过 `Text`组件显示字幕。
  ![32.png](https://forums-obs.openharmony.c ... xo5275p7xxz6fmr.png "32.png")

  ![33.png](https://forums-obs.openharmony.c ... 810qcx69zcz163l.png "33.png")
- `this.text`是监听 `subtitleUpdate`获取的字幕内容。
  ![34.png](https://forums-obs.openharmony.c ... asaanj19nzua37a.png "34.png")

## 缩略图获取:视频跳转到指定位置播放,在中间区域显示时间进度。

- 通过 `createAVMetadataExtractor`从媒体资源中提取元数据,作为缩略图。通过 `createAVImageGenerator`从视频资源中获取指定时间的缩略图。
  ![35.png](https://forums-obs.openharmony.c ... jtvshl9bzat9ptu.png "35.png")

# 结语

以上是本次样例具体功能模块的实现,通过本样例让开发者们了解到如何使用 `AVPlayer`开发视频播放功能,包括创建 `AVPlayer`、设置播放资源和窗口、设置播放倍速、播放控制(播放/暂停/跳转/停止)、重置销毁资源、字幕展示等;除此之外,开源鸿蒙也提供了丰富的基础组件和其他功能模块,依托开源特性可灵活定制底层功能,借助分布式架构实现 “一次开发,多端部署”,大幅降低跨设备协同开发成本,一系列配套的开发工具和教程可让开发者快速上手,欢迎更多的开发者加入到开源鸿蒙应用开发中,创造更多奇思妙想的应用。
[/md]




欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/) Powered by Discuz! X3.5