媒体处理 视频重制接入

视频换脸换人功能基于腾讯云媒体处理服务(MPS)的视频二次创作能力,通过 AI 模型实现视频中人脸替换和全身换人。该功能广泛应用于影视后期、虚拟数字人、短视频创意制作、广告创意等场景。

相关产品
媒体处理 产品页,含版本规格、价格与购买入口。

二、功能说明

功能 说明 效果示意 计费说明
AI 换脸 替换视频中指定人脸,支持多人物、多参考图,保留身体动作与服装。  收取“视频重制 – AI 换脸”费用。
AI 换人 替换视频中人物的整体形象,包含体型、服装等全身特征  收取“视频重制 – AI 换人”费用。
画中画 将原视频缩小嵌入 AI 生成的背景中。  收取“视频重制 – 画面调整”费用。
背景扩展 在视频中插入扩展背景画面。  
垂直填充 竖屏填充,为横屏视频生成上下补充内容。  
水平填充 横屏填充,为竖屏视频生成左右补充内容。  

详细定价可参考 计费说明文档。

三、使用限制

模式 限制
AI 换脸 视频时长建议 ≤ 20 分钟;分辨率 ≤ 1920×1920;单张图片 < 10M,支持 jpg/png,分辨率 ≤ 4K。
AI 换人 视频时长 ≤ 20 分钟;图片大小 ≤ 5M;需正面全身照。

注意:说明:

四、接入准备

1. 腾讯云账号注册/登录。

2. 登录 MPS 控制台,开启服务并完成服务角色授权。

3. 准备 COS 存储桶用于存放输入文件和输出结果。

具体指引请参考 快速入门。账号授权问题可参考 账号授权 文档。

六、使用 API 发起

调用 ProcessMedia 接口。

七、核心参数

参数 类型 说明
InputInfo object 输入文件信息,支持 COS 或 URL。
OutputStorage object 输出存储配置(COS)。
OutputDir string 输出目录路径。
AiAnalysisTask.Definition int 固定填 29。
AiAnalysisTask.ExtendedParameter string 扩展参数 JSON 字符串(需转义)。

八、请求示例(AI 换脸)

