AB
AiBoss
チュートリアル

APIMart

チュートリアル

用 APIMart 调用 Wan 2.7 生成并编辑 AI 视频

面向初次接触 Wan 2.7 的开发者,讲清如何在 APIMart 上开通账号、获取 API Key,并用 wan2.7、wan2.7-r2v、wan2.7-videoedit 三个模型完成文生视频、图生视频、首尾帧动画、视频续写与视频编辑,包含请求参数、异步轮询流程、完整可运行示例与常见报错排查。

Wan 2.7 是阿里巴巴推出的 AI 视频生成模型,支持文生视频、图生视频、视频编辑和参考生视频几种模式。它本身不要求本地显卡,全部推理在云端完成,所以真正需要解决的问题是:怎么把请求发出去、怎么拿到结果、怎么控制成本。APIMart 把 Wan 2.7 封装成三个可直接调用的模型 ID,用统一的异步任务接口对外提供服务,适合需要把视频生成接进自己产品、脚本或批量流水线的开发者。本文按「开通账号 → 选模型 → 发请求 → 轮询取结果 → 处理失败」的顺序,把这条链路完整走一遍。如果你只是想先看看模型效果,可以打开 APIMart 的模型页面对照本文的参数说明阅读。

需要先说明一点:Wan 2.7 的生成是异步的。提交请求只会拿到一个 task_id,视频不会立刻返回,必须再轮询任务状态接口,直到状态变成 completed 才能取到视频地址。这一点决定了后面所有代码的结构,先建立这个认知,后面的步骤会顺很多。

准备工作

账号与 API Key

第一步是注册 APIMart 账号。可以注册个人账号,也可以创建组织账号,后者适合团队共用额度。注册完成后进入 API Key 管理页面生成密钥。密钥只在生成时完整显示一次,务必当场复制并妥善保存,之后所有请求都要把它放进 Authorization 请求头,格式是 Bearer Token。

第二步是充值。APIMart 采用按量付费,没有订阅制,用多少扣多少。账户余额不足时请求会被拒绝,所以正式跑批量任务前先确认余额。

运行环境

因为视频处理全部在云端,本地机器配置不重要。实际需要准备的是:

  • 任意现代浏览器,例如 Chrome、Firefox 或 Edge,用于管理控制台和查看结果;
  • 稳定的网络连接,用于发起 API 调用和下载生成的视频;
  • 足够的本地存储空间,用来保存下载下来的 .mp4 文件;
  • 任意 HTTP 客户端,cURL、Postman、Python 或 Node.js 都可以。

存储这一条容易被忽略。APIMart 只保留生成结果 72 小时,结果里会带一个 expires_at 字段标明具体过期时间。也就是说,视频生成完不等于你已经拥有它,必须在过期前把它转存到自己的对象存储或本地磁盘。批量任务尤其要注意,跑完几十条再统一下载,很可能前面的已经失效了。

找到模型入口

Wan 2.7 在 APIMart 上有三个模型 ID,分别对应不同的能力:

模型 ID覆盖能力
wan2.7文生视频、图生视频(含首帧、首尾帧两种子模式)
wan2.7-r2v参考生视频,支持最多 5 个混合参考素材
wan2.7-videoedit视频编辑、视频续写

三个模型的价格一致,具体单价请以官网当前信息为准。在正式写代码之前,建议先用控制台自带的 Playground 试几组提示词和参数,确认效果方向再接入,比直接写脚本反复调试省时间。

操作步骤

第一步:确定用哪个模式

模式选错是最常见的浪费。判断标准其实很简单,看手里已经有什么:

  • 只有文字想法:用文生视频,模型 ID 用 wan2.7,只传提示词。
  • 有一张图,想让它动起来:用图生视频的首帧模式,image_urls 传一张图。
  • 有两张图,想控制镜头起点和终点:用首尾帧模式,image_urls 传两张图,第一张是起始帧,第二张是结束帧。
  • 已有素材,想延长:用视频续写,video_urls 传原片段。
  • 已有素材,想改内容:用视频编辑,模型 ID 用 wan2.7-videoedit,传源视频加自然语言修改指令。
  • 要跨镜头保持人物或风格一致:用参考生视频,模型 ID 用 wan2.7-r2v,最多可传 5 个混合参考素材。

