视频编辑.md 17 KB

百炼平台视频编辑 - Python 调用指南

模型概览

通义万相视频编辑统一模型(vace)支持多种视频编辑功能:

功能 说明
多图参考 参考多张图像(主体与背景),生成连贯的视频内容
视频重绘 提取视频特征(动作、构图等),结合提示词生成新视频
局部编辑 对视频指定区域进行增加、修改或删除元素
视频延展 基于图像或视频生成延续性内容,延长至5秒
视频画面扩展 对视频在上、下、左、右四个方向按比例扩展

模型名称: wan2.1-vace-plus

处理耗时: 约5-10分钟(具体耗时受限于排队任务数量和服务执行情况)

前提条件

  • 已获取并配置 API Key
  • 将 API Key 配置到环境变量 DASHSCOPE_API_KEY
  • 安装 requests 库:pip install requests

Python 调用示例

由于视频编辑模型处理时间较长,仅支持异步获取模型结果。需要发起两个请求:创建任务获取任务ID,然后根据任务ID查询结果。

1. 多图参考

参考多张图像(主体与背景),生成连贯的视频内容。

import os
import requests
import time

# 配置API Key
api_key = os.getenv("DASHSCOPE_API_KEY")
base_url = "https://dashscope-intl.aliyuncs.com/api/v1"  # 新加坡地域
# 如果使用北京地域,替换为:https://dashscope.aliyuncs.com/api/v1

headers = {
    "Authorization": f"Bearer {api_key}",
    "Content-Type": "application/json",
    "X-DashScope-Async": "enable"
}

# 步骤1:创建任务
create_url = f"{base_url}/services/aigc/video-generation/video-synthesis"
payload = {
    "model": "wan2.1-vace-plus",
    "input": {
        "function": "image_reference",
        "prompt": "视频中,一位女孩自晨雾缭绕的古老森林深处款款走出,她步伐轻盈,镜头捕捉她每一个灵动瞬间。当她站定,环顾四周葱郁林木时,她脸上绽放出惊喜与喜悦交织的笑容。这一幕,定格在了光影交错的瞬间,记录下她与大自然的美妙邂逅。",
        "ref_images_url": [
            "http://wanx.alicdn.com/material/20250318/image_reference_2_5_16.png",
            "http://wanx.alicdn.com/material/20250318/image_reference_1_5_16.png"
        ]
    },
    "parameters": {
        "prompt_extend": True,
        "obj_or_bg": ["obj", "bg"],
        "size": "1280*720"
    }
}

response = requests.post(create_url, headers=headers, json=payload)
result = response.json()
print("创建任务响应:", result)

if response.status_code == 200 and "output" in result:
    task_id = result["output"]["task_id"]
    print(f"任务ID: {task_id}")
    
    # 步骤2:轮询查询任务结果
    query_url = f"{base_url}/tasks/{task_id}"
    
    while True:
        time.sleep(30)  # 每30秒查询一次
        query_response = requests.get(query_url, headers={"Authorization": f"Bearer {api_key}"})
        query_result = query_response.json()
        
        task_status = query_result["output"]["task_status"]
        print(f"任务状态: {task_status}")
        
        if task_status == "SUCCEEDED":
            video_url = query_result["output"]["video_url"]
            print(f"视频生成成功!URL: {video_url}")
            break
        elif task_status == "FAILED":
            print(f"任务失败: {query_result['output'].get('message', '未知错误')}")
            break
else:
    print(f"创建任务失败: {result}")

2. 视频重绘

提取视频特征(动作、构图等),结合提示词生成新视频。

import os
import requests
import time

api_key = os.getenv("DASHSCOPE_API_KEY")
base_url = "https://dashscope-intl.aliyuncs.com/api/v1"

headers = {
    "Authorization": f"Bearer {api_key}",
    "Content-Type": "application/json",
    "X-DashScope-Async": "enable"
}

# 创建任务
create_url = f"{base_url}/services/aigc/video-generation/video-synthesis"
payload = {
    "model": "wan2.1-vace-plus",
    "input": {
        "function": "video_repainting",
        "prompt": "视频展示了一辆黑色的蒸汽朋克风格汽车,绅士驾驶着,车辆装饰着齿轮和铜管。背景是蒸汽驱动的糖果工厂和复古元素,画面复古与趣味。",
        "video_url": "http://wanx.alicdn.com/material/20250318/video_repainting_1.mp4"
    },
    "parameters": {
        "prompt_extend": False,
        "control_condition": "depth"
    }
}

