惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
Microsoft Security Blog
Microsoft Security Blog
B
Blog
Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
爱范儿
爱范儿
博客园_首页
博客园 - 聂微东
量子位
V
Visual Studio Blog
aimingoo的专栏
aimingoo的专栏
T
The Blog of Author Tim Ferriss
J
Java Code Geeks
小众软件
小众软件
大猫的无限游戏
大猫的无限游戏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
N
Netflix TechBlog - Medium
F
Fortinet All Blogs
The Cloudflare Blog
T
Tailwind CSS Blog
G
Google Developers Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
月光博客
月光博客
腾讯CDC

人人都是产品经理

为什么你的产品找不到差异化?90%的失败都卡在第一步上(下) – 人人都是产品经理, 3年从30万到1300万用户、获2200万美元融资,这个AI教育产品用“抽卡”破解了获客难题 – 人人都是产品经理, 园区招商系统怎么做才能真正帮到去化?我加了这一个功能,推广链接转发400次阅读过万 – 人人都是产品经理, AI大事件:OpenAI发完网络安全模型又搞药物研发,小鹏汽车要抓”DeepSeek时刻” – 人人都是产品经理, 电商不是卖货,是一场更残酷的产品经理实战 – 人人都是产品经理, 没想到,活动营销又回来了! – 人人都是产品经理, 为何All-in海外KOC:一场关于AI时代窗口期的豪赌 – 人人都是产品经理, 重新理解企业的内部协作 – 人人都是产品经理, 苹果的 AI 战略到底是什么? – 人人都是产品经理, 医疗智能体·第2讲——合规护城河:等保、PIPL与HIPAA的架构实战 – 人人都是产品经理, 向量知识库五步法:从“答非所问”到“精准回复” – 人人都是产品经理, 鸿蒙PC三方库构建总指挥HPKBUILD(sha)库为例 – 人人都是产品经理, 何时该用LLM?AI产品经理的LLM设计指南 – 人人都是产品经理, 医疗信息领域的需求方、决策方、准入方以及关注点(二) – 人人都是产品经理, 即梦涨价:一场被误读的「傲慢」 – 人人都是产品经理, 面试AI PM必答题:Hermes和OpenClaw的区别,如何讲清楚业务价值 – 人人都是产品经理, AI的下一张船票:世界模型——AI产品经理必须理解的技术拐点 – 人人都是产品经理, 小红书做GEO,怎么让AI信你?记住这 3 个重要信息 – 人人都是产品经理, 5 家印度 AI 初创公司,看看印度 AI 再做什么 – 人人都是产品经理, AI项目跨团队协作:产品技术业务如何不打架 – 人人都是产品经理, Agentic Workflow(智能体工作流):让AI从”答案生成器”变成”数字员工” – 人人都是产品经理, lycium_plusplus 项目全景解读:OpenHarmony 三方库构建的“大管家” – 人人都是产品经理, 从爆单救火到前置履约:两套预采策略,把生鲜大促履约效率拉满 – 人人都是产品经理, 什么时候该补货?我用一轮数据做了一个决定 – 人人都是产品经理, 从“机械兜底”到“动态分流”:AI客服重复进线治理的4大底层逻辑 – 人人都是产品经理, 抖音拼效率,红书拼洞察 – 人人都是产品经理, 全民狂欢与退潮——为什么龙虾这波热潮冷却得如此之快? – 人人都是产品经理, Stripe押注!MPP重塑全球支付 – 人人都是产品经理, 小红书GEO:AI引用你的内容,不是因为你对,而是因为你看起来可信 – 人人都是产品经理, 前百度副总裁押注办公Agent,日韩付费爆发,Manus迎来强劲对手 – 人人都是产品经理,
【HarmonyOS-媒体技术-AVPlayer】手把手教你用 AVPlayer 实现...
华为开发者联盟 · 2025-11-03 · via 人人都是产品经理

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

在视频播放场景中,用户常需要外挂字幕(如 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 示例)

1
00:00:01,000 –> 00:00:04,000
这是第一行字幕。

2
00: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 成为你开发路上的得力助手,开启你的音视频播放新纪元! 🚀