第 6 课 视频摘要:给一个视频链接,AI 写摘要、列时间线、出理解题 | 大模型多模态专题

返回专题

做完你会得到什么

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

视频摘要界面预览

图为执行最终 .aia 里的真实积木生成的布局预览,不是真机截图;AI 的回答与照片、生成的图片都是示意。

难度 用时 前置 用到的模型
★★ 30 分钟 第 1 课 通义千问视觉模型 qwen3-vl-plus

下载本课 .aia(VideoSummary.aia)

哪些组件能看视频

组件 视频 说明
通义千问 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 写成小故事,再把故事里的画面交给豆包画插画——两个模型接力。

文档反馈