出片手脚乱抖、身体比例在几个关键帧之间来回跳变时,先要判断的是驱动视频与参考人像有没有在画幅、比例、时间轴上对齐,而不是直接去调采样步数、引导强度这类生成参数。对齐没做对时,参数调整的结果很难分辨,容易在一次又一次重跑里绕圈。可行的顺序是:先确认驱动视频里人物信息是否完整,再统一两侧画幅比例,然后把抖动定位到具体时间区间,最后用帧数与分辨率做控制对比。
出片抖动里,手脚乱抖与比例跳变更常见的原因是两侧输入没对齐,而不是模型能力边界。建议顺序:驱动视频逐帧确认手、脚、头是否完整入镜 → 参考人像按同一画幅比例裁剪缩放 → 抽帧联系表标出抖动出现在动作切换点还是全程 → 只改帧数或分辨率其中一项做对比。若抖动始终跟随动作切换点,且驱动视频该段确有遮挡或出画,先修素材再谈参数。判断依据以抽帧结果和运行记录为准,具体表现需要结合所用版本确认。
确认驱动视频里人物全身是否完整入镜、无遮挡切换
先把驱动视频单独摊开看。出片抖动有时不是生成环节的问题,而是驱动视频里手已经出画、脚被画幅下沿切掉,或者中途换了遮挡关系,模型只能靠猜去补全缺失的肢体。
# 记录驱动视频的基础信息
ffprobe -v error -select_streams v:0 \
-show_entries stream=width,height,r_frame_rate,nb_frames \
-of default=nw=1 driver.mp4
# 逐帧导出,便于单帧细看
mkdir -p frames/driver
ffmpeg -i driver.mp4 -vsync 0 frames/driver/%06d.png
# 先做一遍低帧率粗看,再回到可疑区间逐帧确认
mkdir -p frames/driver_preview
ffmpeg -i driver.mp4 -vf "fps=2,scale=480:-1" frames/driver_preview/%04d.jpg
要检查的部位固定为三处:手(指尖与手腕是否始终在画幅内)、脚(脚踝到脚掌是否被下边缘切掉)、头部(发际线与头顶是否贴边或出画)。遮挡切换的判断标准是:手部被躯干挡住、左右手交替、转身导致一只手消失又从另一侧出现。驱动视频里出现这类切换时,输出对应的肢体通常会在一段帧内出现不自然的形变或抽动,这类现象需要和模型本身的边界区分开。
把参考人像的构图缩放到与驱动视频一致的画幅比例
驱动视频与参考人像的分辨率、长宽比常常不同。直接喂进去,模型对“人体占画面多大”的理解会在两侧之间反复校正,表现就是比例跳变。先在画幅层面统一,再谈其他设置。
# 查看参考人像尺寸
ffprobe -v error -select_streams v:0 \
-show_entries stream=width,height -of csv=p=0 ref.png
# 保持比例缩放到目标画幅,不足处补边,不做拉伸
ffmpeg -i ref.png -vf "scale=720:1280:force_original_aspect_ratio=decrease,pad=720:1280:(ow-iw)/2:(oh-ih)/2:color=black" ref_canvas.png
# 或者先裁成同一长宽比,再缩放到目标尺寸
ffmpeg -i ref.png -vf "crop=ih*9/16:ih,scale=720:1280" ref_crop.png
驱动视频一侧同理,原始画幅比例与目标不一致时,先裁到同一比例再缩放,不要用拉伸把画面压扁。
ffmpeg -i driver.mp4 -vf "crop=ih*9/16:ih,scale=720:1280" driver_norm.mp4
比例不一致时的异常表现,通常先在四肢末端和头肩交界处暴露:手指长度忽长忽短、脚掌在画面下沿上下跳、头部大小在相邻几个关键帧之间明显变化。把两侧尺寸和裁剪参数记下来,再决定是否继续调生成参数。
抽帧对比抖动出现在动作切换点还是全程
把抖动定位到时间段,比笼统说“整片都抖”更有用。做法是给输出视频抽帧并拼成联系表,一屏看一段,抖动的分布模式会直接显出来。
# 每 0.25 秒取一帧,6 列拼图
ffmpeg -i out.mp4 -vf "fps=4,scale=240:-1,tile=6x4" sheet_out_%03d.jpg
# 叠加帧序号,便于回查具体帧
ffmpeg -i out.mp4 -vf "fps=4,scale=240:-1,drawtext=text='%{n}':x=4:y=4:fontsize=16:fontcolor=yellow,tile=6x4" sheet_num_%03d.jpg
标记动作切换帧号时,在驱动视频上生成一份同格式、带序号的联系表,两侧按时间对齐:同一时间点 t,驱动侧帧号约为 t 乘以驱动帧率,输出侧帧号约为 t 乘以输出帧率。每次动作切换(起跳落地、转身、换重心、挥手开始与结束)都记成一条,再对照输出在切换点前后若干帧的表现。
记录按行写会更清楚,至少包含:时间区间、对应驱动帧号、对应输出帧号、现象类型(手指抖动 / 脚底滑动 / 比例突变 / 躯干扭曲)、是否与切换点重合。抖动若集中在切换点前后一两帧,偏向动作过渡的处理问题;若全程都有细碎抖动,更可能是两侧比例、对齐或分辨率设置的问题。
按帧数与分辨率两个变量做控制对比
确认抖动的分布之后,再做两个变量的控制对比:帧数与分辨率。每一轮只改一个,其余保持不变,包括随机种子(若可固定)、提示词、参考图、采样步数。参数位置按实际使用的版本确认:命令行工作流在启动参数或配置文件里;节点式工作流在生成节点的 length 或 frames、width 或 height 输入项;网页界面一般在生成设置区。
run_id frames resolution seed driver ref 抖动区间 现象
A 49 720x1280 1234 driver_norm ref_canvas 全程 基线
B 81 720x1280 1234 driver_norm ref_canvas 后段 只改帧数
C 49 480x854 1234 driver_norm ref_canvas 全程 只改分辨率
解读时保持保守:帧数变长后抖动只出现在后段,通常指向模型对长序列一致性的边界;同一帧数下换分辨率后抖动依旧,更可能是输入对齐没做好;两档都抖、且抖动位置稳定跟随动作切换点,就回到驱动视频里看那段动作本身是否有遮挡或出画。每次运行都把记录行补齐,避免凭印象判断。
把对齐步骤写成跑之前的固定检查项
上面几步固化成清单,每条都能用一条命令或一次观察完成,重跑时就不容易漏掉同一处错误。
- 驱动视频分辨率与帧率已记录:
ffprobe -v error -select_streams v:0 -show_entries stream=width,height,r_frame_rate,nb_frames -of default=nw=1 driver.mp4 - 驱动视频已逐帧导出并抽查三处关键部位:
ffmpeg -i driver.mp4 -vsync 0 frames/driver/%06d.png - 参考人像尺寸已确认,与驱动侧画幅比例一致:
ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 ref.png - 两侧都已按同一比例裁剪或补边:
ffmpeg -i ref.png -vf "crop=ih*9/16:ih,scale=720:1280" ref_crop.png - 帧数、分辨率、种子已写进本轮运行记录,且只改了一个变量
- 输出已生成带序号的联系表,抖动区间已回填:
ffmpeg -i out.mp4 -vf "fps=4,scale=240:-1,drawtext=text='%{n}':x=4:y=4:fontsize=16,tile=6x4" sheet_num_%03d.jpg
清单执行完再启动生成,抖动问题要么在素材层就消掉,要么能明确落到帧数或分辨率某一项上,排查路径比反复盲调参数短得多。