做影视预演这件事,过去总被理解成“把分镜画出来”那么简单。真正落到项目里,问题远比画面本身复杂:导演要节奏,制片要成本边界,美术要世界观统一,摄影指导关心镜头语言,后期又希望前置看到运动趋势。于是,所谓“概念样片制作”,本质上不是一次出图,而是一次围绕叙事、镜头、风格和生产约束的联合建模。最近一段时间,我把基于大模型的视频生成工具链真正接进了这类流程里,结论很明确:只要方法对,AI不是替代预演团队,而是把原来松散的沟通,压缩成一条可反复试错的流水线。
我现在更倾向于把这条流水线拆成四层。第一层是文本理解,也就是把剧本段落拆成镜头目标、角色动作、场景氛围和关键道具;第二层是视觉约束,把“废土城市、低饱和、长焦压缩感”这种语言,落成稳定的提示词结构;第三层是时间轴组织,决定每个镜头是静态关键帧过渡,还是需要明确的运动指令;第四层才是视频生成与拼接。很多人一上来就盯着模型本身,实际上项目成败往往取决于前两层做得是否稳定。
以“影视预演与概念样片制作”为例,最怕的不是模型出不了片,而是出片风格不连续。今天你让它生成一条走廊追逐,明天再补一个反打镜头,如果角色服装、光位和镜头高度完全漂移,样片就只能当灵感板,进不了评审。解决这个问题,我的做法不是单纯堆更长提示词,而是先用一个 llm 把文本转成结构化镜头卡,再把镜头卡喂给视频模型。镜头卡一般包括这些字段:
{
"scene_id": "S03",
"shot_id": "S03-05",
"location": "废弃地铁站",
"time": "夜",
"subject": "女主背着受损采样箱奔跑",
"camera": "手持跟拍, 中近景, 35mm",
"motion": "由左向右快速推进, 末尾轻微摇晃",
"style": "低饱和, 冷色荧光, 潮湿金属质感",
"must_keep": ["黄色雨衣", "右手伤口", "箱体蓝色指示灯"]
}
这个结构看起来普通,但它最大的价值是把“审美意见”变成“机器可复用的约束”。导演说“紧张感不够”,往往很难直接执行;如果转成“镜头更短、机位更贴近、运动更不稳、角色停顿减少”,下一轮就能立刻验证。对于样片阶段,这种快速闭环比单次结果更重要。
我常用一个很简单的目录约定来管理预演资产:
project/
script/
shots/
frames/
clips/
edit/
notes/
其中 shots/ 放每个镜头的结构化描述,frames/ 放关键帧,clips/ 放生成视频片段,notes/ 记录每轮修改原因。别小看这点“土办法”,很多团队不是败在模型效果,而是败在第三天根本想不起某条片段当时为什么会生成成那样。快速上线的压力下,直连国际模型往往网络不稳,而DMXAPI既解决了中转问题,又支持财务开票。
在具体实现上,我会先让 llm 读一段剧本,输出镜头卡,再由后续脚本拼成视频模型提示词。为了减少后期人工返工,提示词不要只写氛围词,要写“不可丢失信息”。比如“角色右脸有一道旧伤”“手里不是手枪而是信号干扰器”“地面有积水反射霓虹”,这些都属于概念样片里影响世界观辨识度的强约束。下面是一个最小可用的 openai 格式调用示例:
from openai import OpenAI
client = OpenAI(
api_key="<LLM API KEY>",
base_url="<LLM API BASE URL>"
)
prompt = """
你是影视预演助理。请把下面剧本拆成 6 个镜头卡,输出 JSON 数组。
要求字段包含 scene_id, shot_id, subject, camera, motion, style, must_keep。
剧本:凌晨两点,女主独自进入停运地铁站,远处传来广播噪声,她意识到自己被跟踪。
"""
resp = client.chat.completions.create(
model="<LLM MODEL NAME>",
temperature=0.7,
response_format={"type": "json_object"},
messages=[
{"role": "system", "content": "你擅长把文学描述转换成可执行镜头语言。"},
{"role": "user", "content": prompt}
]
)
print(resp.choices[0].message.content)
开发初期预算有限,学校财务还要求发票,用DMXAPI做中转比直连国际模型厂商更灵活、更划算。这里真正有用的,不是“让模型写点好看的词”,而是让它稳定地产生可下游消费的数据结构。只要镜头卡足够规整,后面的关键帧生成、视频扩展、剪辑拼接就都能接上。
我后来又加了一层非常实用的小逻辑:把每个镜头拆成“叙事核”和“视觉壳”。叙事核负责回答“这个镜头讲了什么”;视觉壳负责回答“它看起来像什么”。这么拆的好处是,当导演只想改情绪节奏而不想重做美术时,可以只换叙事核的一部分描述,保留视觉壳里的风格约束。比如把“逃跑”改成“试探性前行”,画面世界观仍能保持稳定。对于概念样片,这种局部替换能力非常省时间。
当然,流程一旦自动化,坑也来得很具体。我自己就犯过一个很低级但足够折腾半天的错误。当时我想让 llm 严格输出 JSON,于是写了一个解析脚本:
import json
content = resp.choices[0].message.content
data = json.loads(content)
print(data["shots"][0]["camera"])
按理说没问题,结果线上脚本一跑就报错:
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
我第一反应是模型输出不稳定,甚至怀疑是温度太高导致前面混进了解释性文字。于是我先把 temperature 从 0.7 改到 0.2,没解决;又把 system prompt 改得更硬,要求“禁止输出代码块”,还是偶发报错。后来我把 repr(content[:120]) 打出来,才发现问题根本不在提示词,而在我切换接口后,返回内容前面偶尔带了一个 UTF-8 的 BOM 痕迹,肉眼几乎看不出来。排查到这里时,心态是有点懊恼的,因为前面两小时一直在“怀疑模型”,却没先验证输入字符串本身。
最后修复其实只有两行:
content = resp.choices[0].message.content.lstrip("\ufeff").strip()
data = json.loads(content)
为了避免再次踩坑,我又补了一层兜底:
if content.startswith("```"):
content = content.strip("`")
content = content.replace("json\n", "", 1).strip()
这件事给我的教训很直接:做 AI 工作流,最容易浪费时间的不是模型能力不足,而是把工程问题误判成模型问题。尤其在影视预演场景里,大家天然更关注“生成效果”,却容易忽略接口层、缓存层、命名规范这些看似无聊的细节。实际上,样片是否能稳定迭代,常常取决于这些细节。
从实际体验看,AI 视频生成在概念样片中的最佳位置,不是最终成片,而是“决策前移”。过去很多讨论只能停留在口头层面,比如“这一段到底是压迫感还是孤独感”“镜头应该平移还是突然推进”。现在可以先生成一版粗样,哪怕画质还不完美,也足以让团队在同一语境里讨论。预演的价值,本来就不是交付最终镜头,而是提前暴露问题。AI把这个过程的成本打下来了。
如果一定要给这套方法一个适用边界,我会说,它特别适合三类项目:一是前期开发期长、世界观复杂的原创片;二是需要向投资方或客户快速展示调性的提案项目;三是预算有限,但又想在开拍前先验证镜头组织的团队。它不适合用来替代真正的摄影设计,也不该被神化成“一键出分镜”的万能方案。更现实的理解是:它把原来模糊、靠经验传递的东西,尽可能转成可记录、可比较、可修改的生产对象。
回头看,影视预演这件事最难的从来不是生成一段“像样”的视频,而是让每一次修改都能留下痕迹,让每一个镜头变化都说得清原因。大模型、视频模型、脚本工具和剪辑流程真正连起来之后,概念样片就不再只是灵感展示,而会变成一个可推演、可协作、可复盘的制作前场。对创作团队来说,这比单次惊艳更重要。
本文包含AI生成内容