HarmonyOS 鸿蒙Next中AVPlayer里如何使用AI字幕组件?

HarmonyOS 鸿蒙Next中AVPlayer里如何使用AI字幕组件? 是否有 AVPlayer播放视频(ArkTS) 里使用 AICaptionComponent(AI字幕组件) 的 Demo?

cke_188.png


更多关于HarmonyOS 鸿蒙Next中AVPlayer里如何使用AI字幕组件?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

10 回复

你这个想法很好。

文档介绍它是使用AI能力将语音实时转化成文本并翻译,提供原文、译文的展示。应该是做实时翻译吧,但配置这些Option参数在下一个版本AICaptionOptions6.1.1(24)才支持。目前对你的想法给你建议下方法。

  1. 提前把视频语音提取出音频,AVPlayer + mp4parser + AICaptionComponent。

  2. 边播边录边显示,目前不可行,没有找到直接内录为PCM的API。

第1种基本步骤

① 视频提取音频PCM,因为目前组件里AudioInfo type仅支持PCM。用@ohos/mp4parser这个库。

//oh-package.json5 文件加上这个
"dependencies": {
    "[@ohos](/user/ohos)/mp4parser": "^2.0.8"
},

② 加载PCM给AICaptionComponent显示。

我这有个小Demo,操作点击从上到下3个按钮看效果。效果如下:

cke_68452.png

《代码包》,欢迎给个采纳😊。

更多关于HarmonyOS 鸿蒙Next中AVPlayer里如何使用AI字幕组件?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


有官方资料,但我没查到“AVPlayer + AICaptionComponent”打包成一个完整页面的官方 Demo
目前官方能直接找到的是两块内容:

关键结论

1. AICaptionComponent 可以用于音视频场景

官方 API 明确写了,AI 字幕组件适用于“音乐类、视频类等音视频内容 App”。AICaptionComponent API

2. 从 API 18 开始,isShown: true 支持“自动识别应用音频生成字幕”

这点非常关键。官方在 AICaptionComponent 参数说明里写明:

  • isShown = true:显示字幕
  • 从 5.1.0(18) 开始支持自动识别应用音频生成字幕
    见:AICaptionComponent API

这意味着如果你是 AVPlayer 播放视频,最值得先试的方案不是自己喂 PCM,而是:

  • 页面上叠一个 AICaptionComponent
  • 打开显示状态
  • 让它自动识别当前应用播放出来的音频

3. writeAudio() 是“手动喂音频流”方案,而且要求很严

官方要求手动写入的音频必须是:

而且官方还明确写了:

  • 调用 writeAudio() 后,会停止自动获取应用音频生成字幕,以后以你写入的音频流为准。AICaptionComponent API

4. AVPlayer 本身没有给你“PCM 回调接口”

我查了 AVPlayer API,它提供的是:

  • 播放控制
  • 状态事件
  • 进度事件
  • 视频尺寸
  • 外挂字幕等

没有直接给你一条“取当前播放音频 PCM 数据”的 ArkTS 回调接口AVPlayer API

所以如果你想走 writeAudio() 方案,通常不能直接从 AVPlayer 无缝拿 PCM。

所以怎么接最合理

方案 A:优先用“自动识别应用音频”

这是最适合 AVPlayer 的接法。

思路是:

  1. 正常用 AVPlayer 播视频
  2. 页面上叠加 AICaptionComponent
  3. isShown = true
  4. 不调用 writeAudio()

这样让 AI 字幕组件自动识别当前应用播放出来的音频。

最小接法示意

import { media } from '@kit.MediaKit';
import { AICaptionComponent, AICaptionController, AICaptionOptions, AICaptionFontSize } from '@kit.SpeechKit';
import { BusinessError } from '@kit.BasicServicesKit';

@Entry
@Component
struct Index {
  private avPlayer?: media.AVPlayer;
  private captionController: AICaptionController = new AICaptionController();
  private captionOptions?: AICaptionOptions;

  @State isCaptionShown: boolean = true;
  @State surfaceId: string = '';

  async aboutToAppear() {
    this.captionOptions = {
      initialOpacity: 1,
      sourceLanguage: 'zh',
      targetLanguage: 'zh',
      fontSize: AICaptionFontSize.NORMAL,
      onPrepared: () => {
        console.info('caption prepared');
      },
      onError: (err: BusinessError) => {
        console.error(`caption error: ${err.code} ${err.message}`);
      }
    };

    this.avPlayer = await media.createAVPlayer();
    this.avPlayer.on('error', (err: BusinessError) => {
      console.error(`player error: ${err.code} ${err.message}`);
    });
  }

  async startPlay(url: string) {
    if (!this.avPlayer || !this.surfaceId) {
      return;
    }
    this.avPlayer.url = url;
    this.avPlayer.surfaceId = this.surfaceId;
    await this.avPlayer.prepare();
    await this.avPlayer.play();
  }

