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

更多关于HarmonyOS 鸿蒙Next中AVPlayer里如何使用AI字幕组件?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
你这个想法很好。
文档介绍它是使用AI能力将语音实时转化成文本并翻译,提供原文、译文的展示。应该是做实时翻译吧,但配置这些Option参数在下一个版本AICaptionOptions6.1.1(24)才支持。目前对你的想法给你建议下方法。
-
提前把视频语音提取出音频,AVPlayer + mp4parser + AICaptionComponent。
-
边播边录边显示,目前不可行,没有找到直接内录为PCM的API。
第1种基本步骤
① 视频提取音频PCM,因为目前组件里AudioInfo type仅支持PCM。用@ohos/mp4parser这个库。
//oh-package.json5 文件加上这个
"dependencies": {
"[@ohos](/user/ohos)/mp4parser": "^2.0.8"
},
② 加载PCM给AICaptionComponent显示。
我这有个小Demo,操作点击从上到下3个按钮看效果。效果如下:

《代码包》,欢迎给个采纳😊。
更多关于HarmonyOS 鸿蒙Next中AVPlayer里如何使用AI字幕组件?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
有官方资料,但我没查到“AVPlayer + AICaptionComponent”打包成一个完整页面的官方 Demo。
目前官方能直接找到的是两块内容:
AICaptionComponent的独立示例,演示如何显示字幕,以及如何通过AICaptionController.writeAudio()手动喂 PCM 数据。AI字幕控件 AICaptionComponent APIAVPlayer的独立示例,演示视频播放、事件监听和外挂字幕,不包含 AI 字幕控件接入。AVPlayer 视频播放 AVPlayer API
关键结论
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() 是“手动喂音频流”方案,而且要求很严
官方要求手动写入的音频必须是:
pcm16000采样率- 单声道
16bit- 每次
640或1280字节
见:AICaptionComponent API
而且官方还明确写了:
- 调用
writeAudio()后,会停止自动获取应用音频生成字幕,以后以你写入的音频流为准。AICaptionComponent API
4. AVPlayer 本身没有给你“PCM 回调接口”
我查了 AVPlayer API,它提供的是:
- 播放控制
- 状态事件
- 进度事件
- 视频尺寸
- 外挂字幕等
但没有直接给你一条“取当前播放音频 PCM 数据”的 ArkTS 回调接口。AVPlayer API
所以如果你想走 writeAudio() 方案,通常不能直接从 AVPlayer 无缝拿 PCM。
所以怎么接最合理
方案 A:优先用“自动识别应用音频”
这是最适合 AVPlayer 的接法。
思路是:
- 正常用
AVPlayer播视频 - 页面上叠加
AICaptionComponent isShown = true- 不调用
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 其实已经支持外挂字幕能力:
addSubtitleFromFdaddSubtitleFromUrlon('subtitleUpdate')
见:AVPlayer API 和 使用AVPlayer添加视频外挂字幕
所以:
- 已有字幕文件:优先
AVPlayer字幕 - 没有字幕文件,想实时识别:用
AICaptionComponent
2. AI 字幕是识别“音频内容”,不是读视频轨本身
所以它对音频质量、语言、设备能力都会有影响。官方给的 AICaptionOptions 也支持源语言、目标语言和字体设置。AICaptionComponent API
最后直接回答你
AVPlayer 里如何使用 AICaptionComponent?
最推荐做法是:
AVPlayer负责播放AICaptionComponent叠在视频层上isShown = true- 先不要调用
writeAudio() - 先验证“自动识别应用音频”是否满足需求
有没有官方 Demo?
- 没有查到官方现成的
AVPlayer + AICaptionComponent一体 Demo - 官方只有:
AICaptionComponent独立示例AVPlayer独立示例
你需要把两者拼起来用。AI字幕控件 AVPlayer 视频播放
可以按两条路选:API 18 以后如果只是给本应用 AVPlayer 正在播放的视频做实时字幕,优先把 AICaptionComponent 叠在视频 Stack 上,isShown=true 后可自动识别应用音频,不一定要从 AVPlayer 拿 PCM。只有你自己掌握音频流时才用 controller.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)方法,其中AVSubtitle的type字段设为SUBTITLE_TYPE_AI,并配置language和source。AI字幕会自动识别语音并生成字幕,显示属性可通过setSubtitleConfig调整。无需额外加载字幕文件。
官方目前暂未发布将 AVPlayer 与 AICaptionComponent 直接集成的完整 Demo。若需自行实现,基本思路如下:
- 使用 AVPlayer 播放视频文件。
- 创建 AICaptionComponent 并绑定音频源(如通过 AudioCapturer 或 MediaSource),在其 onResult 回调中获取实时字幕数据。
- 通过 AVPlayer 的 currentTime 同步字幕时间轴,将字幕文本渲染到自定义的 Text 组件上。
AICaptionComponent 本身不带 UI,只负责输出识别结果。可参考文档:
后续若有官方示例代码放出,可留意相应更新。