response = requests.post(create_url, headers=headers, json=payload)
result = response.json()

if response.status_code == 200 and "output" in result:
    task_id = result["output"]["task_id"]
    print(f"任务ID: {task_id}")
    
    # 轮询查询结果
    query_url = f"{base_url}/tasks/{task_id}"
    while True:
        time.sleep(30)
        query_response = requests.get(query_url, headers={"Authorization": f"Bearer {api_key}"})
        query_result = query_response.json()
        
        task_status = query_result["output"]["task_status"]
        print(f"任务状态: {task_status}")
        
        if task_status == "SUCCEEDED":
            video_url = query_result["output"]["video_url"]
            print(f"视频生成成功!URL: {video_url}")
            break
        elif task_status == "FAILED":
            print(f"任务失败: {query_result['output'].get('message', '未知错误')}")
            break

3. 局部编辑

对视频指定区域进行增加、修改或删除元素。

import os
import requests
import time

api_key = os.getenv("DASHSCOPE_API_KEY")
base_url = "https://dashscope-intl.aliyuncs.com/api/v1"

headers = {
    "Authorization": f"Bearer {api_key}",
    "Content-Type": "application/json",
    "X-DashScope-Async": "enable"
}

# 创建任务
create_url = f"{base_url}/services/aigc/video-generation/video-synthesis"
payload = {
    "model": "wan2.1-vace-plus",
    "input": {
        "function": "video_edit",
        "prompt": "视频展示了一家巴黎风情的法式咖啡馆,一只穿着西装的狮子优雅地品着咖啡。它一手端着咖啡杯,轻轻啜饮,神情惬意。咖啡馆装饰雅致,柔和的色调与温暖灯光映照着狮子所在的区域。",
        "mask_image_url": "http://wanx.alicdn.com/material/20250318/video_edit_1_mask.png",
        "video_url": "http://wanx.alicdn.com/material/20250318/video_edit_2.mp4",
        "mask_frame_id": 1
    },
    "parameters": {
        "prompt_extend": False,
        "mask_type": "tracking",
        "expand_ratio": 0.05
    }
}

response = requests.post(create_url, headers=headers, json=payload)
result = response.json()

if response.status_code == 200 and "output" in result:
    task_id = result["output"]["task_id"]
    print(f"任务ID: {task_id}")
    
    # 轮询查询结果
    query_url = f"{base_url}/tasks/{task_id}"
    while True:
        time.sleep(30)
        query_response = requests.get(query_url, headers={"Authorization": f"Bearer {api_key}"})
        query_result = query_response.json()
        
        task_status = query_result["output"]["task_status"]
        print(f"任务状态: {task_status}")
        
        if task_status == "SUCCEEDED":
            video_url = query_result["output"]["video_url"]
            print(f"视频生成成功!URL: {video_url}")
            break
        elif task_status == "FAILED":
            print(f"任务失败: {query_result['output'].get('message', '未知错误')}")
            break

4. 视频延展

基于图像或视频生成延续性内容,延长至5秒。

import os
import requests
import time

api_key = os.getenv("DASHSCOPE_API_KEY")
base_url = "https://dashscope-intl.aliyuncs.com/api/v1"

headers = {
    "Authorization": f"Bearer {api_key}",
    "Content-Type": "application/json",
    "X-DashScope-Async": "enable"
}

# 创建任务
create_url = f"{base_url}/services/aigc/video-generation/video-synthesis"
payload = {
    "model": "wan2.1-vace-plus",
    "input": {
        "function": "video_extension",
        "prompt": "一只戴着墨镜的狗在街道上滑滑板,3D卡通。",
        "first_clip_url": "http://wanx.alicdn.com/material/20250318/video_extension_1.mp4"
    },
    "parameters": {
        "prompt_extend": False
    }
}

response = requests.post(create_url, headers=headers, json=payload)
result = response.json()