  build() {
    Stack() {
      XComponent({
        id: 'videoSurface',
        type: XComponentType.SURFACE,
        controller: new XComponentController()
      })
      .onLoad(() => {
        // 这里获取 surfaceId
        // this.surfaceId = ...
      })
      .width('100%')
      .height('100%')

      AICaptionComponent({
        isShown: this.isCaptionShown,
        controller: this.captionController,
        options: this.captionOptions
      })
      .width('100%')
      .height(120)
      .align(Alignment.Bottom)
    }
    .width('100%')
    .height('100%')
  }
}

这不是官方现成 Demo,但它是基于官方两份文档最合理的组合方式AI字幕控件 AVPlayer 视频播放

方案 B:手动 writeAudio() 喂 PCM

这个只适合你满足下面条件时:

  • 你的音频源不是直接来自 AVPlayer
  • 或你自己有解码链路
  • 能稳定拿到符合 AI 字幕要求的 PCM 数据

因为官方 AICaptionController.getAudioInfo() / writeAudio() 就是为这种模式准备的。AICaptionComponent API

但如果你现在只是普通 AVPlayer 播 MP4,这条路通常不如方案 A 直接。

你还要注意两点

1. 不是所有字幕都该用 AI 字幕

如果视频本身已经有外挂字幕/内封字幕,AVPlayer 其实已经支持外挂字幕能力:

所以:

  • 已有字幕文件:优先 AVPlayer 字幕
  • 没有字幕文件,想实时识别:用 AICaptionComponent

2. AI 字幕是识别“音频内容”,不是读视频轨本身

所以它对音频质量、语言、设备能力都会有影响。官方给的 AICaptionOptions 也支持源语言、目标语言和字体设置。AICaptionComponent API

最后直接回答你

AVPlayer 里如何使用 AICaptionComponent

最推荐做法是:

  • AVPlayer 负责播放
  • AICaptionComponent 叠在视频层上
  • isShown = true
  • 先不要调用 writeAudio()
  • 先验证“自动识别应用音频”是否满足需求

有没有官方 Demo?

  • 没有查到官方现成的 AVPlayer + AICaptionComponent 一体 Demo
  • 官方只有:

可以按两条路选:API 18 以后如果只是给本应用 AVPlayer 正在播放的视频做实时字幕,优先把 AICaptionComponent 叠在视频 Stack 上,isShown=true 后可自动识别应用音频,不一定要从 AVPlayer 拿 PCM。只有你自己掌握音频流时才用 controller.writeAudio(),调用后会以写入流为准;格式按 getAudioInfo(),目前是 pcm、16k、单声道、16bit,单次 640/1280 字节。

API 18 以后可以先按“自动识别应用音频”的方式接,不一定要从 AVPlayer 里取 PCM。AICaptionComponent 的 isShown 为 true 时支持自动识别应用音频生成字幕,AVPlayer 正常播放,字幕组件放在视频画面的 Stack 顶层即可。只有你自己已经拿到解码后的 PCM 流时,才考虑 controller.writeAudio();调用 writeAudio 后会改为识别写入的音频流,格式要按 getAudioInfo() 要求来,一般是 pcm、16k、单声道、16bit,每次 640/1280 字节。

由于AVPlayer不直接提供音频数据输出接口,目前没有官方的直接集成方案。你可以考虑以下两种替代思路:

音频捕获路由:尝试通过系统级的音频路由或虚拟音频设备,将AVPlayer的输出音频重定向到AI字幕组件的音频输入。但这需要系统权限或特定硬件支持,在普通应用层难以实现。

分离音频源:如果视频文件可分离,可以提前提取音频轨道,并通过独立的音频播放器(如AudioPlayer)播放,同时将其数据流传递给AI字幕组件。这种方式涉及文件预处理,不适合流媒体或实时播放场景。

import { media } from '@kit.MediaKit';
// 创建avPlayer实例对象。
this.avPlayer = await media.createAVPlayer();

可以看看图片,api18开始能识别应用音频,

谢谢,我也学习了,之前没注意,现在看到了这个位置的文档了

在鸿蒙Next中,AVPlayer使用AI字幕组件需通过@ohos.multimedia.media接口。创建AVPlayer实例后,调用setSubtitle(subtitle: AVSubtitle)方法,其中AVSubtitletype字段设为SUBTITLE_TYPE_AI,并配置languagesource。AI字幕会自动识别语音并生成字幕,显示属性可通过setSubtitleConfig调整。无需额外加载字幕文件。

官方目前暂未发布将 AVPlayer 与 AICaptionComponent 直接集成的完整 Demo。若需自行实现,基本思路如下:

  1. 使用 AVPlayer 播放视频文件。
  2. 创建 AICaptionComponent 并绑定音频源(如通过 AudioCapturer 或 MediaSource),在其 onResult 回调中获取实时字幕数据。
  3. 通过 AVPlayer 的 currentTime 同步字幕时间轴,将字幕文本渲染到自定义的 Text 组件上。

AICaptionComponent 本身不带 UI,只负责输出识别结果。可参考文档:

后续若有官方示例代码放出,可留意相应更新。

回到顶部