DepthAnything V2 · 时序平滑 · 双边滤波 · Seedance 素材工厂
用本工具生成的深度视频作为运动参考,配合一张人物图片,让 Seedance 2.0 把静态角色按深度视频的动作动起来——人物动作自然跟随,边缘干净,不崩脸。
一张清晰的正面/半身人物照,白色或纯色背景最佳。光线均匀、五官清晰。可以是真实照片、AI 生成的角色图、或手绘稿。建议用 GPT Image 2 先生成角色设定图,保证一致性。
把 DepthFlow 生成的深度视频上传到 Seedance 2.0 的参考视频槽位。深度视频定义了画面中每个像素的远近关系,Seedance 会把它解读为运动轨迹——近处(白色)= 前景运动,远处(黑色)= 背景静止。
💡 关键:Seedance 要求单帧像素在 409,600 ~ 8,295,044 之间(约 640×640 ~ 4K)。本工具分辨率下限已限制为 640p,960p/15fps 完全够用,文件小上传快。
使用 @ 引用系统标注你的素材:
@图片1 = 你的人物图片
@图片2 = 场景背景图(可选)
@视频1 = 你的深度视频
提示词中用 @图片1 指代角色、@图片2 指代场景、@视频1 指代动作来源。
以下是经过验证的角色动画提示词模板,直接复制到 Seedance 使用:
16:9 电影镜头,@图片1 中的角色执行 @视频1 中的动作, 角色的身体和四肢精确跟随深度视频中的运动轨迹, 保持角色面部、服装、发型完全不变, 真实人体比例,自然流畅的动作衔接, 电影级布光,浅景深虚化背景, 高质感 4K,无抖动无变形。
竖屏 9:16,@图片1 中的人物完整复现 @视频1 的舞蹈动作, 身体律动、四肢摆动、重心转移都与参考视频同步, 面部特征锁定,服装随动作自然飘动, 舞台灯光从上方打下,背景暗色干净, 动态模糊适度,帧率流畅,无水印无字幕。
宽幅电影 21:9,@图片1 中的角色以慢动作演绎 @视频1 的动作, 每个姿态清晰可辨,运动轨迹平滑流畅, 柔和的自然光从侧面打入,空气中微尘飘浮, 电影胶片质感,轻微颗粒,高动态范围, 保持角色身份完全一致,无面部扭曲。
2D 动画风格,@图片1 中的角色形象完整执行 @视频1 的动作, 扁平色彩,干净线条,赛璐璐着色, 角色表情跟随动作变化,头发和衣物自然摆动, 纯色背景或简单场景,日本动画美学, 无额外角色,无场景切换。
16:9 都市街景,@图片1 中的角色在 @图片2 的城市街道上执行 @视频1 的动作, 背景霓虹灯招牌和玻璃幕墙大厦,地面雨后反光, 行人稀疏模糊经过,暖黄路灯与冷蓝霓虹形成对比光, 电影级构图,浅景深突出人物,35mm 镜头感, 角色与场景光照融合自然,服装细节完整。
16:9 户外自然场景,@图片1 中的角色在 @图片2 的树林/草地上执行 @视频1 的动作, 金色逆光从树叶间洒落,发丝边缘发光, 远景虚化的树木和山峦,前景轻微飘动的草叶, 自然色调温暖柔和,纪录片质感, 角色与环境光照融合,动作自然流畅。
竖屏 9:16,@图片1 中的角色在 @图片2 的影棚布景前执行 @视频1 的动作, 三点布光——主光从45度打下、辅光柔化阴影、轮廓光分离人物与背景, 白色无缝地面有轻微倒影, 中景镜别,画面干净高级,商业广告质感, 服装面料纹理清晰,角色与场景光照一致。
宽幅 21:9,@图片1 中的角色在 @图片2 的赛博朋克环境中执行 @视频1 的动作, 全息投影广告牌和悬浮飞行器构成背景,冷色调金属质感, 体积光照穿过雾气和蒸汽,粒子特效漂浮在空中, 科幻电影级别渲染,精密机械细节,电致发光线条勾勒建筑边缘, 角色与场景光效融合,服装材质反射环境光。
@图片1,不要每段换图自动下载到本地 frp/ 目录
将本地 8765 映射到公网端口
等待操作...
自动下载 frps、创建配置、启动服务(脚本使用上面填写的服务器参数生成)
请先在「配置服务器信息」中填写IP并保存
所有接口均可通过 HTTP 调用,支持异地编程访问。参数说明中 str / int / float 为期望类型。
返回服务状态、GPU/CPU 设备、模型是否加载完毕。
curl http://127.0.0.1:8765/api/health
# 返回:
# {"status":"ok","device":"cuda","model_loaded":true}
上传视频文件,返回视频元信息和 video_id。后续所有操作依赖此 ID。
curl -F "video=@你的视频.mp4" http://127.0.0.1:8765/api/upload
# 返回:
# {"video_id":"a1b2c3d4e5","width":1920,"height":1080,
# "duration":12.5,"fps":30.0,"frameCount":375,"filename":"你的视频.mp4"}
获取指定时间点的深度预览图(PNG)。所有参数可选,返回 image/png 二进制流。
curl -X POST http://127.0.0.1:8765/api/preview/a1b2c3d4e5 \ -F "frame_time=3.5" \ -F "gamma=1.0" \ -F "contrast=1.0" \ -F "temporalSmooth=0.3" \ -F "edgePreserve=70" \ -F "fgBoost=0" \ -F "maxRes=960" \ -o preview.png # 参数说明: # frame_time: 时间戳(秒), 默认0 # gamma: 伽马, <1提亮 >1压暗, 默认1.0 # contrast: 对比度, 默认1.0 # temporalSmooth: 时序平滑, 0~0.8, 默认0.3 (单帧预览此参数无效) # edgePreserve: 边缘保真, 20~140, 默认70 # fgBoost: 背景压暗, 0~0.7, 默认0 # maxRes: 分辨率上限, 640~1920, 默认960
启动完整视频处理任务,返回 task_id 用于轮询进度和下载。
curl -X POST http://127.0.0.1:8765/api/process/a1b2c3d4e5 \
-F "gamma=1.0" \
-F "contrast=1.0" \
-F "temporalSmooth=0.3" \
-F "edgePreserve=70" \
-F "fgBoost=0" \
-F "maxRes=960" \
-F "outFps=24" \
-F "seedanceMode=false"
# 返回:
# {"task_id":"f8e7d6c5"}
# 参数含义同上, 额外:
# outFps: 输出帧率 24~30, 默认24
# seedanceMode: 伪彩色深度图 true/false, 默认false
轮询任务状态。status=processing 时带帧数和进度百分比,status=done 时处理完成。
curl http://127.0.0.1:8765/api/progress/f8e7d6c5
# 处理中:
# {"status":"processing","frame":120,"totalFrames":300,"progress":40}
# 完成:
# {"status":"done","frame":300,"totalFrames":300,"progress":100,
# "output":"output/f8e7d6c5.mp4"}
# 出错:
# {"status":"error","message":"错误详情"}
下载处理完成的视频文件。task_id 也可以用 output/ 目录下的文件名(不含扩展名)。
curl -O http://127.0.0.1:8765/api/download/f8e7d6c5 # 下载为 depthflow.mp4
返回最近 20 条已生成视频的列表。
curl http://127.0.0.1:8765/api/history
# 返回:
# [{"name":"f8e7d6c5.mp4","size":3385922,
# "mtime":1751792416.0,
# "url":"/api/download/f8e7d6c5"}, ...]
import requests, time
BASE = "http://127.0.0.1:8765"
# 1. 上传
r = requests.post(f"{BASE}/api/upload", files={"video": open("input.mp4","rb")})
vid = r.json()["video_id"]
# 2. 处理
r = requests.post(f"{BASE}/api/process/{vid}",
data={"gamma":1.0,"contrast":1.0,"temporalSmooth":0.3,
"edgePreserve":70,"fgBoost":0,"maxRes":960,"outFps":24})
tid = r.json()["task_id"]
# 3. 轮询
while True:
p = requests.get(f"{BASE}/api/progress/{tid}").json()
print(f"进度: {p.get('progress',0)}%")
if p["status"] == "done": break
time.sleep(2)
# 4. 下载
r = requests.get(f"{BASE}/api/download/{tid}")
with open("depth_output.mp4","wb") as f: f.write(r.content)
print("完成!")