HarmonyOS 鸿蒙Next中avplayer设置外挂字幕
HarmonyOS 鸿蒙Next中avplayer设置外挂字幕 如题,如何实现 avplayer设置外挂字幕。
3 回复
【背景知识】
- AVPlayer:功能较完善的音视频播放ArkTS/JS API,集成了流媒体和本地资源解析,媒体资源解封装,视频解码和渲染功能,适用于对媒体资源进行端到端播放的场景,可直接播放mp4、mkv等格式的视频文件。
- addSubtitleFromFd:依据fd为视频添加外挂字幕,当前仅支持与视频资源同时设置(在avplayer设置fdSrc视频资源后设置外挂字幕)。
- on(‘subtitleUpdate’):订阅获取外挂字幕的事件,当有外挂字幕时,会通过订阅的回调方法通知用户。
【解决方案】 1.先确保应用沙箱中存在字幕文件,本示例先将字幕文件复制一份存到沙箱中。
writeSubtitle2Sandbox() {
let context: common.UIAbilityContext = this.getUIContext().getHostContext() as common.UIAbilityContext;
let resourceMgr: resourceManager.ResourceManager = context.resourceManager;
let filePath: string = context.filesDir + '/test1.srt';
let subtitleFile: fileIo.File | undefined = undefined;
try {
let openMode: number = fileIo.OpenMode.CREATE | fileIo.OpenMode.TRUNC | fileIo.OpenMode.READ_WRITE;
subtitleFile = fileIo.openSync(filePath, openMode);
// 代码中test1.srt对应的文件,应用需替换成自身的文件,否则无法成功运行
let rawFileContent: Uint8Array = resourceMgr.getRawFileContentSync('test1.srt');
fileIo.writeSync(subtitleFile.fd, rawFileContent.buffer.slice(0));
console.info(`write subtitle file to sandbox successfully`);
} catch (err) {
console.error(`write subtitle file to sandbox failed, ${JSON.stringify(err)}`);
} finally {
fileIo.closeSync(subtitleFile);
}
}
2.通过on(‘subtitleUpdate’)监听字幕回调,在回调中进行页面字幕的更新。
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}: subtitleUpdate info: text=${text} startTime=${startTime} duration=${duration}`);
this.subtitle = text;
} else {
console.info(`${this.tag}: subtitleUpdate info is null`);
}
});
3.AVPlayer通过addSubtitleFromFd接口加载沙箱中的字幕文件。
// 设定字幕
let context: common.UIAbilityContext = this.getUIContext().getHostContext() as common.UIAbilityContext;
let subFilePath: string = context.filesDir + `/test1.srt`;
try {
let subFileLen: number = fileIo.statSync(subFilePath).size;
this.subFile = fileIo.openSync(subFilePath, fileIo.OpenMode.READ_WRITE);
await this.avPlayer.addSubtitleFromFd(this.subFile.fd, 0, subFileLen);
} catch (err) {
if (this.subFile) {
fileIo.closeSync(this.subFile);
}
console.error(`failed to add subtitle from sandbox file, error is ${JSON.stringify(err)}`);
}
完整示例可参考:使用AVPlayer添加视频外挂字幕。
更多关于HarmonyOS 鸿蒙Next中avplayer设置外挂字幕的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,可通过AVPlayer的addSubtitleSource方法加载外挂字幕。字幕文件需为SRT或WebVTT格式,通过指定文件路径或URL添加。使用setSubtitleEnabled控制字幕显示状态,支持实时切换与轨道选择。字幕样式可通过SubtitleConfiguration调整字体、颜色和位置。
在HarmonyOS Next中,可通过AVPlayer的addSubtitleSource方法设置外挂字幕。示例代码:
import media from '@ohos.multimedia.media';
// 创建AVPlayer实例
let avPlayer: media.AVPlayer;
media.createAVPlayer((err, player) => {
avPlayer = player;
});
// 设置字幕源(支持SRT、VTT等格式)
let subtitlePath = 'path/to/subtitle.srt'; // 字幕文件路径
avPlayer.addSubtitleSource(subtitlePath, media.SubtitleFormat.SUBTITLE_SRT);
// 可选:控制字幕显示
avPlayer.showSubtitle(); // 显示字幕
avPlayer.hideSubtitle(); // 隐藏字幕
关键点:
- 确保字幕文件路径正确且可访问
- 支持的字幕格式包括SRT、VTT、ASS等
- 可通过
setSubtitleDelay调整字幕同步时间 - 使用
getTrackDescription可获取可用字幕轨道信息
注意:需在config.json中申请ohos.permission.READ_MEDIA权限以读取本地字幕文件。

