2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

【HarmonyOS- 媒体技术 -AVPlayer】手把手教你用 AVPlayer 实现外挂字幕 (ArkTS 详解)

  • 2025-11-04
    北京
  • 本文字数:2141 字

    阅读完需:约 7 分钟

【HarmonyOS-媒体技术-AVPlayer】手把手教你用 AVPlayer 实现外挂字幕(ArkTS 详解)

前言:为什么需要“外挂字幕”?

在视频播放场景中,用户常需要外挂字幕(如 SRT、VTT 等格式)来提升观看体验,尤其是在外语教学、影视解说、直播回放等场景中。


HarmonyOS 通过 ArkTS + AVPlayer 的 subtitleUpdate 事件机制,我们可以实现视频播放前预加载字幕,并动态显示字幕内容,真正实现“外挂字幕”功能!


一、核心能力:AVPlayer 支持 subtitleUpdate 事件

HarmonyOS 的 AVPlayer 提供了以下关键接口,用于实现外挂字幕:


// 注册字幕更新事件  avPlayer.on('subtitleUpdate', async (info: media.SubtitleInfo) => {    // 获取当前播放帧对应的字幕信息    if (info) {      let text = (!info.text) ? '' : info.text      let startTime = (!info.startTime) ? 0 : info.startTime      let duration = (!info.duration) ? 0 : info.duration      console.info('subtitleUpdate info: text=' + text + ' startTime=' + startTime +' duration=' + duration);    } else {      console.info('subtitleUpdate info is null');    }  });}
复制代码

 

SubtitleInfo 结构如下:


interface SubtitleInfo {  text: string;     // 字幕文本  startTime: number; // 字幕开始显示的时间(毫秒),以视频播放开始的时刻为 0 点  endTime: number;   // 字幕结束显示的时间(毫秒)}
复制代码



二、实现方案:外挂字幕

 字幕文件格式(SRT 示例)


100:00:01,000 --> 00:00:04,000这是第一行字幕。
200:00:05,000 --> 00:00:08,000这是第二行字幕。
复制代码



步骤 1:调用addSubtitleFromFd,使用视频播放的 AVPlayer 实例设置外挂字幕资源。


import { media } from '@kit.MediaKit'; import { common } from '@kit.AbilityKit'; // 类成员定义avPlayer和context。 private avPlayer: media.AVPlayer | null = null; private context: common.UIAbilityContext | undefined = undefined;  // 在业务函数中(示例工程函数名为avSetupVideoAndSubtitle): // 创建avPlayer实例对象。 this.avPlayer = await media.createAVPlayer(); this.context = this.getUIContext().getHostContext() as common.UIAbilityContext; // 设定视频源(此处省略)。
 // 设定字幕。 let fileDescriptorSub = await this.context?.resourceManager.getRawFd('xxx.srt'); this.avPlayer.addSubtitleFromFd(fileDescriptorSub.fd, fileDescriptorSub.offset, fileDescriptorSub.length);
复制代码



步骤 2:调用on('subtitleUpdate')接口,注册字幕回调函数。


import { media } from '@kit.MediaKit'; // 类成员定义用来显示的字幕字符串。 @State subtitle: string = 'subtitleUpdate info'; private avPlayer: media.AVPlayer | null = null; private tag: string = '';
 // 创建avPlayer实例对象。 this.avPlayer = await media.createAVPlayer(); // 字幕回调函数。 this.avPlayer.on('subtitleUpdate', (info: media.SubtitleInfo) => {   if (!!info) {     let text = (!info.text) ? '' : info.text;     let startTime = (!info.startTime) ? 0 : info.startTime;     let duration = (!info.duration) ? 0 : info.duration;     console.info(`${this.tag}: text=${text} startTime=${startTime} duration=${duration}`);     this.subtitle = text;   } else {     console.info(`${this.tag}: subtitleUpdate info is null`);   }
复制代码

 步骤 3:(可选)当需要不显示字幕的时候,使用视频播放的 AVPlayer 实例注销字幕回调函数。


import { media } from '@kit.MediaKit'; // 类成员定义avPlayer和context。 private avPlayer: media.AVPlayer | null = null; // 创建avPlayer实例对象。 this.avPlayer = await media.createAVPlayer(); this.avPlayer?.off('subtitleUpdate');
复制代码



三、关键说明:当前仅支持“播放前设置字幕”

