这篇能做出什么
照着做一遍,你会得到一条 6~10 个镜头的短片:同一个角色从头演到尾,脸型、发型、服装在不同镜头里对得上;镜头之间用「上一镜的尾帧 = 下一镜的首帧」硬接,或者用跨镜动作自然过渡;最后用 ffmpeg 拼成一条画幅、帧率统一的成片,可以直接发到短视频平台或放进提案里。
下面用一条 30 秒、6 个镜头的示例短片串起来讲:雨天傍晚,角色在巷口等人 → 抬头看天 → 转身 → 走进便利店 → 从货架上拿起一把伞 → 推门走进雨里。
每个镜头 5 秒上下,全程大约需要 15~25 次生成(含废片重试)。角色只有一个,场景只有两个(巷口、便利店),这样能把「一致性」的变量压到最少。
需要提前说清楚:可灵的入口名称、单镜可用时长、分辨率档位、消耗规则都会随版本调整,动手前以官方页面当前版本为准。下面的流程是通用的,换任何一版界面都能套。
前置条件清单
账号与额度
- 可灵账号,积分或会员额度够跑 20 次以上生成。建议先用最低档分辨率和最短时长试片,定稿后再用高规格重跑。
素材
- 角色定妆图 1~3 张:正面为主,光线均匀,背景干净,全身或大半身。如果能出侧面和背面各一张,跨镜时更稳。
- 场景参考图 2 张:巷口、便利店各一张。风格、色调、时间段要统一。
- 可选:关键道具图(比如那把伞),道具颜色一旦定下来就别改。
本地工具
- 一个能跑命令行的地方,装好 ffmpeg 和 ffprobe(打包版本即可)。
- 一个文本编辑器,用来维护角色卡和分镜表。
- 一个文件夹结构,建议长这样:
```text
project/
├── refs/ # 角色与场景参考图
├── frames/ # 生成的首帧、尾帧静帧
├── shots/ # 每个镜头的原始视频
├── norm/ # 统一规格后的视频
└── out/ # 最终成片
```
一次性定下来的规格
- 画幅:16:9 或 9:16,全片不许中途换。
- 分辨率:先按 1280×720 跑通,定稿再上更高档。
- 帧率:24 或 25,全片统一。
- 单镜时长:5 秒起步。时长越长越容易崩,尤其是人物转身、走动这类动作。
分步骤
第 1 步:写分镜表,把「一致性」变成能核对的数据
一致性不是靠感觉,是靠一张能逐行对照的表。先在编辑器里把它写出来,后面每一步都对着这张表干活。
| 镜号 | 时长 | 景别/机位 | 动作 | 首帧来源 | 尾帧去向 |
|---|---|---|---|---|---|
| S01 | 5s | 中景,略低角度 | 站在巷口,左右张望 | 生成静帧 A1 | 交给 S02 当首帧 |
| S02 | 5s | 近景,仰拍 | 抬头看天 | S01 尾帧 | 生成静帧 B2 |
| S03 | 5s | 中景,侧后方 | 转身面向巷内 | S02 尾帧 | 交给 S04 |
| S04 | 5s | 全景,固定机位 | 推门进便利店 | S03 尾帧 | 生成静帧 D4 |
| S05 | 5s | 特写,手持微晃 | 从货架拿起伞 | S04 尾帧 | 生成静帧 E5 |
| S06 | 5s | 中景,逆光 | 撑伞走进雨里 | S05 尾帧 | 收尾 |
关键点:除了 S01,每个镜头都不需要凭空造首帧,直接用上一个镜头的尾帧。 这是整条流程里一致性收益最大的一个动作。只有当上一镜的尾帧实在不能用(糊了、人物崩了、动作停死)时,才退回第 2 步重新生成静帧。
第 2 步:做角色卡,把描述文字冻结下来
角色卡是一份你每次生成都要原样复制的文本。很多人一致性做不好,不是模型不行,是每镜都换了说法——这一镜写「深灰色外套」,下一镜写「灰夹克」,模型自然当成两个人。
新建 refs/hero_a.json:
```json
{
"character_id": "hero_a",
"固定描述": "二十七八岁的亚洲男性,黑色短发,下颌线清晰,穿深灰色立领外套,内搭白色圆领衫,左眉尾有一道浅疤",
"禁用描述": ["胡子", "长发", "眼镜", "领带", "帽子"],
"参考图": "refs/hero_a_front.png",
"备选参考图": ["refs/hero_a_side.png", "refs/hero_a_back.png"],
"固定色调": "阴天散射光,低饱和,青蓝为主色,暖黄仅作点缀"
}
```
三条纪律:
1. 「固定描述」在每一个镜头的提示词里逐字出现,一个字都不改,包括标点。
2. 「禁用描述」写进负面提示里。角色没有胡子,但模型爱加,就明确禁掉。
3. 参考图全片只用这几张,不要中途换新的定妆图。换了图,脸就换了。
第 3 步:先出静帧,再出视频
图生视频的一致性明显好于文生视频,原因很直白:起点被锁死了。所以每一镜都走「静帧 → 视频」两段路。
静帧阶段要做的事:用可灵的图像生成,输入角色卡里的固定描述 + 当前镜头的场景与机位描述,一次出 4 张,挑一张脸正、手没崩、构图留了运动空间的。
挑选标准(按优先级):
- 脸部清晰,五官和参考图对得上;
- 人物在画面里没有贴边,前方留出至少一个身位;
- 姿势是「动作的起点」而不是「动作的高潮」,比如要拍走路,就选抬脚前的那一帧;
- 背景干净,没有莫名其妙的路人或文字。
挑好的静帧按 frames/S01_start.png 这样的规则命名,尾帧同理。
第 4 步:用首尾帧接续,把镜头缝起来
在图生视频里选择首尾帧模式,上传起始图和结束图。两种用法:
用法一:单镜内部的运镜。 首帧和尾帧是同一场景的两个不同状态,比如 S01 首帧是「站在原地」,尾帧是「头微微转向左侧」。模型负责中间那段过渡。
用法二:跨镜接续。 把 S01 生成的视频最后一帧截出来,作为 S02 的首帧。可灵生成的视频一般能在结果页直接取到视频,用 ffmpeg 截最后一帧:
```bash
取视频最后一帧,作为下一镜的首帧
ffmpeg -sseof -0.1 -i shots/s01.mp4 -vframes 1 -q:v 2 frames/S02_start.png -y
```
sseof -0.1 表示从结尾往前 0.1 秒开始取,比取绝对最后一帧更稳,能避开某些编码下的空白帧。
拿到 S02_start.png 后,它同时是 S02 的首帧来源。S02 的尾帧则重新生成一张静帧(抬头看天的状态),保证动作有推进。
跨镜接续有个容易忽略的细节:上一镜的尾帧不要停在完全静止的姿势上。 人站得笔直、手垂着,下一镜从这个状态起步,会显得两段视频之间「顿」了一下。让尾帧停在动作中段——手抬到一半、身体刚转过四分之一——接起来才顺。
第 5 步:角色沿用,靠模板而不是靠记忆
每一镜的提示词按同一个模板填,不要自由发挥:
```text
【镜头 S03】
画面主体:{角色固定描述},站在雨后的老城区巷口
景别与机位:中景,略低角度,机位固定在人物右前方
动作:从静止起步,向右前方走两步后停下
环境:青灰砖墙,地面有积水反光,远处有暖色路灯
光线与色调:阴天散射光,低饱和,青蓝为主色,暖黄仅作点缀
镜头运动:轻微手持跟随,幅度小
时长:5 秒
负面提示:不要换脸,不要改变服装颜色,不要出现第二个人物,不要字幕,不要水印
```
其中「画面主体」和「光线与色调」两行,全片逐字复用。变的是景别、动作、镜头运动。
参考图的做法:如果当前版本支持上传参考图并指定人物一致性,就把 hero_a_front.png 传上去,权重调高;如果支持多图参考,可以把正面和侧面一起传,模型对侧面和背面镜头的还原会好一些。具体入口和参数名以官方页面当前版本为准。
还有一个省事的技巧:把全部 6 个镜头的提示词先写成文件再粘贴。 用一段小脚本从角色卡里批量填模板,避免手抄出错:
```python
import json, pathlib
card = json.loads(pathlib.Path("refs/hero_a.json").read_text(encoding="utf-8"))
shots = [
("S01", "中景,略低角度", "站在巷口,左右张望"),
("S02", "近景,仰拍", "抬头看天"),
("S03", "中景,侧后方", "转身面向巷内"),
("S04", "全景,固定机位", "推门走进便利店"),
("S05", "特写,手持微晃", "从货架上拿起一把伞"),
("S06", "中景,逆光", "撑伞走进雨里"),
]
tpl = """【镜头 {sid}】
画面主体:{who},{act}
景别与机位:{size}
光线与色调:{tone}
负面提示:{neg}
"""
for sid, size, act in shots:
print(tpl.format(sid=sid, who=card["固定描述"], act=act,
size=size, tone=card["固定色调"],
neg="、".join(card["禁用描述"])))
```
生成好之后逐条复制到网页里,比一镜一镜现想文案可靠得多。
第 6 步:镜头接续的三种方式,按场景挑
硬接。 上一镜结束、下一镜开始,中间不重叠。适合场景切换(巷口 → 便利店)。做法是把上一镜尾帧当下一镜首帧,然后让下一镜的首帧稍微往前跑一点,形成「同一时刻、不同角度」的感觉。
动作跨镜。 一个动作被切成两镜。比如「拿起伞」拆成 S05 的手部特写 + S06 的起身中景。这就要求 S05 的尾帧停在「手握伞柄、还没拿起来」的位置,S06 的首帧就是这一帧。
空镜过渡。 动作接不上时,插一个 2~3 秒的环境空镜(雨滴打在积水上、便利店门口的灯牌)。空镜不涉及角色,也不怕不一致,是修补接缝的常用手段。
三种方式可以混用。越是想显得「连续」,越要靠前两种;空镜是兜底。
第 7 步:统一规格并导出成片
不管前面生成时选了什么参数,导出前全部归一化。先把每一条镜头转成相同分辨率、相同帧率、相同像素格式:
```bash
mkdir -p norm out
for f in shots/*.mp4; do
name=$(basename "$f")
ffmpeg -i "$f" \
-vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,fps=24,setsar=1" \
-c:v libx264 -crf 18 -preset medium -pix_fmt yuv420p \
-c:a aac -ar 48000 -ac 2 \
"norm/$name" -y
done
```
几个参数的含义:
scale加pad:不拉伸画面,按比例缩放后补黑边,避免人物被压扁。fps=24:统一帧率,拼接时不会出现忽快忽慢。crf 18:接近视觉无损,文件又不会太夸张。数值越小越清晰、文件越大。pix_fmt yuv420p:播放器兼容性好的像素格式,很多平台只认这个。
再按顺序拼成一条:
```bash
: > list.txt
for f in norm/s01.mp4 norm/s02.mp4 norm/s03.mp4 norm/s04.mp4 norm/s05.mp4 norm/s06.mp4; do
echo "file '$PWD/$f'" >> list.txt
done
ffmpeg -f concat -safe 0 -i list.txt \
-c:v libx264 -crf 18 -pix_fmt yuv420p -r 24 \
-c:a aac -b:a 192k \
out/final.mp4 -y
```
这里重编码一次而不是用 -c copy,是因为各段视频的编码参数即使看起来一样,也可能有细微差别,直接复制拼接容易在接缝处黑屏或花屏。
最后检查一遍:
```bash
ffprobe -v error -select_streams v:0 \
-show_entries stream=width,height,r_frame_rate,duration \
-of default=nw=1 out/final.mp4
```
输出的宽高、帧率、时长和你设定的一致,就说明成片没问题。
导出参数怎么选:
| 用途 | 分辨率 | 帧率 | 建议码率区间 |
|---|---|---|---|
| 平台竖屏投放 | 1080×1920 | 24 或 30 | 8~12 Mbps |
| 横屏展示/提案 | 1920×1080 | 24 或 25 | 10~16 Mbps |
| 内部预览 | 1280×720 | 24 | 4~6 Mbps |
音频如果只是配乐,导出时保持 AAC、48kHz、双声道即可。需要配音或对口型的话,建议先导出无声成片,再单独做音轨后合成,改动成本低。
常见坑与排错
| 现象 | 大概率原因 | 处理办法 |
|---|---|---|
| 换镜后脸变了 | 参考图换了,或固定描述被改过 | 全片只用同一组参考图;固定描述逐字复制 |
| 服装颜色飘 | 描述里前后不一致,或没写进负面提示 | 把颜色写死在固定描述里,负面提示加「不要改变服装颜色」 |
| 首尾接续处跳变 | 上一镜尾帧和下一镜首帧不是同一张图 | 直接用 ffmpeg 从上一镜视频里截最后一帧 |
| 接缝处画面「顿」一下 | 尾帧停在完全静止的姿势 | 让尾帧停在动作中段,留出运动余量 |
| 手部、文字崩坏 | 特写里出现手或招牌文字 | 避开手部特写,背景不要带文字招牌 |
| 全景里人物变小后走形 | 单镜时长太长或人物占画面比例过低 | 缩短到 5 秒内,或改成中景 |
| 拼接后黑屏/花屏 | 用 -c copy 直接拼了不同编码的视频 | 先归一化,再重编码拼接 |
| 画面被拉伸 | scale 没加 pad,宽高比不一致 | 用 force_original_aspect_ratio=decrease 加 pad |
| 消耗超预算 | 一上来就用高分辨率长时长试错 | 先用最低档跑通分镜,定稿再重跑高规格 |
| 生成结果与参考图姿势冲突 | 首帧姿势和参考图差太远 | 参考图选正面站姿,首帧不要选极端角度 |
排错顺序建议:先看静帧对不对(脸、服装、构图),再看单镜视频对不对(动作、有没有崩),最后才看接缝。前两步不对,接缝再怎么调也救不回来。
下一步建议
跑通一条 6 镜短片之后,可以往这几个方向加东西:
加声音。 用无声成片做底,单独铺环境音(雨声、门铃)和对白。声音能大幅掩盖接缝处的小瑕疵,性价比很高。
做对口型。 如果有正面或四分之三侧面的近景镜头,可以用对口型功能生成说话画面。前提是那一镜的人物脸要足够清晰,模糊的镜头做出来会很怪。
固化模板。 把角色卡、分镜表、提示词模板、ffmpeg 命令整理成一个项目文件夹,下次换故事只改分镜表和角色卡。第二部片子的一致性成本会低很多。
批量跑镜头。 如果当前版本开放了 API,可以用脚本把分镜表读进去、按顺序提交任务、轮询结果、下载视频,再串上本文的归一化与拼接命令,一条流水线跑完。接口形态、鉴权方式和并发限制以官方文档当前版本为准。
做长镜头。 单镜时长受限时,用「尾帧续接」把同一镜拆成多段生成,再用第 7 步的方法拼起来,能做出超过单次生成上限的长镜头。代价是每一段都要单独检查一致性,工作量会成倍增加,建议只在关键镜头用。
最后提醒一句:一致性的本质是减少变量。角色只有一个、场景只有两个、参考图只有一组、描述只有一套,剩下的交给模型。变量越少,可控性越高,出片速度也越快。
