Novita AI 上的 Wan 2.7 VideoEdit API:如何用 AI 编辑视频

Novita AI 上的 Wan 2.7 VideoEdit API:如何用 AI 编辑视频

Novita AI 上的 Wan 2.7 VideoEdit 是当您已有素材,希望模型重新设计风格或重写场景,而无需从头重建运动时的正确端点。您将源视频提交到 POST https://api.novita.ai/v3/async/wan2.7-videoedit,获得一个 task_id,然后轮询 GET /v3/async/task-result,直到编辑后的剪辑准备就绪。本指南展示了确切的请求结构、何时添加参考图片,以及在将其集成到生产环境之前需要注意的实现细节。

何时使用 Wan 2.7 VideoEdit

当您的源剪辑中的时间和摄像机运动已经足够好,并且您希望 AI 改变观看者看到的内容,而不是调整镜头构图时,请使用 Wan 2.7 VideoEdit。

典型适用场景:

  • 您有一个实景片段,希望将其转换为动漫、电影或风格化的渲染效果。
  • 您需要更改服装、环境、道具或氛围,同时保留原始运动轨迹。
  • 您希望对素材应用基于提示的转换,并可选择使用参考图片来固定视觉风格。

不适用于以下场景:

  • 您需要仅从文本生成全新的运动。请改用 Wan 2.7 T2V。
  • 您希望为静态图像制作动画。请改用 Wan 2.7 I2V。
  • 您需要在生成的场景中通过命名参考槽进行多角色扮演。请改用 Wan 2.7 R2V。

这种区别很重要,因为 VideoEdit 是从输入片段开始的。如果原始运动不正确,模型不会为您修复编排。

已验证的端点和工作流程

Novita AI 上的 Wan 2.7 VideoEdit 使用一个提交端点和共享的异步任务结果端点:

字段
提交端点 POST https://api.novita.ai/v3/async/wan2.7-videoedit
结果轮询 GET https://api.novita.ai/v3/async/task-result?task_id=<id>
认证头 Authorization: Bearer $NOVITA_API_KEY
内容类型 application/json
官方文档 Wan 2.7 VideoEdit API 参考

该 API 是异步的。成功的提交调用会返回一个 task_id,而不是完成的视频 URL。您的应用程序应持久化该任务 ID,并围绕它构建轮询或后台作业逻辑。

第一步:获取 Novita AI API 密钥

Novita AI 密钥管理 创建一个密钥,并将其保存在环境变量中:

export NOVITA_API_KEY="your_api_key_here"

不要将密钥硬编码在浏览器代码、移动应用或已签入的配置文件中。

第二步:理解请求结构

Wan 2.7 VideoEdit 使用扁平的 JSON 请求体。请求不会将字段嵌套在 inputparameters 下。

至少需要发送:

  • video_url
  • prompt

您通常首先关心的可选字段包括:

  • reference_image_url:用于外观/风格参考
  • resolution
  • duration
  • audio_setting
  • prompt_extend
  • seed

第三步:提交您的第一个 VideoEdit 请求

这是最小的实用请求:

curl -s -X POST https://api.novita.ai/v3/async/wan2.7-videoedit \
  -H "Authorization: Bearer $NOVITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "video_url": "https://example.com/source-clip.mp4",
    "prompt": "Turn this office hallway scene into a neon cyberpunk corridor, preserve the walking motion and camera path",
    "resolution": "720P",
    "duration": 5
  }'

预期响应:

{
  "task_id": "abc123..."
}

提交时不会保证其他任何内容。将请求视为一个作业入队步骤,而不是同步编辑响应。

第四步:轮询任务结果端点

使用返回的 task_id 调用共享的任务结果 API:

curl -s "https://api.novita.ai/v3/async/task-result?task_id=abc123..." \
  -H "Authorization: Bearer $NOVITA_API_KEY"

围绕这些状态构建逻辑:

状态 含义
TASK_STATUS_QUEUED 已接受,等待执行
TASK_STATUS_PROCESSING 编辑进行中
TASK_STATUS_SUCCEED 编辑后的视频已就绪
TASK_STATUS_FAILED 任务失败;检查响应体

当任务成功时,响应中包含一个 videos 数组,其中包含编辑后的输出 URL 和 URL TTL。请及时下载或移动该资源,不要将托管 URL 视为永久存储。

第五步:当需要更精细的视觉控制时添加参考图片

reference_image_url 是可选的,但它能以有用的方式改变编辑行为。