{ "InputInfo": { "Type": "URL", "UrlInputInfo": { "Url": "https://your-bucket.cos.ap-guangzhou.myqcloud.com/input/video.mp4" } }, "OutputStorage": { "Type": "COS", "CosOutputStorage": { "Bucket": "your-bucket", "Region": "ap-guangzhou" } }, "OutputDir": "/output/", "AiAnalysisTask": { "Definition": 29, "ExtendedParameter": "{\\"vremake\\":{\\"mode\\":\\"SwapFaceV2\\",\\"swapFaceV2\\":{\\"srcFaces\\":[[\\"https://your-bucket.cos…/p1_ref1.jpg\\",\\"https://your-bucket.cos…/p1_ref2.jpg\\"],[\\"https://your-bucket.cos…/p2_ref1.jpg\\"]],\\"dstFaces\\":[\\"https://your-bucket.cos…/p1_dst.jpg\\",\\"https://your-bucket.cos…/p2_dst.jpg\\"]}}}" }}

注意:说明:

注意:ExtendedParameter 需要对 JSON 字符串进行转义。

十、事件通知回调

发起任务时通过 TaskNotifyConfig 参数配置事件回调,任务完成后系统会主动推送结果。可通过 ParseNotification 解析回调内容。

十一、接口查询

调用 DescribeTaskDetail 接口,传入发起任务时返回的 TaskId,解析 WorkflowTask.AiAnalysisResultSet 字段获取输出结果。

十二、任务结果关键字段

AiAnalysisResultSet[0].VideoRemakeTask.Output.Path → 输出视频路径AiAnalysisResultSet[0].VideoRemakeTask.Output.OutputStorage → 输出存储信息

十三、ExtendedParameter 扩展参数说明

指定不同重制功能,以及配置对应参数,需通过 ExtendedParameter 传入,顶层结构为:

{ "vremake": { "mode": "<模式名>", "<模式参数对象>": { … } }}

功能 mode 值
AI 换脸 SwapFaceV2
AI 换人 SwapCharacter
画中画 PicInPic
背景扩展 BackgroundExtend
垂直填充 VerticalExtend
水平填充 HorizontalExtend

十四、AI 换脸(SwapFaceV2)- 一站式自动处理模式

针对整段输入视频,一站式自动化完成 切镜 → 人脸追踪 → 换脸合成 → 整片拼接,输出最终换脸视频。ExtendedParameter 扩展参数示例:

{ "vremake": { "mode": "SwapFaceV2", "swapFaceV2": { "srcFaces": [ ["<人物1参考图1>", "<人物1参考图2>"], ["<人物2参考图1>"] ], "dstFaces": [ "<人物1目标脸>", "<人物2目标脸>" ] } }}

参数 必选 类型 说明
srcFaces 是 string[][] 视频中需要被替换的人物列表。外层下标对应一个人物,内层是该人物的全部参考图(不同角度/表情)。每人至少 1 张,单图 < 10M。
dstFaces 是 string[] 目标人脸图 URL 列表,与 srcFaces 按人物一一对应,长度必须相等。每人 1 张,单图 < 10M。

注意:说明:

十五、中间产物与 project.json

一站式自动处理模式执行过程中,会将所有中间产物归档到用户 COS 输出目录下的 <成品文件名>_intermediates/ 目录。该目录中的 project.json 是整个项目的单一事实源,后续微调操作均基于此文件进行。

中间产物目录结构

<OutputDir>/├── <finalOutBase>.mp4 # 最终成品视频└── <finalOutBase>_intermediates/ ├── project.json # 项目描述文件(微调的核心依据) ├── scenes/ │ ├── scene_000.mp4 # 切镜后的分镜视频 │ ├── scene_001.mp4 │ └── … ├── masks/ │ ├── scene_000_face_0.mp4 # 各分镜的人脸轨迹 mask │ ├── scene_000_face_1.mp4 │ └── … └── swapped/ ├── scene_000.mp4 # 各分镜的换脸结果 ├── scene_001.mp4 └── …

project.json 结构

{ "faces": [ { "face_id": "face_0", "face_ref_urls": ["<人物0参考图1>", "<人物0参考图2>"], "face_dst_url": "<人物0目标脸>" } ], "scenes": [ { "video": "<分镜源视频URL>", "dst_video": "<分镜换脸结果URL>", "start_time": 0, "end_time": 5.32, "faces": [ { "face_id": "face_0", "face_ref_urls": ["<参考图URL>"], "face_dst_url": "<目标脸URL>", "face_mask_url": "<人脸轨迹mask视频URL>" } ] } ], "dst_video": "<最终成品视频URL>"}

关键字段说明:

字段 类型 说明
faces object[] 项目级人物列表,由入参 srcFaces/dstFaces 派生,按 face_<i> 编号。
scenes object[] 按镜头切片得到的分镜列表,数组顺序即拼接顺序。
scenes[i].video string 该分镜的源视频 URL。
scenes[i].dst_video string 该分镜换脸后的结果视频 URL。
scenes[i].start_time / end_time float 分镜在原始视频中的起止时间(秒)。
scenes[i].faces[j].face_mask_url string 该人物在本分镜的人脸轨迹 mask 视频,可人工微调后回写。
dst_video string 全部分镜拼接后的最终成品视频 URL。

注意:说明:

微调流程

基于 project.json,可以对任意分镜进行微调后重新生成:

SwapFaceV2(一把梭) │ 产出 project.json ▼对某个分镜重新追踪 → SwapFaceV2TrackFace │ 回写 face_mask_url ▼对某个分镜重新换脸 → SwapFaceV2SwapFace │ 回写 dst_video ▼重新拼接整片 → SwapFaceV2Concat │ 更新 project.dst_video ▼保存 project.json 到 COS 同一路径(幂等覆盖)

每次微调子任务完成后,将结果回写到 project.json 对应字段,并将整份 JSON 重新 PUT 回用户 COS 的同一路径。

十六、AI 换脸(SwapFaceV2)- 微调流程

基于一站式自动模式输出的 project.json,可以对任意分镜进行微调后重新生成:

SwapFaceV2(一把梭) │ 产出 project.json ▼对某个分镜重新追踪 → SwapFaceV2TrackFace │ 回写 face_mask_url ▼对某个分镜重新换脸 → SwapFaceV2SwapFace │ 回写 dst_video ▼重新拼接整片 → SwapFaceV2Concat │ 更新 project.dst_video ▼保存 project.json 到 COS 同一路径(幂等覆盖)

mode 用途 计费说明
SwapFaceV2TrackFace 仅追踪人脸(单分镜):输出人脸轨迹 mask。 收取“视频重制 – AI 换脸”费用。
SwapFaceV2SwapFace 仅换脸(单分镜):输入 mask + 目标脸,输出本分镜的换脸结果视频。 收取“视频重制 – AI 换脸”费用。
SwapFaceV2Concat 仅拼接:输入是多段视频 URL(videoUrls),按数组顺序统一分辨率和帧率拼接为最终成品视频。 收取“视频重制 – 画面调整”费用。

详细定价可参考 计费说明文档。

每次微调子任务完成后,系统会将结果回写到 project.json 对应字段,并将整份 JSON 重新 PUT 回用户 COS 的同一路径。

十七、SwapFaceV2TrackFace

仅追踪人脸(单分镜):输出人脸轨迹 mask。

{ "vremake": { "mode": "SwapFaceV2TrackFace", "swapFaceV2TrackFace": { "srcFaces": [ ["<人物1参考图1>", "<人物1参考图2>"], ["<人物2参考图1>"] ] } }}

输出为 JSON 文件,包含每个人物的 face_mask_url(人脸轨迹 mask 视频)。

十八、SwapFaceV2SwapFace

仅换脸(单分镜):输入 mask + 目标脸,输出本分镜的换脸结果视频。

{ "vremake": { "mode": "SwapFaceV2SwapFace", "swapFaceV2SwapFace": { "faces": [ { "face_id": "face_0", "mask_url": "<追踪输出的mask视频URL>", "dst_face_url": "<目标人脸图URL>" } ] } }}

十九、SwapFaceV2Concat

仅拼接:输入是多段视频 URL(videoUrls),按数组顺序统一分辨率和帧率拼接为最终成品视频。该模式常用于多次 SwapFaceV2SwapFace 单分镜微调后导出整片。

{ "vremake": { "mode": "SwapFaceV2Concat", "swapFaceV2Concat": { "videoUrls": [ "<分镜1换脸结果URL>", "<分镜2换脸结果URL>" ] } }}

注意:说明:

20、AI 换人(SwapCharacter)- 一站式自动处理模式

SwapCharacter 用一张目标人物照片替换视频中的人物(整个人,含身体与服装),保留原场景与运镜。对外可视为「切镜 → 逐分镜换人 → 整片拼接」的三阶段流水线:

{ "vremake": { "mode": "SwapCharacter", "swapCharacter": { "character": "<目标人物的正面全身图URL>" } }}

参数 必选 类型 说明
character 是 string 目标替换人物的 URL(正面全身照)。
templateId 否 string 模板 ID,现在默认,不支持其他模式。

21、中间产物与 project.json

为了支持“单分镜重跑”,SwapCharacter 一把梭模式在执行过程中会把中间产物归档到用户目标 COS 的一个中间产物目录下;其中 project.json 是整个项目的单一事实源(Single Source of Truth),微调页面直接基于它进行加载、展示与回写。

22、中间产物目录结构

中间产物目录与最终成品视频同级,位于任务级 OutputStorage + OutputDir 指定的用户 COS 路径下,目录名固定为 <finalOutBase>_intermediates(finalOutBase 是去掉扩展名后的成品文件名)。目录内布局如下:

<OutputDir>/├── <finalOutBase>.mp4 # 最终成品视频└── <finalOutBase>_intermediates/ ├── project.json # 整个项目的 project 快照 ├── scenes/ │ ├── scene_000.mp4 # 切镜后的第 0 个分镜(已转码为 24fps) │ ├── scene_001.mp4 │ └── … └── swapped/ ├── scene_000.mp4 # 第 0 个分镜的换人结果 ├── scene_001.mp4 └── …

注意事项:

·中间产物归档“尽力而为”:换人结果归档失败不会影响最终成品视频产出,此时对应分镜的 dst_video 为空。

·project.json 会在分镜确定后开始写入,并在每个分镜切片 / 换人完成后更新一次。任务成功时一定在任务回调上报前完成最终落盘(读到的一定是终态);任务失败时会留下半成品(未完成分镜的 dst_video 为空,整片 dst_video 为空);若任务在切镜之前就失败,则不会生成 project.json。

·project.json 中 scenes 和 dst_video 的 URL 都指向用户 COS;character 保存的是用户入参原值。

23、project.json 顶层结构

{ "character": "https://<user-cos>/…/person.png", "scenes": [ { "video": "https://<user-cos>/<intermediates>/scenes/scene_000.mp4", "dst_video": "https://<user-cos>/<intermediates>/swapped/scene_000.mp4", "start_time": 0, "end_time": 5.32 }, { "video": "https://<user-cos>/<intermediates>/scenes/scene_001.mp4", "dst_video": "https://<user-cos>/<intermediates>/swapped/scene_001.mp4", "start_time": 5.32, "end_time": 12.8 } ], "dst_video": "https://<user-cos>/<finalOutBase>.mp4"}

字段 类型 说明
character string 目标人物照片 URL,对应入参 swapCharacter.character。
scenes object[] 按镜头切片得到的分镜列表,数组顺序即拼接顺序,下标 idx 与 scenes/scene_<idx>.mp4 一一对应;元素结构参考下文分镜。
dst_video string 全部分镜换人并拼接后的最终成品视频 URL;任务未完成时为空。

24、分镜

project.scenes[i] 描述第 i 个分镜的输入与输出:

字段 类型 说明
video string 该分镜的源视频 URL(scenes/scene_<idx>.mp4),由切镜阶段切片后转存到用户 COS。
dst_video string 该分镜的换人结果视频 URL(swapped/scene_<idx>.mp4);该分镜未完成或归档失败时为空。
start_time float 该分镜在原始整片中的起始时间(秒),便于在总时间轴上定位。
end_time float 该分镜在原始整片中的结束时间(秒)。

25、AI 换人(SwapCharacter)- 微调流程的关系

project.json 是 SwapCharacter(一把梭)与 SwapCharacterSwapScene / SwapCharacterConcat(分阶段子任务)之间的桥梁:

SwapCharacter 一把梭 │ 产出 ▼<intermediates>/project.json ◄────── 微调页面加载 │ │ 对某个 scene 重新换人 ▼SwapCharacterSwapScene(输入 scene.video + project.character) │ 回写 scene.dst_video ▼SwapCharacterConcat(输入按顺序排列的 scenes[i].dst_video,缺失时用 scenes[i].video;音频源 project.dst_video) │ 产出最终整片 ▼回写 project.dst_video 并保存 project.json

每次微调子任务完成后,调用方应把结果回写到内存中的 project 对象,并在保存时把整份 JSON 重新 PUT 回用户 COS 的同一路径,实现幂等覆盖。

26、仅换人(SwapCharacterSwapScene,单分镜)

输入是“单个分镜视频”(任务级 InputInfo)+ 目标人物照片 character,输出本分镜的换人结果视频。

该模式不切镜、不拼接,也不依赖任何上游 project 文件,所有信息都通过入参显式给出,常用于微调页对某个分镜单独重跑。

{ "vremake": { "mode": "SwapCharacterSwapScene", "swapCharacterSwapScene": { "character": "https://ie-mps-1258344699.cos.ap-nanjing.tencentcos.cn/test/person.png" } }}

27、仅拼接(SwapCharacterConcat)

输入是若干视频 URL(videoUrls),按数组顺序统一分辨率/帧率拼接为最终成品视频。

该模式不调任何外部换人服务,也不做内容审核,常用于多次 SwapCharacterSwapScene 单分镜微调后导出整片。行为与 SwapFaceV2Concat 完全一致。

可选地,调用方可以通过任务级 InputInfo(URL 或 COS 输入)指定一个外部音频源:拼接时丢弃各分片自带音频,统一以该源音频作为输出音轨。推荐传入上一版整片:其音轨连续完整,能规避短分片在边界处拼接产生的卡顿。

说明:

·当 InputInfo 指向的资源与 videoUrls 中某一项完全相同时,会复用同一份本地副本,不会重复下载。

·当 InputInfo 未指定或下载失败时,自动退化为“拼接各分片自带音频”,不会阻断主流程。

{ "vremake": { "mode": "SwapCharacterConcat", "swapCharacterConcat": { "videoUrls": [ "https://<user-cos>/<intermediates>/swapped/scene_000.mp4", "https://<user-cos>/<intermediates>/swapped/scene_001.mp4", "https://<user-cos>/<intermediates>/scenes/scene_002.mp4" ] } }}

29、画中画(PicInPic)

{ "vremake": { "mode": "PicInPic", "picInPic": { "llmPrompt": "生成一张科技感背景图片" } }}

参数 必选 类型 说明
llmVideoPrompt 二选一 string 生成背景视频的提示词。
llmPrompt 二选一 string 生成背景图片的提示词。
randomMove 否 bool 是否随机移动,默认 false。
frontRect 否 Rect 上层视频的位置与大小(x/y 默认居中,width/height 默认 0.5)。

30、背景扩展(BackgroundExtend)

{ "vremake": { "mode": "BackgroundExtend", "backgroundExtend": { "minSceneSecs": 2.0 } }}

参数 必选 类型 说明
minSceneSecs 否 float 插入扩展画面的最小间隔(秒),默认2.0。

31、垂直填充(VerticalExtend)

{ "vremake": { "mode": "VerticalExtend", "verticalExtend": { "llmVideoPrompt": "生成一段自然风景视频" } }}

参数 必选 类型 说明
llmVideoPrompt 否 string 生成填充视频的提示词,默认"随机生成一个视频"。

32、水平填充(HorizontalExtend)

{ "vremake": { "mode": "HorizontalExtend", "horizontalExtend": { "llmVideoPrompt": "生成一段城市街景视频" } }}

参数 必选 类型 说明
llmVideoPrompt 否 string 生成填充视频的提示词,默认"随机生成一个视频"。
赞 (0)
上一篇 4天前
下一篇 4天前