首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >基于多模态模型的视频 Prompt 生成实践

基于多模态模型的视频 Prompt 生成实践

原创
作者头像
用户9078657
修改2026-06-23 22:39:40
修改2026-06-23 22:39:40
2640
举报

基于多模态模型的视频 Prompt 生成实践

一、背景

在 AI 图像生成和 AI 视频生成场景中,Prompt 已经从简单文本描述,逐渐变成一种结构化的创作指令。一个可用的 Prompt 往往需要包含主体、场景、镜头、光线、色彩、动作、风格等多种信息。

如果输入来源是一段参考视频,问题会更复杂。视频不只是多张图片的集合,它还包含时间变化、镜头运动、主体动作和场景切换。要把视频转换成适合生成模型使用的 Prompt,不能只做一句话摘要,而需要对视频内容进行拆解和重组。

本文记录一个“视频参考转 Prompt”的实现思路,重点放在工程流程设计,包括视频预处理、关键帧抽取、多模态分析、结构化输出、异步任务和结果格式化。

二、需求分析

用户上传一段视频后,希望系统能输出一段可用于 AI 生成工具的 Prompt。例如:

代码语言:plaintext
复制
A cinematic night street scene featuring a lone person walking through rain-soaked pavement, neon reflections, blue and magenta lighting, handheld camera movement, moody atmosphere.

要生成类似结果,系统需要从视频中提取以下信息:

类型

说明

主体

人物、物体、动物、建筑等

动作

主体正在做什么

场景

室内、街道、森林、海边等

镜头

景别、角度、运动方式

光线

明暗、方向、对比度

色彩

主色调和色彩风格

运动

人物运动、镜头推进、转场

氛围

紧张、宁静、梦幻、电影感

风格

写实、动画、广告、科幻等

这里的关键点是:Prompt 面向的是后续生成任务,而不是普通的视频标题。因此描述要尽量保留视觉细节。

三、整体架构

整体流程可以拆成以下几个模块:

代码语言:plaintext
复制
视频上传
  ↓
格式校验
  ↓
视频转码
  ↓
关键帧抽取
  ↓
多模态模型分析
  ↓
结构化结果整理
  ↓
Prompt 模板拼装
  ↓
结果返回

这类任务不建议设计成同步接口。视频文件通常较大,转码和模型调用耗时也不稳定,更适合用异步任务队列处理。

四、视频上传与预处理

视频上传阶段需要先做基础校验:

  • 文件大小限制
  • 视频时长限制
  • 文件格式检查
  • MIME 类型检查
  • 视频是否能正常解码

示例伪代码:

代码语言:javascript
复制
async function validateVideo(file) {
  const meta = await getVideoMeta(file);

  if (meta.duration > 120) {
    throw new Error('video duration exceeds limit');
  }

  if (file.size > 100 * 1024 * 1024) {
    throw new Error('video file is too large');
  }

  return meta;
}

为了降低后续处理复杂度,可以把输入视频统一转码为标准格式,例如 MP4,并限制最大分辨率。原始文件建议只做临时存储,分析完成后定期清理。

五、关键帧抽取

直接分析完整视频成本较高,也没有必要。更常见的做法是抽取关键帧,再基于关键帧进行多模态理解。

抽帧策略可以分为三类:

  1. 固定间隔抽帧,例如每 2 秒抽 1 帧。
  2. 基于画面变化抽帧,在场景变化明显的位置抽帧。
  3. 混合抽帧,同时保证覆盖率和关键变化。

示例:

代码语言:javascript
复制
async function extractKeyframes(videoPath) {
  const intervalFrames = await extractByInterval(videoPath, 2);
  const sceneFrames = await extractBySceneChange(videoPath, {
    threshold: 0.35
  });

  return removeDuplicateFrames([
    ...intervalFrames,
    ...sceneFrames
  ]);
}

对 Prompt 生成来说,抽帧目标不是完整还原视频,而是覆盖主要视觉信息。因此需要控制最大帧数,避免成本过高。

六、多模态分析

关键帧抽取后,可以把图片帧和时间信息传给多模态模型。

单帧分析通常提取:

  • 当前画面主体
  • 场景环境
  • 光线与颜色
  • 构图方式
  • 画面风格

视频分析还需要考虑帧之间的变化,例如镜头推进、人物移动、场景切换等。因此可以把关键帧整理成时间序列:

代码语言:json
复制
{
  "frames": [
    {
      "time": "00:00",
      "summary": "A person stands in a neon-lit street at night."
    },
    {
      "time": "00:02",
      "summary": "The camera moves closer, rain reflections become clearer."
    }
  ]
}

然后再让模型总结整体场景和运动关系。

七、结构化输出