在以下情况下使用它:

  • 您希望最终片段遵循特定的角色外观、服装或调色板。
  • 您希望将输出引导到特定的艺术方向,而不是完全依赖文本提示。
  • 源视频的运动是正确的,但仅靠文本提示的场景风格过于松散。

带有参考图片的请求示例:

curl -s -X POST https://api.novita.ai/v3/async/wan2.7-videoedit \
  -H "Authorization: Bearer $NOVITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "video_url": "https://example.com/source-clip.mp4",
    "reference_image_url": "https://example.com/reference-look.png",
    "prompt": "Transform the performer into the look and color palette of the reference image while keeping the same dance timing",
    "resolution": "1080P",
    "duration": 6,
    "audio_setting": "auto"
  }'

如果结果持续偏离,通常的解决方法不是更长的提示,而是更精确的提示加上更好的参考图片。

您真正需要关注的关键参数

参数 类型 必需 作用
video_url string 要编辑的源视频
prompt string 描述目标转换
reference_image_url string 用于外观和风格锚定的参考图片
resolution string 输出分辨率,文档中包括 720P1080P
duration integer 目标输出时长(秒);0 表示保留完整输入视频长度
audio_setting string 控制音频生成行为
prompt_extend boolean 允许模型自动扩展简短提示
seed integer 提高跨重试的可复现性

在假设默认值之前,请查看 官方参数参考。视频模型字段的变化频率高于文本模型字段,如果依赖记忆,输出约束很容易出错。

文档中的限制和实际约束

截至 2026 年 7 月 29 日,Novita 官方文档中 Wan 2.7 VideoEdit 记录了以下边界:

  • 支持的分辨率:720P1080P
  • duration 默认为 0,表示完整输入视频长度;当您设置时,文档中明确的输出时长范围为 2 到 10 秒
  • 输入视频格式:mp4mov
  • 输入视频大小限制:最大 100 MB
  • 参考图片格式:jpgjpegpngwebp
  • 参考图片大小限制:最大 20 MB
  • 输出视频格式:mp4

在构建通用媒体管道时,这些约束很容易被忽略。最常见的集成失败是发送了比端点接受范围更长或更大的源文件。

两个实际影响:

  1. 如果您希望编辑后的片段保留源长度,请省略 duration 或将其设置为 0,而不是强制裁剪到 2-10 秒。
  2. 如果您快速测试提示,请先使用 720P,只有在转换效果满意后再切换到 1080P

Python 示例:提交和轮询

import os
import time
import requests

API_KEY = os.environ["NOVITA_API_KEY"]
BASE_URL = "https://api.novita.ai"
HEADERS = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json",
}


def submit_video_edit(
    video_url: str,
    prompt: str,
    reference_image_url: str | None = None,
    resolution: str = "720P",
    duration: int = 0,
    audio_setting: str = "auto",
    prompt_extend: bool = True,
    seed: int | None = None,
) -> str:
    payload = {
        "video_url": video_url,
        "prompt": prompt,
        "resolution": resolution,
        "duration": duration,
        "audio_setting": audio_setting,
        "prompt_extend": prompt_extend,
    }
    if reference_image_url:
        payload["reference_image_url"] = reference_image_url
    if seed is not None:
        payload["seed"] = seed

    resp = requests.post(
        f"{BASE_URL}/v3/async/wan2.7-videoedit",
        headers=HEADERS,
        json=payload,
        timeout=60,
    )
    resp.raise_for_status()
    return resp.json()["task_id"]


def poll_result(task_id: str, interval: int = 5, timeout: int = 300) -> dict:
    deadline = time.time() + timeout
    while time.time() < deadline:
        resp = requests.get(
            f"{BASE_URL}/v3/async/task-result",
            headers=HEADERS,
            params={"task_id": task_id},
            timeout=60,
        )
        resp.raise_for_status()
        data = resp.json()
        status = data.get("task", {}).get("status")

        if status == "TASK_STATUS_SUCCEED":
            return data
        if status == "TASK_STATUS_FAILED":
            reason = data.get("task", {}).get("reason", "unknown")
            raise RuntimeError(f"Task {task_id} failed: {reason}")

        time.sleep(interval)

    raise TimeoutError(f"Task {task_id} did not complete within {timeout}s")


if __name__ == "__main__":
    task_id = submit_video_edit(
        video_url="https://example.com/source-clip.mp4",
        prompt="Change the street scene into a rainy retro-futurist city at night, preserve the original tracking shot",
        reference_image_url="https://example.com/reference-frame.png",
        resolution="720P",
        duration=0,
        seed=42,
    )
    print(f"Submitted task: {task_id}")

    result = poll_result(task_id)
    video = result["videos"][0]
    print("Edited video URL:", video["video_url"])
    print("URL TTL:", video["video_url_ttl"])

