在 AI 图像生成和 AI 视频生成场景中,Prompt 已经从简单文本描述,逐渐变成一种结构化的创作指令。一个可用的 Prompt 往往需要包含主体、场景、镜头、光线、色彩、动作、风格等多种信息。
如果输入来源是一段参考视频,问题会更复杂。视频不只是多张图片的集合,它还包含时间变化、镜头运动、主体动作和场景切换。要把视频转换成适合生成模型使用的 Prompt,不能只做一句话摘要,而需要对视频内容进行拆解和重组。
本文记录一个“视频参考转 Prompt”的实现思路,重点放在工程流程设计,包括视频预处理、关键帧抽取、多模态分析、结构化输出、异步任务和结果格式化。
用户上传一段视频后,希望系统能输出一段可用于 AI 生成工具的 Prompt。例如:
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 面向的是后续生成任务,而不是普通的视频标题。因此描述要尽量保留视觉细节。
整体流程可以拆成以下几个模块:
视频上传
↓
格式校验
↓
视频转码
↓
关键帧抽取
↓
多模态模型分析
↓
结构化结果整理
↓
Prompt 模板拼装
↓
结果返回这类任务不建议设计成同步接口。视频文件通常较大,转码和模型调用耗时也不稳定,更适合用异步任务队列处理。
视频上传阶段需要先做基础校验:
示例伪代码:
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,并限制最大分辨率。原始文件建议只做临时存储,分析完成后定期清理。
直接分析完整视频成本较高,也没有必要。更常见的做法是抽取关键帧,再基于关键帧进行多模态理解。
抽帧策略可以分为三类:
示例:
async function extractKeyframes(videoPath) {
const intervalFrames = await extractByInterval(videoPath, 2);
const sceneFrames = await extractBySceneChange(videoPath, {
threshold: 0.35
});
return removeDuplicateFrames([
...intervalFrames,
...sceneFrames
]);
}对 Prompt 生成来说,抽帧目标不是完整还原视频,而是覆盖主要视觉信息。因此需要控制最大帧数,避免成本过高。
关键帧抽取后,可以把图片帧和时间信息传给多模态模型。
单帧分析通常提取:
视频分析还需要考虑帧之间的变化,例如镜头推进、人物移动、场景切换等。因此可以把关键帧整理成时间序列:
{
"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。
示例:
{
"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"
}结构化输出有几个好处:
拿到结构化结果后,再根据目标场景生成最终 Prompt。
例如图像生成更关注构图、光线、风格:
function formatImagePrompt(data) {
return [
data.subject,
data.scene,
data.lighting,
data.mood,
data.style,
'cinematic composition'
].join(', ');
}视频生成更关注运动和镜头:
function formatVideoPrompt(data) {
return [
data.subject,
data.motion,
data.camera,
data.scene,
data.lighting,
data.mood,
data.style
].join(', ');
}这样可以把“视频理解”和“Prompt 格式化”解耦。后续如果需要支持不同模型,只需要增加模板。
视频分析一般会经历上传、转码、抽帧、模型调用和结果解析。推荐设计任务状态:
pending
processing
extracting
analyzing
formatting
completed
failed用户上传视频后,接口返回 taskId,前端通过轮询、SSE 或 WebSocket 获取进度。
{
"taskId": "task_xxx",
"status": "analyzing",
"progress": 70
}失败时不要只返回 failed,最好记录具体错误码,例如:
这对用户提示和排查问题都更友好。
可以根据视频时长动态设置最大帧数:
function getMaxFrameCount(duration) {
if (duration <= 10) return 6;
if (duration <= 30) return 12;
return 20;
}对同一个视频,可以通过文件 hash 复用结果:
const hash = await getFileHash(file);
const cached = await findResultByHash(hash);
if (cached) {
return cached;
}不要等任务全部完成后再写数据库。上传完成、抽帧完成、分析完成都可以保存一次状态,便于恢复和调试。
视频文件会带来较高存储成本,应设置自动清理策略。分析完成后可以只保留结构化结果和最终 Prompt。
基于这个流程,我做了一个小型在线验证工具:
它的作用是把视频参考转换成可编辑的 Prompt 初稿。实际体验下来,这类工具更适合作为创作辅助,而不是直接替代人工 Prompt 编辑。用户仍然需要根据目标模型继续调整,比如强化镜头运动、删除无关元素,或改写成更短的版本。
视频转 Prompt 表面上是一个内容生成问题,实际上涉及视频处理、多模态理解、异步任务和结构化输出设计。
比较推荐的实现方式是:
从工程角度看,核心不是让模型“描述视频”,而是把视频里的视觉信息稳定转换成后续生成流程可以复用的数据结构。当结构化结果足够清晰时,Prompt 只是其中一种输出形式,后续还可以扩展为镜头脚本、分镜描述、风格标签或创作素材库。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。