为了便于后续处理,建议让模型输出结构化数据,而不是直接输出最终 Prompt。

示例:

代码语言:json
复制
{
  "subject": "a person walking through a rainy city street",
  "scene": "neon-lit street at night",
  "camera": "medium shot, subtle handheld movement",
  "lighting": "blue and magenta neon reflections",
  "motion": "slow walking motion",
  "mood": "moody, cinematic",
  "style": "realistic cyberpunk film look"
}

结构化输出有几个好处:

  1. 前端可以分块展示和编辑。
  2. 可以根据不同目标模型重新拼装 Prompt。
  3. 中间结果可以缓存。
  4. 便于排查模型输出异常。

八、Prompt 拼装

拿到结构化结果后,再根据目标场景生成最终 Prompt。

例如图像生成更关注构图、光线、风格:

代码语言:javascript
复制
function formatImagePrompt(data) {
  return [
    data.subject,
    data.scene,
    data.lighting,
    data.mood,
    data.style,
    'cinematic composition'
  ].join(', ');
}

视频生成更关注运动和镜头:

代码语言:javascript
复制
function formatVideoPrompt(data) {
  return [
    data.subject,
    data.motion,
    data.camera,
    data.scene,
    data.lighting,
    data.mood,
    data.style
  ].join(', ');
}

这样可以把“视频理解”和“Prompt 格式化”解耦。后续如果需要支持不同模型,只需要增加模板。

九、异步任务设计

视频分析一般会经历上传、转码、抽帧、模型调用和结果解析。推荐设计任务状态:

代码语言:plaintext
复制
pending
processing
extracting
analyzing
formatting
completed
failed

用户上传视频后,接口返回 taskId,前端通过轮询、SSE 或 WebSocket 获取进度。

代码语言:json
复制
{
  "taskId": "task_xxx",
  "status": "analyzing",
  "progress": 70
}

失败时不要只返回 failed,最好记录具体错误码,例如:

  • INVALID_VIDEO
  • TRANSCODE_FAILED
  • FRAME_EXTRACTION_FAILED
  • MODEL_TIMEOUT
  • INVALID_MODEL_OUTPUT

这对用户提示和排查问题都更友好。

十、性能与成本优化

1. 控制抽帧数量

可以根据视频时长动态设置最大帧数:

代码语言:javascript
复制
function getMaxFrameCount(duration) {
  if (duration <= 10) return 6;
  if (duration <= 30) return 12;
  return 20;
}

2. 缓存分析结果

对同一个视频,可以通过文件 hash 复用结果:

代码语言:javascript
复制
const hash = await getFileHash(file);
const cached = await findResultByHash(hash);

if (cached) {
  return cached;
}

3. 分阶段保存状态

不要等任务全部完成后再写数据库。上传完成、抽帧完成、分析完成都可以保存一次状态,便于恢复和调试。

4. 清理临时文件

视频文件会带来较高存储成本,应设置自动清理策略。分析完成后可以只保留结构化结果和最终 Prompt。

十一、实践验证

基于这个流程,我做了一个小型在线验证工具:

video to prompt

它的作用是把视频参考转换成可编辑的 Prompt 初稿。实际体验下来,这类工具更适合作为创作辅助,而不是直接替代人工 Prompt 编辑。用户仍然需要根据目标模型继续调整,比如强化镜头运动、删除无关元素,或改写成更短的版本。

十二、总结

视频转 Prompt 表面上是一个内容生成问题,实际上涉及视频处理、多模态理解、异步任务和结构化输出设计。

比较推荐的实现方式是:

  1. 不直接处理完整视频,而是先抽取关键帧。
  2. 不直接生成最终 Prompt,而是先生成结构化语义结果。
  3. 将视频理解和 Prompt 拼装拆开。
  4. 使用异步任务处理视频分析流程。
  5. 对中间结果做缓存,降低重复分析成本。

从工程角度看,核心不是让模型“描述视频”,而是把视频里的视觉信息稳定转换成后续生成流程可以复用的数据结构。当结构化结果足够清晰时,Prompt 只是其中一种输出形式,后续还可以扩展为镜头脚本、分镜描述、风格标签或创作素材库。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 基于多模态模型的视频 Prompt 生成实践
    • 一、背景
    • 二、需求分析
    • 三、整体架构
    • 四、视频上传与预处理
    • 五、关键帧抽取
    • 六、多模态分析
    • 七、结构化输出
    • 八、Prompt 拼装
    • 九、异步任务设计
    • 十、性能与成本优化
      • 1. 控制抽帧数量
      • 2. 缓存分析结果
      • 3. 分阶段保存状态
      • 4. 清理临时文件
    • 十一、实践验证
    • 十二、总结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档