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中,可通过AVPlayeraddSubtitleSource方法设置外挂字幕。示例代码:

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(); // 隐藏字幕

关键点:

  1. 确保字幕文件路径正确且可访问
  2. 支持的字幕格式包括SRT、VTT、ASS等
  3. 可通过setSubtitleDelay调整字幕同步时间
  4. 使用getTrackDescription可获取可用字幕轨道信息

注意:需在config.json中申请ohos.permission.READ_MEDIA权限以读取本地字幕文件。

回到顶部