動態

詳情 返回 返回

【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 示例)

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 成為你開發路上的得力助手,開啓你的音視頻播放新紀元! 🚀

Add a new 評論

Some HTML is okay.