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

核心能力
AI教育场景围绕“快速理解、精准定位和高效回看”提供以下能力:
能力 | 描述 |
智能章节 | 自动识别视频内容结构并生成章节,在进度条和章节列表中同步展示;点击章节即可跳转到对应片段 |
内容摘要 | 提供视频整体摘要和章节摘要,帮助用户快速了解主要内容与章节要点 |
知识点提炼 | 自动提取各章节的关键知识点,并以结构化方式展示,便于学习和复习 |
章节缩略图 | 为章节展示代表性画面,帮助用户快速识别和定位目标内容 |
横竖屏适配 | 根据屏幕方向自动调整交互布局:竖屏显示底部面板,横屏显示右侧面板 |
前提条件
开始集成前,请完成以下准备:
准备项 | 要求 |
阿里云服务 | |
媒体资源 | 已准备测试视频,并完成 AI 内容分析 |
App Server | 已完成部署,可正常提供播放凭证和 AI 分析数据;可参考开源项目VodAppServer |
完成以上准备后,在AiContentConstants类中配置App Server地址和测试视频ID,即可开始体验AI教育场景。
快速接入
通用集成
AI教育场景基于PlayerKit场景层构建。如尚未完成通用集成步骤,请先参阅:
通用集成完成后,仅需以下额外配置即可体验AI教育场景:
配置App Server和测试视频
打开AiContentConstants.m,修改以下配置:
可直接使用官方提供的App Server地址进行体验,但建议优先部署自有服务后使用自己的地址。部署方式请参考VodAppServer。
NSString * const AiContentAppServerBaseURL = @"http://your-server-host:port";
NSString * const AiContentDefaultMediaId = @"your-media-id";验证接入
AI教育场景对应信息:
项目 | 值 |
ViewController |
|
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 {AppServerBaseURL}/appServer/GetVideoPlayAuth?videoId={vid}请求参数:
参数 | 类型 | 必填 | 说明 |
| String | 是 | 视频 ID |
响应示例:
{
"code": 0,
"success": true,
"data": {
"videoId": "your-video-id",
"playAuth": "eyJ..."
}
}响应字段说明:
字段 | 类型 | 说明 |
| Integer | 业务返回码,0 表示成功 |
| Boolean | 请求是否成功 |
| String | 视频 ID |
| String | Base64 编码的播放授权凭证(有时效性) |
获取AI分析内容
GET {AppServerBaseURL}/GetMediaAiAnalysisByResultType?MediaId={vid}请求参数:
参数 | 类型 | 必填 | 说明 |
| String | 是 | 媒资 ID |
| String | 否 | 结果类型: |
响应示例:
{
"AiAnalysisResult": [
{
"ResultType": "Chapter",
"Title": "视频标题",
"Extra": "{\"Summary\":\"降级摘要文本\"}",
"ChapterContentItems": [
{
"ChapterId": "1",
"StartTime": 0,
"EndTime": 120000,
"ChapterTitle": "课程概述",
"Summary": "本章介绍了课程整体内容...",
"ThumbnailUrl": "https://example.com/thumb1.jpg",
"KnowledgePoints": [
{
"PointId": "1",
"Point": "核心概念",
"PointDescription": "本章核心概念的详细描述..."
}
]
}
]
},
{
"ResultType": "Summary",
"Title": "视频标题",
"SummaryContent": {
"ParagraphSummary": "视频整体内容摘要...",
"MarkdownContent": "# 章节标题\n详细内容...",
"MindMapSummary": [
{
"Title": "主题分支",
"Topic": ["子主题 A", "子主题 B"]
}
]
},
"Tags": ["教育", "技术"]
}
]
}如需对接自有服务端,只需返回相同JSON结构即可。客户端不关心服务端的实现方式。
章节字段说明:
字段 | 类型 | 说明 |
| String | 章节唯一标识 |
| Integer | 章节起始时间(毫秒) |
| Integer | 章节结束时间(毫秒) |
| String | 章节标题 |
| String | 章节摘要 |
| String | 章节缩略图 URL |
| Array | 知识点列表 |
| String | 知识点 ID |
| String | 知识点名称 |
| String | 知识点描述 |
摘要字段说明:
字段 | 类型 | 说明 |
| String | 视频整体段落摘要 |
| String | Markdown 格式的完整分析内容 |
| Array | 思维导图分支列表,每项含 Title(String) 和 Topic(Array<String>) |
| Array<String> | 视频标签列表 |
数据模型与映射
数据映射
服务端JSON经AiAnalysisResponse直映射为DTO,再由AiContentAssembler组装为业务模型。以下为服务端字段到客户端DTO及业务模型的映射关系:
服务端 JSON 字段 | 客户端 DTO | 业务模型 | 说明 |
|
|
| 章节 ID |
|
|
| 毫秒 |
|
|
| 毫秒 |
|
|
| 章节标题 |
|
|
| 缩略图 |
|
| — | 章节摘要(DTO 保留,未映射业务模型) |
|
| — | 知识点列表(DTO 保留,未映射业务模型) |
|
|
| 视频全局摘要 |
|
|
| Markdown 完整分析内容 |
|
|
| 保留完整 MindMapItem 结构(含 title 和 topics) |
聚合模型
最终聚合为AiAnalysisResponse,包含:
字段 | 类型 | 说明 |
|
| 媒资 ID |
|
| AI 分析结果列表 |
|
| 章节类型结果条目(便利查找,遍历匹配 Chapter 类型) |
|
| 摘要类型结果条目(便利查找,遍历匹配 Summary 类型) |
DTO模型补充说明:
SummaryContent包含三个属性:paragraphSummary(NSString,段落摘要)、markdownContent(NSString,Markdown格式完整分析)、mindMapSummary(NSArray<MindMapItem *>,思维导图分支列表)。MindMapItem模型:title(NSString,思维导图节点标题)、topics(NSArray<NSString *>,子主题列表)。
面板展示形态由AiAnalysisResponse中实际存在的数据决定,每个TAB与结果条目一一对应:
条件 | 渲染模式 |
仅 | 仅显示章节 TAB,渲染 |
仅 | 仅显示 AI 解析 TAB,渲染 |
两者均非空 | 显示双 TAB:章节 TAB 渲染 |
客户端数据架构
重构后的客户端数据架构采用分层设计,将数据组装与UI渲染职责分离。
数据流图:
Server JSON → AiAnalysisResponse (DTO) → AiContentAssembler → AiContentViewModel → ChapterContentView (UI)新增客户端模型说明:
类名 | 职责 | 关键属性 |
| 数据组装:将 DTO 转换为 ViewModel |
|
| UI 视图模型,面板唯一数据入口 |
|
| TextAnalysis 章节展示模型 |
|
| GraphicAnalysis 摘要展示模型 |
|
设计原则:
AiAnalysisResponse保持纯DTO定位,直映射服务端JSON。AiContentAssembler承担所有数据组装职责(格式化、提取、转换)。ChapterContentView通过initWithViewModel:初始化,纯渲染不做任何数据处理。知识点渲染格式由Assembler预组装:- **{Point}**:{Description}(中文冒号)。
TAB组合规则(由ViewModel的hasChapterData / hasSummaryData决定):
条件 | 渲染模式 |
仅 | 双 TAB:ChaptersOnly(章节)+ TextAnalysis(AI解析) |
仅 | 无 TAB:GraphicAnalysis(AI解析) |
两者都有 | 双 TAB:ChaptersOnly(章节)+ GraphicAnalysis(AI解析) |
自定义与扩展
替换数据源
当前SceneAiEducationViewController内部通过AiContentLoader加载数据。如需使用自己的数据源,可参考ViewController的实现流程,替换数据加载逻辑:
// 自定义加载示例
AiContentLoader *loader = [[AiContentLoader alloc] initWithBaseURL:@"http://your-server"];
[loader loadPlayAuthWithVideoId:@"your-vid"
completion:^(NSString * _Nullable playAuth) {
// 获取到 playAuth 后继续加载 AI 内容...
}];
[loader loadAiAnalysisWithMediaId:@"your-vid"
completion:^(AiAnalysisResponse * _Nullable response) {
// 获取到 AiAnalysisResponse 后配置播放器...
}];自定义 UI
替换章节内容面板样式:继承
ChapterContentView自定义布局。扩展Slot:通过
SlotManager注册自定义插槽。详情请参见插槽系统。
集成到已有 ViewController
如果不想使用内置的SceneAiEducationViewController,可参考其实现:
初始化
AliPlayerView和AliPlayerController。配置
AliPlayerModel的sceneType为SceneTypeAIVod。加载播放凭证和AI数据。
设置
AliPlayerModel的chapters。注册
ChapterButtonSlot自定义插槽。启动播放。
// 1. 创建播放器组件
AliPlayerView *playerView = [[AliPlayerView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:playerView];
AliPlayerController *playerController = [[AliPlayerController alloc] init];
// 2. 配置播放源(VidAuth 方式)
VideoSource *source = [VideoSource vidAuthSourceWithVid:mediaId playAuth:playAuth];
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
model.sceneType = SceneTypeAIVod;
model.chapters = response.chapters;
// 3. 注册章节按钮自定义插槽
CustomSlotType *slotType = [CustomSlotType typeWithKey:@"chapter_button" order:85];
[playerView.slotManager registerCustomSlotType:slotType
provider:^UIView<SlotProtocol> *(UIView *parentView) {
return [[ChapterButtonSlot alloc] initWithFrame:parentView.bounds];
}];
// 4. 配置并挂载(挂载后自动开始播放)
[playerController configure:model];
[playerView attach:playerController];集成FAQ
问题 | 解决方案 |
播放凭证获取失败 | 检查 App Server 地址是否正确、网络是否连通、VideoId 是否有效 |
AI 内容为空 | 确认视频已开通 AI 分析;客户端会降级为普通播放模式(无 AI 面板) |
如何使用自己的视频 ID | 修改 |
横竖屏切换面板异常 | 面板通过 |
如何关闭某个 AI 能力 | 服务端接口中不返回对应 ResultType 即可 |
SDK 版本兼容性 | 需要阿里云播放器 SDK ≥ 7.16.0 |
Markdown 渲染异常 | 确认 Podfile 中已正确引入 Down 依赖(~> 0.11.0) |
章节按钮不显示 | 确认 |
网络超时 |
|