如果拿不准,APIMart 会根据你传入的输入类型自动判断该走哪个模式。但显式指定模型 ID 更可控,尤其是编辑和续写这类容易和普通生成混淆的场景。

第二步:准备输入素材

图片和视频都必须使用公开可访问的 HTTPS URL,本地文件不能直接上传。如果素材在私有存储里,需要先生成带时效的签名链接。

编辑和续写对输入视频有硬性限制:格式必须是 MP4 或 MOV,时长 2 到 10 秒,文件小于 100MB。音频输入支持 WAV 或 MP3,小于 15MB。这些限制在提交前就要校验,否则会直接收到错误响应。

还有一个容易踩的坑:audio_url 不能和 image_urls 或 video_urls 同时传,同时出现会返回 400 错误。如果确实需要音频,要单独确认当前模型和模式是否支持。

第三步:写提示词

文生视频的提示词建议按固定结构组织,把要素拆开写清楚,比堆形容词有效得多:

[主体] + [动作/运动] + [环境] + [光线] + [镜头] + [风格/情绪]

例如:一位咖啡师在温馨的咖啡馆里拉花,暖琥珀色灯光,缓慢推近,电影感风格。

几个实用原则:

  • 镜头运动写具体,用「缓慢左摇」「环绕」这类明确描述,不要写「运镜好看」。
  • 动词用主动式,比如「倾倒」「行走」,避免模糊的形容词。
  • 配合 negative_prompt 压制不想要的画面,例如「模糊、扭曲、静止」。
  • 提示词短于 30 个词时,打开 prompt_extend,模型会自动补全电影感的细节描述。

图生视频的提示词逻辑不同。画面内容已经由图片决定了,提示词应该只描述运动和镜头行为,例如「缓慢拉远」「眼睛轻轻眨动」「镜头向右漂移」。在提示词里重复描述画面内容反而会干扰结果。

视频编辑的提示词要用直接的动作动词:替换、移除、提亮、放慢、换风格。同时明确写出哪些部分要保持不变,例如「把背景替换成森林,主体和光线保持不变」。说清楚不该动什么,能显著减少误改。

第四步:设置核心参数

提交请求前需要确认几个关键参数:

参数说明
model三个模型 ID 之一
prompt提示词正文
negative_prompt反向提示词,压制不需要的元素
resolution分辨率,720P 或 1080P
duration时长,2 到 15 秒,默认 5 秒
seed随机种子,固定后可复现结果
watermark布尔值,控制是否带水印
prompt_extend布尔值,自动扩写短提示词
image_urls1 到 2 张图片 URL
video_urls源视频 URL,用于编辑或续写

成本控制的常规做法是:草稿阶段用 720P,确认构图和运动没问题后再用 1080P 出终版。文生视频和图生视频的输出上限是 1080p、30fps、.mp4 格式。图生视频会根据输入图片的尺寸自动匹配画面比例,不需要手动设置。

第五步:提交任务并轮询结果

提交请求后返回的是任务对象,核心字段是 task_id。之后每隔 15 秒左右调用一次任务查询接口,直到状态变为 completed。正常情况下视频在 30 到 90 秒内完成。

轮询时不要用固定死循环,要设置最大重试次数和超时上限,否则任务卡住时脚本会一直挂着。拿到结果后立刻读取 expires_at,并尽快把视频转存出去。

一个完整示例

下面用 Python 走一遍文生视频的完整流程。示例只依赖标准库,方便直接复制运行。

import json
import time
import urllib.request

API_KEY = "你的_API_KEY"
BASE = "https://api.apimart.ai"

headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json",
}

payload = {
    "model": "wan2.7",
    "prompt": "一位咖啡师在温馨的咖啡馆里拉花,暖琥珀色灯光,缓慢推近,电影感风格",
    "negative_prompt": "模糊, 扭曲, 静止",
    "resolution": "720P",
    "duration": 5,
    "prompt_extend": True,
    "watermark": False,
}

req = urllib.request.Request(
    f"{BASE}/v1/videos/generations",
    data=json.dumps(payload).encode("utf-8"),
    headers=headers,
    method="POST",
)

with urllib.request.urlopen(req) as resp:
    task = json.loads(resp.read().decode("utf-8"))

task_id = task["task_id"]
print("task_id:", task_id)

result = None
for attempt in range(20):
    time.sleep(15)
    poll = urllib.request.Request(
        f"{BASE}/v1/tasks/{task_id}",
        headers={"Authorization": f"Bearer {API_KEY}"},
    )
    with urllib.request.urlopen(poll) as resp:
        data = json.loads(resp.read().decode("utf-8"))

    status = data.get("status")
    print(f"第 {attempt + 1} 次轮询,状态:{status}")

    if status == "completed":
        result = data
        break
    if status in ("failed", "cancelled"):
        raise RuntimeError(f"任务失败:{data}")

if result is None:
    raise TimeoutError("轮询超时,任务仍未完成")

print("视频地址:", result["video_url"])
print("过期时间:", result["expires_at"])

把这段跑通之后,切换到其他模式只需要改两处:model 字段和输入字段。

首帧动画:model 保持 wan2.7,加上 "image_urls": ["https://你的域名/start.jpg"],提示词改成运动描述,例如「缓慢拉远,镜头轻微右移」。

首尾帧动画:image_urls 传两张图,第一张是起始帧,第二张是结束帧,模型会在两者之间生成平滑过渡。

视频续写:video_urls 传入 2 到 10 秒的 MP4 或 MOV 片段,模型在此基础上自然延长。

视频编辑:model 改为 wan2.7-videoedit,video_urls 传源视频,提示词写成「把背景替换成日落海滩,主体和光线保持不变」这类指令。

参考生视频:model 改为 wan2.7-r2v,最多传 5 个混合参考素材,用于跨镜头保持一致性。

注意事项

结果只保留 72 小时

这是最容易造成实际损失的一条。生成结果在 APIMart 侧只保留 72 小时,expires_at 给出精确的失效时间。生产环境里应该在拿到结果后立即触发转存,而不是等业务侧需要时再去取。

输入格式限制

编辑和续写的输入视频必须是 MP4 或 MOV,时长 2 到 10 秒,小于 100MB。超出任一条都会失败。音频支持 WAV 或 MP3,小于 15MB。素材 URL 必须是公开 HTTPS 地址。

参数冲突会返回 400

audio_url 与 image_urls 或 video_urls 同时出现会触发 400 错误。提交前做一次参数互斥校验,能省掉不少排查时间。

时长与分辨率的边界

文生视频和图生视频的时长范围是 2 到 15 秒,默认 5 秒。输出最高 1080p、30fps。图生视频的画面比例由输入图片自动决定,手动设置无效。

轮询节奏

建议 15 秒轮询一次。间隔太短没有意义,因为正常生成需要 30 到 90 秒;间隔太长则会让整体流程变慢。同时务必设置最大轮询次数,避免任务异常时无限等待。

价格与商用

三个模型版本价格一致,720p 与 1080p 单价不同,具体金额以及商用授权范围请以官网当前信息为准。价格和配额会调整,写死在代码注释里的数字很容易过期,建议把单价做成配置项。

提示词过短的补救

提示词少于 30 个词时,打开 prompt_extend 让模型自动补全细节,通常比手动堆词效果更稳定。但如果你需要精确控制画面,扩写反而可能引入不想要的元素,这时应该关掉它并把提示词写足。