使用 Seedance 2.0 API 为电商构建 AI 产品视频
使用 Seedance 2.0 API 从产品照片生成电商视频。5 种视频类型、批量流水线、多平台导出。包含完整 Python 代码。

目录中的每一款产品都值得拥有视频。一张产品照片现在可以在三分钟内变成一条精美的视频广告。无需摄制团队,无需租用摄影棚,无需后期制作排期。Seedance 2.0 —— 字节跳动最新的视频生成模型 —— 通过一次简单的 API 调用,将静态产品图片转化为可直接播出的视频片段。本指南将带你了解五种不同的电商视频类型、整个目录的批量处理流水线,以及多平台导出策略。所有代码示例均为可直接生产使用的 Python。
为什么产品视频很重要(以及为什么摄影棚已经过时)
带有视频的产品列表在表现上始终优于没有视频的列表。根据 Shopify 的产品媒体最佳实践,在产品页面添加视频的商家在互动率和转化率方面都有显著提升。Amazon 自己的卖家指南现在积极鼓励每个列表都配备视频,其 A+ Content 项目也在搜索结果中优先展示带有视频的页面。
"知道视频有用"与"实际制作视频"之间的鸿沟一直以来都是巨大的。一次产品视频拍摄 —— 包括棚拍时间、灯光、设备、摄影师和基本剪辑 —— 每个 SKU 通常需要 $500–$2,000。对于 200 款产品的目录来说,还没上传一个文件就已经是六位数的成本了。
| 传统摄影棚 | Seedance 2.0 API | |
|---|---|---|
| 每条视频成本 | $500–$2,000 | $0.02–$0.15 |
| 交付周期 | 3–10 个工作日 | 60–180 秒 |
| 所需准备 | 摄影棚、团队、设备 | 一张产品照片 |
| 扩展到 500 个 SKU | $250K–$1M+ | 不到 $75 |
| 迭代速度 | 需要重新拍摄 | 修改提示词,重新生成 |
| 宽高比变体 | 每种格式单独编辑 | 修改一个参数 |
两者的经济性不可同日而语。AI 产品视频生成并不是要取代一部价值 $50,000 的品牌大片 —— 它取代的是那些重复性的、按 SKU 计费的视频制作工作,而大多数电商团队要么完全跳过这些工作,要么以痛苦的利润率外包出去。
以一个拥有 300 个 SKU 的中型 Shopify 店铺为例。为整个目录制作传统摄影棚视频:$150K–$600K,外加数月的排期和制作时间。使用 Seedance 2.0 API 处理同样的目录:总计不到 $50,一个下午即可完成。即使算上开发者搭建流水线的时间,投资回报率也高出几个数量级。
这一转变与十年前产品摄影领域发生的变化如出一辙。摄影棚并没有消失,但日常工作转向了自动化解决方案。视频正在沿着同样的轨迹前进,只是速度更快。
视频对转化率的影响
行业报告一致表明,带有视频的产品页面表现优于没有视频的页面。Shopify 自己的研究强调,视频能增加页面停留时间并降低退货率,因为它帮助客户更好地了解他们要购买的商品。Amazon 报告称,带有视频的列表在搜索结果中获得了更高的点击率。
具体数据因品类和市场而异,但方向是明确的:视频能卖出更多产品。问题从来不是视频是否有效,而是投资回报率是否能证明制作成本合理。在 API 定价下,这个计算已经有了定论。
准备工作:API Key 和基础代码
你需要一个 EvoLink 账户和一个 API Key。EvoLink 提供对 Seedance 2.0 的访问,使用简洁的 REST API。如果你尚未创建账户,请参阅入门指南获取操作说明。
安装唯一的依赖:
pip install requests
无需 GPU。无需下载模型。无需管理任何基础设施。API 在服务端处理所有计算。你的本地机器只需发送 HTTP 请求并接收视频 URL。
以下是完整的基础代码。本指南中的每个示例都基于此构建:
import requests
import time
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.evolink.ai/v1"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
def generate_video(payload: dict) -> dict:
"""Submit a video generation request and return the task response."""
response = requests.post(
f"{BASE_URL}/videos/generations",
headers=headers,
json=payload
)
response.raise_for_status()
return response.json()
def wait_for_video(task_id: str, poll_interval: int = 5, timeout: int = 300) -> dict:
"""Poll a task until it completes or fails. Returns the final task object."""
elapsed = 0
while elapsed < timeout:
resp = requests.get(f"{BASE_URL}/tasks/{task_id}", headers=headers)
resp.raise_for_status()
task = resp.json()
status = task.get("status")
if status == "completed":
print(f"✅ Video ready: {task['output']['video_url']}")
return task
elif status == "failed":
raise RuntimeError(f"Task failed: {task.get('error', 'Unknown error')}")
print(f"⏳ Status: {status} ({elapsed}s elapsed)")
time.sleep(poll_interval)
elapsed += poll_interval
raise TimeoutError(f"Task {task_id} did not complete within {timeout}s")
def create_and_wait(payload: dict) -> dict:
"""Generate a video and wait for the result. Returns the completed task."""
task = generate_video(payload)
task_id = task["task_id"]
print(f"🎬 Task created: {task_id}")
return wait_for_video(task_id)
以下所有代码示例均使用相同的基础设置。 我们只展示每种视频类型特有的 payload。
create_and_wait 函数处理完整的生命周期:提交任务、轮询直到完成、返回视频 URL。视频 URL 在 24 小时后过期,因此请及时下载或直接将其导入你的资产管理系统。
轮询方式适用于交互式脚本和小批量处理。对于处理数百个产品的生产流水线,callback_url 参数(在批量流水线章节中介绍)可以完全消除轮询开销。
以下每个代码示例都使用不同的 payload 字典调用 create_and_wait(payload)。上面的基础代码是你唯一需要的样板代码。
视频类型 1:360° 产品旋转
转盘旋转是电商视频的主力格式。一张白底产品照片即可变成流畅的旋转展示 —— 这类片段过去需要电动转盘和精心的灯光布置。这种格式适用于所有场景:Amazon 列表、Shopify 产品页面和社交广告。
以下是一个奢侈手表旋转的 payload:
payload = {
"model": "seedance-2.0",
"image_urls": [
"https://your-cdn.com/products/watch-front.jpg"
],
"prompt": (
"@Image1 is a luxury wristwatch. The watch rotates slowly under "
"dramatic studio lighting on a dark reflective surface. Light catches "
"the polished metal case and sapphire crystal. Slow cinematic rotation. "
"Premium advertisement quality."
),
"duration": 8,
"quality": "1080p",
"aspect_ratio": "16:9"
}
result = create_and_wait(payload)
提示词的结构很重要。将其分层可以在任何产品上获得一致的效果:
第一层 —— 主体识别。 以 @Image1 is a [product]. 开头。这将模型锚定到你的源图像。参阅 @tags 指南了解 Seedance 2.0 如何解读图像引用。
第二层 —— 运动描述。 "Rotates slowly" 比 "spins" 更好 —— 它暗示着匀速运动。添加 "smooth turntable rotation" 或 "360-degree rotation" 可以强化运动模式。
第三层 —— 灯光和环境。 模型对以下摄影棚灯光术语反应良好:"dramatic studio lighting"、"soft diffused light"、"rim lighting"、"three-point lighting setup"。背景选择 —— 深色反射表面、白色无缝背景、渐变背景 —— 完全决定了整体基调。
第四层 —— 品质修饰语。 以品质提示语结尾:"premium advertisement quality"、"commercial-grade" 或 "4K product showcase"。这些术语会推动模型输出更干净、更精致的效果。
旋转技巧
| 参数 | 推荐值 | 原因 |
|---|---|---|
| 时长 | 6–10 秒 | 完整旋转至少需要 6 秒以避免看起来太仓促 |
| 宽高比 | 16:9 或 1:1 | 16:9 适用于网页/Amazon,1:1 适用于社交信息流 |
| 画质 | 1080p | 产品内容始终使用 1080p |
| 提示词中的背景 | 深色反射面或白色 | 匹配你品牌产品页面的视觉风格 |
对于细节复杂的产品 —— 珠宝、手表、电子产品 —— 将时长增加到 10 秒。额外的帧数让模型在旋转过程中能够渲染表面细节,而不会出现运动模糊伪影。
旋转视频的背景策略
源图像的背景会显著影响输出效果。以下是处理常见情况的方法:
白色背景(理想选择)。 标准的白底电商产品照片效果完美。模型会保留产品并生成干净的旋转运动。你可以保留白色背景,也可以在提示词中描述不同的背景。
透明背景(PNG)。 同样出色。模型会根据你的提示词描述填充背景,让你完全控制最终效果。
杂乱或生活场景背景。 可用但不太可预测。模型可能会将不需要的背景元素纳入旋转中。为获得最佳效果,请在提示词中明确描述所需背景:"on a clean white surface" 或 "on a dark gradient background"。
可控背景的摄影棚照片。 很好的起点。如果你现有的照片已经有专业灯光,模型会将该灯光质量延伸到视频中。
如果你的源照片背景杂乱,请在提示词中明确描述所需背景。Seedance 2.0 可以将产品重新置于干净的表面上。为获得最佳效果,请使用白底或透明背景的产品照片。阅读图生视频基础了解更多源图像最佳实践。
用你自己的产品照片试试吧 —— 3 分钟内即可看到结果。
视频类型 2:主视觉(产品发布预告片)
发布预告片能制造期待感。它们是电影般的揭幕时刻 —— 烟雾、光束、戏剧性的角度 —— 压缩成几秒钟。这种格式在社交广告和着陆页主视觉区域占据主导地位,因为第一印象决定了点击率。
payload = {
"model": "seedance-2.0",
"image_urls": [
"https://your-cdn.com/products/headphones-lineup.jpg"
],
"prompt": (
"@Image1 shows premium over-ear headphones in four colors. "
"Rapid four-frame flash cuts, each color freeze-framed. "
"Extreme close-up of hinge mechanism unfolding in slow motion. "
"Quick-cut lifestyle montage. Final lineup on white pedestal. "
"Brand text fades in. Commercial-grade lighting."
),
"duration": 10,
"quality": "1080p",
"aspect_ratio": "16:9"
}
result = create_and_wait(payload)
主视觉的提示词使用的词汇与旋转不同。这里你是在导演一个序列,而不是单一的连续运动。将每个句子视为分镜脚本中的一个场景。
主视觉提示词模式
浮现式: 产品从烟雾、雾气或粒子中升起。适用于科技产品、香水、高端商品。
@Image1 is [product]. It emerges from dense volumetric fog,
backlit by a single golden spotlight. Particles drift upward.
Slow reveal. Cinematic depth of field. Premium commercial aesthetic.
冲击着陆式: 产品带着能量落入画面 —— 水花、碎裂、爆发。
@Image1 is [product]. It lands on a glossy black surface with a
subtle shockwave ripple. Dust particles scatter on impact.
Camera pushes in slowly. Dramatic rim lighting. High-end advertisement.
组装式: 组件飞到一起组成完整产品。非常适合科技产品和模块化商品。
@Image1 is [product]. Individual components float in space, then
smoothly assemble into the final product. Each piece locks into
place with a satisfying precision. Clean white environment.
Studio lighting. Commercial quality.
主视觉格式受益于较长的时长 —— 8 到 12 秒让模型有足够的空间来构建张力并完成揭幕。较短的片段会显得突兀;过长的片段则有失去观众注意力的风险。
何时使用主视觉
主视觉最适用于以下场景:
- 产品发布。 在社交媒体和着陆页上发布新产品。戏剧性的揭幕能营造期待感并传达高端定位。
- 季节性活动。 节日促销、黑五、新品上市。电影级的品质让活动内容脱颖而出。
- 广告素材。 Facebook、Instagram 和 TikTok 广告受益于戏剧性产品揭幕带来的视觉冲击力。这些片段能在快速滑动的信息流中抓住注意力。
- 网站主视觉区域。 首屏自动播放的主视觉片段能即时传达品牌品质。主视觉横幅的时长建议控制在 6 秒以内,以避免性能问题。
主视觉不太适合产品详情页,因为客户在那里需要的是信息性内容。将戏剧性效果留给营销漏斗顶部;产品页面本身使用旋转和微距视频即可。
关于更多电商之外的提示词工程技巧,包括 Seedance 2.0 如何解读电影术语,请查看专门的提示词指南。
视频类型 3:生活场景
白底静态产品照片能促成转化。但生活场景素材 —— 产品在具体场景中、被使用中、在真实环境中 —— 能建立情感连接。生活场景视频是让客户产生"我想要那种生活"而不仅仅是"我想要那个东西"的格式。
Seedance 2.0 支持多图输入。使用 @Image1 指代产品,@Image2 指代你想要放置产品的环境或场景。模型会将产品合成到场景中,并匹配自然的光照和透视。
payload = {
"model": "seedance-2.0",
"image_urls": [
"https://your-cdn.com/products/ceramic-mug.jpg",
"https://your-cdn.com/scenes/cafe-table-morning.jpg"
],
"prompt": (
"@Image1 is a handmade ceramic coffee mug. @Image2 is a cozy "
"café table by a window on a rainy morning. The mug sits on the "
"table, steam rising gently from fresh coffee. Soft natural light "
"from the window. Shallow depth of field. A hand reaches in and "
"wraps around the mug. Warm, inviting atmosphere. Lifestyle "
"advertisement quality."
),
"duration": 8,
"quality": "1080p",
"aspect_ratio": "9:16"
}
result = create_and_wait(payload)
以下是实际效果展示 —— 一个画中角色伸手去拿放在她画框前面的产品(一杯咖啡):
此演示展示了 @Image1(角色/产品引用)如何保持视觉一致性,同时模型生成与道具和环境的自然交互。同样的原理适用于任何产品场景化视频。
@Image2 引用为模型提供了一个具体的环境参考,而不是仅凭文本描述来凭空生成。这会产生更真实、更一致的结果。@tags 系统支持最多九张图片,因此你可以为复杂场景叠加多张参考图。
按品类推荐的生活场景
| 产品品类 | 场景 | 提示词关键词 |
|---|---|---|
| 饮具 | 咖啡馆桌面、厨房台面、户外露台 | steam rising, morning light, cozy atmosphere |
| 手表 | 手握方向盘、办公桌旁、户外探险 | natural wrist movement, lifestyle context, candid feel |
| 耳机 | 火车上的通勤者、公园跑步者、课桌前的学生 | wearing naturally, ambient environment, in-use |
| 护肤品 | 浴室梳妆台、水疗场景、卧室床头柜 | soft lighting, clean aesthetic, self-care moment |
| 家具 | 阳光充足的客厅、精心布置的公寓 | room context, natural scale, interior design |
| 箱包 | 街头风格、机场航站楼、办公室入口 | walking motion, casual carry, urban setting |
生活场景视频的关键在于具体性。"A person using the product" 会生成泛泛的结果。"A hand reaches in and wraps around the mug" 则创造了一个有意图的瞬间。描述微观动作,而非宏观概念。
单图 vs. 双图生活场景
你可以仅用一张产品图片生成生活场景视频 —— 在提示词中完整描述场景即可。双图模式(@Image1 + @Image2)能产生更一致的环境效果,因为模型有场景的视觉参考,而不仅仅是文本描述。
各方式的适用场景:
- 单图 + 描述性提示词: 快速简便。适合场景较为通用的情况(如 "on a desk"、"in a kitchen")。无需准备第二张参考图。
- 双图(产品 + 场景参考): 合成质量更高。适用于特定环境很重要的场景 —— 特定的咖啡馆美学、品牌零售空间、与品牌指南匹配的精心策划的生活场景。
在双图模式中,场景参考图不一定要是你自己拍的照片。库存图片也可以很好地作为环境参考。模型会从 @Image2 中提取光照、色彩方案和空间布局,用于为 @Image1 建立场景上下文。
注意宽高比的变化:Instagram Reels 和 TikTok 的生活场景内容使用 9:16。将宽高比与视频将要发布的平台匹配。更多内容请参阅下方的多平台导出章节。
视频类型 4:材质特写(微距细节)
质感能卖出高端产品。皮革的纹理、铝材的拉丝处理、羊绒毛衣的编织 —— 这些细节以全景镜头无法实现的方式传达品质。缓慢展示表面细节的微距特写视频是奢侈品和手工制品中转化率最高的格式之一。
payload = {
"model": "seedance-2.0",
"image_urls": [
"https://your-cdn.com/products/leather-wallet.jpg"
],
"prompt": (
"@Image1 is a full-grain leather bifold wallet. Extreme macro "
"close-up. The camera slowly glides across the leather surface, "
"revealing grain texture and hand-stitched seams. Shallow depth "
"of field with creamy bokeh. Warm directional lighting rakes "
"across the surface, emphasizing every pore and fiber. The camera "
"pulls back gradually to reveal the full wallet. Luxury product "
"photography in motion."
),
"duration": 8,
"quality": "1080p",
"aspect_ratio": "16:9"
}
result = create_and_wait(payload)
微距提示词词汇表
模型对特定的电影摄影术语反应强烈。使用以下术语来控制微距效果:
- "Extreme macro close-up" —— 触发对表面细节的紧凑取景
- "Shallow depth of field" / "creamy bokeh" —— 模糊背景,突出细节
- "Raking light" / "directional lighting" —— 通过阴影强调表面纹理
- "Camera glides across" —— 平滑的横向运动,逐步展示纹理
- "Surface texture reveal" —— 明确指示聚焦材质品质
针对不同材质的提示词
皮革: 聚焦纹理、缝线、包浆。使用暖色灯光。
Extreme macro on full-grain leather surface. Raking warm light reveals
natural grain variation and hand-stitched seam detail. Camera drifts
slowly across the material. Shallow depth of field.
金属(拉丝/抛光): 聚焦反射、加工痕迹、精密度。
Extreme close-up of brushed stainless steel surface. Cool directional
light creates long specular highlights across machined grooves. Camera
tracks along the edge. Mirror-like reflections shift with the angle.
面料/纺织品: 聚焦编织图案、纤维细节、垂坠感。
Macro view of cashmere knit fabric. Soft diffused light reveals
individual fiber structure and weave pattern. Camera slowly pans
across the textile. Gentle motion shows natural drape and softness.
木纹: 聚焦年轮、涂层、自然纹理变化。
Extreme macro of walnut wood surface with oil finish. Warm side
lighting reveals growth rings and natural color variation. Camera
glides along the grain direction. Rich, organic texture detail.
这些材质特写作为产品列表中的第二或第三个视频特别有效。在客户看到完整产品(旋转或主视觉)之后,微距细节视频能进一步强化品质认知。关于增强这些展示效果的镜头运动技巧,请参阅镜头运动指南。
视频类型 5:开箱揭幕
开箱视频在 YouTube 和社交平台上大行其道是有原因的:它们模拟了购买体验。打开包装的期待、第一眼看到产品的惊喜、精心设计的开箱体验带来的满足感 —— 这种格式触及了购买行为的情感高峰。
payload = {
"model": "seedance-2.0",
"image_urls": [
"https://your-cdn.com/products/smartwatch-boxed.jpg"
],
"prompt": (
"@Image1 is a premium smartwatch in its retail packaging. "
"Hands gently lift the box lid, revealing tissue paper inside. "
"The tissue parts to unveil the watch nestled in a molded insert. "
"Soft overhead lighting. The watch face catches the light as "
"it's lifted from the box. Close-up of the clasp clicking shut "
"on a wrist. Smooth, deliberate pacing. Unboxing experience "
"video. Premium commercial quality."
),
"duration": 12,
"quality": "1080p",
"aspect_ratio": "9:16"
}
result = create_and_wait(payload)
开箱格式在较长时长下效果最好 —— 10 到 15 秒 —— 因为它讲述了一个有开头(密封盒子)、中间(揭幕)和结尾(产品使用或展示)的故事。较短的片段会截断叙事弧线并失去情感回报。
开箱提示词结构
一条有效的开箱提示词遵循三幕结构:
第一幕 —— 包装(2–3 秒)。 建立包装场景。描述双手与密封盒子的互动、包装材质、任何品牌元素。
第二幕 —— 揭幕(4–6 秒)。 盒盖打开。薄纸、泡沫衬垫或保护层分开。产品首次可见。这是情感高潮 —— 用感官细节来描述。
第三幕 —— 产品(3–5 秒)。 产品被取出、展示或投入使用。手表戴上手腕。耳机放入耳中。手机屏幕亮起。这完成了购买的想象体验。
对于包装独特或高端的产品,使用展示盒子的照片作为输入图像。如果你只有白底产品照片,在提示词中描述包装,让模型生成。当你提供实际包装的参考图像时,结果会更加一致。
9:16 竖屏格式在这里占主导地位,因为开箱内容主要存在于 Instagram Reels、TikTok 和 YouTube Shorts。对于产品页面,可以考虑使用更紧凑取景的 16:9 版本。镜头运动指南介绍了如何描述戏剧性揭幕和俯拍角度以增强开箱序列。
包装作为营销资产
高端品牌在包装设计上投入大量资源 —— 而开箱视频正是这项投资在镜头前得到回报的地方。如果你的产品拥有独特包装(定制盒子、磁吸扣、浮雕 logo、品牌薄纸),请确保输入图像捕捉的是包装状态,而不仅仅是产品本身。
对于没有奢华包装的产品 —— 标准牛皮纸盒、塑料快递袋、简约零售包装 —— 你仍然可以创造出令人向往的开箱体验。包装平淡的产品同样可以制作出引人注目的开箱视频。将提示词聚焦于揭幕时刻 —— 密封盒子和内部产品之间的对比。即使包装普通,叙事弧线也能撑起整个视频。
组合视频类型打造完整的产品列表
最有效的产品列表会组合使用多种视频类型。产品页面的强力组合:
- 主视觉(第一个视频)—— 抓住注意力,建立高端定位
- 360° 旋转(第二个视频)—— 从各个角度展示产品
- 微距特写(第三个视频)—— 通过材质细节证明品质
- 生活场景(第四个视频)—— 帮助客户想象拥有后的感觉
在社交媒体推广同一产品时,以主视觉或开箱揭幕打头阵(两者都针对信息流中的快速滑动优化),然后用生活场景和旋转内容进行再营销。
从一张产品照片出发,在一次流水线运行中生成所有五种类型。下一章节的批量系统会自动处理这一切。
多平台导出:为每个渠道匹配宽高比
一条产品视频是有用的。同一视频在你所有渠道所需的每种格式中都有,这才是一套系统。每个平台都有不同的宽高比偏好、自动播放行为和时长最佳范围。生成一条视频然后裁剪来适配会破坏构图。原生为每种比例生成则能产出针对每个屏幕正确构图的视频。
| 平台 | 宽高比 | 推荐时长 | 备注 |
|---|---|---|---|
| Amazon 产品页 | 16:9 | 6–8 秒 | 简洁、信息丰富。列表中自动播放。 |
| Shopify 产品页 | 16:9 | 6–10 秒 | 主视觉自动播放或图库嵌入。 |
| Instagram Reels | 9:16 | 8–10 秒 | 吸引眼球,偏好快节奏。 |
| TikTok | 9:16 | 8–15 秒 | 潮流风格,动态转场。 |
| Facebook 信息流 | 1:1 | 6–8 秒 | 方形格式最大化信息流展示面积。 |
| Pinterest 视频图钉 | 1:1 或 9:16 | 6–15 秒 | 竖版在移动端表现最佳。 |
| 网站主视觉横幅 | 16:9 | 4–6 秒 | 短循环,自动播放,无音频。 |
| YouTube Shorts | 9:16 | 8–15 秒 | 类似 TikTok 格式。 |
| 邮件营销 | 16:9 | 4–6 秒 | GIF 降级方案,控制文件大小。 |
一次性生成所有比例
使用简单的循环为你所有渠道所需的每种比例生成同一产品视频:
platform_configs = [
{"name": "amazon", "aspect_ratio": "16:9", "duration": 8},
{"name": "instagram", "aspect_ratio": "9:16", "duration": 10},
{"name": "facebook", "aspect_ratio": "1:1", "duration": 8},
{"name": "website", "aspect_ratio": "16:9", "duration": 5},
]
base_prompt = (
"@Image1 is a premium wireless speaker. The speaker rotates slowly "
"on a matte black surface under soft studio lighting. Clean, minimal "
"aesthetic. Commercial product video quality."
)
tasks = []
for config in platform_configs:
payload = {
"model": "seedance-2.0",
"image_urls": ["https://your-cdn.com/products/speaker.jpg"],
"prompt": base_prompt,
"duration": config["duration"],
"quality": "1080p",
"aspect_ratio": config["aspect_ratio"]
}
task = generate_video(payload)
tasks.append({"platform": config["name"], "task_id": task["task_id"]})
print(f"📐 {config['name']} ({config['aspect_ratio']}): {task['task_id']}")
time.sleep(1) # Rate limiting
# Collect results
for t in tasks:
result = wait_for_video(t["task_id"])
print(f"✅ {t['platform']}: {result['output']['video_url']}")
这段代码并行提交所有变体(请求之间有 1 秒的间隔用于限流),然后在完成时收集结果。对于 100 款产品跨 4 个平台的目录,总共 400 条视频 —— 生成时间大约相当于看一集电视剧。
此模式提交所有四个变体,然后在完成时收集结果。总生成时间大致等于生成单条视频的时间 —— 四个变体在服务端并行处理。
为什么原生比例优于裁剪
提示词在各比例间保持不变。Seedance 2.0 会原生重新构图场景以适配每种宽高比,调整取景和空间布局,而不是裁剪。9:16 竖版的旋转视频会将产品居中放置并留出更多纵向空间;1:1 方形版本则收紧取景以最大化信息流中的产品可见性。
传统视频编辑通过裁剪 16:9 母版文件来处理多平台需求。将中心裁剪为 9:16 会丢失画面两侧。裁剪为 1:1 会丢失上下文。使用 Seedance 2.0,每种比例都是从头生成的 —— 模型会针对每种画幅适当地构图场景。竖版 9:16 的产品旋转视频会为产品留出更多纵向呼吸空间。方形 1:1 版本则收紧取景以最大化社交信息流中的产品可见性。产品始终占据画面中合适的比例。
针对各平台的提示词调整
虽然同一基础提示词适用于所有比例,但你可以针对每个平台的内容风格进行优化:
- Amazon/Shopify (16:9): 保持简洁和信息性。避免花哨的转场。专注于清晰展示产品。
- Instagram Reels (9:16): 更快的节奏有效。在提示词中添加 "dynamic" 或 "energetic" 以获得更多视觉运动。
- TikTok (9:16): 更加动感。"Quick cuts"、"trend-style transitions" 和 "bold camera movements" 符合 TikTok 的视觉语言。
- Facebook 信息流 (1:1): 方形格式需要强烈的居中构图。居中描述产品:"product centered in frame"。
- 网站主视觉 (16:9): 含蓄取胜。"Slow, hypnotic motion" 和 "seamless loop" 是关键术语。这些视频静音自动播放,因此视觉质量比叙事更重要。
完整的 API 参数文档(包括所有支持的比例)请参阅视频生成 API 文档。
批量流水线:从 CSV 目录到视频库
单个 API 调用适用于测试。生产级电商需要一条流水线:读取产品目录、为每个 SKU 生成视频、处理失败情况、组织输出。本章节将构建这条流水线。
从一个包含产品目录的 CSV 文件开始:
name,image_url,category,style
Leather Bifold Wallet,https://cdn.example.com/wallet.jpg,accessories,rotation
Wireless Earbuds Pro,https://cdn.example.com/earbuds.jpg,electronics,hero
Ceramic Pour-Over Set,https://cdn.example.com/pourover.jpg,kitchen,lifestyle
Merino Wool Scarf,https://cdn.example.com/scarf.jpg,apparel,macro
Smart Fitness Watch,https://cdn.example.com/watch.jpg,electronics,unboxing
style 列映射到本指南涵盖的五种视频类型。以下是完整的流水线:
import csv
import os
import time
import requests
from pathlib import Path
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.evolink.ai/v1"
OUTPUT_DIR = Path("./product_videos")
OUTPUT_DIR.mkdir(exist_ok=True)
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
# Prompt templates keyed by style
STYLE_PROMPTS = {
"rotation": (
"@Image1 is a {name}. The product rotates slowly on a clean surface "
"under professional studio lighting. Smooth 360-degree turntable "
"rotation. Commercial product showcase quality."
),
"hero": (
"@Image1 is a {name}. The product emerges dramatically from soft "
"volumetric fog with a golden backlight. Particles drift upward. "
"Cinematic slow reveal. Premium advertisement quality."
),
"lifestyle": (
"@Image1 is a {name}. The product is shown in a natural lifestyle "
"setting, being used in an everyday context. Warm natural lighting. "
"Shallow depth of field. Authentic lifestyle commercial."
),
"macro": (
"@Image1 is a {name}. Extreme macro close-up. The camera glides "
"across the surface, revealing material texture and craftsmanship "
"details. Shallow depth of field. Raking directional light. "
"Luxury product detail shot."
),
"unboxing": (
"@Image1 is a {name} in retail packaging. Hands lift the lid to "
"reveal the product inside. Tissue paper parts. The product is "
"lifted out and displayed. Soft overhead lighting. Premium "
"unboxing experience video."
),
}
STYLE_DEFAULTS = {
"rotation": {"duration": 8, "aspect_ratio": "16:9"},
"hero": {"duration": 10, "aspect_ratio": "16:9"},
"lifestyle": {"duration": 8, "aspect_ratio": "9:16"},
"macro": {"duration": 8, "aspect_ratio": "16:9"},
"unboxing": {"duration": 12, "aspect_ratio": "9:16"},
}
def submit_video_task(name: str, image_url: str, style: str) -> str:
"""Submit a single video generation task. Returns task_id."""
prompt_template = STYLE_PROMPTS.get(style, STYLE_PROMPTS["rotation"])
defaults = STYLE_DEFAULTS.get(style, STYLE_DEFAULTS["rotation"])
payload = {
"model": "seedance-2.0",
"image_urls": [image_url],
"prompt": prompt_template.format(name=name),
"duration": defaults["duration"],
"quality": "1080p",
"aspect_ratio": defaults["aspect_ratio"],
}
resp = requests.post(
f"{BASE_URL}/videos/generations", headers=headers, json=payload
)
resp.raise_for_status()
return resp.json()["task_id"]
def poll_task(task_id: str, timeout: int = 300) -> dict:
"""Poll until task completes or fails."""
elapsed = 0
while elapsed < timeout:
resp = requests.get(f"{BASE_URL}/tasks/{task_id}", headers=headers)
resp.raise_for_status()
task = resp.json()
if task["status"] == "completed":
return task
elif task["status"] == "failed":
raise RuntimeError(f"Task {task_id} failed: {task.get('error')}")
time.sleep(5)
elapsed += 5
raise TimeoutError(f"Task {task_id} timed out after {timeout}s")
def download_video(url: str, filepath: Path):
"""Download a video file from a URL."""
resp = requests.get(url, stream=True)
resp.raise_for_status()
with open(filepath, "wb") as f:
for chunk in resp.iter_content(chunk_size=8192):
f.write(chunk)
print(f"💾 Saved: {filepath}")
def process_catalog(csv_path: str, max_retries: int = 2):
"""Process an entire product catalog CSV into videos."""
# Phase 1: Submit all tasks
pending = []
with open(csv_path, "r") as f:
reader = csv.DictReader(f)
for row in reader:
name = row["name"]
image_url = row["image_url"]
style = row.get("style", "rotation")
for attempt in range(max_retries + 1):
try:
task_id = submit_video_task(name, image_url, style)
pending.append({
"name": name,
"task_id": task_id,
"style": style,
})
print(f"🎬 Submitted: {name} ({style}) → {task_id}")
time.sleep(1) # Rate limiting: 1 request per second
break
except requests.exceptions.RequestException as e:
if attempt < max_retries:
print(f"⚠️ Retry {attempt + 1} for {name}: {e}")
time.sleep(3)
else:
print(f"❌ Failed to submit {name}: {e}")
# Phase 2: Collect results
results = []
for item in pending:
try:
task = poll_task(item["task_id"])
video_url = task["output"]["video_url"]
# Generate safe filename
safe_name = item["name"].lower().replace(" ", "-")
filename = f"{safe_name}_{item['style']}.mp4"
filepath = OUTPUT_DIR / filename
download_video(video_url, filepath)
results.append({
"name": item["name"],
"style": item["style"],
"file": str(filepath),
"status": "success"
})
except Exception as e:
print(f"❌ Failed: {item['name']}: {e}")
results.append({
"name": item["name"],
"style": item["style"],
"file": None,
"status": f"error: {e}"
})
# Summary
success = sum(1 for r in results if r["status"] == "success")
print(f"\n📊 Complete: {success}/{len(results)} videos generated")
return results
# Run it
results = process_catalog("products.csv")
流水线分两个阶段运行。阶段一快速提交所有任务(带限流),存储任务 ID。阶段二轮询每个任务并下载结果。这最大化了并行性 —— 所有视频在服务端同时生成。
使用回调替代轮询
对于较大的目录(100+ 产品),轮询变得低效。使用 callback_url 参数在每个视频完成时接收 webhook。请参阅 API 文档中的回调参数了解完整的 webhook 载荷规范。
payload = {
"model": "seedance-2.0",
"image_urls": ["https://your-cdn.com/products/item.jpg"],
"prompt": "@Image1 is a product. Smooth rotation. Studio lighting.",
"duration": 8,
"quality": "1080p",
"aspect_ratio": "16:9",
"callback_url": "https://your-server.com/webhooks/video-ready"
}
你的 webhook 端点会收到一个包含已完成任务对象(包括视频 URL)的 POST 请求。这完全消除了轮询,让你可以异步处理结果 —— 在一个 webhook 处理器中完成视频下载、更新产品数据库并推送到 CDN。
流水线技巧
- 限流: 保持每秒 1 个请求。突发提交可能触发节流。
- 视频 URL 过期: 24 小时内下载。上述流水线会立即下载,但如果你使用回调,请确保 webhook 处理器及时下载。
- 重试逻辑: 网络错误在所难免。流水线对失败的提交最多重试两次,退避时间为 3 秒。
- 组织输出: 文件名约定
{product-name}_{style}.mp4让你的视频库便于浏览。如果为每个产品生成多种比例,请在文件名中加入宽高比。 - 幂等性: 跟踪哪些产品已经有视频。在提交任务之前,检查输出文件是否已存在。这可以防止在部分失败后重新运行流水线时产生重复生成。
- 成本监控: 记录每次运行生成的视频数量。每条视频只需几美分,成本很低,但失控的循环或配置错误的 CSV 可能会无意中提交数千个请求。添加确认提示或
--dry-run标志。
超越基础的扩展
对于超过 1,000 个 SKU 的目录,考虑以下增强方案:
并发轮询。 上述流水线按顺序轮询任务。使用 Python 的 concurrent.futures.ThreadPoolExecutor 并行轮询多个任务,减少总挂钟时间。
数据库追踪。 将内存中的 results 列表替换为 SQLite 数据库或在运行间持久化的简单 JSON 文件。追踪任务 ID、完成状态、输出文件路径和时间戳。这使得流水线在中断后可以恢复。
CDN 上传。 下载后自动上传到你的 CDN(S3、CloudFront、Cloudflare R2)并存储公开 URL。这消除了将文件手动传输到托管基础设施的步骤。
元数据生成。 随视频生成 JSON 清单文件,包含产品名称、视频类型、宽高比、时长和 CDN URL。此清单直接接入你的 CMS 或产品信息管理(PIM)系统,实现自动化的列表更新。
电商提示词模板库
为最常见的电商产品品类提供可直接复制粘贴的提示词。每个模板针对指定的产品类型设计,可直接与该品类中的任何产品照片配合使用。在 {name} 占位符中替换产品名称即可。
ECOMMERCE_PROMPTS = {
"jewelry": {
"prompt": (
"@Image1 is {name}. Extreme close-up on a black velvet surface. "
"The piece rotates slowly under pinpoint spotlights. Light refracts "
"through gemstones, casting prismatic reflections. Shallow depth of "
"field. The camera pulls back to reveal the full piece. Luxury "
"jewelry advertisement quality."
),
"duration": 10,
"aspect_ratio": "1:1",
},
"electronics": {
"prompt": (
"@Image1 is {name}. The device sits on a minimal desk setup. "
"Screen illuminates, casting a soft glow. Camera orbits slowly, "
"showing ports, buttons, and build quality from every angle. "
"Clean, modern aesthetic. Tech product showcase."
),
"duration": 10,
"aspect_ratio": "16:9",
},
"apparel": {
"prompt": (
"@Image1 is {name}. The garment is displayed on an invisible "
"mannequin form, rotating slowly. Fabric moves naturally with "
"gentle airflow, showing drape and texture. Soft diffused "
"studio lighting. Clean white background. Fashion e-commerce "
"product video."
),
"duration": 8,
"aspect_ratio": "9:16",
},
"food_beverage": {
"prompt": (
"@Image1 is {name}. Steam rises gently. Camera pushes in slowly "
"from a wide tabletop shot to an appetizing close-up. Warm, "
"golden-hour lighting. Shallow depth of field. Ingredients or "
"garnishes are visible in beautiful detail. Food photography "
"in motion."
),
"duration": 8,
"aspect_ratio": "1:1",
},
"furniture": {
"prompt": (
"@Image1 is {name}. Placed in a styled modern living room with "
"natural light streaming through large windows. Camera dollies "
"slowly around the piece, showing form and proportion in context. "
"Warm afternoon light. Interior design showcase quality."
),
"duration": 10,
"aspect_ratio": "16:9",
},
"cosmetics": {
"prompt": (
"@Image1 is {name}. The product sits on a marble surface with "
"soft pink and gold tones. A gentle pour or squeeze dispenses "
"the product, showing color and texture. Macro close-up of the "
"formula. Smooth, luxurious pacing. Beauty brand advertisement."
),
"duration": 8,
"aspect_ratio": "9:16",
},
"sports_gear": {
"prompt": (
"@Image1 is {name}. Dynamic presentation against a dark "
"background with dramatic side lighting. The product rotates "
"with energy — quick cuts between angles showing key features. "
"Subtle motion graphics energy. Athletic brand commercial style."
),
"duration": 8,
"aspect_ratio": "16:9",
},
"home_decor": {
"prompt": (
"@Image1 is {name}. Displayed in a curated shelf vignette with "
"complementary objects. Soft natural light. Camera slowly racks "
"focus from background to the product. Cozy, aspirational "
"interior styling. Lifestyle brand aesthetic."
),
"duration": 8,
"aspect_ratio": "1:1",
},
}
def generate_from_template(category: str, name: str, image_url: str) -> dict:
"""Generate a video using a category-specific prompt template."""
template = ECOMMERCE_PROMPTS[category]
payload = {
"model": "seedance-2.0",
"image_urls": [image_url],
"prompt": template["prompt"].format(name=name),
"duration": template["duration"],
"quality": "1080p",
"aspect_ratio": template["aspect_ratio"],
}
return create_and_wait(payload)
# Example usage
result = generate_from_template(
category="jewelry",
name="18K gold pendant necklace with emerald",
image_url="https://your-cdn.com/products/emerald-pendant.jpg"
)
这些模板是起点。调整灯光描述和镜头运动以匹配你品牌的视觉识别。完整提示词指南涵盖了微调 Seedance 2.0 输出的高级技巧。
为你的品牌定制模板
每个品牌都有自己的视觉语言。Apple 使用简洁的白色环境搭配精确、缓慢的镜头运动。Nike 使用动感的高对比度灯光和快速剪辑。你的产品视频应该反映品牌既有的视觉美学。
沿以下维度修改模板:
- 灯光色调: 暖色调(金色、琥珀色)适合手工艺/奢侈品牌。冷色调(蓝色、银色)适合科技品牌。中性(白色、柔和)适合极简品牌。
- 镜头速度: 缓慢、沉稳的运动传达高端定位。更快、更动感的运动适合年轻化或运动品牌。
- 背景: 深色背景暗示奢华。白色背景暗示简洁/现代。环境背景暗示生活方式。
- 节奏词汇: "Slow, measured" vs. "dynamic, energetic" vs. "calm, meditative" —— 这些词汇直接影响模型输出的节奏。
构建品牌的主提示词前缀 —— 一组前置于每条产品视频提示词的术语 —— 并在整个目录中一致应用。这能在数百条产品视频中创造视觉一致性,模拟你在单一摄影棚设置中获得的统一感。
常见问题
生成一条产品视频需要多少费用?
定价取决于时长和画质设置。一条标准的 8 秒 1080p 视频只需几美分。为整个目录生成 500 条产品视频在大多数配置下远低于 $100。查看 EvoLink 定价了解当前费率。与摄影棚收取的 $500–$2,000 每条视频相比,API 成本在任何规模下都几乎可以忽略不计。
可以使用真人模特照片作为输入吗?
Seedance 2.0 对生成逼真人脸有限制,以防止深度伪造滥用。纯产品照片没有任何限制。如果你的产品需要展示与人的互动 —— 模特身上的服装、手腕上的手表 —— 请使用插画或风格化的人物参考,而非写实的人像照片。或者,在提示词中描述人物元素(如 "a hand reaches into frame"),让模型生成,而不是提供人脸照片作为输入。
视频生成需要多长时间?
典型的生成时间为 60–180 秒,取决于时长和画质设置。5 秒 720p 的视频大约一分钟完成。15 秒 1080p 的视频可能需要三分钟。本指南中的批量流水线通过轮询自动处理计时。对于生产系统,使用 callback_url 参数在完成时接收 webhook,而不是轮询。
可以添加品牌 logo 或文字叠加吗?
有两种方法。第一种,在提示词中包含文字描述 —— "Brand name fades in at the end" 或 "Logo watermark in lower right corner"。模型可以生成类似文字的元素,但精确的排版不能保证。第二种更可靠的方法是生成不含文字的视频,然后在后期制作中使用 FFmpeg、After Effects 或你选择的视频编辑工具合成 logo、标题或字幕条。第二种方法让你对品牌资产有精确的控制。
视频画质够商用吗?
在 1080p 画质下,输出适合产品列表、社交媒体广告和网站主视觉区域。视觉质量与大多数电商团队使用基础摄影棚设置制作的内容持平或更优。对于高端品牌活动或电视播出,你可能需要将 AI 生成的视频作为预览或起点,然后用传统后期制作进行精修。对于绝大多数电商使用场景 —— Amazon、Shopify、社交广告、邮件营销 —— 输出即为成品。
输入图像最佳的格式和分辨率是什么?
JPEG 和 PNG 均可。带透明通道的 PNG 对于需要干净背景替换的产品是理想选择。在分辨率方面,提供最高质量的源图像 —— 至少 1024x1024 像素。模型从更高分辨率的输入中提取更多细节,这在微距特写和旋转视频中尤其明显。避免压缩严重且有明显伪影的 JPEG,因为这些伪影会传递到生成的视频中。
可以生成带音频或音乐的视频吗?
Seedance 2.0 支持 generate_audio 参数,可为视频添加情境音效。对于产品视频,环境摄影棚声音或微妙的音效可以增强高端感。然而,大多数电商平台会静音自动播放视频,因此视觉质量远比音频重要。如果你需要特定的音乐或旁白,请在后期制作中添加。API 还支持 audio_urls 用于音频引导生成 —— 详情请参阅多模态参考文档。
如何与 Shopify 或 Amazon 集成?
工作流程是:生成视频 → 下载 MP4 → 上传到平台。对于 Shopify,通过管理后台或 Shopify API 直接上传视频到产品媒体。对于 Amazon,通过 Seller Central 的"管理视频"部分或 SP-API 上传。要实现完整的自动化循环,使用带 callback_url 的批量流水线 —— 你的 webhook 处理器可以自动下载视频并推送到平台 API。多模态参考文档涵盖了用于构建集成的完整 API 响应格式。
从摄影棚到 API:你的新视频流水线
五种视频类型覆盖了完整的电商产品视频需求:360° 旋转用于产品页面、主视觉用于产品发布、生活场景用于情感连接、微距特写用于品质感知、开箱揭幕用于社交内容。每种类型只需一张产品照片和一次 API 调用。
批量流水线将 CSV 目录转化为完整的视频库。多平台导出一次性生成你所有渠道所需的每种宽高比。提示词模板库为你提供了适用于任何产品品类的可直接复制使用的起点。
从产品照片到在每个销售渠道发布视频的整个工作流 —— 从数周压缩到数小时。一名开发者即可运营此前需要制作团队、摄影棚和后期编辑师的视频流水线。
这不是对传统视频制作的渐进式改进。这是一次结构性变革。电商视频的瓶颈从来不是创意愿景 —— 而是成本和物流。当一条视频只需几分钱并花费两分钟时,问题就从"哪些产品值得拥有视频"变成了"为什么不是每款产品都有视频"。
从一款产品开始。生成一条旋转视频。三分钟内看到结果。然后扩展到你的整个目录。无论你生成一条还是一万条视频,API 都是一样的。
替换你的视频制作流水线。在 EvoLink 免费注册 →
本系列往期文章:Seedance 2.0 提示词指南 · 多模态 @Tags 指南 · 镜头运动指南 · 图生视频教程