


























在视频播放场景中,用户常需要外挂字幕(如 SRT、VTT 等格式)来提升观看体验,尤其是在外语教学、影视解说、直播回放等场景中。
HarmonyOS 通过 ArkTS + 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; // 字幕结束显示的时间(毫秒)
}
1
00:00:01,000 –> 00:00:04,000
这是第一行字幕。
2
00:00:05,000 –> 00:00:08,000
这是第二行字幕。
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);
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`);
}
});
import { media } from ‘@kit.MediaKit’;
// 类成员定义avPlayer和context。
private avPlayer: media.AVPlayer | null = null;
// 创建avPlayer实例对象。
this.avPlayer = await media.createAVPlayer();
this.avPlayer?.off(‘subtitleUpdate’);
重要限制:
但优势在于:
借助 subtitleUpdate 事件与 timeUpdate 的联动机制实现外挂字母的自动加载:
实现 精准时间同步
支持 SRT/VTT 等格式解析
构建 可自定义、可扩展的字幕系统
👉 点击了解完整开发示例与 API 文档
HarmonyOS AVPlayer 官方文档
我们诚邀广大开发者一起参与 HarmonyOS 技术生态建设,共建更开放、更智能的未来世界!
加入开发者社区,获取最新资讯和技术支持
HarmonyOS 官方社区
如果你觉得这篇指南有用,欢迎点赞、收藏、分享给更多开发者!
让 AVPlayer 成为你开发路上的得力助手,开启你的音视频播放新纪元! 🚀
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。