if response.status_code == 200 and "output" in result:
    task_id = result["output"]["task_id"]
    print(f"任务ID: {task_id}")
    
    # 轮询查询结果
    query_url = f"{base_url}/tasks/{task_id}"
    while True:
        time.sleep(30)
        query_response = requests.get(query_url, headers={"Authorization": f"Bearer {api_key}"})
        query_result = query_response.json()
        
        task_status = query_result["output"]["task_status"]
        print(f"任务状态: {task_status}")
        
        if task_status == "SUCCEEDED":
            video_url = query_result["output"]["video_url"]
            print(f"视频生成成功!URL: {video_url}")
            break
        elif task_status == "FAILED":
            print(f"任务失败: {query_result['output'].get('message', '未知错误')}")
            break

5. 视频画面扩展

对视频在上、下、左、右四个方向按比例扩展。

import os
import requests
import time

api_key = os.getenv("DASHSCOPE_API_KEY")
base_url = "https://dashscope-intl.aliyuncs.com/api/v1"

headers = {
    "Authorization": f"Bearer {api_key}",
    "Content-Type": "application/json",
    "X-DashScope-Async": "enable"
}

# 创建任务
create_url = f"{base_url}/services/aigc/video-generation/video-synthesis"
payload = {
    "model": "wan2.1-vace-plus",
    "input": {
        "function": "video_outpainting",
        "prompt": "一位优雅的女士正在激情演奏小提琴,她身后是一支完整的交响乐团。",
        "video_url": "http://wanx.alicdn.com/material/20250318/video_outpainting_1.mp4"
    },
    "parameters": {
        "prompt_extend": False,
        "top_scale": 1.5,
        "bottom_scale": 1.5,
        "left_scale": 1.5,
        "right_scale": 1.5
    }
}

response = requests.post(create_url, headers=headers, json=payload)
result = response.json()

if response.status_code == 200 and "output" in result:
    task_id = result["output"]["task_id"]
    print(f"任务ID: {task_id}")
    
    # 轮询查询结果
    query_url = f"{base_url}/tasks/{task_id}"
    while True:
        time.sleep(30)
        query_response = requests.get(query_url, headers={"Authorization": f"Bearer {api_key}"})
        query_result = query_response.json()
        
        task_status = query_result["output"]["task_status"]
        print(f"任务状态: {task_status}")
        
        if task_status == "SUCCEEDED":
            video_url = query_result["output"]["video_url"]
            print(f"视频生成成功!URL: {video_url}")
            break
        elif task_status == "FAILED":
            print(f"任务失败: {query_result['output'].get('message', '未知错误')}")
            break

参数说明

通用参数

参数 类型 必选 说明
model string 模型名称,固定为 wan2.1-vace-plus
input.function string 功能名称
- image_reference:多图参考
- video_repainting:视频重绘
- video_edit:局部编辑
- video_extension:视频延展
- video_outpainting:视频画面扩展
input.prompt string 提示词,描述期望生成的视频内容
长度不超过800字符
parameters.prompt_extend bool 是否开启prompt智能改写
- true:默认值,开启
- false:关闭(推荐)
parameters.seed integer 随机数种子,范围[0, 2147483647]
parameters.watermark bool 是否添加"AI生成"水印
- false:默认值,不添加
- true:添加

多图参考特有参数

参数 类型 必选 说明
input.ref_images_url array[string] 参考图像URL数组,支持1-3张图像
parameters.obj_or_bg array[string] 标识每张图像的用途
- obj:主体参考
- bg:背景参考(最多1个)
长度必须与ref_images_url一致
parameters.size string 视频分辨率
- 1280*720(默认,16:9)
- 720*1280(9:16)
- 960*960(1:1)
- 832*1088(3:4)
- 1088*832(4:3)

视频重绘特有参数

参数 类型 必选 说明
input.video_url string 输入视频URL,长度不超过5秒
input.ref_images_url array[string] 参考图像URL数组,仅支持1张
parameters.control_condition string 视频特征提取方式
- posebodyface:提取脸部表情和肢体动作
- posebody:提取肢体动作(不含脸部)
- depth:提取构图和运动轮廓
- scribble:提取线稿结构
parameters.strength float 控制强度,范围[0.0, 1.0],默认1.0

局部编辑特有参数

参数 类型 必选 说明
input.video_url string 输入视频URL,长度不超过5秒
input.mask_image_url string 掩码图像URL(白色区域为编辑区域)
input.mask_frame_id integer 掩码目标所在帧ID,默认为1(首帧)
input.mask_video_url string 掩码视频URL(与mask_image_url二选一)
input.ref_images_url array[string] 参考图像URL数组,仅支持1张
parameters.mask_type string 编辑区域行为方式
- tracking:默认值,动态跟随
- fixed:固定不变
parameters.expand_ratio float 掩码区域扩展比例,范围[0.0, 1.0],默认0.05
parameters.expand_mode string 掩码区域形状
- hull:默认值,多边形
- bbox:矩形
- original:原始形状

