做完你会得到什么
一个「视频摘要」App:粘贴一个视频链接,选「一句话概括」「分段时间线」「列出画面里的文字」「出 3 道理解题」,AI 看完视频把结果写出来;还能追问「第 2 段讲了什么」。

图为执行最终 .aia 里的真实积木生成的布局预览,不是真机截图;AI 的回答与照片、生成的图片都是示意。
| 难度 | 用时 | 前置 | 用到的模型 |
|---|---|---|---|
| ★★ | 30 分钟 | 第 1 课 | 通义千问视觉模型 qwen3-vl-plus |
哪些组件能看视频
| 组件 | 视频 | 说明 |
|---|---|---|
| 通义千问 Qwen | ✅ | 用 qwen3-vl-plus、qwen-vl-max 等视觉模型(本课) |
| 豆包 Doubao | ✅ | ModelName 填支持视频理解的模型或接入点 |
| Kimi | ⚠️ | 官方接口要先把视频上传成文件 ID,直接传网址通常会失败 |
| DeepSeek | ❌ | 只支持图片,没有 ChatWithVideoUrl |
视频链接的要求(最容易卡住的地方)
ChatWithVideoUrl(提示词, 视频地址) 并不上传视频,而是把地址交给模型服务,由服务器自己去下载。所以:
- 必须是公网能直接打开的地址,以
http://或https://开头; - 必须是视频文件直链:浏览器打开就直接播放、地址一般以
.mp4结尾; - 不行的:网盘分享页、视频网站的播放页(B 站、抖音的网页地址)、局域网地址(
192.168.x.x)、手机里的本地文件路径; - 视频越长越慢、越贵。先用几十秒到几分钟的短视频试。
自己的视频可以先上传到对象存储(阿里云 OSS、七牛等),拿到公开读的直链再用。本课界面里有「先预览一下」按钮:在 App 里能播放的地址,模型才有可能取得到。
准备
| 准备什么 | 说明 |
|---|---|
| 阿里云百炼 API Key | 与第 3 课同一个(标签名 qwenKey) |
| 一个 mp4 直链 | 见上一节 |
界面组件
| 组件 | 命名 | 关键属性 / 作用 |
|---|---|---|
| 文本输入框 | 文本输入框_视频 | 粘贴视频地址 |
| 视频播放器 | 视频播放器_预览 | 高 200,默认不可见 |
| 下拉框 | 下拉框_任务 | 元素字串:一句话概括,分段时间线,列出画面里的文字,出 3 道理解题 |
| 标签 | 标签_结果 | |
| 文本输入框 + 按钮 | 文本输入框_追问、按钮_追问 | |
| 按钮 | 按钮_预览、按钮_开始、按钮_复制 | |
| Qwen(拓展) | Qwen1 | 积木里改 ModelName |
| 信息分享器 | 信息分享器1 | 用它的「复制到剪贴板」 |
分步搭
第 1 步:换成视觉模型
when Screen1.Initialize() {
组件美化1.SetAsCard(垂直布局_密钥)
组件美化1.SetAsCard(垂直布局_视频)
组件美化1.SetAsCard(垂直布局_任务)
组件美化1.SetAsCard(垂直布局_结果)
// 默认的 qwen-plus 只懂文字,看视频要换成视觉模型
Qwen1.ModelName = "qwen3-vl-plus"
密码输入框_密钥.Text = 微数据库1.GetValue("qwenKey", "")
使用密钥(密码输入框_密钥.Text)
}
第 2 步:先在 App 里预览
function 是网址(地址) {
return startsat(地址, "http://") == 1 or startsat(地址, "https://") == 1
}
when 按钮_预览.Click() {
var 地址 = trim(文本输入框_视频.Text)
if not 是网址(地址) {
底部提示条1.Show("视频地址要以 http:// 或 https:// 开头")
} else {
视频播放器_预览.Source = 地址
视频播放器_预览.Visible = true
视频播放器_预览.Start()
}
}
中途验证:粘贴地址点「先预览一下」,视频能播放,说明是直链;播不了的地址,模型多半也取不到。
第 3 步:一个下拉框,四段提示词
每个任务一段提示词,都写明输出格式:时间线「每段一行,大约第几秒到第几秒:讲了什么」、理解题「每题 4 个选项,最后统一给出答案」。
global 正在回答 = false
global 当前视频 = ""
function 任务提示词(任务) {
return choose(任务 == "分段时间线", "按时间顺序把这个视频分成 3 到 6 段,每段一行,格式为「大约第几秒到第几秒:这一段讲了什么」。", choose(任务 == "列出画面里的文字", "把视频画面里出现的文字(字幕、标题、招牌、黑板上的字等)按出现顺序逐条列出来,看不清的标注「看不清」。", choose(任务 == "出 3 道理解题", "根据这个视频出 3 道选择题考考观众,每题 4 个选项,最后统一给出答案。", "用一句话(不超过 50 字)概括这个视频讲了什么,再列出 3 个关键词。")))
}
when 按钮_开始.Click() {
var 地址 = trim(文本输入框_视频.Text)
if 正在回答 {
底部提示条1.Show("还在看上一个视频,稍等一下")
} else if Qwen1.APIKey == "" {
底部提示条1.Show("先在上面填好 API Key 并点保存")
} else if not 是网址(地址) {
底部提示条1.Show("视频地址要以 http:// 或 https:// 开头")
} else {
当前视频 = 地址
Qwen1.StartNewChat()
开始回答(join("正在看视频(", 下拉框_任务.Selection, ")……"))
Qwen1.ChatWithVideoUrl(任务提示词(下拉框_任务.Selection), 地址)
}
}
每次点「开始」都开新对话:同一个视频换一种任务,也不会把上一轮的长回答再带上。
第 4 步:流式显示,看完可追问
procedure 开始回答(状态) {
正在回答 = true
标签_结果.Text = ""
标签_状态.Text = 状态
按钮_开始.Enabled = false
按钮_追问.Enabled = false
}
when Qwen1.GotStream(part, finished) {
标签_结果.Text = join(标签_结果.Text, part)
if finished {
正在回答 = false
按钮_开始.Enabled = true
按钮_追问.Enabled = true
标签_状态.Text = "看完了。可以接着追问,或换一种任务再看一遍。"
}
}
when 按钮_追问.Click() {
var 问题 = trim(文本输入框_追问.Text)
if 当前视频 == "" {
底部提示条1.Show("先让 AI 看一个视频")
} else if 正在回答 {
底部提示条1.Show("还在回答,稍等一下")
} else if 问题 == "" {
底部提示条1.Show("先写下想问的话")
} else {
文本输入框_追问.Text = ""
开始回答(join("追问:", 问题))
Qwen1.Chat(问题)
}
}
中途验证:选「分段时间线」点开始,结果一行行出现;追问「第 2 段里出现了什么」,回答针对的就是这个视频。
第 5 步:复制结果与出错处理
when 按钮_复制.Click() {
if 标签_结果.Text == "" {
底部提示条1.Show("还没有结果可复制")
} else {
信息分享器1.CopyToClipboard(标签_结果.Text)
底部提示条1.Show("已复制,可以粘贴到笔记里")
}
}
when Screen1.ErrorOccurred(component, functionName, errorNumber, message) {
正在回答 = false
按钮_开始.Enabled = true
按钮_追问.Enabled = true
标签_状态.Text = 错误说明(message)
}
function 错误说明(message) {
return choose(containstext(message, "401"), "API Key 不对:检查是否抄全,或到百炼控制台重新创建。", choose(containstext(message, "Arrearage"), "阿里云账户欠费:充值后再试。", choose(containstext(message, "429"), "请求太频繁了,等几秒再试。", choose(containstext(downcase(message), "download") or containstext(downcase(message), "url"), "视频取不到:要用公网能直接打开的 .mp4 直链,网盘分享页、视频网站的播放页地址都不行。", join("出错了:", message)))))
}
服务器下载视频失败时,错误消息里通常带 download 或 url 字样(例如 Download the media resource timed out),用 downcase 统一转小写再判断。
这一课的要点
ChatWithVideoUrl交的是地址,视频由模型服务器去下载:直链、公网、能播放,三个条件缺一不可。- 下拉框 + 提示词表 是做「多功能」AI App 最省事的结构:加一个功能 = 加一个选项 + 一段提示词。
- 视频理解比图片慢得多,状态行要写清楚「正在看视频」,按钮变灰防重复。
常见问题
| 现象 | 原因与处理 |
|---|---|
| 状态行「视频取不到」 | 地址不是直链,或服务器访问不到。先在 App 里预览能不能播 |
| 预览能播,模型还是取不到 | 地址可能有防盗链、需要登录,或只在国内某些网络可访问。换一个对象存储的公开链接 |
| 等了很久才出结果 | 视频太长。先用 1 分钟以内的视频试,长视频剪成几段 |
| 时间线的秒数对不上 | 模型对时间的判断是估计的,适合做「大概在哪一段」,不适合精确到秒 |
| 报错「可能不支持图片/视频」 | ModelName 是纯文本模型。用 qwen3-vl-plus 或 qwen-vl-max |
| 用 Kimi 组件看视频失败 | Kimi 官方接口不收普通视频网址,用千问或豆包 |
平台说明
- 安卓、鸿蒙都能运行;鸿蒙版 Qwen 组件同样有
ChatWithVideoUrl。 - 业务检查见验证记录:地址校验、视频以
video_url形式发出、四个任务的提示词、追问时请求里带着视频、复制、下载失败等都逐条执行过。真实视频的理解效果没有在验证中调用模型。
下一课
第 7 课 照片绘本:综合课。一张照片先交给 DeepSeek 写成小故事,再把故事里的画面交给豆包画插画——两个模型接力。
扫码添加客服咨询