 重要限制

  • 当前 HarmonyOS 的 AVPlayer 不支持动态切换字幕源(如切换不同语言字幕)

  • 仅支持 在播放前完成字幕文件加载与解析


 但优势在于

  • 字幕与视频播放时间精准同步

  • 支持自定义字幕样式、位置、动画效果

  • 适合离线视频、教学课件、本地字幕场景


四、结语

借助 subtitleUpdate 事件与 timeUpdate 的联动机制实现外挂字母的自动加载:

实现 精准时间同步 

支持 SRT/VTT 等格式解析 

构建 可自定义、可扩展的字幕系统

 五、立即行动,开启你的音视频播放开发之旅!

👉 点击了解完整开发示例与 API 文档HarmonyOS AVPlayer 官方文档


加入 HarmonyOS 社区,共创未来!

我们诚邀广大开发者一起参与 HarmonyOS 技术生态建设,共建更开放、更智能的未来世界!

 加入开发者社区,获取最新资讯和技术支持HarmonyOS 官方社区


如果你觉得这篇指南有用,欢迎点赞、收藏、分享给更多开发者! 

让 AVPlayer 成为你开发路上的得力助手,开启你的音视频播放新纪元! 🚀



2025-11-04 09:001

评论

发布
暂无评论

React源码分析8-状态更新的优先级机制

goClient1992

React

为什么字节跳动选择使用 Go 语言?

Jackpop

校招前端必会面试题及答案

loveX001

JavaScript

字节前端二面经典vue面试题(边面边更)

bb_xiaxia1998

Vue

前端高频手写面试题指南

helloworld1024fd

JavaScript

从React源码分析看useEffect

goClient1992

React

从0到1:健身房私教预约小程序开发笔记

CC同学

私教预约小程序

说说Vue响应式系统中的Watcher和Dep的关系-面试进阶

bb_xiaxia1998

Vue

能不能手写Vue响应式?前端面试进阶

bb_xiaxia1998

Vue

高效学 C++|编程实例之计算器

TiAmo

c++ 语言 & 开发 语言设计

百度前端常见react面试题

beifeng1996

React

管理者既要安定内部,也要团结外部

石云升

极客时间 2月月更 技术领导力实战笔记

一道React面试题把我整懵了

beifeng1996

React

京东前端高频react面试题集锦

beifeng1996

React

前端一面高频vue面试题(边面边更)

bb_xiaxia1998

Vue

NutUI 4.0 正式发布!

京东科技开发者

CSS GitHub UI 轻量化 企业号 2 月 PK 榜

假如面试官要你手写一个promise

helloworld1024fd

JavaScript

【AI技术分享会第8期】EMNLP 2022 小样本学习论文解读来啦!开年直播好礼相送

阿里云大数据AI技术

人工智能 自然语言处理 深度学习

构建有参与感的干系人小组指南(译)

Bruce Talk

Scrum 敏捷开发 Agile

2023面试官常考的前端面试题

loveX001

JavaScript

腾讯前端二面手写面试题

helloworld1024fd

JavaScript

一天梳理完React所有面试考察知识点

beifeng1996

React

写个JS深拷贝,面试备用

helloworld1024fd

JavaScript

React源码分析8-状态更新的优先级机制

goClient1992

React

从技术专家到总经理,在不确定中探索和成长

石云升

极客时间 2月月更 技术领导力实战笔记

响应式操作实战

老周聊架构

响应式编程 2月月更

JavaScript 中获取数组最后一个元素3种方法及性能

devpoint

JavaScript slice 数组操作

我们从 CircleCI 安全事件获得的3个经验教训

SEAL安全

安全 软件供应链 企业号 2 月 PK 榜 端点保护 恶意软件检测

JS模块化—CJS&AMD&CMD&ES6-前端面试知识点查漏补缺

loveX001

JavaScript

80%的前端开发都答不上来的js异步面试题

loveX001

JavaScript

一个炫酷的头像悬停效果

南城FE

CSS css3 前端 动画 交互设计

【HarmonyOS-媒体技术-AVPlayer】手把手教你用 AVPlayer 实现外挂字幕(ArkTS 详解)_HarmonyOS_HarmonyOS_InfoQ精选文章