cURL 示例与 Shell 轮询

TASK_ID=$(curl -s -X POST https://api.novita.ai/v3/async/wan2.7-videoedit \
  -H "Authorization: Bearer $NOVITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "video_url": "https://example.com/source-clip.mp4",
    "prompt": "Convert the clip into a hand-drawn anime city scene, preserve the running motion",
    "resolution": "720P",
    "duration": 0,
    "prompt_extend": true
  }' | jq -r '.task_id')

while true; do
  RESULT=$(curl -s "https://api.novita.ai/v3/async/task-result?task_id=$TASK_ID" \
    -H "Authorization: Bearer $NOVITA_API_KEY")
  STATUS=$(echo "$RESULT" | jq -r '.task.status')

  if [ "$STATUS" = "TASK_STATUS_SUCCEED" ]; then
    echo "$RESULT" | jq -r '.videos[0].video_url'
    break
  fi

  if [ "$STATUS" = "TASK_STATUS_FAILED" ]; then
    echo "$RESULT"
    break
  fi

  sleep 5
done

如果您从后端服务集成,请将此轮询循环包装在 worker 中,而不是在用户请求期间保持打开整个生成窗口。

定价、积分以及估算成本前需要验证的内容

Novita AI 在其模型和定价页面上展示了视频模型的定价,但这些数字可能会变化。对于 Wan 2.7 VideoEdit,在发布面向客户的成本估算之前,请直接从 Novita AI 定价页面 和官方文档中链接的模型条目验证当前费率。

对于工程规划,更安全的假设是:

  • 成本随生成的剪辑设置而变化,而不仅仅是单次请求费用。
  • 1080P 运行不适合作为迭代基准。
  • 较短的剪辑更容易验证,调试成本也更低。

如果您正在构建内部工具,请将定价查找视为配置问题,而不是嵌入在代码中的常量。

常见的集成错误

发送原始上传而不是可访问的 URL。 文档中请求结构期望基于 URL 的媒体输入。请确保您的源剪辑已存在于一个您的服务器可以引用的稳定 URL。

将 VideoEdit 用于运动更改。 VideoEdit 是转换端点,而不是编排端点。如果原始运动不正确,请使用 T2V 或 I2V 重新生成。

混淆源视频和参考图片的限制。 源视频是较大的资源:mp4/mov,最大 100 MB。较小的 20 MB 限制适用于 reference_image_url,而不是 video_url

轮询过于频繁。 对于多秒的视频任务,每秒调用一次任务结果端点是不必要的。5-10 秒的间隔通常是更好的起点。

忽略 URL TTL。 结果 URL 是临时的。如果编辑后的剪辑对下游很重要,请及时持久化该资源。

跳过提示的精确性。 “让它更好”不是编辑提示。描述目标风格、环境、主体处理方式以及哪些运动应保持不变。

您应该选择哪个 Wan 2.7 端点?

使用这个快速规则:

  • 当您已有源视频时,选择 VideoEdit
  • 当您有源图像或希望从静态图像工作流继续时,选择 I2V
  • 当您只有文本时,选择 T2V
  • 当身份一致性和参考角色控制比编辑现有剪辑更重要时,选择 R2V

这种区分可以让您的集成保持简单。团队经常过度使用文本到视频来处理那些实际上是基于提示的编辑问题。

常见问题

Novita AI 上 Wan 2.7 VideoEdit 的端点是什么?

POST https://api.novita.ai/v3/async/wan2.7-videoedit。它返回一个 task_id,然后您轮询 GET https://api.novita.ai/v3/async/task-result?task_id=<id> 以获取完成状态。

我可以同时提供源视频和参考图片吗?

可以。文档中请求结构支持可选的 reference_image_urlvideo_urlprompt 一起使用,这对于更精确地控制最终外观很有用。

Wan 2.7 VideoEdit 在 Novita AI 上支持多长的视频?

截至 2026 年 7 月 29 日的文档,duration 默认为 0,表示完整输入视频长度。如果您明确设置 duration,文档中的范围为 2-10 秒。

Wan 2.7 VideoEdit 接受大的源视频吗?

是的,在文档限制内。官方文档列出 mp4/mov 输入最大 100 MB。单独的 20 MB 限制适用于可选的参考图片。

我应该使用 Wan 2.7 VideoEdit 还是 Wan 2.7 I2V?

如果您已有剪辑并希望转换它,请使用 VideoEdit。如果您的起点是静态图像或图像主导的工作流,请使用 I2V。

推荐文章