视频延展特有参数

参数 类型 必选 说明
input.first_frame_url string 首帧图像URL
input.last_frame_url string 尾帧图像URL
input.first_clip_url string 首段视频URL,长度不超过3秒
input.last_clip_url string 尾段视频URL,长度不超过3秒
input.video_url string 参考视频URL,用于提取运动特征
parameters.control_condition string 视频特征提取方式(使用video_url时必选)
- posebodyface:提取脸部表情和肢体动作
- depth:提取构图和运动轮廓

视频画面扩展特有参数

参数 类型 必选 说明
input.video_url string 输入视频URL,长度不超过5秒
parameters.top_scale float 向上扩展比例,范围[1.0, 2.0],默认1.0
parameters.bottom_scale float 向下扩展比例,范围[1.0, 2.0],默认1.0
parameters.left_scale float 向左扩展比例,范围[1.0, 2.0],默认1.0
parameters.right_scale float 向右扩展比例,范围[1.0, 2.0],默认1.0

响应参数

创建任务响应

{
    "output": {
        "task_status": "PENDING",
        "task_id": "0385dc79-5ff8-4d82-bcb6-xxxxxx"
    },
    "request_id": "4909100c-7b5a-9f92-bfe5-xxxxxx"
}

查询任务成功响应

{
    "request_id": "851985d0-fbba-9d8d-a17a-xxxxxx",
    "output": {
        "task_id": "208e2fd1-fcb4-4adf-9fcc-xxxxxx",
        "task_status": "SUCCEEDED",
        "submit_time": "2025-05-15 16:14:44.723",
        "scheduled_time": "2025-05-15 16:14:44.750",
        "end_time": "2025-05-15 16:20:09.389",
        "video_url": "https://dashscope-result-wlcb.oss-cn-wulanchabu.aliyuncs.com/xxx.mp4?xxxxxx",
        "orig_prompt": "视频中,一位女孩自晨雾缭绕的古老森林深处款款走出...",
        "actual_prompt": "一位身着浅色长裙的女孩从晨雾缭绕的古老森林深处缓缓走出..."
    },
    "usage": {
        "video_duration": 5,
        "video_ratio": "standard",
        "video_count": 1
    }
}

重要提示

  1. 视频URL有效期:生成的视频URL有效期为24小时,请及时下载保存
  2. 任务查询有效期:task_id查询有效期为24小时,超时后无法查询
  3. 处理耗时:约5-10分钟,具体耗时受限于排队任务数量和服务执行情况
  4. 地域选择:新加坡和北京地域的API Key不同,请注意区分
  5. 视频时长:输出视频时长固定为5秒(视频延展功能)
  6. 输入视频限制
    • 格式:MP4
    • 帧率:≥16FPS
    • 大小:不超过50MB
    • 长度:不超过5秒(超过则取前5秒)
  7. 图像限制
    • 格式:JPG、JPEG、PNG、BMP、TIFF、WEBP
    • 分辨率:宽高范围[360, 2000]像素
    • 大小:不超过10MB

域名白名单配置

如果您的业务对安全性要求较高,需要配置外网访问白名单,请将以下OSS域名添加到白名单:

dashscope-result-bj.oss-cn-beijing.aliyuncs.com
dashscope-result-hz.oss-cn-hangzhou.aliyuncs.com
dashscope-result-sh.oss-cn-shanghai.aliyuncs.com
dashscope-result-wlcb.oss-cn-wulanchabu.aliyuncs.com
dashscope-result-zjk.oss-cn-zhangjiakou.aliyuncs.com
dashscope-result-sz.oss-cn-shenzhen.aliyuncs.com
dashscope-result-hy.oss-cn-heyuan.aliyuncs.com
dashscope-result-cd.oss-cn-chengdu.aliyuncs.com
dashscope-result-gz.oss-cn-guangzhou.aliyuncs.com
dashscope-result-wlcb-acdr-1.oss-cn-wulanchabu-acdr-1.aliyuncs.com

参考文档