AI教育场景是阿里云基于AliPlayerKit与视频点播VOD打造的一体化AI视频解决方案,适用于在线教育、课程培训和知识传播等业务。本文介绍该方案在Android端的核心能力、快速接入、架构、服务端接口与数据模型。
场景介绍
AI教育场景以播放器为统一入口,由视频点播 VOD 提供视频内容与服务支撑,并融合 AI 内容理解能力,可自动生成摘要、章节和知识点,帮助用户快速了解内容脉络、定位重点片段并随时回看,使长视频从“从头看到尾”转变为“按需浏览、快速学习”。
无论是在线课程、职业培训、企业学习,还是知识付费和学术讲座,均可借助该方案提升学习效率与观看体验,盘活存量视频内容,并降低播放器与 AI 功能的接入和建设成本。

核心能力
AI教育场景围绕“快速理解、精准定位和高效回看”提供以下能力:
能力 | 描述 |
智能章节 | 自动识别视频内容结构并生成章节,在进度条和章节列表中同步展示;点击章节即可跳转到对应片段 |
内容摘要 | 提供视频整体摘要和章节摘要,帮助用户快速了解主要内容与章节要点 |
知识点提炼 | 自动提取各章节的关键知识点,并以结构化方式展示,便于学习和复习 |
章节缩略图 | 为章节展示代表性画面,帮助用户快速识别和定位目标内容 |
横竖屏适配 | 根据屏幕方向自动调整交互布局:竖屏显示底部面板,横屏显示右侧面板 |
前提条件
开始集成前,请完成以下准备:
准备项 | 要求 |
阿里云服务 | |
媒体资源 | 已准备测试视频,并完成 AI 内容分析 |
App Server | 已完成部署,可正常提供播放凭证和 AI 分析数据;可参考开源项目VodAppServer |
完成以上准备后,在AiContentConstants类中配置App Server地址和测试视频ID,即可开始体验AI教育场景。
快速接入
通用集成
AI教育场景基于PlayerKit场景层构建。如尚未完成通用集成步骤,请先参阅:
通用集成完成后,仅需以下额外配置即可体验AI教育场景:
配置App Server和测试视频
打开AiContentConstants.java,修改以下配置:
可直接使用官方提供的App Server地址进行体验,但建议优先部署自有服务后使用自己的地址。部署方式请参考VodAppServer。
public static final String APP_SERVER_BASE_URL = "http://your-server-host:port";
public static final String DEFAULT_MEDIA_ID = "your-media-id";验证接入
AI教育场景对应信息:
项目 | 值 |
Activity |
|
Schema |
|
页面启动后,视频将自动加载。播放器显示章节入口按钮,点击后可以查看章节列表和AI分析内容,说明接入成功。
架构概览
AI教育场景由客户端、App Server、ICE / AI工作流和VOD服务共同组成。
整体链路分为两个阶段:
生产阶段:App Server触发AI分析工作流,ICE获取媒资并完成章节提取、摘要生成和知识点分析,随后将结构化结果回写至VOD。
消费阶段:客户端通过App Server获取播放凭证和AI分析结果,并由PlayerKit完成视频播放、章节跳转和AI内容展示。
全局业务流程
全局业务流程描述AI分析结果从生产、存储到客户端消费的完整链路。
其中,VOD负责媒资及AI分析结果的统一存储;ICE / AI工作流负责内容理解和结构化分析;App Server对服务端能力进行封装,并向客户端提供统一接口。
客户端交互流程
客户端交互流程描述用户进入AI教育播放页后,客户端、PlayerKit与App Server之间的调用关系。
页面初始化时,客户端并行或依次获取播放凭证和AI分析结果;数据加载完成后,用户可以通过章节内容面板查看章节、摘要和知识点,并跳转到对应的视频位置。
当AI分析接口请求失败或结果为空时,客户端仍可使用播放凭证完成普通视频播放,但不展示章节和AI分析面板。
客户端分层架构
客户端采用场景层、PlayerKit能力层和播放器SDK分层设计。
场景层负责页面编排、数据加载和AI内容展示;PlayerKit通过Slot机制提供播放器控制栏入口及面板扩展能力;底层播放器SDK负责媒资播放、进度控制和播放状态回调。
服务端接口
获取播放凭证
项目 | 值 |
方法 | GET |
路径 |
|
参数 |
|
请求示例:
GET http://your-server-host:port/appServer/GetVideoPlayAuth?videoId=201558617a9e71f1bfb9e6e7e5780102响应示例:
{
"code": 0,
"success": true,
"data": {
"videoId": "your-video-id",
"playAuth": "eyJ..."
}
}响应字段说明:
字段 | 类型 | 说明 |
|
| 业务状态码,0 表示成功 |
|
| 请求是否成功 |
|
| 视频 ID |
|
| Base64 编码的播放授权凭证 |
获取AI分析内容
项目 | 值 |
方法 | GET |
路径 |
|
必填参数 |
|
可选参数 |
|
请求示例:
GET http://your-server-host:port/GetMediaAiAnalysisByResultType?MediaId=201558617a9e71f1bfb9e6e7e5780102响应示例:
{
"AiAnalysisResult": [
{
"ResultType": "Chapter",
"Title": "视频章节",
"chapterContentItems": [
{
"ChapterId": 1,
"StartTime": 0,
"EndTime": 120000,
"ChapterTitle": "课程导论",
"Summary": "本章介绍了课程的整体框架...",
"ThumbnailUrl": "https://example.com/thumb1.jpg",
"KnowledgePoints": [
{ "PointId": 1, "Point": "核心概念", "Description": "描述内容..." }
]
}
]
},
{
"ResultType": "Summary",
"Title": "视频摘要",
"summaryContent": {
"ParagraphSummary": "本视频主要讲述了...",
"MindMapSummary": [
{ "Title": "核心概念", "Topics": [...] }
],
"MarkdownContent": "# 课程摘要\n\n..."
}
}
]
}如需对接自有服务端,只需返回相同JSON结构即可。客户端不关心服务端的实现方式。
Chapter字段说明:
字段 | 类型 | 说明 |
|
| 章节 ID |
|
| 章节开始时间(毫秒) |
|
| 章节结束时间(毫秒) |
|
| 章节标题 |
|
| 章节文字摘要 |
|
| 章节缩略图 URL |
|
| 知识点 ID |
|
| 知识点名称 |
|
| 知识点描述 |
Summary字段说明:
字段 | 类型 | 说明 |
|
| 段落摘要文本 |
|
| 思维导图摘要列表(递归结构,每项包含 |
|
| Markdown 格式内容 |
接口协议:
项目 | 说明 |
HTTP 超时 | 5 秒(connect + read) |
错误处理 | 接口异常时降级为普通播放模式(无 AI 面板) |
时间单位 |
|
数据模型与映射
数据映射
服务端 JSON 字段 | 客户端 DTO | 业务模型 | 说明 |
|
|
| 转为 String |
|
|
| 毫秒 |
|
|
| 毫秒 |
|
|
| |
|
|
| |
|
|
| 经三级降级生成 |
|
|
| 拼接为 Markdown(优先级高于 Summary) |
|
|
| 视频全局摘要 |
|
|
| 提取顶层 Title 列表 |
|
|
| Markdown 格式内容 |
展示模型
最终组装为AiContentViewModel,由AiContentAssembler.buildViewModel(AiAnalysisResponse)一次性生成,是面板唯一数据入口:
字段 / 方法 | 类型 | 说明 |
|
| 章节列表(空列表表示无章节数据) |
|
| 知识点条目列表 |
|
| 视频摘要信息(可为 null) |
|
| 判断是否包含章节数据 |
|
| 判断是否包含摘要数据 |
@AiContentType不再是聚合模型字段,而是TAB级渲染样式枚举(CHAPTERS_ONLY / TEXT_ANALYSIS / GRAPHIC_ANALYSIS),由ChapterContentDialogFragment内部mTab0Type / mTab1Type推导。
客户端数据架构
客户端采用分层设计,数据组装与UI渲染职责分离。服务端响应以纯DTO形式落地,经组装器转换为展示模型后再交给UI层消费。
数据流:
Server JSON → AiAnalysisResponse (DTO) → AiContentAssembler → AiContentViewModel → ChapterContentDialogFragment (UI)客户端新增模型说明:
类名 | 职责 |
| 纯静态无状态组装器,将 DTO 转换为展示模型;公开方法: |
| 面板展示层 ViewModel,字段: |
| 知识点信息,字段: |
| 视频摘要信息,字段: |
设计原则:
单一职责:DTO只做JSON映射,Assembler只做数据转换,UI只做渲染。
惰性构建:ViewModel在面板展示时才构建,隐藏时释放,避免内存浪费。
无状态组装:Assembler纯静态方法,无实例状态,可任意多次调用。
三级降级:KnowledgeInfo.contentMarkdown生成规则——KnowledgePoints优先 → Summary其次 → 都为空则 null。
TAB组合规则:
数据情况 | TAB 结构 | tab0 类型 | tab1 类型 |
仅章节(无摘要) | 双 TAB |
|
|
仅摘要(无章节) | 无 TAB |
| — |
两者都有 | 双 TAB |
|
|
自定义与扩展
替换数据源
内置的AiEducationActivity通过AiContentLoader加载数据。如需使用自己的数据源,可参考Activity的实现流程,替换数据加载逻辑:
// 自定义加载示例
AiContentLoader loader = new AiContentLoader();
loader.loadPlayAuth(vid, playAuth -> {
// 获取到 playAuth 后继续加载 AI 内容...
});
loader.loadAiAnalysis(vid, response -> {
// 获取到 AiAnalysisResponse(纯 DTO)后,消费侧需显式调用 AiContentAssembler 组装...
});章节数据由AiContentAssembler.buildChapters()从DTO组装后传入AliPlayerModel,且仅非空时下发;视频摘要和章节分段等AI内容无法承载在AliPlayerModel上,需由场景层调用ChapterContentPanelSlot.updateAiContent()传入。
自定义 UI
替换章节内容面板样式:继承
ChapterContentDialogFragment覆盖布局。扩展Slot:通过
CustomSlotType注册自定义插槽。详情请参见插槽系统。
集成到已有 Activity
如果不想使用内置的AiEducationActivity,可以参考其实现,在自己的Activity中:
初始化
AliPlayerController。注册
ChapterButtonSlot+ChapterContentPanelSlot(注册时保存实例引用)。加载PlayAuth和AI内容。
配置播放器并挂载,挂载后把AI内容传给面板插槽。
示例:
public class MyActivity extends AppCompatActivity {
@Nullable
private ChapterContentPanelSlot mChapterContentPanelSlot;
@Nullable
private ChapterButtonSlot mChapterButtonSlot;
private void registerSlots() {
SlotManager slotManager = playerView.getSlotManager();
slotManager.register(ChapterButtonSlot.TYPE, parent -> {
mChapterButtonSlot = new ChapterButtonSlot(parent.getContext());
return mChapterButtonSlot;
});
slotManager.register(ChapterContentPanelSlot.TYPE, parent -> {
// 保存插槽实例,attach 后传入 AI 内容
mChapterContentPanelSlot = new ChapterContentPanelSlot(parent.getContext());
return mChapterContentPanelSlot;
});
}
private void configurePlayer(@NonNull String vid, @NonNull String playAuth,
@Nullable AiAnalysisResponse response) {
// 消费侧显式调用 Assembler 构建章节列表
List<ChapterInfo> chapters = response != null ? AiContentAssembler.buildChapters(response) : null;
boolean hasChapters = chapters != null && !chapters.isEmpty();
AliPlayerModel.Builder builder = new AliPlayerModel.Builder()
.videoSource(VideoSourceFactory.createVidAuthSource(vid, playAuth))
.sceneType(SceneType.AI_VOD);
if (hasChapters) {
builder.chapters(chapters);
}
AliPlayerModel playerModel = builder.build();
playerController.configure(playerModel);
playerView.attach(playerController);
// attach 后显式把 AI DTO 传给面板插槽
if (mChapterContentPanelSlot != null) {
mChapterContentPanelSlot.updateAiContent(response);
}
// 根据 AI 内容是否存在控制章节按钮显隐
boolean chapterAvailable = AiContentAssembler.hasAnyContent(response);
if (mChapterButtonSlot != null) {
mChapterButtonSlot.updateChapterAvailable(chapterAvailable);
}
}
}集成FAQ
问题 | 解决方案 |
播放凭证获取失败 | 检查 App Server 地址是否正确、网络是否连通、VideoId 是否有效 |
AI 内容为空 | 确认视频已开通 AI 分析;客户端会降级为普通播放模式(无 AI 面板) |
如何使用自己的视频 ID | 修改 |
横竖屏切换面板异常 | 确认 Activity 声明了 `android:configChanges="orientation |
如何关闭某个 AI 能力 | 服务端接口中不返回对应 |
SDK 版本兼容性 | 需要阿里云播放器 SDK ≥ 7.16.0,低版本不支持 |