[{"data":1,"prerenderedAt":41360},["ShallowReactive",2],{"blog-list-zh":3},[4,11258,13449,17323,23022,30311,32067,38442],{"id":5,"title":6,"body":7,"description":11247,"extension":11248,"meta":11249,"navigation":58,"path":11254,"seo":11255,"stem":11256,"__hash__":11257},"content/zh/blog/seedance-2-api-tutorial-python.md","Seedance 2.0 API 教程：用 Python 从零生成你的第一个 AI 视频",{"type":8,"value":9,"toc":11189},"minimark",[10,14,17,32,44,47,52,55,66,69,91,95,124,127,200,202,206,215,218,247,250,271,290,299,307,309,313,316,330,337,471,474,509,512,1028,1031,1067,1241,1251,1254,1262,1264,1268,1271,1737,1740,1828,1831,1843,1847,1854,2032,2035,2156,2170,2173,2178,2186,2189,2197,2204,2211,2213,2217,2224,2260,2263,2266,2272,2342,2345,2351,2357,2418,2430,2433,2436,2562,2576,2583,2593,2595,2599,2611,2617,2880,2883,2932,2936,2964,2967,3049,3052,3204,3210,3213,3267,3277,3285,3289,3292,3371,3378,3380,3383,3386,3606,3633,3636,3641,3645,3736,3744,3749,3844,3851,3856,3944,3949,4024,4041,4044,4047,4118,4131,4149,4151,4154,4157,4160,4163,4221,4242,4245,4250,4293,4299,4304,4358,4363,4368,4420,4430,4435,4487,4503,4508,4551,4558,4563,4617,4623,4628,4671,4674,4679,4722,4725,4730,4784,4790,4793,5003,5006,5009,5013,5766,5769,5801,5808,5811,5814,6394,6405,6407,6411,6418,6421,6427,6432,6590,6596,6600,6662,6666,6669,7860,7863,7886,7889,7916,7920,7929,7977,7980,7986,7991,8038,8053,8057,8060,8232,8236,8314,8321,8323,8327,8330,8335,8883,8886,8908,8910,8913,8916,8919,8958,8961,8983,8986,8989,9022,9032,9034,9037,9041,9047,9051,9057,9061,9067,9071,9082,9086,9099,9103,9113,9117,9132,9136,9143,9147,9163,9167,9174,9176,9179,9182,11162,11177,11185],[11,12,13],"p",{},"Seedance 2.0 是字节跳动最强的 AI 视频生成模型——支持多模态引用、原生音频生成、电影级镜头控制，可生成 4–15 秒、最高 1080p 的视频。本教程将带你用 Python 走完整个 API 调用流程：从获取 API Key 到下载你生成的第一个视频。",[11,15,16],{},"读完这篇教程，你将拥有文生视频、图生视频、异步轮询、Webhook 回调和错误重试的完整可运行代码。所有代码示例都经过真实 API 测试验证。",[18,19,20],"blockquote",{},[11,21,22,26,27,31],{},[23,24,25],"strong",{},"关于 Seedance 2.0 与 1.5 的说明："," Seedance 2.0 正在逐步开放中。你现在就可以用 ",[28,29,30],"code",{},"seedance-1.5-pro"," 测试完整流程——等 2.0 全面上线后，只需改一下模型名称即可。所有接口、参数和返回格式完全一致。2.0 的主要升级：多模态引用（图片、视频、音频混合输入）、原生音频生成、更好的物理模拟和视频编辑能力。本教程的所有内容对两个版本都适用。",[11,33,34],{},[23,35,36,43],{},[37,38,42],"a",{"href":39,"rel":40},"https://evolink.ai/early-access",[41],"nofollow","免费获取 API Key","，跟着教程一起动手。",[45,46],"hr",{},[48,49,51],"h2",{"id":50},"你将构建什么以及你需要什么","你将构建什么（以及你需要什么）",[11,53,54],{},"先看看 Seedance 生成的视频效果——只用了一次 API 调用：",[56,57,60,61],"video",{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},true,"width:100%;border-radius:12px;margin:1.5em 0","\n  ",[62,63],"source",{"src":64,"type":65},"https://cdn.evolink.ai/seedance2api/%E5%B0%8F%E5%A5%B3%E5%AD%A9%E5%9B%BE%E4%B9%A6%E9%A6%86%E5%A5%87%E9%81%87.mp4","video/mp4",[11,67,68],{},"在本教程中，你将编写 Python 代码实现以下功能：",[70,71,72,76,79,82,85,88],"ol",{},[73,74,75],"li",{},"发送文本提示词 → 获得生成的视频",[73,77,78],{},"发送图片 → 将静态图片转为动态视频",[73,80,81],{},"异步轮询获取结果",[73,83,84],{},"像生产环境一样处理错误和重试",[73,86,87],{},"通过 Webhook 接收结果（无需轮询）",[73,89,90],{},"取消进行中的任务",[92,93,94],"h3",{"id":94},"前置条件",[96,97,98,108,118],"ul",{},[73,99,100,103,104,107],{},[23,101,102],{},"Python 3.8+","（用 ",[28,105,106],{},"python3 --version"," 检查）",[73,109,110,113,114,117],{},[23,111,112],{},"requests"," 库（",[28,115,116],{},"pip install requests","）",[73,119,120,123],{},[23,121,122],{},"一个 EvoLink API Key","（免费注册——下一节会讲怎么获取）",[11,125,126],{},"不需要 GPU，不需要 Docker，不需要复杂配置。只要 Python 和一个 API Key。",[18,128,129,135],{},[11,130,131,134],{},[23,132,133],{},"小贴士："," 如果你在开发正式项目，建议用虚拟环境隔离依赖：",[136,137,142],"pre",{"className":138,"code":139,"language":140,"meta":141,"style":141},"language-bash shiki shiki-themes github-dark","python3 -m venv seedance-env\nsource seedance-env/bin/activate  # macOS/Linux\nseedance-env\\Scripts\\activate     # Windows\npip install requests flask\n","bash","",[28,143,144,164,176,185],{"__ignoreMap":141},[145,146,149,153,157,161],"span",{"class":147,"line":148},"line",1,[145,150,152],{"class":151},"svObZ","python3",[145,154,156],{"class":155},"sDLfK"," -m",[145,158,160],{"class":159},"sU2Wk"," venv",[145,162,163],{"class":159}," seedance-env\n",[145,165,167,169,172],{"class":147,"line":166},2,[145,168,62],{"class":155},[145,170,171],{"class":159}," seedance-env/bin/activate",[145,173,175],{"class":174},"sAwPA","  # macOS/Linux\n",[145,177,179,182],{"class":147,"line":178},3,[145,180,181],{"class":151},"seedance-env\\Scripts\\activate",[145,183,184],{"class":174},"     # Windows\n",[145,186,188,191,194,197],{"class":147,"line":187},4,[145,189,190],{"class":151},"pip",[145,192,193],{"class":159}," install",[145,195,196],{"class":159}," requests",[145,198,199],{"class":159}," flask\n",[45,201],{},[48,203,205],{"id":204},"获取-api-key","获取 API Key",[11,207,208,209,214],{},"Seedance 2.0 通过 ",[37,210,213],{"href":211,"rel":212},"https://evolink.ai",[41],"EvoLink"," 提供接入。EvoLink 是一个 API 网关，通过一个 API Key 统一接入多个 AI 视频模型——包括 Seedance 2.0、Kling 等。",[11,216,217],{},"获取步骤：",[70,219,220,228,234,240],{},[73,221,222,223,227],{},"访问 ",[37,224,226],{"href":39,"rel":225},[41],"evolink.ai/early-access"," 注册账号",[73,229,230,231],{},"进入 ",[23,232,233],{},"Dashboard → API Keys",[73,235,236,237],{},"点击 ",[23,238,239],{},"Create New Key",[73,241,242,243,246],{},"复制你的 Key——以 ",[28,244,245],{},"sk-"," 开头",[11,248,249],{},"妥善保管你的 Key，不要提交到版本控制。我们用环境变量来存储：",[136,251,253],{"className":138,"code":252,"language":140,"meta":141,"style":141},"export EVOLINK_API_KEY=\"sk-your-api-key-here\"\n",[28,254,255],{"__ignoreMap":141},[145,256,257,261,265,268],{"class":147,"line":148},[145,258,260],{"class":259},"snl16","export",[145,262,264],{"class":263},"s95oV"," EVOLINK_API_KEY",[145,266,267],{"class":259},"=",[145,269,270],{"class":159},"\"sk-your-api-key-here\"\n",[11,272,273,274,277,278,281,282,285,286,289],{},"这行命令在当前终端会话中设置 ",[28,275,276],{},"EVOLINK_API_KEY"," 环境变量。macOS/Linux 用户可以把它加到 ",[28,279,280],{},"~/.bashrc"," 或 ",[28,283,284],{},"~/.zshrc"," 中实现持久化。Windows 用户在命令提示符中用 ",[28,287,288],{},"set EVOLINK_API_KEY=sk-your-api-key-here","，或者在系统属性 → 环境变量中设置。",[11,291,292,293,298],{},"注册后账户会包含初始额度供你体验。具体定价详情请查看",[37,294,297],{"href":295,"rel":296},"https://seedance2api.app/docs/getting-started",[41],"快速入门文档","。",[18,300,301],{},[11,302,303,306],{},[23,304,305],{},"常见错误："," 不要把 API Key 硬编码在源文件里。如果你推送到 GitHub，自动化爬虫几分钟内就会发现它。务必使用环境变量或密钥管理服务（如 AWS Secrets Manager 或 HashiCorp Vault）。",[45,308],{},[48,310,312],{"id":311},"搭建-python-环境","搭建 Python 环境",[11,314,315],{},"安装唯一需要的依赖：",[136,317,319],{"className":138,"code":318,"language":140,"meta":141,"style":141},"pip install requests\n",[28,320,321],{"__ignoreMap":141},[145,322,323,325,327],{"class":147,"line":148},[145,324,190],{"class":151},[145,326,193],{"class":159},[145,328,329],{"class":159}," requests\n",[11,331,332,333,336],{},"创建一个名为 ",[28,334,335],{},"seedance_tutorial.py"," 的文件，添加以下基础代码。本教程的所有示例都基于这个基础：",[136,338,342],{"className":339,"code":340,"language":341,"meta":141,"style":141},"language-python shiki shiki-themes github-dark","import requests\nimport time\nimport os\nimport json\n\n# ── 配置 ─────────────────────────────────────────────────────\nAPI_KEY = os.getenv(\"EVOLINK_API_KEY\", \"sk-your-api-key-here\")\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n","python",[28,343,344,351,358,365,372,378,384,408,419,430,454,465],{"__ignoreMap":141},[145,345,346,349],{"class":147,"line":148},[145,347,348],{"class":259},"import",[145,350,329],{"class":263},[145,352,353,355],{"class":147,"line":166},[145,354,348],{"class":259},[145,356,357],{"class":263}," time\n",[145,359,360,362],{"class":147,"line":178},[145,361,348],{"class":259},[145,363,364],{"class":263}," os\n",[145,366,367,369],{"class":147,"line":187},[145,368,348],{"class":259},[145,370,371],{"class":263}," json\n",[145,373,375],{"class":147,"line":374},5,[145,376,377],{"emptyLinePlaceholder":58},"\n",[145,379,381],{"class":147,"line":380},6,[145,382,383],{"class":174},"# ── 配置 ─────────────────────────────────────────────────────\n",[145,385,387,390,393,396,399,402,405],{"class":147,"line":386},7,[145,388,389],{"class":155},"API_KEY",[145,391,392],{"class":259}," =",[145,394,395],{"class":263}," os.getenv(",[145,397,398],{"class":159},"\"EVOLINK_API_KEY\"",[145,400,401],{"class":263},", ",[145,403,404],{"class":159},"\"sk-your-api-key-here\"",[145,406,407],{"class":263},")\n",[145,409,411,414,416],{"class":147,"line":410},8,[145,412,413],{"class":155},"BASE_URL",[145,415,392],{"class":259},[145,417,418],{"class":159}," \"https://api.evolink.ai/v1\"\n",[145,420,422,425,427],{"class":147,"line":421},9,[145,423,424],{"class":155},"HEADERS",[145,426,392],{"class":259},[145,428,429],{"class":263}," {\n",[145,431,433,436,439,442,445,448,451],{"class":147,"line":432},10,[145,434,435],{"class":159},"    \"Authorization\"",[145,437,438],{"class":263},": ",[145,440,441],{"class":259},"f",[145,443,444],{"class":159},"\"Bearer ",[145,446,447],{"class":155},"{API_KEY}",[145,449,450],{"class":159},"\"",[145,452,453],{"class":263},",\n",[145,455,457,460,462],{"class":147,"line":456},11,[145,458,459],{"class":159},"    \"Content-Type\"",[145,461,438],{"class":263},[145,463,464],{"class":159},"\"application/json\"\n",[145,466,468],{"class":147,"line":467},12,[145,469,470],{"class":263},"}\n",[11,472,473],{},"逐行解释：",[96,475,476,484,494],{},[73,477,478,483],{},[23,479,480],{},[28,481,482],{},"os.getenv(\"EVOLINK_API_KEY\", \"sk-your-api-key-here\")"," — 从环境变量读取 API Key。第二个参数是默认值（仅在本地测试时替换为你的真实 Key）。",[73,485,486,490,491,298],{},[23,487,488],{},[28,489,413],{}," — 所有 EvoLink API 端点的根 URL。所有请求都发送到 ",[28,492,493],{},"https://api.evolink.ai/v1/...",[73,495,496,500,501,504,505,508],{},[23,497,498],{},[28,499,424],{}," — 每个请求都携带的两个 Header：",[28,502,503],{},"Authorization"," 使用 Bearer Token 方式携带 API Key，",[28,506,507],{},"Content-Type"," 告诉服务器我们发送的是 JSON。",[11,510,511],{},"接下来添加可复用的辅助函数：",[136,513,515],{"className":339,"code":514,"language":341,"meta":141,"style":141},"# ── 可复用的轮询辅助函数 ─────────────────────────────────────\ndef wait_for_video(task_id, poll_interval=10, timeout=600):\n    \"\"\"\n    轮询视频生成任务，直到完成或失败。\n    \n    Args:\n        task_id: 生成接口返回的任务 ID。\n        poll_interval: 轮询间隔秒数（默认 10）。\n        timeout: 最大等待时间秒数（默认 600）。\n    \n    Returns:\n        dict: 包含视频 URL 的已完成任务响应。\n    \n    Raises:\n        TimeoutError: 任务在超时时间内未完成。\n        RuntimeError: 任务失败。\n    \"\"\"\n    elapsed = 0\n    while elapsed \u003C timeout:\n        # 发送 GET 请求检查任务当前状态\n        response = requests.get(\n            f\"{BASE_URL}/tasks/{task_id}\",\n            headers=HEADERS\n        )\n        # 如果 HTTP 状态码表示错误，抛出异常\n        response.raise_for_status()\n        task = response.json()\n\n        # 从响应中提取状态和进度\n        status = task[\"status\"]\n        progress = task.get(\"progress\", 0)\n        print(f\"  [{elapsed}s] Status: {status} | Progress: {progress}%\")\n\n        # 检查终态\n        if status == \"completed\":\n            return task\n        elif status == \"failed\":\n            error_info = task.get(\"error\", {})\n            raise RuntimeError(\n                f\"Task {task_id} failed: {error_info.get('message', 'Unknown error')}\"\n            )\n\n        # 等待后再次轮询\n        time.sleep(poll_interval)\n        elapsed += poll_interval\n\n    raise TimeoutError(f\"Task {task_id} timed out after {timeout}s\")\n",[28,516,517,522,549,554,559,564,569,574,579,584,588,593,598,603,609,615,621,626,637,652,658,669,696,708,714,720,726,737,742,748,765,786,832,837,843,861,870,885,901,913,952,958,963,969,975,987,992],{"__ignoreMap":141},[145,518,519],{"class":147,"line":148},[145,520,521],{"class":174},"# ── 可复用的轮询辅助函数 ─────────────────────────────────────\n",[145,523,524,527,530,533,535,538,541,543,546],{"class":147,"line":166},[145,525,526],{"class":259},"def",[145,528,529],{"class":151}," wait_for_video",[145,531,532],{"class":263},"(task_id, poll_interval",[145,534,267],{"class":259},[145,536,537],{"class":155},"10",[145,539,540],{"class":263},", timeout",[145,542,267],{"class":259},[145,544,545],{"class":155},"600",[145,547,548],{"class":263},"):\n",[145,550,551],{"class":147,"line":178},[145,552,553],{"class":159},"    \"\"\"\n",[145,555,556],{"class":147,"line":187},[145,557,558],{"class":159},"    轮询视频生成任务，直到完成或失败。\n",[145,560,561],{"class":147,"line":374},[145,562,563],{"class":159},"    \n",[145,565,566],{"class":147,"line":380},[145,567,568],{"class":159},"    Args:\n",[145,570,571],{"class":147,"line":386},[145,572,573],{"class":159},"        task_id: 生成接口返回的任务 ID。\n",[145,575,576],{"class":147,"line":410},[145,577,578],{"class":159},"        poll_interval: 轮询间隔秒数（默认 10）。\n",[145,580,581],{"class":147,"line":421},[145,582,583],{"class":159},"        timeout: 最大等待时间秒数（默认 600）。\n",[145,585,586],{"class":147,"line":432},[145,587,563],{"class":159},[145,589,590],{"class":147,"line":456},[145,591,592],{"class":159},"    Returns:\n",[145,594,595],{"class":147,"line":467},[145,596,597],{"class":159},"        dict: 包含视频 URL 的已完成任务响应。\n",[145,599,601],{"class":147,"line":600},13,[145,602,563],{"class":159},[145,604,606],{"class":147,"line":605},14,[145,607,608],{"class":159},"    Raises:\n",[145,610,612],{"class":147,"line":611},15,[145,613,614],{"class":159},"        TimeoutError: 任务在超时时间内未完成。\n",[145,616,618],{"class":147,"line":617},16,[145,619,620],{"class":159},"        RuntimeError: 任务失败。\n",[145,622,624],{"class":147,"line":623},17,[145,625,553],{"class":159},[145,627,629,632,634],{"class":147,"line":628},18,[145,630,631],{"class":263},"    elapsed ",[145,633,267],{"class":259},[145,635,636],{"class":155}," 0\n",[145,638,640,643,646,649],{"class":147,"line":639},19,[145,641,642],{"class":259},"    while",[145,644,645],{"class":263}," elapsed ",[145,647,648],{"class":259},"\u003C",[145,650,651],{"class":263}," timeout:\n",[145,653,655],{"class":147,"line":654},20,[145,656,657],{"class":174},"        # 发送 GET 请求检查任务当前状态\n",[145,659,661,664,666],{"class":147,"line":660},21,[145,662,663],{"class":263},"        response ",[145,665,267],{"class":259},[145,667,668],{"class":263}," requests.get(\n",[145,670,672,675,677,680,683,686,689,692,694],{"class":147,"line":671},22,[145,673,674],{"class":259},"            f",[145,676,450],{"class":159},[145,678,679],{"class":155},"{BASE_URL}",[145,681,682],{"class":159},"/tasks/",[145,684,685],{"class":155},"{",[145,687,688],{"class":263},"task_id",[145,690,691],{"class":155},"}",[145,693,450],{"class":159},[145,695,453],{"class":263},[145,697,699,703,705],{"class":147,"line":698},23,[145,700,702],{"class":701},"s9osk","            headers",[145,704,267],{"class":259},[145,706,707],{"class":155},"HEADERS\n",[145,709,711],{"class":147,"line":710},24,[145,712,713],{"class":263},"        )\n",[145,715,717],{"class":147,"line":716},25,[145,718,719],{"class":174},"        # 如果 HTTP 状态码表示错误，抛出异常\n",[145,721,723],{"class":147,"line":722},26,[145,724,725],{"class":263},"        response.raise_for_status()\n",[145,727,729,732,734],{"class":147,"line":728},27,[145,730,731],{"class":263},"        task ",[145,733,267],{"class":259},[145,735,736],{"class":263}," response.json()\n",[145,738,740],{"class":147,"line":739},28,[145,741,377],{"emptyLinePlaceholder":58},[145,743,745],{"class":147,"line":744},29,[145,746,747],{"class":174},"        # 从响应中提取状态和进度\n",[145,749,751,754,756,759,762],{"class":147,"line":750},30,[145,752,753],{"class":263},"        status ",[145,755,267],{"class":259},[145,757,758],{"class":263}," task[",[145,760,761],{"class":159},"\"status\"",[145,763,764],{"class":263},"]\n",[145,766,768,771,773,776,779,781,784],{"class":147,"line":767},31,[145,769,770],{"class":263},"        progress ",[145,772,267],{"class":259},[145,774,775],{"class":263}," task.get(",[145,777,778],{"class":159},"\"progress\"",[145,780,401],{"class":263},[145,782,783],{"class":155},"0",[145,785,407],{"class":263},[145,787,789,792,795,797,800,802,805,807,810,812,815,817,820,822,825,827,830],{"class":147,"line":788},32,[145,790,791],{"class":155},"        print",[145,793,794],{"class":263},"(",[145,796,441],{"class":259},[145,798,799],{"class":159},"\"  [",[145,801,685],{"class":155},[145,803,804],{"class":263},"elapsed",[145,806,691],{"class":155},[145,808,809],{"class":159},"s] Status: ",[145,811,685],{"class":155},[145,813,814],{"class":263},"status",[145,816,691],{"class":155},[145,818,819],{"class":159}," | Progress: ",[145,821,685],{"class":155},[145,823,824],{"class":263},"progress",[145,826,691],{"class":155},[145,828,829],{"class":159},"%\"",[145,831,407],{"class":263},[145,833,835],{"class":147,"line":834},33,[145,836,377],{"emptyLinePlaceholder":58},[145,838,840],{"class":147,"line":839},34,[145,841,842],{"class":174},"        # 检查终态\n",[145,844,846,849,852,855,858],{"class":147,"line":845},35,[145,847,848],{"class":259},"        if",[145,850,851],{"class":263}," status ",[145,853,854],{"class":259},"==",[145,856,857],{"class":159}," \"completed\"",[145,859,860],{"class":263},":\n",[145,862,864,867],{"class":147,"line":863},36,[145,865,866],{"class":259},"            return",[145,868,869],{"class":263}," task\n",[145,871,873,876,878,880,883],{"class":147,"line":872},37,[145,874,875],{"class":259},"        elif",[145,877,851],{"class":263},[145,879,854],{"class":259},[145,881,882],{"class":159}," \"failed\"",[145,884,860],{"class":263},[145,886,888,891,893,895,898],{"class":147,"line":887},38,[145,889,890],{"class":263},"            error_info ",[145,892,267],{"class":259},[145,894,775],{"class":263},[145,896,897],{"class":159},"\"error\"",[145,899,900],{"class":263},", {})\n",[145,902,904,907,910],{"class":147,"line":903},39,[145,905,906],{"class":259},"            raise",[145,908,909],{"class":155}," RuntimeError",[145,911,912],{"class":263},"(\n",[145,914,916,919,922,924,926,928,931,933,936,939,941,944,947,949],{"class":147,"line":915},40,[145,917,918],{"class":259},"                f",[145,920,921],{"class":159},"\"Task ",[145,923,685],{"class":155},[145,925,688],{"class":263},[145,927,691],{"class":155},[145,929,930],{"class":159}," failed: ",[145,932,685],{"class":155},[145,934,935],{"class":263},"error_info.get(",[145,937,938],{"class":159},"'message'",[145,940,401],{"class":263},[145,942,943],{"class":159},"'Unknown error'",[145,945,946],{"class":263},")",[145,948,691],{"class":155},[145,950,951],{"class":159},"\"\n",[145,953,955],{"class":147,"line":954},41,[145,956,957],{"class":263},"            )\n",[145,959,961],{"class":147,"line":960},42,[145,962,377],{"emptyLinePlaceholder":58},[145,964,966],{"class":147,"line":965},43,[145,967,968],{"class":174},"        # 等待后再次轮询\n",[145,970,972],{"class":147,"line":971},44,[145,973,974],{"class":263},"        time.sleep(poll_interval)\n",[145,976,978,981,984],{"class":147,"line":977},45,[145,979,980],{"class":263},"        elapsed ",[145,982,983],{"class":259},"+=",[145,985,986],{"class":263}," poll_interval\n",[145,988,990],{"class":147,"line":989},46,[145,991,377],{"emptyLinePlaceholder":58},[145,993,995,998,1001,1003,1005,1007,1009,1011,1013,1016,1018,1021,1023,1026],{"class":147,"line":994},47,[145,996,997],{"class":259},"    raise",[145,999,1000],{"class":155}," TimeoutError",[145,1002,794],{"class":263},[145,1004,441],{"class":259},[145,1006,921],{"class":159},[145,1008,685],{"class":155},[145,1010,688],{"class":263},[145,1012,691],{"class":155},[145,1014,1015],{"class":159}," timed out after ",[145,1017,685],{"class":155},[145,1019,1020],{"class":263},"timeout",[145,1022,691],{"class":155},[145,1024,1025],{"class":159},"s\"",[145,1027,407],{"class":263},[11,1029,1030],{},"这个函数的几个关键设计决策：",[96,1032,1033,1041,1049,1057],{},[73,1034,1035,1040],{},[23,1036,1037],{},[28,1038,1039],{},"poll_interval=10"," — 10 秒是最佳间隔。太快浪费 API 配额，太慢又影响效率。",[73,1042,1043,1048],{},[23,1044,1045],{},[28,1046,1047],{},"timeout=600"," — 10 分钟足够宽裕。大多数视频在 30–120 秒内完成，但这能覆盖队列拥堵等极端情况。",[73,1050,1051,1056],{},[23,1052,1053],{},[28,1054,1055],{},"response.raise_for_status()"," — 将 HTTP 错误（4xx/5xx）转换为 Python 异常，避免静默失败。",[73,1058,1059,1062,1063,1066],{},[23,1060,1061],{},"进度打印"," — ",[28,1064,1065],{},"[elapsed]s"," 前缀帮你关联时间。调试慢生成时很有用。",[136,1068,1070],{"className":339,"code":1069,"language":341,"meta":141,"style":141},"# ── 辅助函数：下载视频 ───────────────────────────────────────\ndef download_video(url, filename=\"output.mp4\"):\n    \"\"\"从 URL 下载视频文件。\"\"\"\n    print(f\"Downloading video to {filename}...\")\n    resp = requests.get(url, stream=True)\n    resp.raise_for_status()\n    with open(filename, \"wb\") as f:\n        for chunk in resp.iter_content(chunk_size=8192):\n            f.write(chunk)\n    print(f\"Saved: {filename} ({os.path.getsize(filename) / 1024:.0f} KB)\")\n",[28,1071,1072,1077,1094,1099,1123,1143,1148,1171,1195,1200],{"__ignoreMap":141},[145,1073,1074],{"class":147,"line":148},[145,1075,1076],{"class":174},"# ── 辅助函数：下载视频 ───────────────────────────────────────\n",[145,1078,1079,1081,1084,1087,1089,1092],{"class":147,"line":166},[145,1080,526],{"class":259},[145,1082,1083],{"class":151}," download_video",[145,1085,1086],{"class":263},"(url, filename",[145,1088,267],{"class":259},[145,1090,1091],{"class":159},"\"output.mp4\"",[145,1093,548],{"class":263},[145,1095,1096],{"class":147,"line":178},[145,1097,1098],{"class":159},"    \"\"\"从 URL 下载视频文件。\"\"\"\n",[145,1100,1101,1104,1106,1108,1111,1113,1116,1118,1121],{"class":147,"line":187},[145,1102,1103],{"class":155},"    print",[145,1105,794],{"class":263},[145,1107,441],{"class":259},[145,1109,1110],{"class":159},"\"Downloading video to ",[145,1112,685],{"class":155},[145,1114,1115],{"class":263},"filename",[145,1117,691],{"class":155},[145,1119,1120],{"class":159},"...\"",[145,1122,407],{"class":263},[145,1124,1125,1128,1130,1133,1136,1138,1141],{"class":147,"line":374},[145,1126,1127],{"class":263},"    resp ",[145,1129,267],{"class":259},[145,1131,1132],{"class":263}," requests.get(url, ",[145,1134,1135],{"class":701},"stream",[145,1137,267],{"class":259},[145,1139,1140],{"class":155},"True",[145,1142,407],{"class":263},[145,1144,1145],{"class":147,"line":380},[145,1146,1147],{"class":263},"    resp.raise_for_status()\n",[145,1149,1150,1153,1156,1159,1162,1165,1168],{"class":147,"line":386},[145,1151,1152],{"class":259},"    with",[145,1154,1155],{"class":155}," open",[145,1157,1158],{"class":263},"(filename, ",[145,1160,1161],{"class":159},"\"wb\"",[145,1163,1164],{"class":263},") ",[145,1166,1167],{"class":259},"as",[145,1169,1170],{"class":263}," f:\n",[145,1172,1173,1176,1179,1182,1185,1188,1190,1193],{"class":147,"line":410},[145,1174,1175],{"class":259},"        for",[145,1177,1178],{"class":263}," chunk ",[145,1180,1181],{"class":259},"in",[145,1183,1184],{"class":263}," resp.iter_content(",[145,1186,1187],{"class":701},"chunk_size",[145,1189,267],{"class":259},[145,1191,1192],{"class":155},"8192",[145,1194,548],{"class":263},[145,1196,1197],{"class":147,"line":421},[145,1198,1199],{"class":263},"            f.write(chunk)\n",[145,1201,1202,1204,1206,1208,1211,1213,1215,1217,1220,1222,1225,1228,1231,1234,1236,1239],{"class":147,"line":432},[145,1203,1103],{"class":155},[145,1205,794],{"class":263},[145,1207,441],{"class":259},[145,1209,1210],{"class":159},"\"Saved: ",[145,1212,685],{"class":155},[145,1214,1115],{"class":263},[145,1216,691],{"class":155},[145,1218,1219],{"class":159}," (",[145,1221,685],{"class":155},[145,1223,1224],{"class":263},"os.path.getsize(filename) ",[145,1226,1227],{"class":259},"/",[145,1229,1230],{"class":155}," 1024",[145,1232,1233],{"class":259},":.0f",[145,1235,691],{"class":155},[145,1237,1238],{"class":159}," KB)\"",[145,1240,407],{"class":263},[11,1242,1243,1244,1247,1248,1250],{},"这个函数以 8 KB 为单位流式下载，而不是把整个视频加载到内存。这很重要——生成的视频可能有 10–50 MB。",[28,1245,1246],{},"stream=True"," 参数告诉 ",[28,1249,112],{}," 增量下载。",[11,1252,1253],{},"以上三部分——配置、轮询、下载——就是基础框架。后面的每个代码示例都会用到它们，不再重复，只展示新的 payload。",[11,1255,1256,1257,298],{},"完整 API 参考请查看",[37,1258,1261],{"href":1259,"rel":1260},"https://seedance2api.app/docs/video-generation",[41],"视频生成文档",[45,1263],{},[48,1265,1267],{"id":1266},"生成你的第一个视频文生视频","生成你的第一个视频（文生视频）",[11,1269,1270],{},"开始生成视频吧。把以下代码添加到你的脚本中：",[136,1272,1274],{"className":339,"code":1273,"language":341,"meta":141,"style":141},"# ── 文生视频 ─────────────────────────────────────────────────\ndef text_to_video():\n    payload = {\n        \"model\": \"seedance-2.0\",          # 使用的 AI 模型\n        \"prompt\": (\n            \"A golden retriever puppy chases a butterfly through \"\n            \"a sunlit meadow. The camera follows the puppy with a \"\n            \"smooth tracking shot as wildflowers sway in the breeze.\"\n        ),\n        \"duration\": 5,                     # 视频时长：4-15 秒\n        \"quality\": \"720p\",                 # 分辨率：480p、720p、1080p\n        \"aspect_ratio\": \"16:9\",            # 标准宽屏\n        \"generate_audio\": True             # AI 生成匹配的音频\n    }\n\n    print(\"Submitting text-to-video request...\")\n    response = requests.post(\n        f\"{BASE_URL}/videos/generations\",  # 视频生成接口\n        headers=HEADERS,                   # 认证 + content-type 头\n        json=payload                       # 自动序列化为 JSON\n    )\n    response.raise_for_status()            # 非 200 则抛异常\n    task = response.json()                 # 解析 JSON 响应\n\n    # 打印响应中的关键信息\n    print(f\"Task created: {task['id']}\")\n    print(f\"Estimated time: {task['task_info']['estimated_time']}s\")\n    print(f\"Credits reserved: {task['usage']['credits_reserved']}\")\n\n    # 轮询直到视频就绪\n    result = wait_for_video(task[\"id\"])\n\n    # results 数组包含一个或多个视频 URL\n    video_url = result[\"results\"][0]\n    print(f\"\\nVideo URL: {video_url}\")\n    download_video(video_url, \"my_first_video.mp4\")\n\n    return result\n\n\nif __name__ == \"__main__\":\n    text_to_video()\n",[28,1275,1276,1281,1291,1300,1316,1324,1329,1334,1339,1344,1360,1376,1392,1404,1409,1413,1424,1434,1452,1467,1480,1485,1493,1506,1510,1515,1543,1575,1606,1610,1615,1631,1635,1640,1659,1686,1696,1700,1708,1712,1716,1732],{"__ignoreMap":141},[145,1277,1278],{"class":147,"line":148},[145,1279,1280],{"class":174},"# ── 文生视频 ─────────────────────────────────────────────────\n",[145,1282,1283,1285,1288],{"class":147,"line":166},[145,1284,526],{"class":259},[145,1286,1287],{"class":151}," text_to_video",[145,1289,1290],{"class":263},"():\n",[145,1292,1293,1296,1298],{"class":147,"line":178},[145,1294,1295],{"class":263},"    payload ",[145,1297,267],{"class":259},[145,1299,429],{"class":263},[145,1301,1302,1305,1307,1310,1313],{"class":147,"line":187},[145,1303,1304],{"class":159},"        \"model\"",[145,1306,438],{"class":263},[145,1308,1309],{"class":159},"\"seedance-2.0\"",[145,1311,1312],{"class":263},",          ",[145,1314,1315],{"class":174},"# 使用的 AI 模型\n",[145,1317,1318,1321],{"class":147,"line":374},[145,1319,1320],{"class":159},"        \"prompt\"",[145,1322,1323],{"class":263},": (\n",[145,1325,1326],{"class":147,"line":380},[145,1327,1328],{"class":159},"            \"A golden retriever puppy chases a butterfly through \"\n",[145,1330,1331],{"class":147,"line":386},[145,1332,1333],{"class":159},"            \"a sunlit meadow. The camera follows the puppy with a \"\n",[145,1335,1336],{"class":147,"line":410},[145,1337,1338],{"class":159},"            \"smooth tracking shot as wildflowers sway in the breeze.\"\n",[145,1340,1341],{"class":147,"line":421},[145,1342,1343],{"class":263},"        ),\n",[145,1345,1346,1349,1351,1354,1357],{"class":147,"line":432},[145,1347,1348],{"class":159},"        \"duration\"",[145,1350,438],{"class":263},[145,1352,1353],{"class":155},"5",[145,1355,1356],{"class":263},",                     ",[145,1358,1359],{"class":174},"# 视频时长：4-15 秒\n",[145,1361,1362,1365,1367,1370,1373],{"class":147,"line":456},[145,1363,1364],{"class":159},"        \"quality\"",[145,1366,438],{"class":263},[145,1368,1369],{"class":159},"\"720p\"",[145,1371,1372],{"class":263},",                 ",[145,1374,1375],{"class":174},"# 分辨率：480p、720p、1080p\n",[145,1377,1378,1381,1383,1386,1389],{"class":147,"line":467},[145,1379,1380],{"class":159},"        \"aspect_ratio\"",[145,1382,438],{"class":263},[145,1384,1385],{"class":159},"\"16:9\"",[145,1387,1388],{"class":263},",            ",[145,1390,1391],{"class":174},"# 标准宽屏\n",[145,1393,1394,1397,1399,1401],{"class":147,"line":600},[145,1395,1396],{"class":159},"        \"generate_audio\"",[145,1398,438],{"class":263},[145,1400,1140],{"class":155},[145,1402,1403],{"class":174},"             # AI 生成匹配的音频\n",[145,1405,1406],{"class":147,"line":605},[145,1407,1408],{"class":263},"    }\n",[145,1410,1411],{"class":147,"line":611},[145,1412,377],{"emptyLinePlaceholder":58},[145,1414,1415,1417,1419,1422],{"class":147,"line":617},[145,1416,1103],{"class":155},[145,1418,794],{"class":263},[145,1420,1421],{"class":159},"\"Submitting text-to-video request...\"",[145,1423,407],{"class":263},[145,1425,1426,1429,1431],{"class":147,"line":623},[145,1427,1428],{"class":263},"    response ",[145,1430,267],{"class":259},[145,1432,1433],{"class":263}," requests.post(\n",[145,1435,1436,1439,1441,1443,1446,1449],{"class":147,"line":628},[145,1437,1438],{"class":259},"        f",[145,1440,450],{"class":159},[145,1442,679],{"class":155},[145,1444,1445],{"class":159},"/videos/generations\"",[145,1447,1448],{"class":263},",  ",[145,1450,1451],{"class":174},"# 视频生成接口\n",[145,1453,1454,1457,1459,1461,1464],{"class":147,"line":639},[145,1455,1456],{"class":701},"        headers",[145,1458,267],{"class":259},[145,1460,424],{"class":155},[145,1462,1463],{"class":263},",                   ",[145,1465,1466],{"class":174},"# 认证 + content-type 头\n",[145,1468,1469,1472,1474,1477],{"class":147,"line":654},[145,1470,1471],{"class":701},"        json",[145,1473,267],{"class":259},[145,1475,1476],{"class":263},"payload                       ",[145,1478,1479],{"class":174},"# 自动序列化为 JSON\n",[145,1481,1482],{"class":147,"line":660},[145,1483,1484],{"class":263},"    )\n",[145,1486,1487,1490],{"class":147,"line":671},[145,1488,1489],{"class":263},"    response.raise_for_status()            ",[145,1491,1492],{"class":174},"# 非 200 则抛异常\n",[145,1494,1495,1498,1500,1503],{"class":147,"line":698},[145,1496,1497],{"class":263},"    task ",[145,1499,267],{"class":259},[145,1501,1502],{"class":263}," response.json()                 ",[145,1504,1505],{"class":174},"# 解析 JSON 响应\n",[145,1507,1508],{"class":147,"line":710},[145,1509,377],{"emptyLinePlaceholder":58},[145,1511,1512],{"class":147,"line":716},[145,1513,1514],{"class":174},"    # 打印响应中的关键信息\n",[145,1516,1517,1519,1521,1523,1526,1528,1531,1534,1537,1539,1541],{"class":147,"line":722},[145,1518,1103],{"class":155},[145,1520,794],{"class":263},[145,1522,441],{"class":259},[145,1524,1525],{"class":159},"\"Task created: ",[145,1527,685],{"class":155},[145,1529,1530],{"class":263},"task[",[145,1532,1533],{"class":159},"'id'",[145,1535,1536],{"class":263},"]",[145,1538,691],{"class":155},[145,1540,450],{"class":159},[145,1542,407],{"class":263},[145,1544,1545,1547,1549,1551,1554,1556,1558,1561,1564,1567,1569,1571,1573],{"class":147,"line":728},[145,1546,1103],{"class":155},[145,1548,794],{"class":263},[145,1550,441],{"class":259},[145,1552,1553],{"class":159},"\"Estimated time: ",[145,1555,685],{"class":155},[145,1557,1530],{"class":263},[145,1559,1560],{"class":159},"'task_info'",[145,1562,1563],{"class":263},"][",[145,1565,1566],{"class":159},"'estimated_time'",[145,1568,1536],{"class":263},[145,1570,691],{"class":155},[145,1572,1025],{"class":159},[145,1574,407],{"class":263},[145,1576,1577,1579,1581,1583,1586,1588,1590,1593,1595,1598,1600,1602,1604],{"class":147,"line":739},[145,1578,1103],{"class":155},[145,1580,794],{"class":263},[145,1582,441],{"class":259},[145,1584,1585],{"class":159},"\"Credits reserved: ",[145,1587,685],{"class":155},[145,1589,1530],{"class":263},[145,1591,1592],{"class":159},"'usage'",[145,1594,1563],{"class":263},[145,1596,1597],{"class":159},"'credits_reserved'",[145,1599,1536],{"class":263},[145,1601,691],{"class":155},[145,1603,450],{"class":159},[145,1605,407],{"class":263},[145,1607,1608],{"class":147,"line":744},[145,1609,377],{"emptyLinePlaceholder":58},[145,1611,1612],{"class":147,"line":750},[145,1613,1614],{"class":174},"    # 轮询直到视频就绪\n",[145,1616,1617,1620,1622,1625,1628],{"class":147,"line":767},[145,1618,1619],{"class":263},"    result ",[145,1621,267],{"class":259},[145,1623,1624],{"class":263}," wait_for_video(task[",[145,1626,1627],{"class":159},"\"id\"",[145,1629,1630],{"class":263},"])\n",[145,1632,1633],{"class":147,"line":788},[145,1634,377],{"emptyLinePlaceholder":58},[145,1636,1637],{"class":147,"line":834},[145,1638,1639],{"class":174},"    # results 数组包含一个或多个视频 URL\n",[145,1641,1642,1645,1647,1650,1653,1655,1657],{"class":147,"line":839},[145,1643,1644],{"class":263},"    video_url ",[145,1646,267],{"class":259},[145,1648,1649],{"class":263}," result[",[145,1651,1652],{"class":159},"\"results\"",[145,1654,1563],{"class":263},[145,1656,783],{"class":155},[145,1658,764],{"class":263},[145,1660,1661,1663,1665,1667,1669,1672,1675,1677,1680,1682,1684],{"class":147,"line":845},[145,1662,1103],{"class":155},[145,1664,794],{"class":263},[145,1666,441],{"class":259},[145,1668,450],{"class":159},[145,1670,1671],{"class":155},"\\n",[145,1673,1674],{"class":159},"Video URL: ",[145,1676,685],{"class":155},[145,1678,1679],{"class":263},"video_url",[145,1681,691],{"class":155},[145,1683,450],{"class":159},[145,1685,407],{"class":263},[145,1687,1688,1691,1694],{"class":147,"line":863},[145,1689,1690],{"class":263},"    download_video(video_url, ",[145,1692,1693],{"class":159},"\"my_first_video.mp4\"",[145,1695,407],{"class":263},[145,1697,1698],{"class":147,"line":872},[145,1699,377],{"emptyLinePlaceholder":58},[145,1701,1702,1705],{"class":147,"line":887},[145,1703,1704],{"class":259},"    return",[145,1706,1707],{"class":263}," result\n",[145,1709,1710],{"class":147,"line":903},[145,1711,377],{"emptyLinePlaceholder":58},[145,1713,1714],{"class":147,"line":915},[145,1715,377],{"emptyLinePlaceholder":58},[145,1717,1718,1721,1724,1727,1730],{"class":147,"line":954},[145,1719,1720],{"class":259},"if",[145,1722,1723],{"class":155}," __name__",[145,1725,1726],{"class":259}," ==",[145,1728,1729],{"class":159}," \"__main__\"",[145,1731,860],{"class":263},[145,1733,1734],{"class":147,"line":960},[145,1735,1736],{"class":263},"    text_to_video()\n",[11,1738,1739],{},"逐一解释 payload 中的参数：",[96,1741,1742,1756,1768,1776,1796,1816],{},[73,1743,1744,1749,1750,1753,1754,298],{},[23,1745,1746],{},[28,1747,1748],{},"model"," — 使用哪个 Seedance 模型。设为 ",[28,1751,1752],{},"seedance-2.0"," 使用最新版；如果 2.0 在你所在地区还不可用，先用 ",[28,1755,30],{},[73,1757,1758,1763,1764,298],{},[23,1759,1760],{},[28,1761,1762],{},"prompt"," — 视频描述。尽量具体地描述主体、动作、镜头运动和氛围。上面的提示词用了三段式结构：主体（\"golden retriever puppy\"）、动作（\"chases a butterfly\"）、镜头（\"smooth tracking shot\"）。更多提示词技巧请看",[37,1765,1767],{"href":1766},"/blog/seedance-2-prompt-guide","提示词工程指南",[73,1769,1770,1775],{},[23,1771,1772],{},[28,1773,1774],{},"duration"," — 视频时长，单位秒（4–15）。短视频生成更快、消耗更少额度。测试时建议用 5 秒。",[73,1777,1778,1783,1784,1787,1788,1791,1792,1795],{},[23,1779,1780],{},[28,1781,1782],{},"quality"," — 分辨率档位。",[28,1785,1786],{},"720p"," 是开发阶段质量和速度的最佳平衡。",[28,1789,1790],{},"480p"," 适合快速迭代，",[28,1793,1794],{},"1080p"," 用于最终渲染。",[73,1797,1798,1803,1804,1807,1808,1811,1812,1815],{},[23,1799,1800],{},[28,1801,1802],{},"aspect_ratio"," — 输出比例。",[28,1805,1806],{},"16:9"," 适合 YouTube/横屏，",[28,1809,1810],{},"9:16"," 适合抖音/Reels/Shorts，",[28,1813,1814],{},"1:1"," 适合 Instagram 信息流。",[73,1817,1818,1823,1824,1827],{},[23,1819,1820],{},[28,1821,1822],{},"generate_audio"," — 设为 ",[28,1825,1826],{},"true"," 时，Seedance 会生成与视觉内容匹配的环境音和音乐，大约增加 ~2 秒生成时间。",[11,1829,1830],{},"运行：",[136,1832,1834],{"className":138,"code":1833,"language":140,"meta":141,"style":141},"python seedance_tutorial.py\n",[28,1835,1836],{"__ignoreMap":141},[145,1837,1838,1840],{"class":147,"line":148},[145,1839,341],{"class":151},[145,1841,1842],{"class":159}," seedance_tutorial.py\n",[92,1844,1846],{"id":1845},"api-返回内容","API 返回内容",[11,1848,1849,1850,1853],{},"提交生成请求后，你会立即收到一个 ",[23,1851,1852],{},"task 对象","——视频还没准备好。以下是实际的响应：",[136,1855,1859],{"className":1856,"code":1857,"language":1858,"meta":141,"style":141},"language-json shiki shiki-themes github-dark","{\n  \"created\": 1772203771,\n  \"id\": \"task-unified-1772203771-yf1dxogh\",\n  \"model\": \"seedance-2.0\",\n  \"object\": \"video.generation.task\",\n  \"progress\": 0,\n  \"status\": \"pending\",\n  \"task_info\": {\n    \"can_cancel\": true,\n    \"estimated_time\": 132\n  },\n  \"type\": \"video\",\n  \"usage\": {\n    \"billing_rule\": \"per_second\",\n    \"credits_reserved\": 17.784,\n    \"user_group\": \"default\"\n  }\n}\n","json",[28,1860,1861,1866,1878,1890,1901,1913,1924,1936,1944,1955,1965,1970,1982,1989,2001,2013,2023,2028],{"__ignoreMap":141},[145,1862,1863],{"class":147,"line":148},[145,1864,1865],{"class":263},"{\n",[145,1867,1868,1871,1873,1876],{"class":147,"line":166},[145,1869,1870],{"class":155},"  \"created\"",[145,1872,438],{"class":263},[145,1874,1875],{"class":155},"1772203771",[145,1877,453],{"class":263},[145,1879,1880,1883,1885,1888],{"class":147,"line":178},[145,1881,1882],{"class":155},"  \"id\"",[145,1884,438],{"class":263},[145,1886,1887],{"class":159},"\"task-unified-1772203771-yf1dxogh\"",[145,1889,453],{"class":263},[145,1891,1892,1895,1897,1899],{"class":147,"line":187},[145,1893,1894],{"class":155},"  \"model\"",[145,1896,438],{"class":263},[145,1898,1309],{"class":159},[145,1900,453],{"class":263},[145,1902,1903,1906,1908,1911],{"class":147,"line":374},[145,1904,1905],{"class":155},"  \"object\"",[145,1907,438],{"class":263},[145,1909,1910],{"class":159},"\"video.generation.task\"",[145,1912,453],{"class":263},[145,1914,1915,1918,1920,1922],{"class":147,"line":380},[145,1916,1917],{"class":155},"  \"progress\"",[145,1919,438],{"class":263},[145,1921,783],{"class":155},[145,1923,453],{"class":263},[145,1925,1926,1929,1931,1934],{"class":147,"line":386},[145,1927,1928],{"class":155},"  \"status\"",[145,1930,438],{"class":263},[145,1932,1933],{"class":159},"\"pending\"",[145,1935,453],{"class":263},[145,1937,1938,1941],{"class":147,"line":410},[145,1939,1940],{"class":155},"  \"task_info\"",[145,1942,1943],{"class":263},": {\n",[145,1945,1946,1949,1951,1953],{"class":147,"line":421},[145,1947,1948],{"class":155},"    \"can_cancel\"",[145,1950,438],{"class":263},[145,1952,1826],{"class":155},[145,1954,453],{"class":263},[145,1956,1957,1960,1962],{"class":147,"line":432},[145,1958,1959],{"class":155},"    \"estimated_time\"",[145,1961,438],{"class":263},[145,1963,1964],{"class":155},"132\n",[145,1966,1967],{"class":147,"line":456},[145,1968,1969],{"class":263},"  },\n",[145,1971,1972,1975,1977,1980],{"class":147,"line":467},[145,1973,1974],{"class":155},"  \"type\"",[145,1976,438],{"class":263},[145,1978,1979],{"class":159},"\"video\"",[145,1981,453],{"class":263},[145,1983,1984,1987],{"class":147,"line":600},[145,1985,1986],{"class":155},"  \"usage\"",[145,1988,1943],{"class":263},[145,1990,1991,1994,1996,1999],{"class":147,"line":605},[145,1992,1993],{"class":155},"    \"billing_rule\"",[145,1995,438],{"class":263},[145,1997,1998],{"class":159},"\"per_second\"",[145,2000,453],{"class":263},[145,2002,2003,2006,2008,2011],{"class":147,"line":611},[145,2004,2005],{"class":155},"    \"credits_reserved\"",[145,2007,438],{"class":263},[145,2009,2010],{"class":155},"17.784",[145,2012,453],{"class":263},[145,2014,2015,2018,2020],{"class":147,"line":617},[145,2016,2017],{"class":155},"    \"user_group\"",[145,2019,438],{"class":263},[145,2021,2022],{"class":159},"\"default\"\n",[145,2024,2025],{"class":147,"line":623},[145,2026,2027],{"class":263},"  }\n",[145,2029,2030],{"class":147,"line":628},[145,2031,470],{"class":263},[11,2033,2034],{},"关键字段说明：",[2036,2037,2038,2051],"table",{},[2039,2040,2041],"thead",{},[2042,2043,2044,2048],"tr",{},[2045,2046,2047],"th",{},"字段",[2045,2049,2050],{},"含义",[2052,2053,2054,2065,2088,2100,2110,2120,2132,2142],"tbody",{},[2042,2055,2056,2062],{},[2057,2058,2059],"td",{},[28,2060,2061],{},"id",[2057,2063,2064],{},"任务 ID——用它来查询状态和获取结果",[2042,2066,2067,2071],{},[2057,2068,2069],{},[28,2070,814],{},[2057,2072,2073,2074,2077,2078,2081,2082,281,2085],{},"初始为 ",[28,2075,2076],{},"pending","，然后变为 ",[28,2079,2080],{},"processing","，最终变为 ",[28,2083,2084],{},"completed",[28,2086,2087],{},"failed",[2042,2089,2090,2094],{},[2057,2091,2092],{},[28,2093,824],{},[2057,2095,2096,2097,2099],{},"0–100 的百分比。在 ",[28,2098,2080],{}," 阶段实时更新",[2042,2101,2102,2107],{},[2057,2103,2104],{},[28,2105,2106],{},"estimated_time",[2057,2108,2109],{},"预计完成时间（秒），服务端估算",[2042,2111,2112,2117],{},[2057,2113,2114],{},[28,2115,2116],{},"credits_reserved",[2057,2118,2119],{},"本次任务预扣的额度。任务失败时自动退还",[2042,2121,2122,2127],{},[2057,2123,2124],{},[28,2125,2126],{},"task_info.can_cancel",[2057,2128,2129,2130,117],{},"是否可以取消该任务（完成前始终为 ",[28,2131,1826],{},[2042,2133,2134,2139],{},[2057,2135,2136],{},[28,2137,2138],{},"created",[2057,2140,2141],{},"任务提交时间的 Unix 时间戳",[2042,2143,2144,2149],{},[2057,2145,2146],{},[28,2147,2148],{},"usage.billing_rule",[2057,2150,2151,2152,2155],{},"计费方式——",[28,2153,2154],{},"per_second"," 表示按时长计费",[18,2157,2158],{},[11,2159,2160,2162,2163,2165,2166,2169],{},[23,2161,133],{}," 提交后立即把 ",[28,2164,2061],{}," 保存到文件或数据库。如果你的脚本在轮询过程中崩溃了，可以用保存的任务 ID 调用 ",[28,2167,2168],{},"wait_for_video()"," 恢复。任务在服务器上保留 24 小时。",[92,2171,2172],{"id":2172},"轮询过程",[11,2174,2175,2177],{},[28,2176,2168],{}," 函数每 10 秒轮询一次。以下是真实的输出：",[136,2179,2184],{"className":2180,"code":2182,"language":2183},[2181],"language-text","Submitting text-to-video request...\nTask created: task-unified-1772203771-yf1dxogh\nEstimated time: 132s\nCredits reserved: 17.784\n  [0s] Status: pending | Progress: 0%\n  [10s] Status: processing | Progress: 7%\n  [20s] Status: processing | Progress: 13%\n  [30s] Status: processing | Progress: 20%\n  [40s] Status: processing | Progress: 27%\n  [50s] Status: completed | Progress: 100%\n\nVideo URL: https://files.evolink.ai/.../cgt-20260227224931-8vl7s.mp4\nDownloading video to my_first_video.mp4...\nSaved: my_first_video.mp4 (2847 KB)\n","text",[28,2185,2182],{"__ignoreMap":141},[11,2187,2188],{},"就这么简单——从发起 API 调用到视频文件保存到本地，大约 50 秒。",[18,2190,2191],{},[11,2192,2193,2196],{},[23,2194,2195],{},"重要："," 视频 URL 在 24 小时后过期。务必及时下载文件或存储到你自己的对象存储（S3、GCS、Cloudflare R2 等）。",[18,2198,2199],{},[11,2200,2201,2203],{},[23,2202,305],{}," 不要依赖视频 URL 做长期存储。你的流水线应该在生成完成后立即下载。如果你在异步处理视频，用 Webhook（下面会讲）在生成完成的那一刻触发下载。",[11,2205,2206,2207,2210],{},"更多提示词编写技巧请看 ",[37,2208,2209],{"href":1766},"Seedance 2.0 提示词指南","——涵盖分镜脚本格式、风格关键词和时间轴语法。",[45,2212],{},[48,2214,2216],{"id":2215},"轮询结果理解异步工作流","轮询结果：理解异步工作流",[11,2218,2219,2220,2223],{},"视频生成需要 30–120+ 秒，取决于时长和质量设置。API 使用",[23,2221,2222],{},"异步任务模式","——和 OpenAI、Stability AI 以及大多数生成式 AI API 用的是同一套模式：",[70,2225,2226,2236,2246],{},[73,2227,2228,2231,2232,2235],{},[23,2229,2230],{},"提交"," → POST 到 ",[28,2233,2234],{},"/v1/videos/generations"," → 立即获得任务 ID",[73,2237,2238,2241,2242,2245],{},[23,2239,2240],{},"轮询"," → GET ",[28,2243,2244],{},"/v1/tasks/{task_id}"," → 定期检查状态",[73,2247,2248,2251,2252,2255,2256,2259],{},[23,2249,2250],{},"获取"," → 当 ",[28,2253,2254],{},"status: \"completed\""," 时，",[28,2257,2258],{},"results"," 数组中包含视频 URL",[11,2261,2262],{},"这种模式存在的原因是视频生成计算量巨大。如果用同步 HTTP 请求，视频还没生成完就会超时。",[92,2264,2265],{"id":2265},"任务状态生命周期",[136,2267,2270],{"className":2268,"code":2269,"language":2183},[2181],"pending → processing → completed\n                    ↘ failed\n",[28,2271,2269],{"__ignoreMap":141},[2036,2273,2274,2287],{},[2039,2275,2276],{},[2042,2277,2278,2281,2284],{},[2045,2279,2280],{},"状态",[2045,2282,2283],{},"发生了什么",[2045,2285,2286],{},"典型耗时",[2052,2288,2289,2301,2316,2331],{},[2042,2290,2291,2295,2298],{},[2057,2292,2293],{},[28,2294,2076],{},[2057,2296,2297],{},"任务排队中，等待 GPU 资源",[2057,2299,2300],{},"0–30 秒",[2042,2302,2303,2307,2313],{},[2057,2304,2305],{},[28,2306,2080],{},[2057,2308,2309,2310,2312],{},"视频正在生成——",[28,2311,824],{}," 实时更新",[2057,2314,2315],{},"30–120 秒",[2042,2317,2318,2322,2328],{},[2057,2319,2320],{},[28,2321,2084],{},[2057,2323,2324,2325,2327],{},"完成！",[28,2326,2258],{}," 数组中有视频 URL",[2057,2329,2330],{},"终态",[2042,2332,2333,2337,2340],{},[2057,2334,2335],{},[28,2336,2087],{},[2057,2338,2339],{},"出错了——查看错误详情",[2057,2341,2330],{},[92,2343,2344],{"id":2344},"轮询最佳实践",[11,2346,2347,2350],{},[23,2348,2349],{},"轮询间隔："," 10 秒是合理的默认值。太快浪费请求次数，还可能触发限流；太慢则拖延你的流水线。对于时间敏感的应用，可以 5 秒一次，但没必要更快了。",[11,2352,2353,2356],{},[23,2354,2355],{},"超时时间："," 根据你的参数设置合理的上限：",[2036,2358,2359,2372],{},[2039,2360,2361],{},[2042,2362,2363,2366,2369],{},[2045,2364,2365],{},"配置",[2045,2367,2368],{},"预期耗时",[2045,2370,2371],{},"建议超时",[2052,2373,2374,2385,2396,2407],{},[2042,2375,2376,2379,2382],{},[2057,2377,2378],{},"4s, 480p",[2057,2380,2381],{},"20–40 秒",[2057,2383,2384],{},"120 秒",[2042,2386,2387,2390,2393],{},[2057,2388,2389],{},"5s, 720p",[2057,2391,2392],{},"30–60 秒",[2057,2394,2395],{},"180 秒",[2042,2397,2398,2401,2404],{},[2057,2399,2400],{},"10s, 720p",[2057,2402,2403],{},"60–90 秒",[2057,2405,2406],{},"300 秒",[2042,2408,2409,2412,2415],{},[2057,2410,2411],{},"15s, 1080p",[2057,2413,2414],{},"90–180 秒",[2057,2416,2417],{},"600 秒",[11,2419,2420,2423,2424,2426,2427,2429],{},[23,2421,2422],{},"进度跟踪："," ",[28,2425,824],{}," 字段（0–100）提供细粒度反馈——适合在 UI 中构建进度条。在 ",[28,2428,2080],{}," 阶段大约每 5–7 秒更新一次。",[92,2431,2432],{"id":2432},"取消任务",[11,2434,2435],{},"如果你需要停止正在进行的生成（提示词写错了、改主意了），可以取消它：",[136,2437,2439],{"className":339,"code":2438,"language":341,"meta":141,"style":141},"def cancel_task(task_id):\n    \"\"\"取消 pending 或 processing 状态的任务。额度会退还。\"\"\"\n    response = requests.post(\n        f\"{BASE_URL}/tasks/{task_id}/cancel\",\n        headers=HEADERS\n    )\n    if response.status_code == 200:\n        print(f\"Task {task_id} cancelled. Credits refunded.\")\n    else:\n        print(f\"Cancel failed: {response.json()}\")\n",[28,2440,2441,2451,2456,2464,2485,2493,2497,2512,2533,2540],{"__ignoreMap":141},[145,2442,2443,2445,2448],{"class":147,"line":148},[145,2444,526],{"class":259},[145,2446,2447],{"class":151}," cancel_task",[145,2449,2450],{"class":263},"(task_id):\n",[145,2452,2453],{"class":147,"line":166},[145,2454,2455],{"class":159},"    \"\"\"取消 pending 或 processing 状态的任务。额度会退还。\"\"\"\n",[145,2457,2458,2460,2462],{"class":147,"line":178},[145,2459,1428],{"class":263},[145,2461,267],{"class":259},[145,2463,1433],{"class":263},[145,2465,2466,2468,2470,2472,2474,2476,2478,2480,2483],{"class":147,"line":187},[145,2467,1438],{"class":259},[145,2469,450],{"class":159},[145,2471,679],{"class":155},[145,2473,682],{"class":159},[145,2475,685],{"class":155},[145,2477,688],{"class":263},[145,2479,691],{"class":155},[145,2481,2482],{"class":159},"/cancel\"",[145,2484,453],{"class":263},[145,2486,2487,2489,2491],{"class":147,"line":374},[145,2488,1456],{"class":701},[145,2490,267],{"class":259},[145,2492,707],{"class":155},[145,2494,2495],{"class":147,"line":380},[145,2496,1484],{"class":263},[145,2498,2499,2502,2505,2507,2510],{"class":147,"line":386},[145,2500,2501],{"class":259},"    if",[145,2503,2504],{"class":263}," response.status_code ",[145,2506,854],{"class":259},[145,2508,2509],{"class":155}," 200",[145,2511,860],{"class":263},[145,2513,2514,2516,2518,2520,2522,2524,2526,2528,2531],{"class":147,"line":410},[145,2515,791],{"class":155},[145,2517,794],{"class":263},[145,2519,441],{"class":259},[145,2521,921],{"class":159},[145,2523,685],{"class":155},[145,2525,688],{"class":263},[145,2527,691],{"class":155},[145,2529,2530],{"class":159}," cancelled. Credits refunded.\"",[145,2532,407],{"class":263},[145,2534,2535,2538],{"class":147,"line":421},[145,2536,2537],{"class":259},"    else",[145,2539,860],{"class":263},[145,2541,2542,2544,2546,2548,2551,2553,2556,2558,2560],{"class":147,"line":432},[145,2543,791],{"class":155},[145,2545,794],{"class":263},[145,2547,441],{"class":259},[145,2549,2550],{"class":159},"\"Cancel failed: ",[145,2552,685],{"class":155},[145,2554,2555],{"class":263},"response.json()",[145,2557,691],{"class":155},[145,2559,450],{"class":159},[145,2561,407],{"class":263},[11,2563,2564,2565,2567,2568,2570,2571,281,2573,2575],{},"取消在 ",[28,2566,2126],{}," 为 ",[28,2569,1826],{}," 时有效。任务达到 ",[28,2572,2084],{},[28,2574,2087],{}," 后无法取消。取消时预扣的额度会自动退还。",[18,2577,2578],{},[11,2579,2580,2582],{},[23,2581,133],{}," 尽早在你的 UI 中加入取消功能。用户难免会提交错误的提示词，等 2 分钟生成一个不想要的视频既浪费时间又浪费额度。",[11,2584,2585,2586,2588,2589,298],{},"前面搭建的 ",[28,2587,2168],{}," 函数已经处理了标准轮询流程。如果你想完全跳过轮询，请直接跳到下面的 ",[37,2590,2592],{"href":2591},"#%E9%85%8D%E7%BD%AE-webhook%E8%B7%B3%E8%BF%87%E8%BD%AE%E8%AF%A2","Webhook 章节",[45,2594],{},[48,2596,2598],{"id":2597},"让图片动起来图生视频","让图片动起来（图生视频）",[11,2600,2601,2602,2605,2606,2610],{},"有产品图、角色插画或风景照想让它动起来？传入 ",[28,2603,2604],{},"image_url","，Seedance 就会把它动画化。这是",[37,2607,2609],{"href":2608},"/blog/seedance-2-ecommerce-product-videos","电商产品视频","最强大的功能之一——把一张静态产品图变成吸引眼球的视频广告。",[11,2612,2613],{},[2614,2615,2616],"em",{},"使用前面第一个示例中相同的配置和轮询函数。",[136,2618,2620],{"className":339,"code":2619,"language":341,"meta":141,"style":141},"# ── 图生视频 ─────────────────────────────────────────────────\ndef image_to_video():\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"@Image1 as the first frame. The scene slowly comes \"\n            \"to life — leaves rustle gently, soft light shifts \"\n            \"across the frame, and the subject blinks naturally.\"\n        ),\n        \"image_urls\": [\n            \"https://example.com/your-image.jpg\"\n        ],\n        \"duration\": 5,\n        \"quality\": \"720p\",\n        \"aspect_ratio\": \"16:9\"\n    }\n\n    print(\"Submitting image-to-video request...\")\n    response = requests.post(\n        f\"{BASE_URL}/videos/generations\",\n        headers=HEADERS,\n        json=payload\n    )\n    response.raise_for_status()\n    task = response.json()\n\n    print(f\"Task created: {task['id']}\")\n    result = wait_for_video(task[\"id\"])\n\n    video_url = result[\"results\"][0]\n    download_video(video_url, \"animated_image.mp4\")\n\n    return result\n",[28,2621,2622,2627,2636,2644,2654,2660,2665,2670,2675,2679,2687,2692,2697,2707,2717,2726,2730,2734,2745,2753,2765,2775,2784,2788,2793,2801,2805,2829,2841,2845,2861,2870,2874],{"__ignoreMap":141},[145,2623,2624],{"class":147,"line":148},[145,2625,2626],{"class":174},"# ── 图生视频 ─────────────────────────────────────────────────\n",[145,2628,2629,2631,2634],{"class":147,"line":166},[145,2630,526],{"class":259},[145,2632,2633],{"class":151}," image_to_video",[145,2635,1290],{"class":263},[145,2637,2638,2640,2642],{"class":147,"line":178},[145,2639,1295],{"class":263},[145,2641,267],{"class":259},[145,2643,429],{"class":263},[145,2645,2646,2648,2650,2652],{"class":147,"line":187},[145,2647,1304],{"class":159},[145,2649,438],{"class":263},[145,2651,1309],{"class":159},[145,2653,453],{"class":263},[145,2655,2656,2658],{"class":147,"line":374},[145,2657,1320],{"class":159},[145,2659,1323],{"class":263},[145,2661,2662],{"class":147,"line":380},[145,2663,2664],{"class":159},"            \"@Image1 as the first frame. The scene slowly comes \"\n",[145,2666,2667],{"class":147,"line":386},[145,2668,2669],{"class":159},"            \"to life — leaves rustle gently, soft light shifts \"\n",[145,2671,2672],{"class":147,"line":410},[145,2673,2674],{"class":159},"            \"across the frame, and the subject blinks naturally.\"\n",[145,2676,2677],{"class":147,"line":421},[145,2678,1343],{"class":263},[145,2680,2681,2684],{"class":147,"line":432},[145,2682,2683],{"class":159},"        \"image_urls\"",[145,2685,2686],{"class":263},": [\n",[145,2688,2689],{"class":147,"line":456},[145,2690,2691],{"class":159},"            \"https://example.com/your-image.jpg\"\n",[145,2693,2694],{"class":147,"line":467},[145,2695,2696],{"class":263},"        ],\n",[145,2698,2699,2701,2703,2705],{"class":147,"line":600},[145,2700,1348],{"class":159},[145,2702,438],{"class":263},[145,2704,1353],{"class":155},[145,2706,453],{"class":263},[145,2708,2709,2711,2713,2715],{"class":147,"line":605},[145,2710,1364],{"class":159},[145,2712,438],{"class":263},[145,2714,1369],{"class":159},[145,2716,453],{"class":263},[145,2718,2719,2721,2723],{"class":147,"line":611},[145,2720,1380],{"class":159},[145,2722,438],{"class":263},[145,2724,2725],{"class":159},"\"16:9\"\n",[145,2727,2728],{"class":147,"line":617},[145,2729,1408],{"class":263},[145,2731,2732],{"class":147,"line":623},[145,2733,377],{"emptyLinePlaceholder":58},[145,2735,2736,2738,2740,2743],{"class":147,"line":628},[145,2737,1103],{"class":155},[145,2739,794],{"class":263},[145,2741,2742],{"class":159},"\"Submitting image-to-video request...\"",[145,2744,407],{"class":263},[145,2746,2747,2749,2751],{"class":147,"line":639},[145,2748,1428],{"class":263},[145,2750,267],{"class":259},[145,2752,1433],{"class":263},[145,2754,2755,2757,2759,2761,2763],{"class":147,"line":654},[145,2756,1438],{"class":259},[145,2758,450],{"class":159},[145,2760,679],{"class":155},[145,2762,1445],{"class":159},[145,2764,453],{"class":263},[145,2766,2767,2769,2771,2773],{"class":147,"line":660},[145,2768,1456],{"class":701},[145,2770,267],{"class":259},[145,2772,424],{"class":155},[145,2774,453],{"class":263},[145,2776,2777,2779,2781],{"class":147,"line":671},[145,2778,1471],{"class":701},[145,2780,267],{"class":259},[145,2782,2783],{"class":263},"payload\n",[145,2785,2786],{"class":147,"line":698},[145,2787,1484],{"class":263},[145,2789,2790],{"class":147,"line":710},[145,2791,2792],{"class":263},"    response.raise_for_status()\n",[145,2794,2795,2797,2799],{"class":147,"line":716},[145,2796,1497],{"class":263},[145,2798,267],{"class":259},[145,2800,736],{"class":263},[145,2802,2803],{"class":147,"line":722},[145,2804,377],{"emptyLinePlaceholder":58},[145,2806,2807,2809,2811,2813,2815,2817,2819,2821,2823,2825,2827],{"class":147,"line":728},[145,2808,1103],{"class":155},[145,2810,794],{"class":263},[145,2812,441],{"class":259},[145,2814,1525],{"class":159},[145,2816,685],{"class":155},[145,2818,1530],{"class":263},[145,2820,1533],{"class":159},[145,2822,1536],{"class":263},[145,2824,691],{"class":155},[145,2826,450],{"class":159},[145,2828,407],{"class":263},[145,2830,2831,2833,2835,2837,2839],{"class":147,"line":739},[145,2832,1619],{"class":263},[145,2834,267],{"class":259},[145,2836,1624],{"class":263},[145,2838,1627],{"class":159},[145,2840,1630],{"class":263},[145,2842,2843],{"class":147,"line":744},[145,2844,377],{"emptyLinePlaceholder":58},[145,2846,2847,2849,2851,2853,2855,2857,2859],{"class":147,"line":750},[145,2848,1644],{"class":263},[145,2850,267],{"class":259},[145,2852,1649],{"class":263},[145,2854,1652],{"class":159},[145,2856,1563],{"class":263},[145,2858,783],{"class":155},[145,2860,764],{"class":263},[145,2862,2863,2865,2868],{"class":147,"line":767},[145,2864,1690],{"class":263},[145,2866,2867],{"class":159},"\"animated_image.mp4\"",[145,2869,407],{"class":263},[145,2871,2872],{"class":147,"line":788},[145,2873,377],{"emptyLinePlaceholder":58},[145,2875,2876,2878],{"class":147,"line":834},[145,2877,1704],{"class":259},[145,2879,1707],{"class":263},[11,2881,2882],{},"与文生视频相比，这里有几个不同点：",[96,2884,2885,2897,2918],{},[73,2886,2887,2892,2893,2896],{},[23,2888,2889],{},[28,2890,2891],{},"image_urls"," — 一个公开可访问的图片 URL 数组。API 会直接拉取这些图片，所以它们必须能从公网访问（不能是 ",[28,2894,2895],{},"localhost"," 或内网地址）。",[73,2898,2899,2905,2906,2908,2909,2911,2912,2911,2915,298],{},[23,2900,2901,2904],{},[28,2902,2903],{},"@Image1"," 在提示词中"," — 这个标签告诉 Seedance 引用哪张图片以及如何使用它。它对应 ",[28,2907,2891],{}," 中的第一个 URL。如果你传了三张图片，就用 ",[28,2910,2903],{},"、",[28,2913,2914],{},"@Image2",[28,2916,2917],{},"@Image3",[73,2919,2920,2925,2926,2928,2929,298],{},[23,2921,2922,2923],{},"没有 ",[28,2924,1822],{}," — 这里省略了，默认值是 ",[28,2927,1826],{},"。如果要生成无声动画，设为 ",[28,2930,2931],{},"false",[92,2933,2935],{"id":2934},"image-标签的工作原理","@Image 标签的工作原理",[11,2937,2938,2939,2941,2942,2944,2945,2947,2948,2951,2952,2955,2956,2959,2960,298],{},"提示词中的 ",[28,2940,2903],{}," 标签告诉 Seedance 如何使用图片，它引用的是 ",[28,2943,2891],{}," 数组中的第一个 URL。最多可以传 9 张图片（",[28,2946,2903],{}," 到 ",[28,2949,2950],{},"@Image9","）。关于多模态标签（包括 ",[28,2953,2954],{},"@Video"," 和 ",[28,2957,2958],{},"@Audio","）的完整指南，请看 ",[37,2961,2963],{"href":2962},"/blog/seedance-2-multimodal-tags-guide","多模态 @Tags 指南",[11,2965,2966],{},"常用模式：",[2036,2968,2969,2982],{},[2039,2970,2971],{},[2042,2972,2973,2976,2979],{},[2045,2974,2975],{},"提示词模式",[2045,2977,2978],{},"效果",[2045,2980,2981],{},"适用场景",[2052,2983,2984,2997,3010,3023,3036],{},[2042,2985,2986,2991,2994],{},[2057,2987,2988],{},[28,2989,2990],{},"@Image1 as first frame",[2057,2992,2993],{},"把图片用作开头帧",[2057,2995,2996],{},"产品展示、场景设定",[2042,2998,2999,3004,3007],{},[2057,3000,3001],{},[28,3002,3003],{},"@Image1 as last frame",[2057,3005,3006],{},"把图片用作结尾帧",[2057,3008,3009],{},"Logo 揭示、转场",[2042,3011,3012,3017,3020],{},[2057,3013,3014],{},[28,3015,3016],{},"@Image1 as character reference",[2057,3018,3019],{},"保持角色外观一致",[2057,3021,3022],{},"跨片段的角色一致性",[2042,3024,3025,3030,3033],{},[2057,3026,3027],{},[28,3028,3029],{},"@Image1 as style reference",[2057,3031,3032],{},"应用图片的视觉风格",[2057,3034,3035],{},"品牌一致性、美术指导",[2042,3037,3038,3043,3046],{},[2057,3039,3040],{},[28,3041,3042],{},"@Image1 as first frame, @Image2 as last frame",[2057,3044,3045],{},"在两张图片之间创建过渡",[2057,3047,3048],{},"前后对比、变形",[11,3050,3051],{},"我们测试得到的实际响应：",[136,3053,3055],{"className":1856,"code":3054,"language":1858,"meta":141,"style":141},"{\n  \"created\": 1772204037,\n  \"id\": \"task-unified-1772204036-lify8u5p\",\n  \"model\": \"seedance-2.0\",\n  \"object\": \"video.generation.task\",\n  \"progress\": 0,\n  \"status\": \"pending\",\n  \"task_info\": {\n    \"can_cancel\": true,\n    \"estimated_time\": 145\n  },\n  \"type\": \"video\",\n  \"usage\": {\n    \"billing_rule\": \"per_second\",\n    \"credits_reserved\": 17.784,\n    \"user_group\": \"default\"\n  }\n}\n",[28,3056,3057,3061,3072,3083,3093,3103,3113,3123,3129,3139,3148,3152,3162,3168,3178,3188,3196,3200],{"__ignoreMap":141},[145,3058,3059],{"class":147,"line":148},[145,3060,1865],{"class":263},[145,3062,3063,3065,3067,3070],{"class":147,"line":166},[145,3064,1870],{"class":155},[145,3066,438],{"class":263},[145,3068,3069],{"class":155},"1772204037",[145,3071,453],{"class":263},[145,3073,3074,3076,3078,3081],{"class":147,"line":178},[145,3075,1882],{"class":155},[145,3077,438],{"class":263},[145,3079,3080],{"class":159},"\"task-unified-1772204036-lify8u5p\"",[145,3082,453],{"class":263},[145,3084,3085,3087,3089,3091],{"class":147,"line":187},[145,3086,1894],{"class":155},[145,3088,438],{"class":263},[145,3090,1309],{"class":159},[145,3092,453],{"class":263},[145,3094,3095,3097,3099,3101],{"class":147,"line":374},[145,3096,1905],{"class":155},[145,3098,438],{"class":263},[145,3100,1910],{"class":159},[145,3102,453],{"class":263},[145,3104,3105,3107,3109,3111],{"class":147,"line":380},[145,3106,1917],{"class":155},[145,3108,438],{"class":263},[145,3110,783],{"class":155},[145,3112,453],{"class":263},[145,3114,3115,3117,3119,3121],{"class":147,"line":386},[145,3116,1928],{"class":155},[145,3118,438],{"class":263},[145,3120,1933],{"class":159},[145,3122,453],{"class":263},[145,3124,3125,3127],{"class":147,"line":410},[145,3126,1940],{"class":155},[145,3128,1943],{"class":263},[145,3130,3131,3133,3135,3137],{"class":147,"line":421},[145,3132,1948],{"class":155},[145,3134,438],{"class":263},[145,3136,1826],{"class":155},[145,3138,453],{"class":263},[145,3140,3141,3143,3145],{"class":147,"line":432},[145,3142,1959],{"class":155},[145,3144,438],{"class":263},[145,3146,3147],{"class":155},"145\n",[145,3149,3150],{"class":147,"line":456},[145,3151,1969],{"class":263},[145,3153,3154,3156,3158,3160],{"class":147,"line":467},[145,3155,1974],{"class":155},[145,3157,438],{"class":263},[145,3159,1979],{"class":159},[145,3161,453],{"class":263},[145,3163,3164,3166],{"class":147,"line":600},[145,3165,1986],{"class":155},[145,3167,1943],{"class":263},[145,3169,3170,3172,3174,3176],{"class":147,"line":605},[145,3171,1993],{"class":155},[145,3173,438],{"class":263},[145,3175,1998],{"class":159},[145,3177,453],{"class":263},[145,3179,3180,3182,3184,3186],{"class":147,"line":611},[145,3181,2005],{"class":155},[145,3183,438],{"class":263},[145,3185,2010],{"class":155},[145,3187,453],{"class":263},[145,3189,3190,3192,3194],{"class":147,"line":617},[145,3191,2017],{"class":155},[145,3193,438],{"class":263},[145,3195,2022],{"class":159},[145,3197,3198],{"class":147,"line":623},[145,3199,2027],{"class":263},[145,3201,3202],{"class":147,"line":628},[145,3203,470],{"class":263},[11,3205,3206,3207,3209],{},"图生视频和文生视频遵循完全相同的异步模式——提交、轮询、下载。",[28,3208,2106],{}," 会稍长一些，因为模型需要分析输入图片。",[92,3211,3212],{"id":3212},"图片要求",[2036,3214,3215,3225],{},[2039,3216,3217],{},[2042,3218,3219,3222],{},[2045,3220,3221],{},"约束",[2045,3223,3224],{},"值",[2052,3226,3227,3235,3243,3251,3259],{},[2042,3228,3229,3232],{},[2057,3230,3231],{},"最大图片数",[2057,3233,3234],{},"每次请求 9 张",[2042,3236,3237,3240],{},[2057,3238,3239],{},"最大文件大小",[2057,3241,3242],{},"每张 30 MB",[2042,3244,3245,3248],{},[2057,3246,3247],{},"支持格式",[2057,3249,3250],{},"JPEG、PNG、WebP、BMP、TIFF、GIF",[2042,3252,3253,3256],{},[2057,3254,3255],{},"URL 要求",[2057,3257,3258],{},"必须公开可访问",[2042,3260,3261,3264],{},[2057,3262,3263],{},"推荐分辨率",[2057,3265,3266],{},"短边至少 720px",[18,3268,3269],{},[11,3270,3271,3273,3274,3276],{},[23,3272,305],{}," 传本地文件路径而不是 URL。",[28,3275,2891],{}," 字段需要公开可访问的 HTTP/HTTPS URL。如果你的图片在本地，先上传到 S3、Cloudflare R2 或临时文件托管服务。",[18,3278,3279],{},[11,3280,3281,3284],{},[23,3282,3283],{},"限制："," Seedance 不支持上传写实人脸图片。系统会自动拒绝。请使用插画或风格化角色。",[92,3286,3288],{"id":3287},"为-api-托管图片","为 API 托管图片",[11,3290,3291],{},"如果你没有 CDN，以下是快速获取公开 URL 的方法：",[136,3293,3295],{"className":339,"code":3294,"language":341,"meta":141,"style":141},"# 方式一：上传到 S3（如果你有 AWS）\nimport boto3\ns3 = boto3.client('s3')\ns3.upload_file('local_image.jpg', 'my-bucket', 'seedance/input.jpg')\nimage_url = f\"https://my-bucket.s3.amazonaws.com/seedance/input.jpg\"\n\n# 方式二：使用临时文件托管 API\n# 很多服务提供免费的临时托管用于测试\n",[28,3296,3297,3302,3309,3324,3344,3357,3361,3366],{"__ignoreMap":141},[145,3298,3299],{"class":147,"line":148},[145,3300,3301],{"class":174},"# 方式一：上传到 S3（如果你有 AWS）\n",[145,3303,3304,3306],{"class":147,"line":166},[145,3305,348],{"class":259},[145,3307,3308],{"class":263}," boto3\n",[145,3310,3311,3314,3316,3319,3322],{"class":147,"line":178},[145,3312,3313],{"class":263},"s3 ",[145,3315,267],{"class":259},[145,3317,3318],{"class":263}," boto3.client(",[145,3320,3321],{"class":159},"'s3'",[145,3323,407],{"class":263},[145,3325,3326,3329,3332,3334,3337,3339,3342],{"class":147,"line":187},[145,3327,3328],{"class":263},"s3.upload_file(",[145,3330,3331],{"class":159},"'local_image.jpg'",[145,3333,401],{"class":263},[145,3335,3336],{"class":159},"'my-bucket'",[145,3338,401],{"class":263},[145,3340,3341],{"class":159},"'seedance/input.jpg'",[145,3343,407],{"class":263},[145,3345,3346,3349,3351,3354],{"class":147,"line":374},[145,3347,3348],{"class":263},"image_url ",[145,3350,267],{"class":259},[145,3352,3353],{"class":259}," f",[145,3355,3356],{"class":159},"\"https://my-bucket.s3.amazonaws.com/seedance/input.jpg\"\n",[145,3358,3359],{"class":147,"line":380},[145,3360,377],{"emptyLinePlaceholder":58},[145,3362,3363],{"class":147,"line":386},[145,3364,3365],{"class":174},"# 方式二：使用临时文件托管 API\n",[145,3367,3368],{"class":147,"line":410},[145,3369,3370],{"class":174},"# 很多服务提供免费的临时托管用于测试\n",[11,3372,3373,3374,298],{},"更多图生视频高级技巧——首尾帧控制、多图合成、电商产品动画——请看",[37,3375,3377],{"href":3376},"/blog/seedance-2-image-to-video-api","图生视频详解",[45,3379],{},[48,3381,3382],{"id":3382},"自定义你的视频",[11,3384,3385],{},"生成请求中可调整的所有参数：",[2036,3387,3388,3407],{},[2039,3389,3390],{},[2042,3391,3392,3395,3398,3401,3404],{},[2045,3393,3394],{},"参数",[2045,3396,3397],{},"类型",[2045,3399,3400],{},"默认值",[2045,3402,3403],{},"选项",[2045,3405,3406],{},"说明",[2052,3408,3409,3428,3444,3461,3484,3516,3538,3555,3572,3589],{},[2042,3410,3411,3415,3418,3421,3425],{},[2057,3412,3413],{},[28,3414,1748],{},[2057,3416,3417],{},"string",[2057,3419,3420],{},"—",[2057,3422,3423],{},[28,3424,1752],{},[2057,3426,3427],{},"必填。使用的模型。",[2042,3429,3430,3434,3436,3438,3441],{},[2057,3431,3432],{},[28,3433,1762],{},[2057,3435,3417],{},[2057,3437,3420],{},[2057,3439,3440],{},"≤2000 tokens",[2057,3442,3443],{},"必填。视频描述，可使用 @tags。",[2042,3445,3446,3450,3453,3455,3458],{},[2057,3447,3448],{},[28,3449,1774],{},[2057,3451,3452],{},"integer",[2057,3454,1353],{},[2057,3456,3457],{},"4–15",[2057,3459,3460],{},"视频时长（秒）。",[2042,3462,3463,3467,3469,3473,3481],{},[2057,3464,3465],{},[28,3466,1782],{},[2057,3468,3417],{},[2057,3470,3471],{},[28,3472,1786],{},[2057,3474,3475,2911,3477,2911,3479],{},[28,3476,1790],{},[28,3478,1786],{},[28,3480,1794],{},[2057,3482,3483],{},"分辨率档位。越高消耗越多额度。",[2042,3485,3486,3490,3492,3496,3513],{},[2057,3487,3488],{},[28,3489,1802],{},[2057,3491,3417],{},[2057,3493,3494],{},[28,3495,1806],{},[2057,3497,3498,2911,3500,2911,3502,2911,3504,2911,3507,2911,3510],{},[28,3499,1806],{},[28,3501,1810],{},[28,3503,1814],{},[28,3505,3506],{},"4:3",[28,3508,3509],{},"3:4",[28,3511,3512],{},"21:9",[2057,3514,3515],{},"输出宽高比。",[2042,3517,3518,3522,3525,3529,3535],{},[2057,3519,3520],{},[28,3521,1822],{},[2057,3523,3524],{},"boolean",[2057,3526,3527],{},[28,3528,1826],{},[2057,3530,3531,2911,3533],{},[28,3532,1826],{},[28,3534,2931],{},[2057,3536,3537],{},"启用 AI 生成音频/音乐。",[2042,3539,3540,3544,3547,3549,3552],{},[2057,3541,3542],{},[28,3543,2891],{},[2057,3545,3546],{},"array",[2057,3548,3420],{},[2057,3550,3551],{},"≤9 张图片",[2057,3553,3554],{},"参考图片。在提示词中用 @Image1、@Image2... 引用。",[2042,3556,3557,3562,3564,3566,3569],{},[2057,3558,3559],{},[28,3560,3561],{},"video_urls",[2057,3563,3546],{},[2057,3565,3420],{},[2057,3567,3568],{},"≤3 个视频",[2057,3570,3571],{},"参考视频。在提示词中用 @Video1、@Video2... 引用。",[2042,3573,3574,3579,3581,3583,3586],{},[2057,3575,3576],{},[28,3577,3578],{},"audio_urls",[2057,3580,3546],{},[2057,3582,3420],{},[2057,3584,3585],{},"≤3 个音频",[2057,3587,3588],{},"参考音频。在提示词中用 @Audio1、@Audio2... 引用。",[2042,3590,3591,3596,3598,3600,3603],{},[2057,3592,3593],{},[28,3594,3595],{},"callback_url",[2057,3597,3417],{},[2057,3599,3420],{},[2057,3601,3602],{},"HTTPS URL",[2057,3604,3605],{},"完成时的 Webhook 回调地址。",[18,3607,3608],{},[11,3609,3610,3613,3614,2955,3616,3618,3619,2911,3621,3623,3624,2947,3626,3628,3629,3632],{},[23,3611,3612],{},"Seedance 2.0 与 1.5 的区别："," 以上所有参数对 ",[28,3615,1752],{},[28,3617,30],{}," 都适用。主要区别在于：",[28,3620,3561],{},[28,3622,3578],{}," 和多图引用（",[28,3625,2914],{},[28,3627,2950],{},"）是 2.0 独有功能。在 1.5 上使用它们，API 会返回 ",[28,3630,3631],{},"400"," 错误，并明确提示该功能不支持。",[92,3634,3635],{"id":3635},"快速示例",[11,3637,3638],{},[23,3639,3640],{},"竖版社交媒体视频（抖音/Reels）：",[11,3642,3643],{},[2614,3644,2616],{},[136,3646,3648],{"className":339,"code":3647,"language":341,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"A barista pours latte art in slow motion. Close-up overhead shot.\",\n    \"duration\": 8,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"9:16\",       # 竖版，适合手机\n    \"generate_audio\": True\n}\n",[28,3649,3650,3659,3670,3682,3694,3706,3722,3732],{"__ignoreMap":141},[145,3651,3652,3655,3657],{"class":147,"line":148},[145,3653,3654],{"class":263},"payload ",[145,3656,267],{"class":259},[145,3658,429],{"class":263},[145,3660,3661,3664,3666,3668],{"class":147,"line":166},[145,3662,3663],{"class":159},"    \"model\"",[145,3665,438],{"class":263},[145,3667,1309],{"class":159},[145,3669,453],{"class":263},[145,3671,3672,3675,3677,3680],{"class":147,"line":178},[145,3673,3674],{"class":159},"    \"prompt\"",[145,3676,438],{"class":263},[145,3678,3679],{"class":159},"\"A barista pours latte art in slow motion. Close-up overhead shot.\"",[145,3681,453],{"class":263},[145,3683,3684,3687,3689,3692],{"class":147,"line":187},[145,3685,3686],{"class":159},"    \"duration\"",[145,3688,438],{"class":263},[145,3690,3691],{"class":155},"8",[145,3693,453],{"class":263},[145,3695,3696,3699,3701,3704],{"class":147,"line":374},[145,3697,3698],{"class":159},"    \"quality\"",[145,3700,438],{"class":263},[145,3702,3703],{"class":159},"\"1080p\"",[145,3705,453],{"class":263},[145,3707,3708,3711,3713,3716,3719],{"class":147,"line":380},[145,3709,3710],{"class":159},"    \"aspect_ratio\"",[145,3712,438],{"class":263},[145,3714,3715],{"class":159},"\"9:16\"",[145,3717,3718],{"class":263},",       ",[145,3720,3721],{"class":174},"# 竖版，适合手机\n",[145,3723,3724,3727,3729],{"class":147,"line":386},[145,3725,3726],{"class":159},"    \"generate_audio\"",[145,3728,438],{"class":263},[145,3730,3731],{"class":155},"True\n",[145,3733,3734],{"class":147,"line":410},[145,3735,470],{"class":263},[11,3737,3738,3740,3741,3743],{},[28,3739,1810],{}," 比例生成 1080×1920 的视频——抖音、Instagram Reels 和 YouTube Shorts 的原生分辨率。",[28,3742,1794],{}," 质量档保证手机屏幕上的清晰度。",[11,3745,3746],{},[23,3747,3748],{},"电影级宽屏 + 镜头运动：",[136,3750,3752],{"className":339,"code":3751,"language":341,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": (\n        \"Aerial drone shot over a misty mountain range at sunrise. \"\n        \"Camera slowly pushes forward, revealing a hidden valley. \"\n        \"Cinematic color grading, volumetric lighting.\"\n    ),\n    \"duration\": 10,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"21:9\",       # 超宽屏电影比例\n    \"generate_audio\": True\n}\n",[28,3753,3754,3762,3772,3778,3783,3788,3793,3798,3808,3818,3832,3840],{"__ignoreMap":141},[145,3755,3756,3758,3760],{"class":147,"line":148},[145,3757,3654],{"class":263},[145,3759,267],{"class":259},[145,3761,429],{"class":263},[145,3763,3764,3766,3768,3770],{"class":147,"line":166},[145,3765,3663],{"class":159},[145,3767,438],{"class":263},[145,3769,1309],{"class":159},[145,3771,453],{"class":263},[145,3773,3774,3776],{"class":147,"line":178},[145,3775,3674],{"class":159},[145,3777,1323],{"class":263},[145,3779,3780],{"class":147,"line":187},[145,3781,3782],{"class":159},"        \"Aerial drone shot over a misty mountain range at sunrise. \"\n",[145,3784,3785],{"class":147,"line":374},[145,3786,3787],{"class":159},"        \"Camera slowly pushes forward, revealing a hidden valley. \"\n",[145,3789,3790],{"class":147,"line":380},[145,3791,3792],{"class":159},"        \"Cinematic color grading, volumetric lighting.\"\n",[145,3794,3795],{"class":147,"line":386},[145,3796,3797],{"class":263},"    ),\n",[145,3799,3800,3802,3804,3806],{"class":147,"line":410},[145,3801,3686],{"class":159},[145,3803,438],{"class":263},[145,3805,537],{"class":155},[145,3807,453],{"class":263},[145,3809,3810,3812,3814,3816],{"class":147,"line":421},[145,3811,3698],{"class":159},[145,3813,438],{"class":263},[145,3815,3703],{"class":159},[145,3817,453],{"class":263},[145,3819,3820,3822,3824,3827,3829],{"class":147,"line":432},[145,3821,3710],{"class":159},[145,3823,438],{"class":263},[145,3825,3826],{"class":159},"\"21:9\"",[145,3828,3718],{"class":263},[145,3830,3831],{"class":174},"# 超宽屏电影比例\n",[145,3833,3834,3836,3838],{"class":147,"line":456},[145,3835,3726],{"class":159},[145,3837,438],{"class":263},[145,3839,3731],{"class":155},[145,3841,3842],{"class":147,"line":467},[145,3843,470],{"class":263},[11,3845,3846,3847,298],{},"关于编程控制镜头——推拉变焦、环绕镜头、希区柯克式运镜——请看",[37,3848,3850],{"href":3849},"/blog/seedance-2-camera-movement-api","镜头运动 API 指南",[11,3852,3853],{},[23,3854,3855],{},"无声网页背景视频：",[136,3857,3859],{"className":339,"code":3858,"language":341,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"Abstract flowing particles in deep blue and gold. Slow, meditative movement.\",\n    \"duration\": 15,               # 最长时长，适合无缝循环\n    \"quality\": \"720p\",\n    \"aspect_ratio\": \"21:9\",       # 宽屏背景\n    \"generate_audio\": False       # 自动播放背景不需要音频\n}\n",[28,3860,3861,3869,3879,3890,3905,3915,3928,3940],{"__ignoreMap":141},[145,3862,3863,3865,3867],{"class":147,"line":148},[145,3864,3654],{"class":263},[145,3866,267],{"class":259},[145,3868,429],{"class":263},[145,3870,3871,3873,3875,3877],{"class":147,"line":166},[145,3872,3663],{"class":159},[145,3874,438],{"class":263},[145,3876,1309],{"class":159},[145,3878,453],{"class":263},[145,3880,3881,3883,3885,3888],{"class":147,"line":178},[145,3882,3674],{"class":159},[145,3884,438],{"class":263},[145,3886,3887],{"class":159},"\"Abstract flowing particles in deep blue and gold. Slow, meditative movement.\"",[145,3889,453],{"class":263},[145,3891,3892,3894,3896,3899,3902],{"class":147,"line":187},[145,3893,3686],{"class":159},[145,3895,438],{"class":263},[145,3897,3898],{"class":155},"15",[145,3900,3901],{"class":263},",               ",[145,3903,3904],{"class":174},"# 最长时长，适合无缝循环\n",[145,3906,3907,3909,3911,3913],{"class":147,"line":374},[145,3908,3698],{"class":159},[145,3910,438],{"class":263},[145,3912,1369],{"class":159},[145,3914,453],{"class":263},[145,3916,3917,3919,3921,3923,3925],{"class":147,"line":380},[145,3918,3710],{"class":159},[145,3920,438],{"class":263},[145,3922,3826],{"class":159},[145,3924,3718],{"class":263},[145,3926,3927],{"class":174},"# 宽屏背景\n",[145,3929,3930,3932,3934,3937],{"class":147,"line":386},[145,3931,3726],{"class":159},[145,3933,438],{"class":263},[145,3935,3936],{"class":155},"False",[145,3938,3939],{"class":174},"       # 自动播放背景不需要音频\n",[145,3941,3942],{"class":147,"line":410},[145,3943,470],{"class":263},[11,3945,3946],{},[23,3947,3948],{},"低成本草稿（快速迭代）：",[136,3950,3952],{"className":339,"code":3951,"language":341,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"A cat wearing sunglasses sits at a DJ booth. Neon club lighting.\",\n    \"duration\": 4,                # 最短时长 = 最快生成\n    \"quality\": \"480p\",            # 最低质量 = 最省额度\n    \"aspect_ratio\": \"16:9\"\n}\n",[28,3953,3954,3962,3972,3983,3998,4012,4020],{"__ignoreMap":141},[145,3955,3956,3958,3960],{"class":147,"line":148},[145,3957,3654],{"class":263},[145,3959,267],{"class":259},[145,3961,429],{"class":263},[145,3963,3964,3966,3968,3970],{"class":147,"line":166},[145,3965,3663],{"class":159},[145,3967,438],{"class":263},[145,3969,1309],{"class":159},[145,3971,453],{"class":263},[145,3973,3974,3976,3978,3981],{"class":147,"line":178},[145,3975,3674],{"class":159},[145,3977,438],{"class":263},[145,3979,3980],{"class":159},"\"A cat wearing sunglasses sits at a DJ booth. Neon club lighting.\"",[145,3982,453],{"class":263},[145,3984,3985,3987,3989,3992,3995],{"class":147,"line":187},[145,3986,3686],{"class":159},[145,3988,438],{"class":263},[145,3990,3991],{"class":155},"4",[145,3993,3994],{"class":263},",                ",[145,3996,3997],{"class":174},"# 最短时长 = 最快生成\n",[145,3999,4000,4002,4004,4007,4009],{"class":147,"line":374},[145,4001,3698],{"class":159},[145,4003,438],{"class":263},[145,4005,4006],{"class":159},"\"480p\"",[145,4008,1388],{"class":263},[145,4010,4011],{"class":174},"# 最低质量 = 最省额度\n",[145,4013,4014,4016,4018],{"class":147,"line":380},[145,4015,3710],{"class":159},[145,4017,438],{"class":263},[145,4019,2725],{"class":159},[145,4021,4022],{"class":147,"line":386},[145,4023,470],{"class":263},[18,4025,4026],{},[11,4027,4028,4030,4031,2955,4034,4037,4038,4040],{},[23,4029,133],{}," 开发阶段始终用 ",[28,4032,4033],{},"duration: 4",[28,4035,4036],{},"quality: \"480p\"","。这是最便宜最快的组合——非常适合迭代提示词。满意后再用 ",[28,4039,1794],{}," 和你需要的时长渲染最终版。",[92,4042,4043],{"id":4043},"额度消耗估算",[11,4045,4046],{},"额度消耗随时长和质量递增。大致参考：",[2036,4048,4049,4068],{},[2039,4050,4051],{},[2042,4052,4053,4056,4059,4062,4065],{},[2045,4054,4055],{},"质量",[2045,4057,4058],{},"4s",[2045,4060,4061],{},"5s",[2045,4063,4064],{},"10s",[2045,4066,4067],{},"15s",[2052,4069,4070,4086,4102],{},[2042,4071,4072,4074,4077,4080,4083],{},[2057,4073,1790],{},[2057,4075,4076],{},"~8",[2057,4078,4079],{},"~10",[2057,4081,4082],{},"~20",[2057,4084,4085],{},"~30",[2042,4087,4088,4090,4093,4096,4099],{},[2057,4089,1786],{},[2057,4091,4092],{},"~14",[2057,4094,4095],{},"~18",[2057,4097,4098],{},"~36",[2057,4100,4101],{},"~53",[2042,4103,4104,4106,4109,4112,4115],{},[2057,4105,1794],{},[2057,4107,4108],{},"~22",[2057,4110,4111],{},"~28",[2057,4113,4114],{},"~55",[2057,4116,4117],{},"~83",[11,4119,4120],{},[2614,4121,4122,4123,4125,4126,4130],{},"近似额度。实际费用以 ",[28,4124,2116],{}," 字段为准。查看 ",[37,4127,4129],{"href":211,"rel":4128},[41],"EvoLink 控制台","了解当前费率。",[11,4132,4133,4134,2911,4137,2911,4139,4141,4142,4145,4146,298],{},"多模态引用系统——",[28,4135,4136],{},"@Image",[28,4138,2954],{},[28,4140,2958],{}," 标签——是 Seedance 2.0 真正强大的地方。你可以从参考视频中复刻",[37,4143,4144],{"href":3849},"镜头运动","，保持跨镜头的角色一致性，还能与音频节拍同步。完整指南请看",[37,4147,4148],{"href":2962},"多模态 @Tags 终极指南",[45,4150],{},[48,4152,4153],{"id":4153},"优雅地处理错误",[11,4155,4156],{},"API 调用会失败，网络会中断，限流会被触发。以下是如何构建健壮的代码来应对每种真实的错误场景。",[92,4158,4159],{"id":4159},"常见错误响应",[11,4161,4162],{},"所有错误遵循相同的格式：",[136,4164,4166],{"className":1856,"code":4165,"language":1858,"meta":141,"style":141},"{\n  \"error\": {\n    \"message\": \"description of what went wrong\",\n    \"type\": \"error_category\",\n    \"code\": \"specific_error_code\"\n  }\n}\n",[28,4167,4168,4172,4179,4191,4203,4213,4217],{"__ignoreMap":141},[145,4169,4170],{"class":147,"line":148},[145,4171,1865],{"class":263},[145,4173,4174,4177],{"class":147,"line":166},[145,4175,4176],{"class":155},"  \"error\"",[145,4178,1943],{"class":263},[145,4180,4181,4184,4186,4189],{"class":147,"line":178},[145,4182,4183],{"class":155},"    \"message\"",[145,4185,438],{"class":263},[145,4187,4188],{"class":159},"\"description of what went wrong\"",[145,4190,453],{"class":263},[145,4192,4193,4196,4198,4201],{"class":147,"line":187},[145,4194,4195],{"class":155},"    \"type\"",[145,4197,438],{"class":263},[145,4199,4200],{"class":159},"\"error_category\"",[145,4202,453],{"class":263},[145,4204,4205,4208,4210],{"class":147,"line":374},[145,4206,4207],{"class":155},"    \"code\"",[145,4209,438],{"class":263},[145,4211,4212],{"class":159},"\"specific_error_code\"\n",[145,4214,4215],{"class":147,"line":380},[145,4216,2027],{"class":263},[145,4218,4219],{"class":147,"line":386},[145,4220,470],{"class":263},[11,4222,4223,4226,4227,2955,4230,298,4233,4235,4236,4238,4239,4241],{},[28,4224,4225],{},"error"," 对象始终包含 ",[28,4228,4229],{},"message",[28,4231,4232],{},"type",[28,4234,28],{}," 字段在大多数错误中存在但不是全部。优先检查 ",[28,4237,4232],{},"，再看 ",[28,4240,28],{}," 获取具体信息。",[11,4243,4244],{},"以下是 API 返回的真实错误响应：",[11,4246,4247],{},[23,4248,4249],{},"401 — API Key 无效：",[136,4251,4253],{"className":1856,"code":4252,"language":1858,"meta":141,"style":141},"{\n  \"error\": {\n    \"message\": \"Invalid token (request id: 20260227225245660301729AApJNAhJ)\",\n    \"type\": \"evo_api_error\"\n  }\n}\n",[28,4254,4255,4259,4265,4276,4285,4289],{"__ignoreMap":141},[145,4256,4257],{"class":147,"line":148},[145,4258,1865],{"class":263},[145,4260,4261,4263],{"class":147,"line":166},[145,4262,4176],{"class":155},[145,4264,1943],{"class":263},[145,4266,4267,4269,4271,4274],{"class":147,"line":178},[145,4268,4183],{"class":155},[145,4270,438],{"class":263},[145,4272,4273],{"class":159},"\"Invalid token (request id: 20260227225245660301729AApJNAhJ)\"",[145,4275,453],{"class":263},[145,4277,4278,4280,4282],{"class":147,"line":187},[145,4279,4195],{"class":155},[145,4281,438],{"class":263},[145,4283,4284],{"class":159},"\"evo_api_error\"\n",[145,4286,4287],{"class":147,"line":374},[145,4288,2027],{"class":263},[145,4290,4291],{"class":147,"line":380},[145,4292,470],{"class":263},[11,4294,4295,4296,4298],{},"说明你的 API Key 错误、过期或已被撤销。检查 ",[28,4297,276],{}," 环境变量。常见原因：复制 Key 时带了尾部空格。",[11,4300,4301],{},[23,4302,4303],{},"400 — 缺少必填字段：",[136,4305,4307],{"className":1856,"code":4306,"language":1858,"meta":141,"style":141},"{\n  \"error\": {\n    \"code\": \"invalid_parameter\",\n    \"message\": \"prompt cannot be empty\",\n    \"type\": \"invalid_request_error\"\n  }\n}\n",[28,4308,4309,4313,4319,4330,4341,4350,4354],{"__ignoreMap":141},[145,4310,4311],{"class":147,"line":148},[145,4312,1865],{"class":263},[145,4314,4315,4317],{"class":147,"line":166},[145,4316,4176],{"class":155},[145,4318,1943],{"class":263},[145,4320,4321,4323,4325,4328],{"class":147,"line":178},[145,4322,4207],{"class":155},[145,4324,438],{"class":263},[145,4326,4327],{"class":159},"\"invalid_parameter\"",[145,4329,453],{"class":263},[145,4331,4332,4334,4336,4339],{"class":147,"line":187},[145,4333,4183],{"class":155},[145,4335,438],{"class":263},[145,4337,4338],{"class":159},"\"prompt cannot be empty\"",[145,4340,453],{"class":263},[145,4342,4343,4345,4347],{"class":147,"line":374},[145,4344,4195],{"class":155},[145,4346,438],{"class":263},[145,4348,4349],{"class":159},"\"invalid_request_error\"\n",[145,4351,4352],{"class":147,"line":380},[145,4353,2027],{"class":263},[145,4355,4356],{"class":147,"line":386},[145,4357,470],{"class":263},[11,4359,4360,4362],{},[28,4361,1762],{}," 字段在所有生成请求中都是必填的。传空字符串或纯空格也会触发这个错误。",[11,4364,4365],{},[23,4366,4367],{},"400 — 参数值无效：",[136,4369,4371],{"className":1856,"code":4370,"language":1858,"meta":141,"style":141},"{\n  \"error\": {\n    \"code\": \"invalid_parameter\",\n    \"message\": \"duration must be between 4 and 15\",\n    \"type\": \"invalid_request_error\"\n  }\n}\n",[28,4372,4373,4377,4383,4393,4404,4412,4416],{"__ignoreMap":141},[145,4374,4375],{"class":147,"line":148},[145,4376,1865],{"class":263},[145,4378,4379,4381],{"class":147,"line":166},[145,4380,4176],{"class":155},[145,4382,1943],{"class":263},[145,4384,4385,4387,4389,4391],{"class":147,"line":178},[145,4386,4207],{"class":155},[145,4388,438],{"class":263},[145,4390,4327],{"class":159},[145,4392,453],{"class":263},[145,4394,4395,4397,4399,4402],{"class":147,"line":187},[145,4396,4183],{"class":155},[145,4398,438],{"class":263},[145,4400,4401],{"class":159},"\"duration must be between 4 and 15\"",[145,4403,453],{"class":263},[145,4405,4406,4408,4410],{"class":147,"line":374},[145,4407,4195],{"class":155},[145,4409,438],{"class":263},[145,4411,4349],{"class":159},[145,4413,4414],{"class":147,"line":380},[145,4415,2027],{"class":263},[145,4417,4418],{"class":147,"line":386},[145,4419,470],{"class":263},[11,4421,4422,4423,281,4426,4429],{},"当你传 ",[28,4424,4425],{},"duration: 3",[28,4427,4428],{},"duration: 20"," 时会出现。有效范围是 4–15 秒（含）。",[11,4431,4432],{},[23,4433,4434],{},"400 — 不支持的质量档位：",[136,4436,4438],{"className":1856,"code":4437,"language":1858,"meta":141,"style":141},"{\n  \"error\": {\n    \"code\": \"invalid_parameter\",\n    \"message\": \"quality must be one of: 480p, 720p, 1080p\",\n    \"type\": \"invalid_request_error\"\n  }\n}\n",[28,4439,4440,4444,4450,4460,4471,4479,4483],{"__ignoreMap":141},[145,4441,4442],{"class":147,"line":148},[145,4443,1865],{"class":263},[145,4445,4446,4448],{"class":147,"line":166},[145,4447,4176],{"class":155},[145,4449,1943],{"class":263},[145,4451,4452,4454,4456,4458],{"class":147,"line":178},[145,4453,4207],{"class":155},[145,4455,438],{"class":263},[145,4457,4327],{"class":159},[145,4459,453],{"class":263},[145,4461,4462,4464,4466,4469],{"class":147,"line":187},[145,4463,4183],{"class":155},[145,4465,438],{"class":263},[145,4467,4468],{"class":159},"\"quality must be one of: 480p, 720p, 1080p\"",[145,4470,453],{"class":263},[145,4472,4473,4475,4477],{"class":147,"line":374},[145,4474,4195],{"class":155},[145,4476,438],{"class":263},[145,4478,4349],{"class":159},[145,4480,4481],{"class":147,"line":380},[145,4482,2027],{"class":263},[145,4484,4485],{"class":147,"line":386},[145,4486,470],{"class":263},[11,4488,4489,4490,281,4493,4496,4497,2911,4499,281,4501,298],{},"常见于传 ",[28,4491,4492],{},"\"quality\": \"4k\"",[28,4494,4495],{},"\"quality\": \"hd\""," 时。必须使用精确的字符串：",[28,4498,1790],{},[28,4500,1786],{},[28,4502,1794],{},[11,4504,4505],{},[23,4506,4507],{},"402 — 额度不足：",[136,4509,4511],{"className":1856,"code":4510,"language":1858,"meta":141,"style":141},"{\n  \"error\": {\n    \"message\": \"Insufficient credits. Required: 17.784, Available: 2.100\",\n    \"type\": \"insufficient_quota_error\"\n  }\n}\n",[28,4512,4513,4517,4523,4534,4543,4547],{"__ignoreMap":141},[145,4514,4515],{"class":147,"line":148},[145,4516,1865],{"class":263},[145,4518,4519,4521],{"class":147,"line":166},[145,4520,4176],{"class":155},[145,4522,1943],{"class":263},[145,4524,4525,4527,4529,4532],{"class":147,"line":178},[145,4526,4183],{"class":155},[145,4528,438],{"class":263},[145,4530,4531],{"class":159},"\"Insufficient credits. Required: 17.784, Available: 2.100\"",[145,4533,453],{"class":263},[145,4535,4536,4538,4540],{"class":147,"line":187},[145,4537,4195],{"class":155},[145,4539,438],{"class":263},[145,4541,4542],{"class":159},"\"insufficient_quota_error\"\n",[145,4544,4545],{"class":147,"line":374},[145,4546,2027],{"class":263},[145,4548,4549],{"class":147,"line":380},[145,4550,470],{"class":263},[11,4552,4553,4554,4557],{},"你的账户额度不够。错误信息会告诉你需要多少、还剩多少。去 ",[37,4555,4129],{"href":211,"rel":4556},[41]," 充值。",[11,4559,4560],{},[23,4561,4562],{},"404 — 任务未找到：",[136,4564,4566],{"className":1856,"code":4565,"language":1858,"meta":141,"style":141},"{\n  \"error\": {\n    \"message\": \"Task not found\",\n    \"type\": \"invalid_request_error\",\n    \"code\": \"task_not_found\"\n  }\n}\n",[28,4567,4568,4572,4578,4589,4600,4609,4613],{"__ignoreMap":141},[145,4569,4570],{"class":147,"line":148},[145,4571,1865],{"class":263},[145,4573,4574,4576],{"class":147,"line":166},[145,4575,4176],{"class":155},[145,4577,1943],{"class":263},[145,4579,4580,4582,4584,4587],{"class":147,"line":178},[145,4581,4183],{"class":155},[145,4583,438],{"class":263},[145,4585,4586],{"class":159},"\"Task not found\"",[145,4588,453],{"class":263},[145,4590,4591,4593,4595,4598],{"class":147,"line":187},[145,4592,4195],{"class":155},[145,4594,438],{"class":263},[145,4596,4597],{"class":159},"\"invalid_request_error\"",[145,4599,453],{"class":263},[145,4601,4602,4604,4606],{"class":147,"line":374},[145,4603,4207],{"class":155},[145,4605,438],{"class":263},[145,4607,4608],{"class":159},"\"task_not_found\"\n",[145,4610,4611],{"class":147,"line":380},[145,4612,2027],{"class":263},[145,4614,4615],{"class":147,"line":386},[145,4616,470],{"class":263},[11,4618,4619,4620,4622],{},"通常是任务 ID 错误，或者任务创建超过 24 小时已过期。确认你用的是创建响应中的 ",[28,4621,2061],{}," 字段，而不是其他字段。",[11,4624,4625],{},[23,4626,4627],{},"413 — 图片太大：",[136,4629,4631],{"className":1856,"code":4630,"language":1858,"meta":141,"style":141},"{\n  \"error\": {\n    \"message\": \"Image file size exceeds 30MB limit\",\n    \"type\": \"request_too_large_error\"\n  }\n}\n",[28,4632,4633,4637,4643,4654,4663,4667],{"__ignoreMap":141},[145,4634,4635],{"class":147,"line":148},[145,4636,1865],{"class":263},[145,4638,4639,4641],{"class":147,"line":166},[145,4640,4176],{"class":155},[145,4642,1943],{"class":263},[145,4644,4645,4647,4649,4652],{"class":147,"line":178},[145,4646,4183],{"class":155},[145,4648,438],{"class":263},[145,4650,4651],{"class":159},"\"Image file size exceeds 30MB limit\"",[145,4653,453],{"class":263},[145,4655,4656,4658,4660],{"class":147,"line":187},[145,4657,4195],{"class":155},[145,4659,438],{"class":263},[145,4661,4662],{"class":159},"\"request_too_large_error\"\n",[145,4664,4665],{"class":147,"line":374},[145,4666,2027],{"class":263},[145,4668,4669],{"class":147,"line":380},[145,4670,470],{"class":263},[11,4672,4673],{},"上传前先压缩图片。对 API 来说，超过 2–3 MB 的图片对生成效果的提升微乎其微。",[11,4675,4676],{},[23,4677,4678],{},"429 — 触发限流：",[136,4680,4682],{"className":1856,"code":4681,"language":1858,"meta":141,"style":141},"{\n  \"error\": {\n    \"message\": \"Rate limit exceeded. Please retry after 60 seconds.\",\n    \"type\": \"rate_limit_error\"\n  }\n}\n",[28,4683,4684,4688,4694,4705,4714,4718],{"__ignoreMap":141},[145,4685,4686],{"class":147,"line":148},[145,4687,1865],{"class":263},[145,4689,4690,4692],{"class":147,"line":166},[145,4691,4176],{"class":155},[145,4693,1943],{"class":263},[145,4695,4696,4698,4700,4703],{"class":147,"line":178},[145,4697,4183],{"class":155},[145,4699,438],{"class":263},[145,4701,4702],{"class":159},"\"Rate limit exceeded. Please retry after 60 seconds.\"",[145,4704,453],{"class":263},[145,4706,4707,4709,4711],{"class":147,"line":187},[145,4708,4195],{"class":155},[145,4710,438],{"class":263},[145,4712,4713],{"class":159},"\"rate_limit_error\"\n",[145,4715,4716],{"class":147,"line":374},[145,4717,2027],{"class":263},[145,4719,4720],{"class":147,"line":380},[145,4721,470],{"class":263},[11,4723,4724],{},"请求太频繁了。默认限制对开发来说很宽裕，但批量脚本可能会触发。实现指数退避（见下文）。",[11,4726,4727],{},[23,4728,4729],{},"422 — 内容审核拒绝：",[136,4731,4733],{"className":1856,"code":4732,"language":1858,"meta":141,"style":141},"{\n  \"error\": {\n    \"message\": \"Content rejected by safety filter\",\n    \"type\": \"content_policy_violation\",\n    \"code\": \"content_filtered\"\n  }\n}\n",[28,4734,4735,4739,4745,4756,4767,4776,4780],{"__ignoreMap":141},[145,4736,4737],{"class":147,"line":148},[145,4738,1865],{"class":263},[145,4740,4741,4743],{"class":147,"line":166},[145,4742,4176],{"class":155},[145,4744,1943],{"class":263},[145,4746,4747,4749,4751,4754],{"class":147,"line":178},[145,4748,4183],{"class":155},[145,4750,438],{"class":263},[145,4752,4753],{"class":159},"\"Content rejected by safety filter\"",[145,4755,453],{"class":263},[145,4757,4758,4760,4762,4765],{"class":147,"line":187},[145,4759,4195],{"class":155},[145,4761,438],{"class":263},[145,4763,4764],{"class":159},"\"content_policy_violation\"",[145,4766,453],{"class":263},[145,4768,4769,4771,4773],{"class":147,"line":374},[145,4770,4207],{"class":155},[145,4772,438],{"class":263},[145,4774,4775],{"class":159},"\"content_filtered\"\n",[145,4777,4778],{"class":147,"line":380},[145,4779,2027],{"class":263},[145,4781,4782],{"class":147,"line":386},[145,4783,470],{"class":263},[11,4785,4786,4787,4789],{},"你的提示词或输入图片触发了内容审核系统。修改提示词避免受限内容。",[28,4788,2891],{}," 中的写实人脸图片会被自动拒绝。",[92,4791,4792],{"id":4792},"错误速查表",[2036,4794,4795,4812],{},[2039,4796,4797],{},[2042,4798,4799,4802,4804,4806,4809],{},[2045,4800,4801],{},"HTTP 状态码",[2045,4803,3397],{},[2045,4805,2050],{},[2045,4807,4808],{},"可重试？",[2045,4810,4811],{},"处理方式",[2052,4813,4814,4832,4850,4868,4886,4904,4922,4943,4963,4983],{},[2042,4815,4816,4818,4823,4826,4829],{},[2057,4817,3631],{},[2057,4819,4820],{},[28,4821,4822],{},"invalid_request_error",[2057,4824,4825],{},"参数错误",[2057,4827,4828],{},"否",[2057,4830,4831],{},"修正 payload",[2042,4833,4834,4837,4842,4845,4847],{},[2057,4835,4836],{},"401",[2057,4838,4839],{},[28,4840,4841],{},"authentication_error",[2057,4843,4844],{},"API Key 无效",[2057,4846,4828],{},[2057,4848,4849],{},"检查 Key",[2042,4851,4852,4855,4860,4863,4865],{},[2057,4853,4854],{},"402",[2057,4856,4857],{},[28,4858,4859],{},"insufficient_quota_error",[2057,4861,4862],{},"额度不足",[2057,4864,4828],{},[2057,4866,4867],{},"充值",[2042,4869,4870,4873,4878,4881,4883],{},[2057,4871,4872],{},"404",[2057,4874,4875],{},[28,4876,4877],{},"not_found_error",[2057,4879,4880],{},"任务或模型未找到",[2057,4882,4828],{},[2057,4884,4885],{},"检查 task_id / 模型名",[2042,4887,4888,4891,4896,4899,4901],{},[2057,4889,4890],{},"413",[2057,4892,4893],{},[28,4894,4895],{},"request_too_large_error",[2057,4897,4898],{},"请求体太大",[2057,4900,4828],{},[2057,4902,4903],{},"减小文件大小",[2042,4905,4906,4909,4914,4917,4919],{},[2057,4907,4908],{},"422",[2057,4910,4911],{},[28,4912,4913],{},"content_policy_violation",[2057,4915,4916],{},"内容被过滤",[2057,4918,4828],{},[2057,4920,4921],{},"修改提示词",[2042,4923,4924,4927,4932,4935,4940],{},[2057,4925,4926],{},"429",[2057,4928,4929],{},[28,4930,4931],{},"rate_limit_error",[2057,4933,4934],{},"请求太频繁",[2057,4936,4937],{},[23,4938,4939],{},"是",[2057,4941,4942],{},"等 60 秒后重试",[2042,4944,4945,4948,4953,4956,4960],{},[2057,4946,4947],{},"500",[2057,4949,4950],{},[28,4951,4952],{},"internal_server_error",[2057,4954,4955],{},"服务器问题",[2057,4957,4958],{},[23,4959,4939],{},[2057,4961,4962],{},"几秒后重试",[2042,4964,4965,4968,4973,4976,4980],{},[2057,4966,4967],{},"502",[2057,4969,4970],{},[28,4971,4972],{},"bad_gateway",[2057,4974,4975],{},"上游错误",[2057,4977,4978],{},[23,4979,4939],{},[2057,4981,4982],{},"5 秒后重试",[2042,4984,4985,4988,4993,4996,5000],{},[2057,4986,4987],{},"503",[2057,4989,4990],{},[28,4991,4992],{},"service_unavailable_error",[2057,4994,4995],{},"服务不可用",[2057,4997,4998],{},[23,4999,4939],{},[2057,5001,5002],{},"30 秒后重试",[92,5004,5005],{"id":5005},"生产级错误处理",[11,5007,5008],{},"用重试逻辑包装你的 API 调用，处理瞬态错误：",[11,5010,5011],{},[2614,5012,2616],{},[136,5014,5016],{"className":339,"code":5015,"language":341,"meta":141,"style":141},"import random\n\ndef generate_video_with_retry(payload, max_retries=3):\n    \"\"\"\n    提交视频生成请求，对瞬态错误（429、500、502、503）自动重试。\n    \n    使用指数退避 + 随机抖动避免惊群效应：\n    - 第 1 次：等待 ~1s\n    - 第 2 次：等待 ~2s  \n    - 第 3 次：等待 ~4s\n    \n    不可重试的错误（400、401、402、404、413、422）立即失败，\n    因为重试不会修复根本问题。\n    \"\"\"\n    for attempt in range(max_retries):\n        try:\n            response = requests.post(\n                f\"{BASE_URL}/videos/generations\",\n                headers=HEADERS,\n                json=payload,\n                timeout=30       # 30 秒连接超时\n            )\n\n            # 成功——返回 task 对象\n            if response.status_code == 200:\n                return response.json()\n\n            # 解析错误响应\n            error = response.json().get(\"error\", {})\n            error_type = error.get(\"type\", \"\")\n            error_msg = error.get(\"message\", \"Unknown error\")\n\n            # 不可重试的错误——立即失败\n            if response.status_code in (400, 401, 402, 404, 413, 422):\n                raise ValueError(\n                    f\"API error {response.status_code}: {error_msg}\"\n                )\n\n            # 可重试的错误——指数退避 + 随机抖动\n            if response.status_code in (429, 500, 502, 503):\n                wait = (2 ** attempt) + random.uniform(0, 1)\n                print(f\"  Retry {attempt + 1}/{max_retries} \"\n                      f\"after {wait:.1f}s ({error_type}: {error_msg})\")\n                time.sleep(wait)\n                continue\n\n        except requests.exceptions.Timeout:\n            # 服务器在 30 秒内没有响应\n            wait = (2 ** attempt) + random.uniform(0, 1)\n            print(f\"  Timeout. Retry {attempt + 1}/{max_retries} \"\n                  f\"after {wait:.1f}s\")\n            time.sleep(wait)\n            continue\n\n        except requests.exceptions.ConnectionError as e:\n            # DNS 解析失败、连接被拒等\n            wait = (2 ** attempt) + random.uniform(0, 1)\n            print(f\"  Connection error: {e}. Retry {attempt + 1}/{max_retries} \"\n                  f\"after {wait:.1f}s\")\n            time.sleep(wait)\n            continue\n\n    raise RuntimeError(f\"Failed after {max_retries} retries\")\n",[28,5017,5018,5025,5029,5046,5050,5055,5059,5064,5069,5074,5079,5083,5088,5093,5097,5113,5120,5129,5141,5152,5162,5175,5179,5183,5188,5201,5208,5212,5217,5231,5251,5270,5274,5279,5313,5323,5349,5354,5358,5363,5389,5422,5456,5497,5502,5507,5511,5519,5525,5553,5584,5604,5610,5616,5621,5634,5640,5667,5707,5726,5731,5736,5741],{"__ignoreMap":141},[145,5019,5020,5022],{"class":147,"line":148},[145,5021,348],{"class":259},[145,5023,5024],{"class":263}," random\n",[145,5026,5027],{"class":147,"line":166},[145,5028,377],{"emptyLinePlaceholder":58},[145,5030,5031,5033,5036,5039,5041,5044],{"class":147,"line":178},[145,5032,526],{"class":259},[145,5034,5035],{"class":151}," generate_video_with_retry",[145,5037,5038],{"class":263},"(payload, max_retries",[145,5040,267],{"class":259},[145,5042,5043],{"class":155},"3",[145,5045,548],{"class":263},[145,5047,5048],{"class":147,"line":187},[145,5049,553],{"class":159},[145,5051,5052],{"class":147,"line":374},[145,5053,5054],{"class":159},"    提交视频生成请求，对瞬态错误（429、500、502、503）自动重试。\n",[145,5056,5057],{"class":147,"line":380},[145,5058,563],{"class":159},[145,5060,5061],{"class":147,"line":386},[145,5062,5063],{"class":159},"    使用指数退避 + 随机抖动避免惊群效应：\n",[145,5065,5066],{"class":147,"line":410},[145,5067,5068],{"class":159},"    - 第 1 次：等待 ~1s\n",[145,5070,5071],{"class":147,"line":421},[145,5072,5073],{"class":159},"    - 第 2 次：等待 ~2s  \n",[145,5075,5076],{"class":147,"line":432},[145,5077,5078],{"class":159},"    - 第 3 次：等待 ~4s\n",[145,5080,5081],{"class":147,"line":456},[145,5082,563],{"class":159},[145,5084,5085],{"class":147,"line":467},[145,5086,5087],{"class":159},"    不可重试的错误（400、401、402、404、413、422）立即失败，\n",[145,5089,5090],{"class":147,"line":600},[145,5091,5092],{"class":159},"    因为重试不会修复根本问题。\n",[145,5094,5095],{"class":147,"line":605},[145,5096,553],{"class":159},[145,5098,5099,5102,5105,5107,5110],{"class":147,"line":611},[145,5100,5101],{"class":259},"    for",[145,5103,5104],{"class":263}," attempt ",[145,5106,1181],{"class":259},[145,5108,5109],{"class":155}," range",[145,5111,5112],{"class":263},"(max_retries):\n",[145,5114,5115,5118],{"class":147,"line":617},[145,5116,5117],{"class":259},"        try",[145,5119,860],{"class":263},[145,5121,5122,5125,5127],{"class":147,"line":623},[145,5123,5124],{"class":263},"            response ",[145,5126,267],{"class":259},[145,5128,1433],{"class":263},[145,5130,5131,5133,5135,5137,5139],{"class":147,"line":628},[145,5132,918],{"class":259},[145,5134,450],{"class":159},[145,5136,679],{"class":155},[145,5138,1445],{"class":159},[145,5140,453],{"class":263},[145,5142,5143,5146,5148,5150],{"class":147,"line":639},[145,5144,5145],{"class":701},"                headers",[145,5147,267],{"class":259},[145,5149,424],{"class":155},[145,5151,453],{"class":263},[145,5153,5154,5157,5159],{"class":147,"line":654},[145,5155,5156],{"class":701},"                json",[145,5158,267],{"class":259},[145,5160,5161],{"class":263},"payload,\n",[145,5163,5164,5167,5169,5172],{"class":147,"line":660},[145,5165,5166],{"class":701},"                timeout",[145,5168,267],{"class":259},[145,5170,5171],{"class":155},"30",[145,5173,5174],{"class":174},"       # 30 秒连接超时\n",[145,5176,5177],{"class":147,"line":671},[145,5178,957],{"class":263},[145,5180,5181],{"class":147,"line":698},[145,5182,377],{"emptyLinePlaceholder":58},[145,5184,5185],{"class":147,"line":710},[145,5186,5187],{"class":174},"            # 成功——返回 task 对象\n",[145,5189,5190,5193,5195,5197,5199],{"class":147,"line":716},[145,5191,5192],{"class":259},"            if",[145,5194,2504],{"class":263},[145,5196,854],{"class":259},[145,5198,2509],{"class":155},[145,5200,860],{"class":263},[145,5202,5203,5206],{"class":147,"line":722},[145,5204,5205],{"class":259},"                return",[145,5207,736],{"class":263},[145,5209,5210],{"class":147,"line":728},[145,5211,377],{"emptyLinePlaceholder":58},[145,5213,5214],{"class":147,"line":739},[145,5215,5216],{"class":174},"            # 解析错误响应\n",[145,5218,5219,5222,5224,5227,5229],{"class":147,"line":744},[145,5220,5221],{"class":263},"            error ",[145,5223,267],{"class":259},[145,5225,5226],{"class":263}," response.json().get(",[145,5228,897],{"class":159},[145,5230,900],{"class":263},[145,5232,5233,5236,5238,5241,5244,5246,5249],{"class":147,"line":750},[145,5234,5235],{"class":263},"            error_type ",[145,5237,267],{"class":259},[145,5239,5240],{"class":263}," error.get(",[145,5242,5243],{"class":159},"\"type\"",[145,5245,401],{"class":263},[145,5247,5248],{"class":159},"\"\"",[145,5250,407],{"class":263},[145,5252,5253,5256,5258,5260,5263,5265,5268],{"class":147,"line":767},[145,5254,5255],{"class":263},"            error_msg ",[145,5257,267],{"class":259},[145,5259,5240],{"class":263},[145,5261,5262],{"class":159},"\"message\"",[145,5264,401],{"class":263},[145,5266,5267],{"class":159},"\"Unknown error\"",[145,5269,407],{"class":263},[145,5271,5272],{"class":147,"line":788},[145,5273,377],{"emptyLinePlaceholder":58},[145,5275,5276],{"class":147,"line":834},[145,5277,5278],{"class":174},"            # 不可重试的错误——立即失败\n",[145,5280,5281,5283,5285,5287,5289,5291,5293,5295,5297,5299,5301,5303,5305,5307,5309,5311],{"class":147,"line":839},[145,5282,5192],{"class":259},[145,5284,2504],{"class":263},[145,5286,1181],{"class":259},[145,5288,1219],{"class":263},[145,5290,3631],{"class":155},[145,5292,401],{"class":263},[145,5294,4836],{"class":155},[145,5296,401],{"class":263},[145,5298,4854],{"class":155},[145,5300,401],{"class":263},[145,5302,4872],{"class":155},[145,5304,401],{"class":263},[145,5306,4890],{"class":155},[145,5308,401],{"class":263},[145,5310,4908],{"class":155},[145,5312,548],{"class":263},[145,5314,5315,5318,5321],{"class":147,"line":845},[145,5316,5317],{"class":259},"                raise",[145,5319,5320],{"class":155}," ValueError",[145,5322,912],{"class":263},[145,5324,5325,5328,5331,5333,5336,5338,5340,5342,5345,5347],{"class":147,"line":863},[145,5326,5327],{"class":259},"                    f",[145,5329,5330],{"class":159},"\"API error ",[145,5332,685],{"class":155},[145,5334,5335],{"class":263},"response.status_code",[145,5337,691],{"class":155},[145,5339,438],{"class":159},[145,5341,685],{"class":155},[145,5343,5344],{"class":263},"error_msg",[145,5346,691],{"class":155},[145,5348,951],{"class":159},[145,5350,5351],{"class":147,"line":872},[145,5352,5353],{"class":263},"                )\n",[145,5355,5356],{"class":147,"line":887},[145,5357,377],{"emptyLinePlaceholder":58},[145,5359,5360],{"class":147,"line":903},[145,5361,5362],{"class":174},"            # 可重试的错误——指数退避 + 随机抖动\n",[145,5364,5365,5367,5369,5371,5373,5375,5377,5379,5381,5383,5385,5387],{"class":147,"line":915},[145,5366,5192],{"class":259},[145,5368,2504],{"class":263},[145,5370,1181],{"class":259},[145,5372,1219],{"class":263},[145,5374,4926],{"class":155},[145,5376,401],{"class":263},[145,5378,4947],{"class":155},[145,5380,401],{"class":263},[145,5382,4967],{"class":155},[145,5384,401],{"class":263},[145,5386,4987],{"class":155},[145,5388,548],{"class":263},[145,5390,5391,5394,5396,5398,5401,5404,5407,5410,5413,5415,5417,5420],{"class":147,"line":954},[145,5392,5393],{"class":263},"                wait ",[145,5395,267],{"class":259},[145,5397,1219],{"class":263},[145,5399,5400],{"class":155},"2",[145,5402,5403],{"class":259}," **",[145,5405,5406],{"class":263}," attempt) ",[145,5408,5409],{"class":259},"+",[145,5411,5412],{"class":263}," random.uniform(",[145,5414,783],{"class":155},[145,5416,401],{"class":263},[145,5418,5419],{"class":155},"1",[145,5421,407],{"class":263},[145,5423,5424,5427,5429,5431,5434,5436,5439,5441,5444,5446,5448,5451,5453],{"class":147,"line":960},[145,5425,5426],{"class":155},"                print",[145,5428,794],{"class":263},[145,5430,441],{"class":259},[145,5432,5433],{"class":159},"\"  Retry ",[145,5435,685],{"class":155},[145,5437,5438],{"class":263},"attempt ",[145,5440,5409],{"class":259},[145,5442,5443],{"class":155}," 1}",[145,5445,1227],{"class":159},[145,5447,685],{"class":155},[145,5449,5450],{"class":263},"max_retries",[145,5452,691],{"class":155},[145,5454,5455],{"class":159}," \"\n",[145,5457,5458,5461,5464,5466,5469,5472,5474,5477,5479,5482,5484,5486,5488,5490,5492,5495],{"class":147,"line":965},[145,5459,5460],{"class":259},"                      f",[145,5462,5463],{"class":159},"\"after ",[145,5465,685],{"class":155},[145,5467,5468],{"class":263},"wait",[145,5470,5471],{"class":259},":.1f",[145,5473,691],{"class":155},[145,5475,5476],{"class":159},"s (",[145,5478,685],{"class":155},[145,5480,5481],{"class":263},"error_type",[145,5483,691],{"class":155},[145,5485,438],{"class":159},[145,5487,685],{"class":155},[145,5489,5344],{"class":263},[145,5491,691],{"class":155},[145,5493,5494],{"class":159},")\"",[145,5496,407],{"class":263},[145,5498,5499],{"class":147,"line":971},[145,5500,5501],{"class":263},"                time.sleep(wait)\n",[145,5503,5504],{"class":147,"line":977},[145,5505,5506],{"class":259},"                continue\n",[145,5508,5509],{"class":147,"line":989},[145,5510,377],{"emptyLinePlaceholder":58},[145,5512,5513,5516],{"class":147,"line":994},[145,5514,5515],{"class":259},"        except",[145,5517,5518],{"class":263}," requests.exceptions.Timeout:\n",[145,5520,5522],{"class":147,"line":5521},48,[145,5523,5524],{"class":174},"            # 服务器在 30 秒内没有响应\n",[145,5526,5528,5531,5533,5535,5537,5539,5541,5543,5545,5547,5549,5551],{"class":147,"line":5527},49,[145,5529,5530],{"class":263},"            wait ",[145,5532,267],{"class":259},[145,5534,1219],{"class":263},[145,5536,5400],{"class":155},[145,5538,5403],{"class":259},[145,5540,5406],{"class":263},[145,5542,5409],{"class":259},[145,5544,5412],{"class":263},[145,5546,783],{"class":155},[145,5548,401],{"class":263},[145,5550,5419],{"class":155},[145,5552,407],{"class":263},[145,5554,5556,5559,5561,5563,5566,5568,5570,5572,5574,5576,5578,5580,5582],{"class":147,"line":5555},50,[145,5557,5558],{"class":155},"            print",[145,5560,794],{"class":263},[145,5562,441],{"class":259},[145,5564,5565],{"class":159},"\"  Timeout. Retry ",[145,5567,685],{"class":155},[145,5569,5438],{"class":263},[145,5571,5409],{"class":259},[145,5573,5443],{"class":155},[145,5575,1227],{"class":159},[145,5577,685],{"class":155},[145,5579,5450],{"class":263},[145,5581,691],{"class":155},[145,5583,5455],{"class":159},[145,5585,5587,5590,5592,5594,5596,5598,5600,5602],{"class":147,"line":5586},51,[145,5588,5589],{"class":259},"                  f",[145,5591,5463],{"class":159},[145,5593,685],{"class":155},[145,5595,5468],{"class":263},[145,5597,5471],{"class":259},[145,5599,691],{"class":155},[145,5601,1025],{"class":159},[145,5603,407],{"class":263},[145,5605,5607],{"class":147,"line":5606},52,[145,5608,5609],{"class":263},"            time.sleep(wait)\n",[145,5611,5613],{"class":147,"line":5612},53,[145,5614,5615],{"class":259},"            continue\n",[145,5617,5619],{"class":147,"line":5618},54,[145,5620,377],{"emptyLinePlaceholder":58},[145,5622,5624,5626,5629,5631],{"class":147,"line":5623},55,[145,5625,5515],{"class":259},[145,5627,5628],{"class":263}," requests.exceptions.ConnectionError ",[145,5630,1167],{"class":259},[145,5632,5633],{"class":263}," e:\n",[145,5635,5637],{"class":147,"line":5636},56,[145,5638,5639],{"class":174},"            # DNS 解析失败、连接被拒等\n",[145,5641,5643,5645,5647,5649,5651,5653,5655,5657,5659,5661,5663,5665],{"class":147,"line":5642},57,[145,5644,5530],{"class":263},[145,5646,267],{"class":259},[145,5648,1219],{"class":263},[145,5650,5400],{"class":155},[145,5652,5403],{"class":259},[145,5654,5406],{"class":263},[145,5656,5409],{"class":259},[145,5658,5412],{"class":263},[145,5660,783],{"class":155},[145,5662,401],{"class":263},[145,5664,5419],{"class":155},[145,5666,407],{"class":263},[145,5668,5670,5672,5674,5676,5679,5681,5684,5686,5689,5691,5693,5695,5697,5699,5701,5703,5705],{"class":147,"line":5669},58,[145,5671,5558],{"class":155},[145,5673,794],{"class":263},[145,5675,441],{"class":259},[145,5677,5678],{"class":159},"\"  Connection error: ",[145,5680,685],{"class":155},[145,5682,5683],{"class":263},"e",[145,5685,691],{"class":155},[145,5687,5688],{"class":159},". Retry ",[145,5690,685],{"class":155},[145,5692,5438],{"class":263},[145,5694,5409],{"class":259},[145,5696,5443],{"class":155},[145,5698,1227],{"class":159},[145,5700,685],{"class":155},[145,5702,5450],{"class":263},[145,5704,691],{"class":155},[145,5706,5455],{"class":159},[145,5708,5710,5712,5714,5716,5718,5720,5722,5724],{"class":147,"line":5709},59,[145,5711,5589],{"class":259},[145,5713,5463],{"class":159},[145,5715,685],{"class":155},[145,5717,5468],{"class":263},[145,5719,5471],{"class":259},[145,5721,691],{"class":155},[145,5723,1025],{"class":159},[145,5725,407],{"class":263},[145,5727,5729],{"class":147,"line":5728},60,[145,5730,5609],{"class":263},[145,5732,5734],{"class":147,"line":5733},61,[145,5735,5615],{"class":259},[145,5737,5739],{"class":147,"line":5738},62,[145,5740,377],{"emptyLinePlaceholder":58},[145,5742,5744,5746,5748,5750,5752,5755,5757,5759,5761,5764],{"class":147,"line":5743},63,[145,5745,997],{"class":259},[145,5747,909],{"class":155},[145,5749,794],{"class":263},[145,5751,441],{"class":259},[145,5753,5754],{"class":159},"\"Failed after ",[145,5756,685],{"class":155},[145,5758,5450],{"class":263},[145,5760,691],{"class":155},[145,5762,5763],{"class":159}," retries\"",[145,5765,407],{"class":263},[11,5767,5768],{},"这段代码处理了：",[96,5770,5771,5777,5783,5789,5795],{},[73,5772,5773,5776],{},[23,5774,5775],{},"限流（429）"," — 指数退避 + 随机抖动避免多个客户端同步重试",[73,5778,5779,5782],{},[23,5780,5781],{},"服务器错误（500/502/503）"," — 自动重试，间隔递增",[73,5784,5785,5788],{},[23,5786,5787],{},"超时"," — 30 秒超时防止在无响应的服务器上挂起",[73,5790,5791,5794],{},[23,5792,5793],{},"连接中断"," — DNS 解析失败、连接被拒、网络波动",[73,5796,5797,5800],{},[23,5798,5799],{},"客户端错误（400/401/402/404/413/422）"," — 立即失败，因为重试不会修复错误的输入",[18,5802,5803],{},[11,5804,5805,5807],{},[23,5806,133],{}," 对于生产系统，建议记录失败请求的完整 payload 和错误响应。凌晨 3 点出问题时，这会让调试轻松很多。",[92,5809,5810],{"id":5810},"调用前校验输入",[11,5812,5813],{},"在发送 API 请求前先在本地捕获明显的错误，节省额度和时间：",[136,5815,5817],{"className":339,"code":5816,"language":341,"meta":141,"style":141},"def validate_payload(payload):\n    \"\"\"\n    在发送到 API 之前校验生成 payload。\n    捕获会导致 400 错误的常见错误。\n    \"\"\"\n    errors = []\n    \n    # 必填字段\n    if not payload.get(\"model\"):\n        errors.append(\"'model' is required\")\n    if not payload.get(\"prompt\") or not payload[\"prompt\"].strip():\n        errors.append(\"'prompt' is required and cannot be empty\")\n    \n    # 时长范围\n    duration = payload.get(\"duration\", 5)\n    if duration \u003C 4 or duration > 15:\n        errors.append(f\"'duration' must be 4-15, got {duration}\")\n    \n    # 质量值\n    valid_qualities = {\"480p\", \"720p\", \"1080p\"}\n    quality = payload.get(\"quality\", \"720p\")\n    if quality not in valid_qualities:\n        errors.append(f\"'quality' must be one of {valid_qualities}, got '{quality}'\")\n    \n    # 宽高比\n    valid_ratios = {\"16:9\", \"9:16\", \"1:1\", \"4:3\", \"3:4\", \"21:9\"}\n    ratio = payload.get(\"aspect_ratio\", \"16:9\")\n    if ratio not in valid_ratios:\n        errors.append(f\"'aspect_ratio' must be one of {valid_ratios}, got '{ratio}'\")\n    \n    # 图片 URL 校验\n    image_urls = payload.get(\"image_urls\", [])\n    if len(image_urls) > 9:\n        errors.append(f\"Maximum 9 images allowed, got {len(image_urls)}\")\n    for i, url in enumerate(image_urls):\n        if not url.startswith((\"http://\", \"https://\")):\n            errors.append(f\"image_urls[{i}] must be an HTTP(S) URL\")\n    \n    if errors:\n        raise ValueError(f\"Payload validation failed:\\n\" + \"\\n\".join(f\"  - {e}\" for e in errors))\n    \n    return True\n",[28,5818,5819,5829,5833,5838,5843,5847,5857,5861,5866,5881,5891,5917,5926,5930,5935,5953,5978,5997,6001,6006,6028,6046,6062,6092,6096,6101,6137,6155,6169,6198,6202,6207,6222,6239,6260,6275,6295,6317,6321,6328,6383,6387],{"__ignoreMap":141},[145,5820,5821,5823,5826],{"class":147,"line":148},[145,5822,526],{"class":259},[145,5824,5825],{"class":151}," validate_payload",[145,5827,5828],{"class":263},"(payload):\n",[145,5830,5831],{"class":147,"line":166},[145,5832,553],{"class":159},[145,5834,5835],{"class":147,"line":178},[145,5836,5837],{"class":159},"    在发送到 API 之前校验生成 payload。\n",[145,5839,5840],{"class":147,"line":187},[145,5841,5842],{"class":159},"    捕获会导致 400 错误的常见错误。\n",[145,5844,5845],{"class":147,"line":374},[145,5846,553],{"class":159},[145,5848,5849,5852,5854],{"class":147,"line":380},[145,5850,5851],{"class":263},"    errors ",[145,5853,267],{"class":259},[145,5855,5856],{"class":263}," []\n",[145,5858,5859],{"class":147,"line":386},[145,5860,563],{"class":263},[145,5862,5863],{"class":147,"line":410},[145,5864,5865],{"class":174},"    # 必填字段\n",[145,5867,5868,5870,5873,5876,5879],{"class":147,"line":421},[145,5869,2501],{"class":259},[145,5871,5872],{"class":259}," not",[145,5874,5875],{"class":263}," payload.get(",[145,5877,5878],{"class":159},"\"model\"",[145,5880,548],{"class":263},[145,5882,5883,5886,5889],{"class":147,"line":432},[145,5884,5885],{"class":263},"        errors.append(",[145,5887,5888],{"class":159},"\"'model' is required\"",[145,5890,407],{"class":263},[145,5892,5893,5895,5897,5899,5902,5904,5907,5909,5912,5914],{"class":147,"line":456},[145,5894,2501],{"class":259},[145,5896,5872],{"class":259},[145,5898,5875],{"class":263},[145,5900,5901],{"class":159},"\"prompt\"",[145,5903,1164],{"class":263},[145,5905,5906],{"class":259},"or",[145,5908,5872],{"class":259},[145,5910,5911],{"class":263}," payload[",[145,5913,5901],{"class":159},[145,5915,5916],{"class":263},"].strip():\n",[145,5918,5919,5921,5924],{"class":147,"line":467},[145,5920,5885],{"class":263},[145,5922,5923],{"class":159},"\"'prompt' is required and cannot be empty\"",[145,5925,407],{"class":263},[145,5927,5928],{"class":147,"line":600},[145,5929,563],{"class":263},[145,5931,5932],{"class":147,"line":605},[145,5933,5934],{"class":174},"    # 时长范围\n",[145,5936,5937,5940,5942,5944,5947,5949,5951],{"class":147,"line":611},[145,5938,5939],{"class":263},"    duration ",[145,5941,267],{"class":259},[145,5943,5875],{"class":263},[145,5945,5946],{"class":159},"\"duration\"",[145,5948,401],{"class":263},[145,5950,1353],{"class":155},[145,5952,407],{"class":263},[145,5954,5955,5957,5960,5962,5965,5968,5970,5973,5976],{"class":147,"line":617},[145,5956,2501],{"class":259},[145,5958,5959],{"class":263}," duration ",[145,5961,648],{"class":259},[145,5963,5964],{"class":155}," 4",[145,5966,5967],{"class":259}," or",[145,5969,5959],{"class":263},[145,5971,5972],{"class":259},">",[145,5974,5975],{"class":155}," 15",[145,5977,860],{"class":263},[145,5979,5980,5982,5984,5987,5989,5991,5993,5995],{"class":147,"line":623},[145,5981,5885],{"class":263},[145,5983,441],{"class":259},[145,5985,5986],{"class":159},"\"'duration' must be 4-15, got ",[145,5988,685],{"class":155},[145,5990,1774],{"class":263},[145,5992,691],{"class":155},[145,5994,450],{"class":159},[145,5996,407],{"class":263},[145,5998,5999],{"class":147,"line":628},[145,6000,563],{"class":263},[145,6002,6003],{"class":147,"line":639},[145,6004,6005],{"class":174},"    # 质量值\n",[145,6007,6008,6011,6013,6016,6018,6020,6022,6024,6026],{"class":147,"line":654},[145,6009,6010],{"class":263},"    valid_qualities ",[145,6012,267],{"class":259},[145,6014,6015],{"class":263}," {",[145,6017,4006],{"class":159},[145,6019,401],{"class":263},[145,6021,1369],{"class":159},[145,6023,401],{"class":263},[145,6025,3703],{"class":159},[145,6027,470],{"class":263},[145,6029,6030,6033,6035,6037,6040,6042,6044],{"class":147,"line":660},[145,6031,6032],{"class":263},"    quality ",[145,6034,267],{"class":259},[145,6036,5875],{"class":263},[145,6038,6039],{"class":159},"\"quality\"",[145,6041,401],{"class":263},[145,6043,1369],{"class":159},[145,6045,407],{"class":263},[145,6047,6048,6050,6053,6056,6059],{"class":147,"line":671},[145,6049,2501],{"class":259},[145,6051,6052],{"class":263}," quality ",[145,6054,6055],{"class":259},"not",[145,6057,6058],{"class":259}," in",[145,6060,6061],{"class":263}," valid_qualities:\n",[145,6063,6064,6066,6068,6071,6073,6076,6078,6081,6083,6085,6087,6090],{"class":147,"line":698},[145,6065,5885],{"class":263},[145,6067,441],{"class":259},[145,6069,6070],{"class":159},"\"'quality' must be one of ",[145,6072,685],{"class":155},[145,6074,6075],{"class":263},"valid_qualities",[145,6077,691],{"class":155},[145,6079,6080],{"class":159},", got '",[145,6082,685],{"class":155},[145,6084,1782],{"class":263},[145,6086,691],{"class":155},[145,6088,6089],{"class":159},"'\"",[145,6091,407],{"class":263},[145,6093,6094],{"class":147,"line":710},[145,6095,563],{"class":263},[145,6097,6098],{"class":147,"line":716},[145,6099,6100],{"class":174},"    # 宽高比\n",[145,6102,6103,6106,6108,6110,6112,6114,6116,6118,6121,6123,6126,6128,6131,6133,6135],{"class":147,"line":722},[145,6104,6105],{"class":263},"    valid_ratios ",[145,6107,267],{"class":259},[145,6109,6015],{"class":263},[145,6111,1385],{"class":159},[145,6113,401],{"class":263},[145,6115,3715],{"class":159},[145,6117,401],{"class":263},[145,6119,6120],{"class":159},"\"1:1\"",[145,6122,401],{"class":263},[145,6124,6125],{"class":159},"\"4:3\"",[145,6127,401],{"class":263},[145,6129,6130],{"class":159},"\"3:4\"",[145,6132,401],{"class":263},[145,6134,3826],{"class":159},[145,6136,470],{"class":263},[145,6138,6139,6142,6144,6146,6149,6151,6153],{"class":147,"line":728},[145,6140,6141],{"class":263},"    ratio ",[145,6143,267],{"class":259},[145,6145,5875],{"class":263},[145,6147,6148],{"class":159},"\"aspect_ratio\"",[145,6150,401],{"class":263},[145,6152,1385],{"class":159},[145,6154,407],{"class":263},[145,6156,6157,6159,6162,6164,6166],{"class":147,"line":739},[145,6158,2501],{"class":259},[145,6160,6161],{"class":263}," ratio ",[145,6163,6055],{"class":259},[145,6165,6058],{"class":259},[145,6167,6168],{"class":263}," valid_ratios:\n",[145,6170,6171,6173,6175,6178,6180,6183,6185,6187,6189,6192,6194,6196],{"class":147,"line":744},[145,6172,5885],{"class":263},[145,6174,441],{"class":259},[145,6176,6177],{"class":159},"\"'aspect_ratio' must be one of ",[145,6179,685],{"class":155},[145,6181,6182],{"class":263},"valid_ratios",[145,6184,691],{"class":155},[145,6186,6080],{"class":159},[145,6188,685],{"class":155},[145,6190,6191],{"class":263},"ratio",[145,6193,691],{"class":155},[145,6195,6089],{"class":159},[145,6197,407],{"class":263},[145,6199,6200],{"class":147,"line":750},[145,6201,563],{"class":263},[145,6203,6204],{"class":147,"line":767},[145,6205,6206],{"class":174},"    # 图片 URL 校验\n",[145,6208,6209,6212,6214,6216,6219],{"class":147,"line":788},[145,6210,6211],{"class":263},"    image_urls ",[145,6213,267],{"class":259},[145,6215,5875],{"class":263},[145,6217,6218],{"class":159},"\"image_urls\"",[145,6220,6221],{"class":263},", [])\n",[145,6223,6224,6226,6229,6232,6234,6237],{"class":147,"line":834},[145,6225,2501],{"class":259},[145,6227,6228],{"class":155}," len",[145,6230,6231],{"class":263},"(image_urls) ",[145,6233,5972],{"class":259},[145,6235,6236],{"class":155}," 9",[145,6238,860],{"class":263},[145,6240,6241,6243,6245,6248,6251,6254,6256,6258],{"class":147,"line":839},[145,6242,5885],{"class":263},[145,6244,441],{"class":259},[145,6246,6247],{"class":159},"\"Maximum 9 images allowed, got ",[145,6249,6250],{"class":155},"{len",[145,6252,6253],{"class":263},"(image_urls)",[145,6255,691],{"class":155},[145,6257,450],{"class":159},[145,6259,407],{"class":263},[145,6261,6262,6264,6267,6269,6272],{"class":147,"line":845},[145,6263,5101],{"class":259},[145,6265,6266],{"class":263}," i, url ",[145,6268,1181],{"class":259},[145,6270,6271],{"class":155}," enumerate",[145,6273,6274],{"class":263},"(image_urls):\n",[145,6276,6277,6279,6281,6284,6287,6289,6292],{"class":147,"line":863},[145,6278,848],{"class":259},[145,6280,5872],{"class":259},[145,6282,6283],{"class":263}," url.startswith((",[145,6285,6286],{"class":159},"\"http://\"",[145,6288,401],{"class":263},[145,6290,6291],{"class":159},"\"https://\"",[145,6293,6294],{"class":263},")):\n",[145,6296,6297,6300,6302,6305,6307,6310,6312,6315],{"class":147,"line":872},[145,6298,6299],{"class":263},"            errors.append(",[145,6301,441],{"class":259},[145,6303,6304],{"class":159},"\"image_urls[",[145,6306,685],{"class":155},[145,6308,6309],{"class":263},"i",[145,6311,691],{"class":155},[145,6313,6314],{"class":159},"] must be an HTTP(S) URL\"",[145,6316,407],{"class":263},[145,6318,6319],{"class":147,"line":887},[145,6320,563],{"class":263},[145,6322,6323,6325],{"class":147,"line":903},[145,6324,2501],{"class":259},[145,6326,6327],{"class":263}," errors:\n",[145,6329,6330,6333,6335,6337,6339,6342,6344,6346,6349,6352,6354,6356,6359,6361,6364,6366,6368,6370,6372,6375,6378,6380],{"class":147,"line":915},[145,6331,6332],{"class":259},"        raise",[145,6334,5320],{"class":155},[145,6336,794],{"class":263},[145,6338,441],{"class":259},[145,6340,6341],{"class":159},"\"Payload validation failed:",[145,6343,1671],{"class":155},[145,6345,450],{"class":159},[145,6347,6348],{"class":259}," +",[145,6350,6351],{"class":159}," \"",[145,6353,1671],{"class":155},[145,6355,450],{"class":159},[145,6357,6358],{"class":263},".join(",[145,6360,441],{"class":259},[145,6362,6363],{"class":159},"\"  - ",[145,6365,685],{"class":155},[145,6367,5683],{"class":263},[145,6369,691],{"class":155},[145,6371,450],{"class":159},[145,6373,6374],{"class":259}," for",[145,6376,6377],{"class":263}," e ",[145,6379,1181],{"class":259},[145,6381,6382],{"class":263}," errors))\n",[145,6384,6385],{"class":147,"line":954},[145,6386,563],{"class":263},[145,6388,6389,6391],{"class":147,"line":960},[145,6390,1704],{"class":259},[145,6392,6393],{"class":155}," True\n",[18,6395,6396],{},[11,6397,6398,6400,6401,6404],{},[23,6399,305],{}," 忘记对图片 URL 中的特殊字符进行 URL 编码。如果你的图片路径包含空格或非 ASCII 字符，用 ",[28,6402,6403],{},"urllib.parse.quote()"," 编码。",[45,6406],{},[48,6408,6410],{"id":6409},"配置-webhook跳过轮询","配置 Webhook（跳过轮询）",[11,6412,6413,6414,6417],{},"轮询对脚本和原型开发来说完全够用。对于生产系统，",[23,6415,6416],{},"Webhook"," 更高效——API 在视频就绪时主动推送结果到你的服务器。不浪费请求，完成与通知之间零延迟。",[92,6419,6420],{"id":6420},"工作原理",[11,6422,6423,6424,6426],{},"在生成请求中添加 ",[28,6425,3595],{},"：",[11,6428,6429],{},[2614,6430,6431],{},"使用前面第一个示例中相同的配置。",[136,6433,6435],{"className":339,"code":6434,"language":341,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"A spaceship launches from a desert landscape at sunset.\",\n    \"duration\": 8,\n    \"quality\": \"720p\",\n    \"callback_url\": \"https://your-server.com/api/webhook/seedance\"\n}\n\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json=payload\n)\ntask = response.json()\nprint(f\"Task submitted: {task['id']}\")\n# 不需要轮询——你的 Webhook 会收到结果\n",[28,6436,6437,6445,6455,6466,6476,6486,6496,6500,6504,6513,6526,6537,6546,6550,6559,6585],{"__ignoreMap":141},[145,6438,6439,6441,6443],{"class":147,"line":148},[145,6440,3654],{"class":263},[145,6442,267],{"class":259},[145,6444,429],{"class":263},[145,6446,6447,6449,6451,6453],{"class":147,"line":166},[145,6448,3663],{"class":159},[145,6450,438],{"class":263},[145,6452,1309],{"class":159},[145,6454,453],{"class":263},[145,6456,6457,6459,6461,6464],{"class":147,"line":178},[145,6458,3674],{"class":159},[145,6460,438],{"class":263},[145,6462,6463],{"class":159},"\"A spaceship launches from a desert landscape at sunset.\"",[145,6465,453],{"class":263},[145,6467,6468,6470,6472,6474],{"class":147,"line":187},[145,6469,3686],{"class":159},[145,6471,438],{"class":263},[145,6473,3691],{"class":155},[145,6475,453],{"class":263},[145,6477,6478,6480,6482,6484],{"class":147,"line":374},[145,6479,3698],{"class":159},[145,6481,438],{"class":263},[145,6483,1369],{"class":159},[145,6485,453],{"class":263},[145,6487,6488,6491,6493],{"class":147,"line":380},[145,6489,6490],{"class":159},"    \"callback_url\"",[145,6492,438],{"class":263},[145,6494,6495],{"class":159},"\"https://your-server.com/api/webhook/seedance\"\n",[145,6497,6498],{"class":147,"line":386},[145,6499,470],{"class":263},[145,6501,6502],{"class":147,"line":410},[145,6503,377],{"emptyLinePlaceholder":58},[145,6505,6506,6509,6511],{"class":147,"line":421},[145,6507,6508],{"class":263},"response ",[145,6510,267],{"class":259},[145,6512,1433],{"class":263},[145,6514,6515,6518,6520,6522,6524],{"class":147,"line":432},[145,6516,6517],{"class":259},"    f",[145,6519,450],{"class":159},[145,6521,679],{"class":155},[145,6523,1445],{"class":159},[145,6525,453],{"class":263},[145,6527,6528,6531,6533,6535],{"class":147,"line":456},[145,6529,6530],{"class":701},"    headers",[145,6532,267],{"class":259},[145,6534,424],{"class":155},[145,6536,453],{"class":263},[145,6538,6539,6542,6544],{"class":147,"line":467},[145,6540,6541],{"class":701},"    json",[145,6543,267],{"class":259},[145,6545,2783],{"class":263},[145,6547,6548],{"class":147,"line":600},[145,6549,407],{"class":263},[145,6551,6552,6555,6557],{"class":147,"line":605},[145,6553,6554],{"class":263},"task ",[145,6556,267],{"class":259},[145,6558,736],{"class":263},[145,6560,6561,6564,6566,6568,6571,6573,6575,6577,6579,6581,6583],{"class":147,"line":611},[145,6562,6563],{"class":155},"print",[145,6565,794],{"class":263},[145,6567,441],{"class":259},[145,6569,6570],{"class":159},"\"Task submitted: ",[145,6572,685],{"class":155},[145,6574,1530],{"class":263},[145,6576,1533],{"class":159},[145,6578,1536],{"class":263},[145,6580,691],{"class":155},[145,6582,450],{"class":159},[145,6584,407],{"class":263},[145,6586,6587],{"class":147,"line":617},[145,6588,6589],{"class":174},"# 不需要轮询——你的 Webhook 会收到结果\n",[11,6591,6592,6593,6595],{},"视频就绪后，API 会向你的 ",[28,6594,3595],{}," 发送一个 POST 请求，携带完整的 task 对象——和你通过轮询拿到的内容完全一样。",[92,6597,6599],{"id":6598},"webhook-要求","Webhook 要求",[2036,6601,6602,6612],{},[2039,6603,6604],{},[2042,6605,6606,6609],{},[2045,6607,6608],{},"要求",[2045,6610,6611],{},"详情",[2052,6613,6614,6622,6630,6638,6646,6654],{},[2042,6615,6616,6619],{},[2057,6617,6618],{},"协议",[2057,6620,6621],{},"仅限 HTTPS（不支持 HTTP）——安全要求",[2042,6623,6624,6627],{},[2057,6625,6626],{},"响应",[2057,6628,6629],{},"10 秒内返回 2xx",[2042,6631,6632,6635],{},[2057,6633,6634],{},"重试",[2057,6636,6637],{},"失败时重试 3 次（间隔 1s、2s、4s）",[2042,6639,6640,6643],{},[2057,6641,6642],{},"URL 长度",[2057,6644,6645],{},"≤ 2048 字符",[2042,6647,6648,6651],{},[2057,6649,6650],{},"网络",[2057,6652,6653],{},"不支持内网/私有 IP（localhost、10.x.x.x、192.168.x.x）",[2042,6655,6656,6659],{},[2057,6657,6658],{},"请求体",[2057,6660,6661],{},"JSON POST，携带完整 task 对象",[92,6663,6665],{"id":6664},"生产级-flask-webhook-接收器","生产级 Flask Webhook 接收器",[11,6667,6668],{},"以下是一个完整的 Webhook 服务器，使用 Flask 实现，包含校验、错误处理和异步视频下载：",[136,6670,6672],{"className":339,"code":6671,"language":341,"meta":141,"style":141},"# webhook_server.py\n\"\"\"\nSeedance Webhook 接收器——处理视频生成完成的回调。\n运行：pip install flask requests\n      python webhook_server.py\n\"\"\"\nfrom flask import Flask, request, jsonify\nimport json\nimport os\nimport threading\nimport requests as req  # 重命名以避免和 flask.request 冲突\n\napp = Flask(__name__)\n\n# 保存已完成视频的目录\nOUTPUT_DIR = os.getenv(\"VIDEO_OUTPUT_DIR\", \"./videos\")\nos.makedirs(OUTPUT_DIR, exist_ok=True)\n\n\ndef download_video_async(video_url, task_id):\n    \"\"\"在后台线程中下载视频，不阻塞 Webhook 响应。\"\"\"\n    try:\n        filename = os.path.join(OUTPUT_DIR, f\"{task_id}.mp4\")\n        print(f\"  Downloading {task_id} to {filename}...\")\n        resp = req.get(video_url, stream=True, timeout=120)\n        resp.raise_for_status()\n        with open(filename, \"wb\") as f:\n            for chunk in resp.iter_content(chunk_size=8192):\n                f.write(chunk)\n        size_mb = os.path.getsize(filename) / (1024 * 1024)\n        print(f\"  Saved: {filename} ({size_mb:.1f} MB)\")\n    except Exception as e:\n        print(f\"  Download failed for {task_id}: {e}\")\n\n\n@app.route(\"/api/webhook/seedance\", methods=[\"POST\"])\ndef handle_webhook():\n    \"\"\"\n    处理 Seedance 视频生成完成的 Webhook 回调。\n    \n    视频生成完成（成功或失败）时，\n    API 会发送一个携带完整 task 对象的 POST 请求。\n    \"\"\"\n    # 解析传入的 task 对象\n    task = request.json\n    if not task:\n        return jsonify({\"error\": \"Empty body\"}), 400\n    \n    task_id = task.get(\"id\", \"unknown\")\n    status = task.get(\"status\", \"unknown\")\n    model = task.get(\"model\", \"unknown\")\n\n    print(f\"\\n{'='*50}\")\n    print(f\"Webhook received: task={task_id}\")\n    print(f\"  Status: {status}\")\n    print(f\"  Model: {model}\")\n\n    if status == \"completed\":\n        # 从 results 中提取视频 URL\n        results = task.get(\"results\", [])\n        if results:\n            video_url = results[0]\n            print(f\"  Video URL: {video_url}\")\n            \n            # 在后台线程中下载，确保快速响应\n            thread = threading.Thread(\n                target=download_video_async,\n                args=(video_url, task_id)\n            )\n            thread.start()\n        else:\n            print(f\"  WARNING: Completed but no results array!\")\n\n    elif status == \"failed\":\n        error_info = task.get(\"error\", {})\n        print(f\"  FAILED: {json.dumps(error_info, indent=2)}\")\n        # TODO: 记录到你的错误追踪系统（Sentry 等）\n        # TODO: 可选择修改参数后重试生成\n\n    else:\n        print(f\"  Unexpected status: {status}\")\n        print(f\"  Full payload: {json.dumps(task, indent=2)}\")\n\n    # 始终快速返回 200——API 期望在 10 秒内收到响应\n    return jsonify({\"received\": True, \"task_id\": task_id}), 200\n\n\n@app.route(\"/health\", methods=[\"GET\"])\ndef health_check():\n    \"\"\"负载均衡器的健康检查端点。\"\"\"\n    return jsonify({\"status\": \"ok\"}), 200\n\n\nif __name__ == \"__main__\":\n    print(f\"Starting webhook server...\")\n    print(f\"Videos will be saved to: {os.path.abspath(OUTPUT_DIR)}\")\n    print(f\"Webhook URL: http://localhost:5000/api/webhook/seedance\")\n    app.run(host=\"0.0.0.0\", port=5000, debug=True)\n",[28,6673,6674,6679,6684,6689,6694,6699,6703,6716,6722,6728,6735,6750,6754,6769,6773,6778,6797,6815,6819,6823,6833,6838,6845,6874,6904,6931,6936,6953,6972,6977,7001,7034,7047,7076,7080,7084,7109,7118,7122,7127,7131,7136,7141,7145,7150,7159,7168,7189,7193,7211,7228,7245,7249,7275,7296,7317,7338,7342,7354,7359,7372,7379,7393,7414,7420,7426,7437,7448,7459,7464,7470,7478,7492,7497,7511,7525,7557,7569,7579,7584,7591,7613,7644,7649,7655,7680,7685,7690,7713,7723,7729,7747,7752,7757,7770,7784,7811,7825],{"__ignoreMap":141},[145,6675,6676],{"class":147,"line":148},[145,6677,6678],{"class":174},"# webhook_server.py\n",[145,6680,6681],{"class":147,"line":166},[145,6682,6683],{"class":159},"\"\"\"\n",[145,6685,6686],{"class":147,"line":178},[145,6687,6688],{"class":159},"Seedance Webhook 接收器——处理视频生成完成的回调。\n",[145,6690,6691],{"class":147,"line":187},[145,6692,6693],{"class":159},"运行：pip install flask requests\n",[145,6695,6696],{"class":147,"line":374},[145,6697,6698],{"class":159},"      python webhook_server.py\n",[145,6700,6701],{"class":147,"line":380},[145,6702,6683],{"class":159},[145,6704,6705,6708,6711,6713],{"class":147,"line":386},[145,6706,6707],{"class":259},"from",[145,6709,6710],{"class":263}," flask ",[145,6712,348],{"class":259},[145,6714,6715],{"class":263}," Flask, request, jsonify\n",[145,6717,6718,6720],{"class":147,"line":410},[145,6719,348],{"class":259},[145,6721,371],{"class":263},[145,6723,6724,6726],{"class":147,"line":421},[145,6725,348],{"class":259},[145,6727,364],{"class":263},[145,6729,6730,6732],{"class":147,"line":432},[145,6731,348],{"class":259},[145,6733,6734],{"class":263}," threading\n",[145,6736,6737,6739,6742,6744,6747],{"class":147,"line":456},[145,6738,348],{"class":259},[145,6740,6741],{"class":263}," requests ",[145,6743,1167],{"class":259},[145,6745,6746],{"class":263}," req  ",[145,6748,6749],{"class":174},"# 重命名以避免和 flask.request 冲突\n",[145,6751,6752],{"class":147,"line":467},[145,6753,377],{"emptyLinePlaceholder":58},[145,6755,6756,6759,6761,6764,6767],{"class":147,"line":600},[145,6757,6758],{"class":263},"app ",[145,6760,267],{"class":259},[145,6762,6763],{"class":263}," Flask(",[145,6765,6766],{"class":155},"__name__",[145,6768,407],{"class":263},[145,6770,6771],{"class":147,"line":605},[145,6772,377],{"emptyLinePlaceholder":58},[145,6774,6775],{"class":147,"line":611},[145,6776,6777],{"class":174},"# 保存已完成视频的目录\n",[145,6779,6780,6783,6785,6787,6790,6792,6795],{"class":147,"line":617},[145,6781,6782],{"class":155},"OUTPUT_DIR",[145,6784,392],{"class":259},[145,6786,395],{"class":263},[145,6788,6789],{"class":159},"\"VIDEO_OUTPUT_DIR\"",[145,6791,401],{"class":263},[145,6793,6794],{"class":159},"\"./videos\"",[145,6796,407],{"class":263},[145,6798,6799,6802,6804,6806,6809,6811,6813],{"class":147,"line":623},[145,6800,6801],{"class":263},"os.makedirs(",[145,6803,6782],{"class":155},[145,6805,401],{"class":263},[145,6807,6808],{"class":701},"exist_ok",[145,6810,267],{"class":259},[145,6812,1140],{"class":155},[145,6814,407],{"class":263},[145,6816,6817],{"class":147,"line":628},[145,6818,377],{"emptyLinePlaceholder":58},[145,6820,6821],{"class":147,"line":639},[145,6822,377],{"emptyLinePlaceholder":58},[145,6824,6825,6827,6830],{"class":147,"line":654},[145,6826,526],{"class":259},[145,6828,6829],{"class":151}," download_video_async",[145,6831,6832],{"class":263},"(video_url, task_id):\n",[145,6834,6835],{"class":147,"line":660},[145,6836,6837],{"class":159},"    \"\"\"在后台线程中下载视频，不阻塞 Webhook 响应。\"\"\"\n",[145,6839,6840,6843],{"class":147,"line":671},[145,6841,6842],{"class":259},"    try",[145,6844,860],{"class":263},[145,6846,6847,6850,6852,6855,6857,6859,6861,6863,6865,6867,6869,6872],{"class":147,"line":698},[145,6848,6849],{"class":263},"        filename ",[145,6851,267],{"class":259},[145,6853,6854],{"class":263}," os.path.join(",[145,6856,6782],{"class":155},[145,6858,401],{"class":263},[145,6860,441],{"class":259},[145,6862,450],{"class":159},[145,6864,685],{"class":155},[145,6866,688],{"class":263},[145,6868,691],{"class":155},[145,6870,6871],{"class":159},".mp4\"",[145,6873,407],{"class":263},[145,6875,6876,6878,6880,6882,6885,6887,6889,6891,6894,6896,6898,6900,6902],{"class":147,"line":710},[145,6877,791],{"class":155},[145,6879,794],{"class":263},[145,6881,441],{"class":259},[145,6883,6884],{"class":159},"\"  Downloading ",[145,6886,685],{"class":155},[145,6888,688],{"class":263},[145,6890,691],{"class":155},[145,6892,6893],{"class":159}," to ",[145,6895,685],{"class":155},[145,6897,1115],{"class":263},[145,6899,691],{"class":155},[145,6901,1120],{"class":159},[145,6903,407],{"class":263},[145,6905,6906,6909,6911,6914,6916,6918,6920,6922,6924,6926,6929],{"class":147,"line":716},[145,6907,6908],{"class":263},"        resp ",[145,6910,267],{"class":259},[145,6912,6913],{"class":263}," req.get(video_url, ",[145,6915,1135],{"class":701},[145,6917,267],{"class":259},[145,6919,1140],{"class":155},[145,6921,401],{"class":263},[145,6923,1020],{"class":701},[145,6925,267],{"class":259},[145,6927,6928],{"class":155},"120",[145,6930,407],{"class":263},[145,6932,6933],{"class":147,"line":722},[145,6934,6935],{"class":263},"        resp.raise_for_status()\n",[145,6937,6938,6941,6943,6945,6947,6949,6951],{"class":147,"line":728},[145,6939,6940],{"class":259},"        with",[145,6942,1155],{"class":155},[145,6944,1158],{"class":263},[145,6946,1161],{"class":159},[145,6948,1164],{"class":263},[145,6950,1167],{"class":259},[145,6952,1170],{"class":263},[145,6954,6955,6958,6960,6962,6964,6966,6968,6970],{"class":147,"line":739},[145,6956,6957],{"class":259},"            for",[145,6959,1178],{"class":263},[145,6961,1181],{"class":259},[145,6963,1184],{"class":263},[145,6965,1187],{"class":701},[145,6967,267],{"class":259},[145,6969,1192],{"class":155},[145,6971,548],{"class":263},[145,6973,6974],{"class":147,"line":744},[145,6975,6976],{"class":263},"                f.write(chunk)\n",[145,6978,6979,6982,6984,6987,6989,6991,6994,6997,6999],{"class":147,"line":750},[145,6980,6981],{"class":263},"        size_mb ",[145,6983,267],{"class":259},[145,6985,6986],{"class":263}," os.path.getsize(filename) ",[145,6988,1227],{"class":259},[145,6990,1219],{"class":263},[145,6992,6993],{"class":155},"1024",[145,6995,6996],{"class":259}," *",[145,6998,1230],{"class":155},[145,7000,407],{"class":263},[145,7002,7003,7005,7007,7009,7012,7014,7016,7018,7020,7022,7025,7027,7029,7032],{"class":147,"line":767},[145,7004,791],{"class":155},[145,7006,794],{"class":263},[145,7008,441],{"class":259},[145,7010,7011],{"class":159},"\"  Saved: ",[145,7013,685],{"class":155},[145,7015,1115],{"class":263},[145,7017,691],{"class":155},[145,7019,1219],{"class":159},[145,7021,685],{"class":155},[145,7023,7024],{"class":263},"size_mb",[145,7026,5471],{"class":259},[145,7028,691],{"class":155},[145,7030,7031],{"class":159}," MB)\"",[145,7033,407],{"class":263},[145,7035,7036,7039,7042,7045],{"class":147,"line":788},[145,7037,7038],{"class":259},"    except",[145,7040,7041],{"class":155}," Exception",[145,7043,7044],{"class":259}," as",[145,7046,5633],{"class":263},[145,7048,7049,7051,7053,7055,7058,7060,7062,7064,7066,7068,7070,7072,7074],{"class":147,"line":834},[145,7050,791],{"class":155},[145,7052,794],{"class":263},[145,7054,441],{"class":259},[145,7056,7057],{"class":159},"\"  Download failed for ",[145,7059,685],{"class":155},[145,7061,688],{"class":263},[145,7063,691],{"class":155},[145,7065,438],{"class":159},[145,7067,685],{"class":155},[145,7069,5683],{"class":263},[145,7071,691],{"class":155},[145,7073,450],{"class":159},[145,7075,407],{"class":263},[145,7077,7078],{"class":147,"line":839},[145,7079,377],{"emptyLinePlaceholder":58},[145,7081,7082],{"class":147,"line":845},[145,7083,377],{"emptyLinePlaceholder":58},[145,7085,7086,7089,7091,7094,7096,7099,7101,7104,7107],{"class":147,"line":863},[145,7087,7088],{"class":151},"@app.route",[145,7090,794],{"class":263},[145,7092,7093],{"class":159},"\"/api/webhook/seedance\"",[145,7095,401],{"class":263},[145,7097,7098],{"class":701},"methods",[145,7100,267],{"class":259},[145,7102,7103],{"class":263},"[",[145,7105,7106],{"class":159},"\"POST\"",[145,7108,1630],{"class":263},[145,7110,7111,7113,7116],{"class":147,"line":872},[145,7112,526],{"class":259},[145,7114,7115],{"class":151}," handle_webhook",[145,7117,1290],{"class":263},[145,7119,7120],{"class":147,"line":887},[145,7121,553],{"class":159},[145,7123,7124],{"class":147,"line":903},[145,7125,7126],{"class":159},"    处理 Seedance 视频生成完成的 Webhook 回调。\n",[145,7128,7129],{"class":147,"line":915},[145,7130,563],{"class":159},[145,7132,7133],{"class":147,"line":954},[145,7134,7135],{"class":159},"    视频生成完成（成功或失败）时，\n",[145,7137,7138],{"class":147,"line":960},[145,7139,7140],{"class":159},"    API 会发送一个携带完整 task 对象的 POST 请求。\n",[145,7142,7143],{"class":147,"line":965},[145,7144,553],{"class":159},[145,7146,7147],{"class":147,"line":971},[145,7148,7149],{"class":174},"    # 解析传入的 task 对象\n",[145,7151,7152,7154,7156],{"class":147,"line":977},[145,7153,1497],{"class":263},[145,7155,267],{"class":259},[145,7157,7158],{"class":263}," request.json\n",[145,7160,7161,7163,7165],{"class":147,"line":989},[145,7162,2501],{"class":259},[145,7164,5872],{"class":259},[145,7166,7167],{"class":263}," task:\n",[145,7169,7170,7173,7176,7178,7180,7183,7186],{"class":147,"line":994},[145,7171,7172],{"class":259},"        return",[145,7174,7175],{"class":263}," jsonify({",[145,7177,897],{"class":159},[145,7179,438],{"class":263},[145,7181,7182],{"class":159},"\"Empty body\"",[145,7184,7185],{"class":263},"}), ",[145,7187,7188],{"class":155},"400\n",[145,7190,7191],{"class":147,"line":5521},[145,7192,563],{"class":263},[145,7194,7195,7198,7200,7202,7204,7206,7209],{"class":147,"line":5527},[145,7196,7197],{"class":263},"    task_id ",[145,7199,267],{"class":259},[145,7201,775],{"class":263},[145,7203,1627],{"class":159},[145,7205,401],{"class":263},[145,7207,7208],{"class":159},"\"unknown\"",[145,7210,407],{"class":263},[145,7212,7213,7216,7218,7220,7222,7224,7226],{"class":147,"line":5555},[145,7214,7215],{"class":263},"    status ",[145,7217,267],{"class":259},[145,7219,775],{"class":263},[145,7221,761],{"class":159},[145,7223,401],{"class":263},[145,7225,7208],{"class":159},[145,7227,407],{"class":263},[145,7229,7230,7233,7235,7237,7239,7241,7243],{"class":147,"line":5586},[145,7231,7232],{"class":263},"    model ",[145,7234,267],{"class":259},[145,7236,775],{"class":263},[145,7238,5878],{"class":159},[145,7240,401],{"class":263},[145,7242,7208],{"class":159},[145,7244,407],{"class":263},[145,7246,7247],{"class":147,"line":5606},[145,7248,377],{"emptyLinePlaceholder":58},[145,7250,7251,7253,7255,7257,7259,7262,7265,7268,7271,7273],{"class":147,"line":5612},[145,7252,1103],{"class":155},[145,7254,794],{"class":263},[145,7256,441],{"class":259},[145,7258,450],{"class":159},[145,7260,7261],{"class":155},"\\n{",[145,7263,7264],{"class":159},"'='",[145,7266,7267],{"class":259},"*",[145,7269,7270],{"class":155},"50}",[145,7272,450],{"class":159},[145,7274,407],{"class":263},[145,7276,7277,7279,7281,7283,7286,7288,7290,7292,7294],{"class":147,"line":5618},[145,7278,1103],{"class":155},[145,7280,794],{"class":263},[145,7282,441],{"class":259},[145,7284,7285],{"class":159},"\"Webhook received: task=",[145,7287,685],{"class":155},[145,7289,688],{"class":263},[145,7291,691],{"class":155},[145,7293,450],{"class":159},[145,7295,407],{"class":263},[145,7297,7298,7300,7302,7304,7307,7309,7311,7313,7315],{"class":147,"line":5623},[145,7299,1103],{"class":155},[145,7301,794],{"class":263},[145,7303,441],{"class":259},[145,7305,7306],{"class":159},"\"  Status: ",[145,7308,685],{"class":155},[145,7310,814],{"class":263},[145,7312,691],{"class":155},[145,7314,450],{"class":159},[145,7316,407],{"class":263},[145,7318,7319,7321,7323,7325,7328,7330,7332,7334,7336],{"class":147,"line":5636},[145,7320,1103],{"class":155},[145,7322,794],{"class":263},[145,7324,441],{"class":259},[145,7326,7327],{"class":159},"\"  Model: ",[145,7329,685],{"class":155},[145,7331,1748],{"class":263},[145,7333,691],{"class":155},[145,7335,450],{"class":159},[145,7337,407],{"class":263},[145,7339,7340],{"class":147,"line":5642},[145,7341,377],{"emptyLinePlaceholder":58},[145,7343,7344,7346,7348,7350,7352],{"class":147,"line":5669},[145,7345,2501],{"class":259},[145,7347,851],{"class":263},[145,7349,854],{"class":259},[145,7351,857],{"class":159},[145,7353,860],{"class":263},[145,7355,7356],{"class":147,"line":5709},[145,7357,7358],{"class":174},"        # 从 results 中提取视频 URL\n",[145,7360,7361,7364,7366,7368,7370],{"class":147,"line":5728},[145,7362,7363],{"class":263},"        results ",[145,7365,267],{"class":259},[145,7367,775],{"class":263},[145,7369,1652],{"class":159},[145,7371,6221],{"class":263},[145,7373,7374,7376],{"class":147,"line":5733},[145,7375,848],{"class":259},[145,7377,7378],{"class":263}," results:\n",[145,7380,7381,7384,7386,7389,7391],{"class":147,"line":5738},[145,7382,7383],{"class":263},"            video_url ",[145,7385,267],{"class":259},[145,7387,7388],{"class":263}," results[",[145,7390,783],{"class":155},[145,7392,764],{"class":263},[145,7394,7395,7397,7399,7401,7404,7406,7408,7410,7412],{"class":147,"line":5743},[145,7396,5558],{"class":155},[145,7398,794],{"class":263},[145,7400,441],{"class":259},[145,7402,7403],{"class":159},"\"  Video URL: ",[145,7405,685],{"class":155},[145,7407,1679],{"class":263},[145,7409,691],{"class":155},[145,7411,450],{"class":159},[145,7413,407],{"class":263},[145,7415,7417],{"class":147,"line":7416},64,[145,7418,7419],{"class":263},"            \n",[145,7421,7423],{"class":147,"line":7422},65,[145,7424,7425],{"class":174},"            # 在后台线程中下载，确保快速响应\n",[145,7427,7429,7432,7434],{"class":147,"line":7428},66,[145,7430,7431],{"class":263},"            thread ",[145,7433,267],{"class":259},[145,7435,7436],{"class":263}," threading.Thread(\n",[145,7438,7440,7443,7445],{"class":147,"line":7439},67,[145,7441,7442],{"class":701},"                target",[145,7444,267],{"class":259},[145,7446,7447],{"class":263},"download_video_async,\n",[145,7449,7451,7454,7456],{"class":147,"line":7450},68,[145,7452,7453],{"class":701},"                args",[145,7455,267],{"class":259},[145,7457,7458],{"class":263},"(video_url, task_id)\n",[145,7460,7462],{"class":147,"line":7461},69,[145,7463,957],{"class":263},[145,7465,7467],{"class":147,"line":7466},70,[145,7468,7469],{"class":263},"            thread.start()\n",[145,7471,7473,7476],{"class":147,"line":7472},71,[145,7474,7475],{"class":259},"        else",[145,7477,860],{"class":263},[145,7479,7481,7483,7485,7487,7490],{"class":147,"line":7480},72,[145,7482,5558],{"class":155},[145,7484,794],{"class":263},[145,7486,441],{"class":259},[145,7488,7489],{"class":159},"\"  WARNING: Completed but no results array!\"",[145,7491,407],{"class":263},[145,7493,7495],{"class":147,"line":7494},73,[145,7496,377],{"emptyLinePlaceholder":58},[145,7498,7500,7503,7505,7507,7509],{"class":147,"line":7499},74,[145,7501,7502],{"class":259},"    elif",[145,7504,851],{"class":263},[145,7506,854],{"class":259},[145,7508,882],{"class":159},[145,7510,860],{"class":263},[145,7512,7514,7517,7519,7521,7523],{"class":147,"line":7513},75,[145,7515,7516],{"class":263},"        error_info ",[145,7518,267],{"class":259},[145,7520,775],{"class":263},[145,7522,897],{"class":159},[145,7524,900],{"class":263},[145,7526,7528,7530,7532,7534,7537,7539,7542,7545,7547,7549,7551,7553,7555],{"class":147,"line":7527},76,[145,7529,791],{"class":155},[145,7531,794],{"class":263},[145,7533,441],{"class":259},[145,7535,7536],{"class":159},"\"  FAILED: ",[145,7538,685],{"class":155},[145,7540,7541],{"class":263},"json.dumps(error_info, ",[145,7543,7544],{"class":701},"indent",[145,7546,267],{"class":259},[145,7548,5400],{"class":155},[145,7550,946],{"class":263},[145,7552,691],{"class":155},[145,7554,450],{"class":159},[145,7556,407],{"class":263},[145,7558,7560,7563,7566],{"class":147,"line":7559},77,[145,7561,7562],{"class":174},"        # ",[145,7564,7565],{"class":259},"TODO",[145,7567,7568],{"class":174},": 记录到你的错误追踪系统（Sentry 等）\n",[145,7570,7572,7574,7576],{"class":147,"line":7571},78,[145,7573,7562],{"class":174},[145,7575,7565],{"class":259},[145,7577,7578],{"class":174},": 可选择修改参数后重试生成\n",[145,7580,7582],{"class":147,"line":7581},79,[145,7583,377],{"emptyLinePlaceholder":58},[145,7585,7587,7589],{"class":147,"line":7586},80,[145,7588,2537],{"class":259},[145,7590,860],{"class":263},[145,7592,7594,7596,7598,7600,7603,7605,7607,7609,7611],{"class":147,"line":7593},81,[145,7595,791],{"class":155},[145,7597,794],{"class":263},[145,7599,441],{"class":259},[145,7601,7602],{"class":159},"\"  Unexpected status: ",[145,7604,685],{"class":155},[145,7606,814],{"class":263},[145,7608,691],{"class":155},[145,7610,450],{"class":159},[145,7612,407],{"class":263},[145,7614,7616,7618,7620,7622,7625,7627,7630,7632,7634,7636,7638,7640,7642],{"class":147,"line":7615},82,[145,7617,791],{"class":155},[145,7619,794],{"class":263},[145,7621,441],{"class":259},[145,7623,7624],{"class":159},"\"  Full payload: ",[145,7626,685],{"class":155},[145,7628,7629],{"class":263},"json.dumps(task, ",[145,7631,7544],{"class":701},[145,7633,267],{"class":259},[145,7635,5400],{"class":155},[145,7637,946],{"class":263},[145,7639,691],{"class":155},[145,7641,450],{"class":159},[145,7643,407],{"class":263},[145,7645,7647],{"class":147,"line":7646},83,[145,7648,377],{"emptyLinePlaceholder":58},[145,7650,7652],{"class":147,"line":7651},84,[145,7653,7654],{"class":174},"    # 始终快速返回 200——API 期望在 10 秒内收到响应\n",[145,7656,7658,7660,7662,7665,7667,7669,7671,7674,7677],{"class":147,"line":7657},85,[145,7659,1704],{"class":259},[145,7661,7175],{"class":263},[145,7663,7664],{"class":159},"\"received\"",[145,7666,438],{"class":263},[145,7668,1140],{"class":155},[145,7670,401],{"class":263},[145,7672,7673],{"class":159},"\"task_id\"",[145,7675,7676],{"class":263},": task_id}), ",[145,7678,7679],{"class":155},"200\n",[145,7681,7683],{"class":147,"line":7682},86,[145,7684,377],{"emptyLinePlaceholder":58},[145,7686,7688],{"class":147,"line":7687},87,[145,7689,377],{"emptyLinePlaceholder":58},[145,7691,7693,7695,7697,7700,7702,7704,7706,7708,7711],{"class":147,"line":7692},88,[145,7694,7088],{"class":151},[145,7696,794],{"class":263},[145,7698,7699],{"class":159},"\"/health\"",[145,7701,401],{"class":263},[145,7703,7098],{"class":701},[145,7705,267],{"class":259},[145,7707,7103],{"class":263},[145,7709,7710],{"class":159},"\"GET\"",[145,7712,1630],{"class":263},[145,7714,7716,7718,7721],{"class":147,"line":7715},89,[145,7717,526],{"class":259},[145,7719,7720],{"class":151}," health_check",[145,7722,1290],{"class":263},[145,7724,7726],{"class":147,"line":7725},90,[145,7727,7728],{"class":159},"    \"\"\"负载均衡器的健康检查端点。\"\"\"\n",[145,7730,7732,7734,7736,7738,7740,7743,7745],{"class":147,"line":7731},91,[145,7733,1704],{"class":259},[145,7735,7175],{"class":263},[145,7737,761],{"class":159},[145,7739,438],{"class":263},[145,7741,7742],{"class":159},"\"ok\"",[145,7744,7185],{"class":263},[145,7746,7679],{"class":155},[145,7748,7750],{"class":147,"line":7749},92,[145,7751,377],{"emptyLinePlaceholder":58},[145,7753,7755],{"class":147,"line":7754},93,[145,7756,377],{"emptyLinePlaceholder":58},[145,7758,7760,7762,7764,7766,7768],{"class":147,"line":7759},94,[145,7761,1720],{"class":259},[145,7763,1723],{"class":155},[145,7765,1726],{"class":259},[145,7767,1729],{"class":159},[145,7769,860],{"class":263},[145,7771,7773,7775,7777,7779,7782],{"class":147,"line":7772},95,[145,7774,1103],{"class":155},[145,7776,794],{"class":263},[145,7778,441],{"class":259},[145,7780,7781],{"class":159},"\"Starting webhook server...\"",[145,7783,407],{"class":263},[145,7785,7787,7789,7791,7793,7796,7798,7801,7803,7805,7807,7809],{"class":147,"line":7786},96,[145,7788,1103],{"class":155},[145,7790,794],{"class":263},[145,7792,441],{"class":259},[145,7794,7795],{"class":159},"\"Videos will be saved to: ",[145,7797,685],{"class":155},[145,7799,7800],{"class":263},"os.path.abspath(",[145,7802,6782],{"class":155},[145,7804,946],{"class":263},[145,7806,691],{"class":155},[145,7808,450],{"class":159},[145,7810,407],{"class":263},[145,7812,7814,7816,7818,7820,7823],{"class":147,"line":7813},97,[145,7815,1103],{"class":155},[145,7817,794],{"class":263},[145,7819,441],{"class":259},[145,7821,7822],{"class":159},"\"Webhook URL: http://localhost:5000/api/webhook/seedance\"",[145,7824,407],{"class":263},[145,7826,7828,7831,7834,7836,7839,7841,7844,7846,7849,7851,7854,7856,7858],{"class":147,"line":7827},98,[145,7829,7830],{"class":263},"    app.run(",[145,7832,7833],{"class":701},"host",[145,7835,267],{"class":259},[145,7837,7838],{"class":159},"\"0.0.0.0\"",[145,7840,401],{"class":263},[145,7842,7843],{"class":701},"port",[145,7845,267],{"class":259},[145,7847,7848],{"class":155},"5000",[145,7850,401],{"class":263},[145,7852,7853],{"class":701},"debug",[145,7855,267],{"class":259},[145,7857,1140],{"class":155},[145,7859,407],{"class":263},[11,7861,7862],{},"安装依赖并运行：",[136,7864,7866],{"className":138,"code":7865,"language":140,"meta":141,"style":141},"pip install flask requests\npython webhook_server.py\n",[28,7867,7868,7879],{"__ignoreMap":141},[145,7869,7870,7872,7874,7877],{"class":147,"line":148},[145,7871,190],{"class":151},[145,7873,193],{"class":159},[145,7875,7876],{"class":159}," flask",[145,7878,329],{"class":159},[145,7880,7881,7883],{"class":147,"line":166},[145,7882,341],{"class":151},[145,7884,7885],{"class":159}," webhook_server.py\n",[11,7887,7888],{},"这个服务器的几个关键设计决策：",[96,7890,7891,7901,7910],{},[73,7892,7893,7896,7897,7900],{},[23,7894,7895],{},"后台下载"," — 我们开一个线程下载视频，这样 Webhook 处理函数可以立即返回 ",[28,7898,7899],{},"200","。API 期望 10 秒内收到响应，但视频下载可能需要更久。",[73,7902,7903,1062,7906,7909],{},[23,7904,7905],{},"健康检查端点",[28,7907,7908],{},"/health"," 在部署到负载均衡器（ALB、nginx 等）后面时很有用。",[73,7911,7912,7915],{},[23,7913,7914],{},"错误日志"," — 失败的任务会打印完整的错误 payload。生产环境中，把这些接入 Sentry、Datadog 或你的日志系统。",[92,7917,7919],{"id":7918},"用-ngrok-暴露本地服务","用 ngrok 暴露本地服务",[11,7921,7922,7923,7928],{},"本地开发时，用 ",[37,7924,7927],{"href":7925,"rel":7926},"https://ngrok.com",[41],"ngrok"," 创建一个公开的 HTTPS URL，通过隧道转发到你的本地服务器：",[136,7930,7932],{"className":138,"code":7931,"language":140,"meta":141,"style":141},"# 安装 ngrok（macOS）\nbrew install ngrok\n\n# 或者从 https://ngrok.com/download 下载\n\n# 启动隧道\nngrok http 5000\n",[28,7933,7934,7939,7949,7953,7958,7962,7967],{"__ignoreMap":141},[145,7935,7936],{"class":147,"line":148},[145,7937,7938],{"class":174},"# 安装 ngrok（macOS）\n",[145,7940,7941,7944,7946],{"class":147,"line":166},[145,7942,7943],{"class":151},"brew",[145,7945,193],{"class":159},[145,7947,7948],{"class":159}," ngrok\n",[145,7950,7951],{"class":147,"line":178},[145,7952,377],{"emptyLinePlaceholder":58},[145,7954,7955],{"class":147,"line":187},[145,7956,7957],{"class":174},"# 或者从 https://ngrok.com/download 下载\n",[145,7959,7960],{"class":147,"line":374},[145,7961,377],{"emptyLinePlaceholder":58},[145,7963,7964],{"class":147,"line":380},[145,7965,7966],{"class":174},"# 启动隧道\n",[145,7968,7969,7971,7974],{"class":147,"line":386},[145,7970,7927],{"class":151},[145,7972,7973],{"class":159}," http",[145,7975,7976],{"class":155}," 5000\n",[11,7978,7979],{},"ngrok 输出类似：",[136,7981,7984],{"className":7982,"code":7983,"language":2183},[2181],"Forwarding  https://a1b2c3d4.ngrok-free.app → http://localhost:5000\n",[28,7985,7983],{"__ignoreMap":141},[11,7987,7988,7989,6426],{},"把这个 HTTPS URL 用作你的 ",[28,7990,3595],{},[136,7992,7994],{"className":339,"code":7993,"language":341,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"Your prompt here\",\n    \"callback_url\": \"https://a1b2c3d4.ngrok-free.app/api/webhook/seedance\"\n}\n",[28,7995,7996,8004,8014,8025,8034],{"__ignoreMap":141},[145,7997,7998,8000,8002],{"class":147,"line":148},[145,7999,3654],{"class":263},[145,8001,267],{"class":259},[145,8003,429],{"class":263},[145,8005,8006,8008,8010,8012],{"class":147,"line":166},[145,8007,3663],{"class":159},[145,8009,438],{"class":263},[145,8011,1309],{"class":159},[145,8013,453],{"class":263},[145,8015,8016,8018,8020,8023],{"class":147,"line":178},[145,8017,3674],{"class":159},[145,8019,438],{"class":263},[145,8021,8022],{"class":159},"\"Your prompt here\"",[145,8024,453],{"class":263},[145,8026,8027,8029,8031],{"class":147,"line":187},[145,8028,6490],{"class":159},[145,8030,438],{"class":263},[145,8032,8033],{"class":159},"\"https://a1b2c3d4.ngrok-free.app/api/webhook/seedance\"\n",[145,8035,8036],{"class":147,"line":374},[145,8037,470],{"class":263},[18,8039,8040],{},[11,8041,8042,8044,8045,8048,8049,8052],{},[23,8043,305],{}," 使用 ngrok 的 ",[28,8046,8047],{},"http://"," URL 而不是 ",[28,8050,8051],{},"https://","。Seedance API 要求 Webhook 必须使用 HTTPS——使用纯 HTTP 的回调 URL 会返回 400 错误。",[92,8054,8056],{"id":8055},"webhook-安全","Webhook 安全",[11,8058,8059],{},"在生产环境中，验证 Webhook 请求确实来自 EvoLink API：",[136,8061,8063],{"className":339,"code":8062,"language":341,"meta":141,"style":141},"import hmac\nimport hashlib\n\ndef verify_webhook(request):\n    \"\"\"通过任务 ID 格式验证 Webhook 真实性。\"\"\"\n    task = request.json\n    task_id = task.get(\"id\", \"\")\n    \n    # EvoLink 的任务 ID 遵循特定格式\n    if not task_id.startswith(\"task-unified-\"):\n        return False\n    \n    # 额外验证：检查必填字段是否存在\n    required_fields = [\"id\", \"status\", \"model\", \"created\"]\n    if not all(field in task for field in required_fields):\n        return False\n    \n    return True\n",[28,8064,8065,8072,8079,8083,8093,8098,8106,8122,8126,8131,8145,8152,8156,8161,8188,8216,8222,8226],{"__ignoreMap":141},[145,8066,8067,8069],{"class":147,"line":148},[145,8068,348],{"class":259},[145,8070,8071],{"class":263}," hmac\n",[145,8073,8074,8076],{"class":147,"line":166},[145,8075,348],{"class":259},[145,8077,8078],{"class":263}," hashlib\n",[145,8080,8081],{"class":147,"line":178},[145,8082,377],{"emptyLinePlaceholder":58},[145,8084,8085,8087,8090],{"class":147,"line":187},[145,8086,526],{"class":259},[145,8088,8089],{"class":151}," verify_webhook",[145,8091,8092],{"class":263},"(request):\n",[145,8094,8095],{"class":147,"line":374},[145,8096,8097],{"class":159},"    \"\"\"通过任务 ID 格式验证 Webhook 真实性。\"\"\"\n",[145,8099,8100,8102,8104],{"class":147,"line":380},[145,8101,1497],{"class":263},[145,8103,267],{"class":259},[145,8105,7158],{"class":263},[145,8107,8108,8110,8112,8114,8116,8118,8120],{"class":147,"line":386},[145,8109,7197],{"class":263},[145,8111,267],{"class":259},[145,8113,775],{"class":263},[145,8115,1627],{"class":159},[145,8117,401],{"class":263},[145,8119,5248],{"class":159},[145,8121,407],{"class":263},[145,8123,8124],{"class":147,"line":410},[145,8125,563],{"class":263},[145,8127,8128],{"class":147,"line":421},[145,8129,8130],{"class":174},"    # EvoLink 的任务 ID 遵循特定格式\n",[145,8132,8133,8135,8137,8140,8143],{"class":147,"line":432},[145,8134,2501],{"class":259},[145,8136,5872],{"class":259},[145,8138,8139],{"class":263}," task_id.startswith(",[145,8141,8142],{"class":159},"\"task-unified-\"",[145,8144,548],{"class":263},[145,8146,8147,8149],{"class":147,"line":456},[145,8148,7172],{"class":259},[145,8150,8151],{"class":155}," False\n",[145,8153,8154],{"class":147,"line":467},[145,8155,563],{"class":263},[145,8157,8158],{"class":147,"line":600},[145,8159,8160],{"class":174},"    # 额外验证：检查必填字段是否存在\n",[145,8162,8163,8166,8168,8171,8173,8175,8177,8179,8181,8183,8186],{"class":147,"line":605},[145,8164,8165],{"class":263},"    required_fields ",[145,8167,267],{"class":259},[145,8169,8170],{"class":263}," [",[145,8172,1627],{"class":159},[145,8174,401],{"class":263},[145,8176,761],{"class":159},[145,8178,401],{"class":263},[145,8180,5878],{"class":159},[145,8182,401],{"class":263},[145,8184,8185],{"class":159},"\"created\"",[145,8187,764],{"class":263},[145,8189,8190,8192,8194,8197,8200,8202,8205,8208,8211,8213],{"class":147,"line":611},[145,8191,2501],{"class":259},[145,8193,5872],{"class":259},[145,8195,8196],{"class":155}," all",[145,8198,8199],{"class":263},"(field ",[145,8201,1181],{"class":259},[145,8203,8204],{"class":263}," task ",[145,8206,8207],{"class":259},"for",[145,8209,8210],{"class":263}," field ",[145,8212,1181],{"class":259},[145,8214,8215],{"class":263}," required_fields):\n",[145,8217,8218,8220],{"class":147,"line":617},[145,8219,7172],{"class":259},[145,8221,8151],{"class":155},[145,8223,8224],{"class":147,"line":623},[145,8225,563],{"class":263},[145,8227,8228,8230],{"class":147,"line":628},[145,8229,1704],{"class":259},[145,8231,6393],{"class":155},[92,8233,8235],{"id":8234},"webhook-vs-轮询怎么选","Webhook vs 轮询：怎么选？",[2036,8237,8238,8251],{},[2039,8239,8240],{},[2042,8241,8242,8245,8248],{},[2045,8243,8244],{},"场景",[2045,8246,8247],{},"推荐方案",[2045,8249,8250],{},"原因",[2052,8252,8253,8263,8273,8284,8294,8304],{},[2042,8254,8255,8258,8260],{},[2057,8256,8257],{},"快速原型 / 脚本",[2057,8259,2240],{},[2057,8261,8262],{},"更简单，不需要服务器",[2042,8264,8265,8268,8270],{},[2057,8266,8267],{},"生产级 Web 应用",[2057,8269,6416],{},[2057,8271,8272],{},"可扩展，不浪费请求",[2042,8274,8275,8278,8281],{},[2057,8276,8277],{},"批量处理（100+ 视频）",[2057,8279,8280],{},"Webhook + 消息队列",[2057,8282,8283],{},"全部提交，按完成顺序处理",[2042,8285,8286,8289,8291],{},[2057,8287,8288],{},"CLI 工具",[2057,8290,2240],{},[2057,8292,8293],{},"不需要服务器基础设施",[2042,8295,8296,8299,8301],{},[2057,8297,8298],{},"移动应用后端",[2057,8300,6416],{},[2057,8302,8303],{},"完成后推送通知给用户",[2042,8305,8306,8309,8311],{},[2057,8307,8308],{},"Serverless（Lambda/Cloud Functions）",[2057,8310,6416],{},[2057,8312,8313],{},"完美匹配——每次完成触发一个函数",[18,8315,8316],{},[11,8317,8318,8320],{},[23,8319,133],{}," 对于批量处理，把 Webhook 和消息队列（Redis、RabbitMQ、SQS）结合使用。提交所有生成请求，然后按它们到达队列的顺序处理。这种方式将提交和处理解耦，并且优雅地处理重试。",[45,8322],{},[48,8324,8326],{"id":8325},"批量处理生成多个视频","批量处理：生成多个视频",[11,8328,8329],{},"实际场景中经常需要生成大量视频。以下是带限流控制的批量处理模式：",[11,8331,8332],{},[2614,8333,8334],{},"使用前面第一个示例中相同的配置和辅助函数。",[136,8336,8338],{"className":339,"code":8337,"language":341,"meta":141,"style":141},"import concurrent.futures\n\ndef batch_generate(prompts, max_concurrent=3):\n    \"\"\"\n    带并发控制的批量视频生成。\n    \n    Args:\n        prompts: 提示词字符串列表。\n        max_concurrent: 最大同时生成数。\n    \n    Returns:\n        (prompt, result_or_error) 元组列表。\n    \"\"\"\n    results = []\n    \n    def generate_one(prompt, index):\n        \"\"\"生成单个视频并返回结果。\"\"\"\n        payload = {\n            \"model\": \"seedance-2.0\",\n            \"prompt\": prompt,\n            \"duration\": 5,\n            \"quality\": \"720p\"\n        }\n        try:\n            task = generate_video_with_retry(payload)\n            print(f\"[{index}] Submitted: {task['id']}\")\n            result = wait_for_video(task[\"id\"])\n            video_url = result[\"results\"][0]\n            download_video(video_url, f\"batch_{index}.mp4\")\n            return (prompt, result)\n        except Exception as e:\n            print(f\"[{index}] Failed: {e}\")\n            return (prompt, str(e))\n    \n    # 分批处理以遵守限流规则\n    with concurrent.futures.ThreadPoolExecutor(max_workers=max_concurrent) as executor:\n        futures = {\n            executor.submit(generate_one, prompt, i): i\n            for i, prompt in enumerate(prompts)\n        }\n        for future in concurrent.futures.as_completed(futures):\n            results.append(future.result())\n    \n    # 汇总\n    succeeded = sum(1 for _, r in results if isinstance(r, dict))\n    print(f\"\\nBatch complete: {succeeded}/{len(prompts)} succeeded\")\n    return results\n\n\n# 示例用法\nprompts = [\n    \"A hummingbird hovering near a red flower. Macro lens, shallow depth of field.\",\n    \"Ocean waves crashing on volcanic rocks at sunset. Slow motion.\",\n    \"A street musician playing violin in the rain. Cinematic lighting.\",\n]\nbatch_generate(prompts, max_concurrent=2)\n",[28,8339,8340,8347,8351,8367,8371,8376,8380,8384,8389,8394,8398,8402,8407,8411,8420,8424,8435,8440,8449,8460,8468,8479,8489,8494,8500,8510,8545,8558,8574,8594,8601,8611,8640,8653,8657,8662,8682,8691,8696,8710,8714,8726,8731,8735,8740,8778,8814,8821,8825,8829,8834,8844,8851,8858,8865,8869],{"__ignoreMap":141},[145,8341,8342,8344],{"class":147,"line":148},[145,8343,348],{"class":259},[145,8345,8346],{"class":263}," concurrent.futures\n",[145,8348,8349],{"class":147,"line":166},[145,8350,377],{"emptyLinePlaceholder":58},[145,8352,8353,8355,8358,8361,8363,8365],{"class":147,"line":178},[145,8354,526],{"class":259},[145,8356,8357],{"class":151}," batch_generate",[145,8359,8360],{"class":263},"(prompts, max_concurrent",[145,8362,267],{"class":259},[145,8364,5043],{"class":155},[145,8366,548],{"class":263},[145,8368,8369],{"class":147,"line":187},[145,8370,553],{"class":159},[145,8372,8373],{"class":147,"line":374},[145,8374,8375],{"class":159},"    带并发控制的批量视频生成。\n",[145,8377,8378],{"class":147,"line":380},[145,8379,563],{"class":159},[145,8381,8382],{"class":147,"line":386},[145,8383,568],{"class":159},[145,8385,8386],{"class":147,"line":410},[145,8387,8388],{"class":159},"        prompts: 提示词字符串列表。\n",[145,8390,8391],{"class":147,"line":421},[145,8392,8393],{"class":159},"        max_concurrent: 最大同时生成数。\n",[145,8395,8396],{"class":147,"line":432},[145,8397,563],{"class":159},[145,8399,8400],{"class":147,"line":456},[145,8401,592],{"class":159},[145,8403,8404],{"class":147,"line":467},[145,8405,8406],{"class":159},"        (prompt, result_or_error) 元组列表。\n",[145,8408,8409],{"class":147,"line":600},[145,8410,553],{"class":159},[145,8412,8413,8416,8418],{"class":147,"line":605},[145,8414,8415],{"class":263},"    results ",[145,8417,267],{"class":259},[145,8419,5856],{"class":263},[145,8421,8422],{"class":147,"line":611},[145,8423,563],{"class":263},[145,8425,8426,8429,8432],{"class":147,"line":617},[145,8427,8428],{"class":259},"    def",[145,8430,8431],{"class":151}," generate_one",[145,8433,8434],{"class":263},"(prompt, index):\n",[145,8436,8437],{"class":147,"line":623},[145,8438,8439],{"class":159},"        \"\"\"生成单个视频并返回结果。\"\"\"\n",[145,8441,8442,8445,8447],{"class":147,"line":628},[145,8443,8444],{"class":263},"        payload ",[145,8446,267],{"class":259},[145,8448,429],{"class":263},[145,8450,8451,8454,8456,8458],{"class":147,"line":639},[145,8452,8453],{"class":159},"            \"model\"",[145,8455,438],{"class":263},[145,8457,1309],{"class":159},[145,8459,453],{"class":263},[145,8461,8462,8465],{"class":147,"line":654},[145,8463,8464],{"class":159},"            \"prompt\"",[145,8466,8467],{"class":263},": prompt,\n",[145,8469,8470,8473,8475,8477],{"class":147,"line":660},[145,8471,8472],{"class":159},"            \"duration\"",[145,8474,438],{"class":263},[145,8476,1353],{"class":155},[145,8478,453],{"class":263},[145,8480,8481,8484,8486],{"class":147,"line":671},[145,8482,8483],{"class":159},"            \"quality\"",[145,8485,438],{"class":263},[145,8487,8488],{"class":159},"\"720p\"\n",[145,8490,8491],{"class":147,"line":698},[145,8492,8493],{"class":263},"        }\n",[145,8495,8496,8498],{"class":147,"line":710},[145,8497,5117],{"class":259},[145,8499,860],{"class":263},[145,8501,8502,8505,8507],{"class":147,"line":716},[145,8503,8504],{"class":263},"            task ",[145,8506,267],{"class":259},[145,8508,8509],{"class":263}," generate_video_with_retry(payload)\n",[145,8511,8512,8514,8516,8518,8521,8523,8526,8528,8531,8533,8535,8537,8539,8541,8543],{"class":147,"line":722},[145,8513,5558],{"class":155},[145,8515,794],{"class":263},[145,8517,441],{"class":259},[145,8519,8520],{"class":159},"\"[",[145,8522,685],{"class":155},[145,8524,8525],{"class":263},"index",[145,8527,691],{"class":155},[145,8529,8530],{"class":159},"] Submitted: ",[145,8532,685],{"class":155},[145,8534,1530],{"class":263},[145,8536,1533],{"class":159},[145,8538,1536],{"class":263},[145,8540,691],{"class":155},[145,8542,450],{"class":159},[145,8544,407],{"class":263},[145,8546,8547,8550,8552,8554,8556],{"class":147,"line":728},[145,8548,8549],{"class":263},"            result ",[145,8551,267],{"class":259},[145,8553,1624],{"class":263},[145,8555,1627],{"class":159},[145,8557,1630],{"class":263},[145,8559,8560,8562,8564,8566,8568,8570,8572],{"class":147,"line":739},[145,8561,7383],{"class":263},[145,8563,267],{"class":259},[145,8565,1649],{"class":263},[145,8567,1652],{"class":159},[145,8569,1563],{"class":263},[145,8571,783],{"class":155},[145,8573,764],{"class":263},[145,8575,8576,8579,8581,8584,8586,8588,8590,8592],{"class":147,"line":744},[145,8577,8578],{"class":263},"            download_video(video_url, ",[145,8580,441],{"class":259},[145,8582,8583],{"class":159},"\"batch_",[145,8585,685],{"class":155},[145,8587,8525],{"class":263},[145,8589,691],{"class":155},[145,8591,6871],{"class":159},[145,8593,407],{"class":263},[145,8595,8596,8598],{"class":147,"line":750},[145,8597,866],{"class":259},[145,8599,8600],{"class":263}," (prompt, result)\n",[145,8602,8603,8605,8607,8609],{"class":147,"line":767},[145,8604,5515],{"class":259},[145,8606,7041],{"class":155},[145,8608,7044],{"class":259},[145,8610,5633],{"class":263},[145,8612,8613,8615,8617,8619,8621,8623,8625,8627,8630,8632,8634,8636,8638],{"class":147,"line":788},[145,8614,5558],{"class":155},[145,8616,794],{"class":263},[145,8618,441],{"class":259},[145,8620,8520],{"class":159},[145,8622,685],{"class":155},[145,8624,8525],{"class":263},[145,8626,691],{"class":155},[145,8628,8629],{"class":159},"] Failed: ",[145,8631,685],{"class":155},[145,8633,5683],{"class":263},[145,8635,691],{"class":155},[145,8637,450],{"class":159},[145,8639,407],{"class":263},[145,8641,8642,8644,8647,8650],{"class":147,"line":834},[145,8643,866],{"class":259},[145,8645,8646],{"class":263}," (prompt, ",[145,8648,8649],{"class":155},"str",[145,8651,8652],{"class":263},"(e))\n",[145,8654,8655],{"class":147,"line":839},[145,8656,563],{"class":263},[145,8658,8659],{"class":147,"line":845},[145,8660,8661],{"class":174},"    # 分批处理以遵守限流规则\n",[145,8663,8664,8666,8669,8672,8674,8677,8679],{"class":147,"line":863},[145,8665,1152],{"class":259},[145,8667,8668],{"class":263}," concurrent.futures.ThreadPoolExecutor(",[145,8670,8671],{"class":701},"max_workers",[145,8673,267],{"class":259},[145,8675,8676],{"class":263},"max_concurrent) ",[145,8678,1167],{"class":259},[145,8680,8681],{"class":263}," executor:\n",[145,8683,8684,8687,8689],{"class":147,"line":872},[145,8685,8686],{"class":263},"        futures ",[145,8688,267],{"class":259},[145,8690,429],{"class":263},[145,8692,8693],{"class":147,"line":887},[145,8694,8695],{"class":263},"            executor.submit(generate_one, prompt, i): i\n",[145,8697,8698,8700,8703,8705,8707],{"class":147,"line":903},[145,8699,6957],{"class":259},[145,8701,8702],{"class":263}," i, prompt ",[145,8704,1181],{"class":259},[145,8706,6271],{"class":155},[145,8708,8709],{"class":263},"(prompts)\n",[145,8711,8712],{"class":147,"line":915},[145,8713,8493],{"class":263},[145,8715,8716,8718,8721,8723],{"class":147,"line":954},[145,8717,1175],{"class":259},[145,8719,8720],{"class":263}," future ",[145,8722,1181],{"class":259},[145,8724,8725],{"class":263}," concurrent.futures.as_completed(futures):\n",[145,8727,8728],{"class":147,"line":960},[145,8729,8730],{"class":263},"            results.append(future.result())\n",[145,8732,8733],{"class":147,"line":965},[145,8734,563],{"class":263},[145,8736,8737],{"class":147,"line":971},[145,8738,8739],{"class":174},"    # 汇总\n",[145,8741,8742,8745,8747,8750,8752,8754,8756,8759,8761,8764,8766,8769,8772,8775],{"class":147,"line":977},[145,8743,8744],{"class":263},"    succeeded ",[145,8746,267],{"class":259},[145,8748,8749],{"class":155}," sum",[145,8751,794],{"class":263},[145,8753,5419],{"class":155},[145,8755,6374],{"class":259},[145,8757,8758],{"class":263}," _, r ",[145,8760,1181],{"class":259},[145,8762,8763],{"class":263}," results ",[145,8765,1720],{"class":259},[145,8767,8768],{"class":155}," isinstance",[145,8770,8771],{"class":263},"(r, ",[145,8773,8774],{"class":155},"dict",[145,8776,8777],{"class":263},"))\n",[145,8779,8780,8782,8784,8786,8788,8790,8793,8795,8798,8800,8802,8804,8807,8809,8812],{"class":147,"line":989},[145,8781,1103],{"class":155},[145,8783,794],{"class":263},[145,8785,441],{"class":259},[145,8787,450],{"class":159},[145,8789,1671],{"class":155},[145,8791,8792],{"class":159},"Batch complete: ",[145,8794,685],{"class":155},[145,8796,8797],{"class":263},"succeeded",[145,8799,691],{"class":155},[145,8801,1227],{"class":159},[145,8803,6250],{"class":155},[145,8805,8806],{"class":263},"(prompts)",[145,8808,691],{"class":155},[145,8810,8811],{"class":159}," succeeded\"",[145,8813,407],{"class":263},[145,8815,8816,8818],{"class":147,"line":994},[145,8817,1704],{"class":259},[145,8819,8820],{"class":263}," results\n",[145,8822,8823],{"class":147,"line":5521},[145,8824,377],{"emptyLinePlaceholder":58},[145,8826,8827],{"class":147,"line":5527},[145,8828,377],{"emptyLinePlaceholder":58},[145,8830,8831],{"class":147,"line":5555},[145,8832,8833],{"class":174},"# 示例用法\n",[145,8835,8836,8839,8841],{"class":147,"line":5586},[145,8837,8838],{"class":263},"prompts ",[145,8840,267],{"class":259},[145,8842,8843],{"class":263}," [\n",[145,8845,8846,8849],{"class":147,"line":5606},[145,8847,8848],{"class":159},"    \"A hummingbird hovering near a red flower. Macro lens, shallow depth of field.\"",[145,8850,453],{"class":263},[145,8852,8853,8856],{"class":147,"line":5612},[145,8854,8855],{"class":159},"    \"Ocean waves crashing on volcanic rocks at sunset. Slow motion.\"",[145,8857,453],{"class":263},[145,8859,8860,8863],{"class":147,"line":5618},[145,8861,8862],{"class":159},"    \"A street musician playing violin in the rain. Cinematic lighting.\"",[145,8864,453],{"class":263},[145,8866,8867],{"class":147,"line":5623},[145,8868,764],{"class":263},[145,8870,8871,8874,8877,8879,8881],{"class":147,"line":5636},[145,8872,8873],{"class":263},"batch_generate(prompts, ",[145,8875,8876],{"class":701},"max_concurrent",[145,8878,267],{"class":259},[145,8880,5400],{"class":155},[145,8882,407],{"class":263},[11,8884,8885],{},"批量处理的关键考虑：",[96,8887,8888,8896,8902],{},[73,8889,8890,8895],{},[23,8891,8892],{},[28,8893,8894],{},"max_concurrent=3"," — 不要同时提交太多请求。从 2–3 个并发开始，根据你的限流配额逐步增加。",[73,8897,8898,8901],{},[23,8899,8900],{},"ThreadPoolExecutor"," — 使用线程（而非进程），因为我们是 I/O 密集型（等待 API 响应），而不是 CPU 密集型。",[73,8903,8904,8907],{},[23,8905,8906],{},"错误隔离"," — 每个视频生成都是独立的。一个失败不会中断整个批次。",[45,8909],{},[48,8911,8912],{"id":8912},"下一步",[11,8914,8915],{},"你已经掌握了基础——文生视频、图生视频、异步轮询、Webhook、错误处理和批量处理。以下是深入学习的方向：",[92,8917,8918],{"id":8918},"探索高级功能",[96,8920,8921,8929,8936,8943,8951],{},[73,8922,8923,8928],{},[23,8924,8925],{},[37,8926,8927],{"href":2962},"@Tags 多模态引用指南"," — 掌握 @Image、@Video、@Audio 引用系统，实现多模态生成",[73,8930,8931,8935],{},[23,8932,8933],{},[37,8934,3850],{"href":3849}," — 用代码复刻希区柯克变焦、一镜到底跟踪镜头和环绕镜头",[73,8937,8938,8942],{},[23,8939,8940],{},[37,8941,3377],{"href":3376}," — 首尾帧控制、多图合成、电商产品视频",[73,8944,8945,8950],{},[23,8946,8947],{},[37,8948,8949],{"href":2608},"电商产品视频指南"," — 批量将产品图转化为营销视频",[73,8952,8953,8957],{},[23,8954,8955],{},[37,8956,1767],{"href":1766}," — 分镜脚本格式、时间轴语法，以及我们 Demo 视频背后的提示词",[92,8959,8960],{"id":8960},"参考文档",[96,8962,8963,8969,8976],{},[73,8964,8965],{},[37,8966,8968],{"href":1259,"rel":8967},[41],"视频生成 API 参考",[73,8970,8971],{},[37,8972,8975],{"href":8973,"rel":8974},"https://seedance2api.app/docs/multimodal-reference",[41],"多模态引用规范",[73,8977,8978],{},[37,8979,8982],{"href":8980,"rel":8981},"https://seedance2api.app/docs/sdks",[41],"Python & Node.js SDK",[92,8984,8985],{"id":8985},"动手做点什么",[11,8987,8988],{},"把你学到的东西组合起来。以下是一些项目灵感：",[96,8990,8991,9000,9006,9016],{},[73,8992,8993,8996,8997,117],{},[23,8994,8995],{},"自动化产品视频流水线"," — 上传产品图，批量生成营销视频（参考",[37,8998,8999],{"href":2608},"电商视频指南",[73,9001,9002,9005],{},[23,9003,9004],{},"社交媒体内容引擎"," — 从文本简报生成竖版短视频，直接发布到抖音/Reels",[73,9007,9008,9011,9012,9015],{},[23,9009,9010],{},"分镜到视频工具"," — 将连续图片转化为带",[37,9013,9014],{"href":3849},"镜头运动控制","的动画场景",[73,9017,9018,9021],{},[23,9019,9020],{},"AI 视频编辑流水线"," — 利用 Seedance 2.0 的视频延展功能，从短片段创建更长的叙事",[11,9023,9024],{},[23,9025,9026,9027,9031],{},"准备好了？",[37,9028,9030],{"href":39,"rel":9029},[41],"免费获取 EvoLink API Key","，今天就开始生成视频。",[45,9033],{},[48,9035,9036],{"id":9036},"常见问题",[92,9038,9040],{"id":9039},"seedance-20-视频生成需要多长时间","Seedance 2.0 视频生成需要多长时间？",[11,9042,9043,9044,9046],{},"通常 30–120 秒，取决于时长和质量设置。5 秒 720p 的视频大约 50 秒完成。15 秒 1080p 的视频可能需要 2–3 分钟。API 在每个任务中返回 ",[28,9045,2106],{}," 字段，方便你设置合理的超时时间。高峰时段，排队等待可能额外增加 10–30 秒。",[92,9048,9050],{"id":9049},"seedance-20-api-支持哪些图片格式","Seedance 2.0 API 支持哪些图片格式？",[11,9052,9053,9054,9056],{},"JPEG、PNG、WebP、BMP、TIFF 和 GIF。每张图片不超过 30 MB。每次请求最多通过 ",[28,9055,2891],{}," 参数传 9 张图片。图片必须是公开可访问的 URL——API 会直接拉取。建议使用短边至少 720px 的图片。分辨率太低（低于 256px）可能导致动画模糊。",[92,9058,9060],{"id":9059},"能生成超过-15-秒的视频吗","能生成超过 15 秒的视频吗？",[11,9062,9063,9064,9066],{},"单次生成最长 15 秒。要制作更长的内容，生成多个片段后用 FFmpeg 或任何视频编辑器拼接。Seedance 2.0 支持视频延展——你可以把生成视频的最后一帧作为下一次生成的首帧，实现无缝衔接。基本思路：生成片段 1，提取最后一帧，作为 ",[28,9065,2990],{}," 传入片段 2。",[92,9068,9070],{"id":9069},"通过-evolink-使用-seedance-20-api-要多少钱","通过 EvoLink 使用 Seedance 2.0 API 要多少钱？",[11,9072,9073,9074,9078,9079,9081],{},"定价基于视频时长和质量档位。5 秒 720p 的视频大约消耗 18 个额度。EvoLink 提供",[37,9075,9077],{"href":211,"rel":9076},[41],"智能路由","，相比直接调用 API 可以降低成本。具体的每秒费率请查看控制台。API 响应中的 ",[28,9080,2116],{}," 字段会在生成前显示精确费用——实际收费不会超过这个金额。",[92,9083,9085],{"id":9084},"seedance-15-pro-和-seedance-20-有什么区别","seedance-1.5-pro 和 seedance-2.0 有什么区别？",[11,9087,9088,9089,9091,9092,9094,9095,298],{},"Seedance 2.0 新增了多模态引用（图片、视频、音频混合输入）、原生音频生成、更好的物理一致性和视频编辑能力。API 接口完全一致——相同的端点、相同的参数、相同的响应格式。你现在可以用 ",[28,9090,30],{}," 测试，之后只需改模型名称切换到 ",[28,9093,1752],{},"。1.5 的主要限制：仅支持单张图片输入（不支持 @Image2–9）、不支持视频/音频引用、不支持原生音频生成。详细对比请看 ",[37,9096,9098],{"href":9097},"/blog/seedance-2-vs-sora-2-api-comparison","Seedance 2.0 vs Sora 2 评测",[92,9100,9102],{"id":9101},"如何处理content-rejected-by-safety-filter错误","如何处理\"content rejected by safety filter\"错误？",[11,9104,9105,9106,9108,9109,9112],{},"内容审核系统会拒绝涉及写实暴力、露骨内容和真实公众人物的提示词。通过 ",[28,9107,2891],{}," 上传的写实人脸图片也会被拒绝。要绕过人脸限制，使用插画、风格化或动漫风格的角色图片。对于提示词被拒的情况，修改措辞避免涉及受限主题。错误响应中包含 ",[28,9110,9111],{},"type: \"content_policy_violation\"","——在你的错误处理代码中检查这个字段，给用户一个清晰的提示。",[92,9114,9116],{"id":9115},"能在-nodejs-javascript-项目中使用-seedance-api-吗","能在 Node.js / JavaScript 项目中使用 Seedance API 吗？",[11,9118,9119,9120,281,9123,9126,9127,9131],{},"可以。REST API 与语言无关——任何 HTTP 客户端都能用。本教程中的概念（异步轮询、Webhook、错误处理）可以直接用 Node.js 的 ",[28,9121,9122],{},"fetch",[28,9124,9125],{},"axios"," 实现。EvoLink 还提供官方的 ",[37,9128,9130],{"href":8980,"rel":9129},[41],"Node.js 和 Python SDK","，帮你处理轮询和重试。",[92,9133,9135],{"id":9134},"视频完成时我的-webhook-服务器挂了怎么办","视频完成时我的 Webhook 服务器挂了怎么办？",[11,9137,9138,9139,9142],{},"API 会以递增间隔重试 3 次 Webhook 投递（1s、2s、4s）。如果 3 次都失败，Webhook 就放弃了——但视频仍然可用。你随时可以用 ",[28,9140,9141],{},"GET /v1/tasks/{task_id}"," 轮询获取结果作为兜底。因此，最佳实践是在提交时保存任务 ID，并设置一个后台任务定期检查是否有完成但未通过 Webhook 接收到的任务。",[92,9144,9146],{"id":9145},"api-请求有限流吗","API 请求有限流吗？",[11,9148,9149,9150,9152,9153,9157,9158,9162],{},"有。默认限流对开发和中等规模的生产使用来说很宽裕。如果遇到 ",[28,9151,4926],{}," 错误，按照",[37,9154,9156],{"href":9155},"#%E4%BC%98%E9%9B%85%E5%9C%B0%E5%A4%84%E7%90%86%E9%94%99%E8%AF%AF","错误处理章节","中的方式实现指数退避。对于大规模使用场景（每天数千个视频），联系 ",[37,9159,9161],{"href":211,"rel":9160},[41],"EvoLink 支持"," 讨论自定义限流和专属容量。",[92,9164,9166],{"id":9165},"seedance-20-可以用于商业项目吗","Seedance 2.0 可以用于商业项目吗？",[11,9168,9169,9170,298],{},"可以。通过 EvoLink API 生成的视频授权商业使用。你拥有输出内容的所有权，可以用于产品、营销材料、客户交付物和发布内容。详细的授权条款和商业使用最佳实践请看 ",[37,9171,9173],{"href":9172},"/blog/seedance-2-copyright-api-guide","Seedance 2.0 版权指南",[45,9175],{},[48,9177,9178],{"id":9178},"完整脚本",[11,9180,9181],{},"以下是本教程的完整代码，整合在一个文件中——复制、粘贴、填入你的 API Key，直接运行：",[136,9183,9185],{"className":339,"code":9184,"language":341,"meta":141,"style":141},"\"\"\"\nSeedance 2.0 API 教程 — 完整脚本\n文档：https://seedance2api.app/docs/video-generation\nAPI Key：https://evolink.ai/early-access\n\"\"\"\nimport requests\nimport time\nimport os\nimport json\nimport random\n\n# ── 配置 ─────────────────────────────────────────────────────\nAPI_KEY = os.getenv(\"EVOLINK_API_KEY\", \"sk-your-api-key-here\")\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\n\n# ── 可复用辅助函数 ───────────────────────────────────────────\ndef wait_for_video(task_id, poll_interval=10, timeout=600):\n    \"\"\"轮询视频生成任务直到完成。\"\"\"\n    elapsed = 0\n    while elapsed \u003C timeout:\n        response = requests.get(\n            f\"{BASE_URL}/tasks/{task_id}\",\n            headers=HEADERS\n        )\n        response.raise_for_status()\n        task = response.json()\n        status = task[\"status\"]\n        progress = task.get(\"progress\", 0)\n        print(f\"  [{elapsed}s] Status: {status} | Progress: {progress}%\")\n        if status == \"completed\":\n            return task\n        elif status == \"failed\":\n            raise RuntimeError(f\"Task {task_id} failed: {task}\")\n        time.sleep(poll_interval)\n        elapsed += poll_interval\n    raise TimeoutError(f\"Task {task_id} timed out after {timeout}s\")\n\n\ndef download_video(url, filename=\"output.mp4\"):\n    \"\"\"从 URL 下载视频文件。\"\"\"\n    print(f\"Downloading to {filename}...\")\n    resp = requests.get(url, stream=True)\n    resp.raise_for_status()\n    with open(filename, \"wb\") as f:\n        for chunk in resp.iter_content(chunk_size=8192):\n            f.write(chunk)\n    print(f\"Saved: {filename} ({os.path.getsize(filename) / 1024:.0f} KB)\")\n\n\ndef generate_video_with_retry(payload, max_retries=3):\n    \"\"\"提交生成请求，对瞬态错误自动重试。\"\"\"\n    for attempt in range(max_retries):\n        try:\n            response = requests.post(\n                f\"{BASE_URL}/videos/generations\",\n                headers=HEADERS,\n                json=payload,\n                timeout=30\n            )\n            if response.status_code == 200:\n                return response.json()\n            error = response.json().get(\"error\", {})\n            if response.status_code in (400, 401, 402, 404, 413, 422):\n                raise ValueError(\n                    f\"API error {response.status_code}: \"\n                    f\"{error.get('message', 'Unknown')}\"\n                )\n            if response.status_code in (429, 500, 502, 503):\n                wait = (2 ** attempt) + random.uniform(0, 1)\n                print(f\"  Retry {attempt+1}/{max_retries} after {wait:.1f}s\")\n                time.sleep(wait)\n                continue\n        except requests.exceptions.RequestException:\n            wait = (2 ** attempt) + random.uniform(0, 1)\n            print(f\"  Retry {attempt+1}/{max_retries} after {wait:.1f}s\")\n            time.sleep(wait)\n            continue\n    raise RuntimeError(f\"Failed after {max_retries} retries\")\n\n\ndef validate_payload(payload):\n    \"\"\"在 API 调用前校验生成 payload。\"\"\"\n    errors = []\n    if not payload.get(\"model\"):\n        errors.append(\"'model' is required\")\n    if not payload.get(\"prompt\") or not payload[\"prompt\"].strip():\n        errors.append(\"'prompt' is required\")\n    duration = payload.get(\"duration\", 5)\n    if duration \u003C 4 or duration > 15:\n        errors.append(f\"'duration' must be 4-15, got {duration}\")\n    quality = payload.get(\"quality\", \"720p\")\n    if quality not in {\"480p\", \"720p\", \"1080p\"}:\n        errors.append(f\"Invalid quality: {quality}\")\n    if errors:\n        raise ValueError(\"Validation failed:\\n\" + \"\\n\".join(f\"  - {e}\" for e in errors))\n\n\ndef cancel_task(task_id):\n    \"\"\"取消 pending 或 processing 状态的任务。\"\"\"\n    response = requests.post(\n        f\"{BASE_URL}/tasks/{task_id}/cancel\",\n        headers=HEADERS\n    )\n    if response.status_code == 200:\n        print(f\"Task {task_id} cancelled.\")\n    else:\n        print(f\"Cancel failed: {response.json()}\")\n\n\n# ── 示例 1：文生视频 ─────────────────────────────────────────\ndef text_to_video():\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"A golden retriever puppy chases a butterfly through \"\n            \"a sunlit meadow. The camera follows the puppy with a \"\n            \"smooth tracking shot as wildflowers sway in the breeze.\"\n        ),\n        \"duration\": 5,\n        \"quality\": \"720p\",\n        \"aspect_ratio\": \"16:9\",\n        \"generate_audio\": True\n    }\n    validate_payload(payload)\n    task = generate_video_with_retry(payload)\n    print(f\"Task: {task['id']} (ETA: {task['task_info']['estimated_time']}s)\")\n    result = wait_for_video(task[\"id\"])\n    download_video(result[\"results\"][0], \"text_to_video.mp4\")\n\n\n# ── 示例 2：图生视频 ─────────────────────────────────────────\ndef image_to_video():\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"@Image1 as the first frame. The scene slowly comes \"\n            \"to life — leaves rustle gently, soft light shifts \"\n            \"across the frame.\"\n        ),\n        \"image_urls\": [\"https://example.com/your-image.jpg\"],\n        \"duration\": 5,\n        \"quality\": \"720p\"\n    }\n    validate_payload(payload)\n    task = generate_video_with_retry(payload)\n    print(f\"Task: {task['id']}\")\n    result = wait_for_video(task[\"id\"])\n    download_video(result[\"results\"][0], \"image_to_video.mp4\")\n\n\n# ── 示例 3：竖版社交媒体视频 ─────────────────────────────────\ndef social_media_video():\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"A barista pours latte art in slow motion. \"\n            \"Close-up overhead shot, warm cafe lighting.\"\n        ),\n        \"duration\": 8,\n        \"quality\": \"1080p\",\n        \"aspect_ratio\": \"9:16\",\n        \"generate_audio\": True\n    }\n    validate_payload(payload)\n    task = generate_video_with_retry(payload)\n    print(f\"Task: {task['id']}\")\n    result = wait_for_video(task[\"id\"])\n    download_video(result[\"results\"][0], \"social_video.mp4\")\n\n\nif __name__ == \"__main__\":\n    print(\"=== 文生视频 ===\")\n    text_to_video()\n    # print(\"\\n=== 图生视频 ===\")\n    # image_to_video()  # 取消注释并设置你的图片 URL\n    # print(\"\\n=== 社交媒体视频 ===\")\n    # social_media_video()\n",[28,9186,9187,9191,9196,9201,9206,9210,9216,9222,9228,9234,9240,9244,9248,9264,9272,9280,9296,9304,9308,9312,9316,9321,9341,9346,9354,9364,9372,9392,9400,9404,9408,9416,9428,9444,9480,9492,9498,9510,9541,9545,9553,9583,9587,9591,9605,9609,9630,9646,9650,9666,9684,9688,9722,9726,9730,9744,9749,9761,9767,9775,9787,9797,9805,9814,9818,9830,9836,9848,9882,9890,9905,9929,9933,9959,9985,10028,10032,10036,10043,10069,10109,10113,10117,10139,10143,10147,10155,10160,10168,10180,10188,10210,10219,10235,10255,10273,10289,10314,10333,10340,10386,10391,10396,10405,10411,10420,10441,10450,10455,10468,10490,10497,10518,10523,10528,10534,10543,10552,10563,10570,10575,10580,10585,10590,10601,10612,10623,10632,10637,10643,10652,10696,10709,10729,10734,10739,10745,10754,10763,10774,10781,10786,10791,10797,10802,10816,10827,10836,10841,10846,10855,10880,10893,10911,10916,10921,10927,10937,10946,10957,10964,10970,10976,10981,10992,11003,11014,11023,11028,11033,11042,11067,11080,11098,11103,11108,11121,11133,11138,11144,11150,11156],{"__ignoreMap":141},[145,9188,9189],{"class":147,"line":148},[145,9190,6683],{"class":159},[145,9192,9193],{"class":147,"line":166},[145,9194,9195],{"class":159},"Seedance 2.0 API 教程 — 完整脚本\n",[145,9197,9198],{"class":147,"line":178},[145,9199,9200],{"class":159},"文档：https://seedance2api.app/docs/video-generation\n",[145,9202,9203],{"class":147,"line":187},[145,9204,9205],{"class":159},"API Key：https://evolink.ai/early-access\n",[145,9207,9208],{"class":147,"line":374},[145,9209,6683],{"class":159},[145,9211,9212,9214],{"class":147,"line":380},[145,9213,348],{"class":259},[145,9215,329],{"class":263},[145,9217,9218,9220],{"class":147,"line":386},[145,9219,348],{"class":259},[145,9221,357],{"class":263},[145,9223,9224,9226],{"class":147,"line":410},[145,9225,348],{"class":259},[145,9227,364],{"class":263},[145,9229,9230,9232],{"class":147,"line":421},[145,9231,348],{"class":259},[145,9233,371],{"class":263},[145,9235,9236,9238],{"class":147,"line":432},[145,9237,348],{"class":259},[145,9239,5024],{"class":263},[145,9241,9242],{"class":147,"line":456},[145,9243,377],{"emptyLinePlaceholder":58},[145,9245,9246],{"class":147,"line":467},[145,9247,383],{"class":174},[145,9249,9250,9252,9254,9256,9258,9260,9262],{"class":147,"line":600},[145,9251,389],{"class":155},[145,9253,392],{"class":259},[145,9255,395],{"class":263},[145,9257,398],{"class":159},[145,9259,401],{"class":263},[145,9261,404],{"class":159},[145,9263,407],{"class":263},[145,9265,9266,9268,9270],{"class":147,"line":605},[145,9267,413],{"class":155},[145,9269,392],{"class":259},[145,9271,418],{"class":159},[145,9273,9274,9276,9278],{"class":147,"line":611},[145,9275,424],{"class":155},[145,9277,392],{"class":259},[145,9279,429],{"class":263},[145,9281,9282,9284,9286,9288,9290,9292,9294],{"class":147,"line":617},[145,9283,435],{"class":159},[145,9285,438],{"class":263},[145,9287,441],{"class":259},[145,9289,444],{"class":159},[145,9291,447],{"class":155},[145,9293,450],{"class":159},[145,9295,453],{"class":263},[145,9297,9298,9300,9302],{"class":147,"line":623},[145,9299,459],{"class":159},[145,9301,438],{"class":263},[145,9303,464],{"class":159},[145,9305,9306],{"class":147,"line":628},[145,9307,470],{"class":263},[145,9309,9310],{"class":147,"line":639},[145,9311,377],{"emptyLinePlaceholder":58},[145,9313,9314],{"class":147,"line":654},[145,9315,377],{"emptyLinePlaceholder":58},[145,9317,9318],{"class":147,"line":660},[145,9319,9320],{"class":174},"# ── 可复用辅助函数 ───────────────────────────────────────────\n",[145,9322,9323,9325,9327,9329,9331,9333,9335,9337,9339],{"class":147,"line":671},[145,9324,526],{"class":259},[145,9326,529],{"class":151},[145,9328,532],{"class":263},[145,9330,267],{"class":259},[145,9332,537],{"class":155},[145,9334,540],{"class":263},[145,9336,267],{"class":259},[145,9338,545],{"class":155},[145,9340,548],{"class":263},[145,9342,9343],{"class":147,"line":698},[145,9344,9345],{"class":159},"    \"\"\"轮询视频生成任务直到完成。\"\"\"\n",[145,9347,9348,9350,9352],{"class":147,"line":710},[145,9349,631],{"class":263},[145,9351,267],{"class":259},[145,9353,636],{"class":155},[145,9355,9356,9358,9360,9362],{"class":147,"line":716},[145,9357,642],{"class":259},[145,9359,645],{"class":263},[145,9361,648],{"class":259},[145,9363,651],{"class":263},[145,9365,9366,9368,9370],{"class":147,"line":722},[145,9367,663],{"class":263},[145,9369,267],{"class":259},[145,9371,668],{"class":263},[145,9373,9374,9376,9378,9380,9382,9384,9386,9388,9390],{"class":147,"line":728},[145,9375,674],{"class":259},[145,9377,450],{"class":159},[145,9379,679],{"class":155},[145,9381,682],{"class":159},[145,9383,685],{"class":155},[145,9385,688],{"class":263},[145,9387,691],{"class":155},[145,9389,450],{"class":159},[145,9391,453],{"class":263},[145,9393,9394,9396,9398],{"class":147,"line":739},[145,9395,702],{"class":701},[145,9397,267],{"class":259},[145,9399,707],{"class":155},[145,9401,9402],{"class":147,"line":744},[145,9403,713],{"class":263},[145,9405,9406],{"class":147,"line":750},[145,9407,725],{"class":263},[145,9409,9410,9412,9414],{"class":147,"line":767},[145,9411,731],{"class":263},[145,9413,267],{"class":259},[145,9415,736],{"class":263},[145,9417,9418,9420,9422,9424,9426],{"class":147,"line":788},[145,9419,753],{"class":263},[145,9421,267],{"class":259},[145,9423,758],{"class":263},[145,9425,761],{"class":159},[145,9427,764],{"class":263},[145,9429,9430,9432,9434,9436,9438,9440,9442],{"class":147,"line":834},[145,9431,770],{"class":263},[145,9433,267],{"class":259},[145,9435,775],{"class":263},[145,9437,778],{"class":159},[145,9439,401],{"class":263},[145,9441,783],{"class":155},[145,9443,407],{"class":263},[145,9445,9446,9448,9450,9452,9454,9456,9458,9460,9462,9464,9466,9468,9470,9472,9474,9476,9478],{"class":147,"line":839},[145,9447,791],{"class":155},[145,9449,794],{"class":263},[145,9451,441],{"class":259},[145,9453,799],{"class":159},[145,9455,685],{"class":155},[145,9457,804],{"class":263},[145,9459,691],{"class":155},[145,9461,809],{"class":159},[145,9463,685],{"class":155},[145,9465,814],{"class":263},[145,9467,691],{"class":155},[145,9469,819],{"class":159},[145,9471,685],{"class":155},[145,9473,824],{"class":263},[145,9475,691],{"class":155},[145,9477,829],{"class":159},[145,9479,407],{"class":263},[145,9481,9482,9484,9486,9488,9490],{"class":147,"line":845},[145,9483,848],{"class":259},[145,9485,851],{"class":263},[145,9487,854],{"class":259},[145,9489,857],{"class":159},[145,9491,860],{"class":263},[145,9493,9494,9496],{"class":147,"line":863},[145,9495,866],{"class":259},[145,9497,869],{"class":263},[145,9499,9500,9502,9504,9506,9508],{"class":147,"line":872},[145,9501,875],{"class":259},[145,9503,851],{"class":263},[145,9505,854],{"class":259},[145,9507,882],{"class":159},[145,9509,860],{"class":263},[145,9511,9512,9514,9516,9518,9520,9522,9524,9526,9528,9530,9532,9535,9537,9539],{"class":147,"line":887},[145,9513,906],{"class":259},[145,9515,909],{"class":155},[145,9517,794],{"class":263},[145,9519,441],{"class":259},[145,9521,921],{"class":159},[145,9523,685],{"class":155},[145,9525,688],{"class":263},[145,9527,691],{"class":155},[145,9529,930],{"class":159},[145,9531,685],{"class":155},[145,9533,9534],{"class":263},"task",[145,9536,691],{"class":155},[145,9538,450],{"class":159},[145,9540,407],{"class":263},[145,9542,9543],{"class":147,"line":903},[145,9544,974],{"class":263},[145,9546,9547,9549,9551],{"class":147,"line":915},[145,9548,980],{"class":263},[145,9550,983],{"class":259},[145,9552,986],{"class":263},[145,9554,9555,9557,9559,9561,9563,9565,9567,9569,9571,9573,9575,9577,9579,9581],{"class":147,"line":954},[145,9556,997],{"class":259},[145,9558,1000],{"class":155},[145,9560,794],{"class":263},[145,9562,441],{"class":259},[145,9564,921],{"class":159},[145,9566,685],{"class":155},[145,9568,688],{"class":263},[145,9570,691],{"class":155},[145,9572,1015],{"class":159},[145,9574,685],{"class":155},[145,9576,1020],{"class":263},[145,9578,691],{"class":155},[145,9580,1025],{"class":159},[145,9582,407],{"class":263},[145,9584,9585],{"class":147,"line":960},[145,9586,377],{"emptyLinePlaceholder":58},[145,9588,9589],{"class":147,"line":965},[145,9590,377],{"emptyLinePlaceholder":58},[145,9592,9593,9595,9597,9599,9601,9603],{"class":147,"line":971},[145,9594,526],{"class":259},[145,9596,1083],{"class":151},[145,9598,1086],{"class":263},[145,9600,267],{"class":259},[145,9602,1091],{"class":159},[145,9604,548],{"class":263},[145,9606,9607],{"class":147,"line":977},[145,9608,1098],{"class":159},[145,9610,9611,9613,9615,9617,9620,9622,9624,9626,9628],{"class":147,"line":989},[145,9612,1103],{"class":155},[145,9614,794],{"class":263},[145,9616,441],{"class":259},[145,9618,9619],{"class":159},"\"Downloading to ",[145,9621,685],{"class":155},[145,9623,1115],{"class":263},[145,9625,691],{"class":155},[145,9627,1120],{"class":159},[145,9629,407],{"class":263},[145,9631,9632,9634,9636,9638,9640,9642,9644],{"class":147,"line":994},[145,9633,1127],{"class":263},[145,9635,267],{"class":259},[145,9637,1132],{"class":263},[145,9639,1135],{"class":701},[145,9641,267],{"class":259},[145,9643,1140],{"class":155},[145,9645,407],{"class":263},[145,9647,9648],{"class":147,"line":5521},[145,9649,1147],{"class":263},[145,9651,9652,9654,9656,9658,9660,9662,9664],{"class":147,"line":5527},[145,9653,1152],{"class":259},[145,9655,1155],{"class":155},[145,9657,1158],{"class":263},[145,9659,1161],{"class":159},[145,9661,1164],{"class":263},[145,9663,1167],{"class":259},[145,9665,1170],{"class":263},[145,9667,9668,9670,9672,9674,9676,9678,9680,9682],{"class":147,"line":5555},[145,9669,1175],{"class":259},[145,9671,1178],{"class":263},[145,9673,1181],{"class":259},[145,9675,1184],{"class":263},[145,9677,1187],{"class":701},[145,9679,267],{"class":259},[145,9681,1192],{"class":155},[145,9683,548],{"class":263},[145,9685,9686],{"class":147,"line":5586},[145,9687,1199],{"class":263},[145,9689,9690,9692,9694,9696,9698,9700,9702,9704,9706,9708,9710,9712,9714,9716,9718,9720],{"class":147,"line":5606},[145,9691,1103],{"class":155},[145,9693,794],{"class":263},[145,9695,441],{"class":259},[145,9697,1210],{"class":159},[145,9699,685],{"class":155},[145,9701,1115],{"class":263},[145,9703,691],{"class":155},[145,9705,1219],{"class":159},[145,9707,685],{"class":155},[145,9709,1224],{"class":263},[145,9711,1227],{"class":259},[145,9713,1230],{"class":155},[145,9715,1233],{"class":259},[145,9717,691],{"class":155},[145,9719,1238],{"class":159},[145,9721,407],{"class":263},[145,9723,9724],{"class":147,"line":5612},[145,9725,377],{"emptyLinePlaceholder":58},[145,9727,9728],{"class":147,"line":5618},[145,9729,377],{"emptyLinePlaceholder":58},[145,9731,9732,9734,9736,9738,9740,9742],{"class":147,"line":5623},[145,9733,526],{"class":259},[145,9735,5035],{"class":151},[145,9737,5038],{"class":263},[145,9739,267],{"class":259},[145,9741,5043],{"class":155},[145,9743,548],{"class":263},[145,9745,9746],{"class":147,"line":5636},[145,9747,9748],{"class":159},"    \"\"\"提交生成请求，对瞬态错误自动重试。\"\"\"\n",[145,9750,9751,9753,9755,9757,9759],{"class":147,"line":5642},[145,9752,5101],{"class":259},[145,9754,5104],{"class":263},[145,9756,1181],{"class":259},[145,9758,5109],{"class":155},[145,9760,5112],{"class":263},[145,9762,9763,9765],{"class":147,"line":5669},[145,9764,5117],{"class":259},[145,9766,860],{"class":263},[145,9768,9769,9771,9773],{"class":147,"line":5709},[145,9770,5124],{"class":263},[145,9772,267],{"class":259},[145,9774,1433],{"class":263},[145,9776,9777,9779,9781,9783,9785],{"class":147,"line":5728},[145,9778,918],{"class":259},[145,9780,450],{"class":159},[145,9782,679],{"class":155},[145,9784,1445],{"class":159},[145,9786,453],{"class":263},[145,9788,9789,9791,9793,9795],{"class":147,"line":5733},[145,9790,5145],{"class":701},[145,9792,267],{"class":259},[145,9794,424],{"class":155},[145,9796,453],{"class":263},[145,9798,9799,9801,9803],{"class":147,"line":5738},[145,9800,5156],{"class":701},[145,9802,267],{"class":259},[145,9804,5161],{"class":263},[145,9806,9807,9809,9811],{"class":147,"line":5743},[145,9808,5166],{"class":701},[145,9810,267],{"class":259},[145,9812,9813],{"class":155},"30\n",[145,9815,9816],{"class":147,"line":7416},[145,9817,957],{"class":263},[145,9819,9820,9822,9824,9826,9828],{"class":147,"line":7422},[145,9821,5192],{"class":259},[145,9823,2504],{"class":263},[145,9825,854],{"class":259},[145,9827,2509],{"class":155},[145,9829,860],{"class":263},[145,9831,9832,9834],{"class":147,"line":7428},[145,9833,5205],{"class":259},[145,9835,736],{"class":263},[145,9837,9838,9840,9842,9844,9846],{"class":147,"line":7439},[145,9839,5221],{"class":263},[145,9841,267],{"class":259},[145,9843,5226],{"class":263},[145,9845,897],{"class":159},[145,9847,900],{"class":263},[145,9849,9850,9852,9854,9856,9858,9860,9862,9864,9866,9868,9870,9872,9874,9876,9878,9880],{"class":147,"line":7450},[145,9851,5192],{"class":259},[145,9853,2504],{"class":263},[145,9855,1181],{"class":259},[145,9857,1219],{"class":263},[145,9859,3631],{"class":155},[145,9861,401],{"class":263},[145,9863,4836],{"class":155},[145,9865,401],{"class":263},[145,9867,4854],{"class":155},[145,9869,401],{"class":263},[145,9871,4872],{"class":155},[145,9873,401],{"class":263},[145,9875,4890],{"class":155},[145,9877,401],{"class":263},[145,9879,4908],{"class":155},[145,9881,548],{"class":263},[145,9883,9884,9886,9888],{"class":147,"line":7461},[145,9885,5317],{"class":259},[145,9887,5320],{"class":155},[145,9889,912],{"class":263},[145,9891,9892,9894,9896,9898,9900,9902],{"class":147,"line":7466},[145,9893,5327],{"class":259},[145,9895,5330],{"class":159},[145,9897,685],{"class":155},[145,9899,5335],{"class":263},[145,9901,691],{"class":155},[145,9903,9904],{"class":159},": \"\n",[145,9906,9907,9909,9911,9913,9916,9918,9920,9923,9925,9927],{"class":147,"line":7472},[145,9908,5327],{"class":259},[145,9910,450],{"class":159},[145,9912,685],{"class":155},[145,9914,9915],{"class":263},"error.get(",[145,9917,938],{"class":159},[145,9919,401],{"class":263},[145,9921,9922],{"class":159},"'Unknown'",[145,9924,946],{"class":263},[145,9926,691],{"class":155},[145,9928,951],{"class":159},[145,9930,9931],{"class":147,"line":7480},[145,9932,5353],{"class":263},[145,9934,9935,9937,9939,9941,9943,9945,9947,9949,9951,9953,9955,9957],{"class":147,"line":7494},[145,9936,5192],{"class":259},[145,9938,2504],{"class":263},[145,9940,1181],{"class":259},[145,9942,1219],{"class":263},[145,9944,4926],{"class":155},[145,9946,401],{"class":263},[145,9948,4947],{"class":155},[145,9950,401],{"class":263},[145,9952,4967],{"class":155},[145,9954,401],{"class":263},[145,9956,4987],{"class":155},[145,9958,548],{"class":263},[145,9960,9961,9963,9965,9967,9969,9971,9973,9975,9977,9979,9981,9983],{"class":147,"line":7499},[145,9962,5393],{"class":263},[145,9964,267],{"class":259},[145,9966,1219],{"class":263},[145,9968,5400],{"class":155},[145,9970,5403],{"class":259},[145,9972,5406],{"class":263},[145,9974,5409],{"class":259},[145,9976,5412],{"class":263},[145,9978,783],{"class":155},[145,9980,401],{"class":263},[145,9982,5419],{"class":155},[145,9984,407],{"class":263},[145,9986,9987,9989,9991,9993,9995,9997,10000,10002,10005,10007,10009,10011,10013,10016,10018,10020,10022,10024,10026],{"class":147,"line":7513},[145,9988,5426],{"class":155},[145,9990,794],{"class":263},[145,9992,441],{"class":259},[145,9994,5433],{"class":159},[145,9996,685],{"class":155},[145,9998,9999],{"class":263},"attempt",[145,10001,5409],{"class":259},[145,10003,10004],{"class":155},"1}",[145,10006,1227],{"class":159},[145,10008,685],{"class":155},[145,10010,5450],{"class":263},[145,10012,691],{"class":155},[145,10014,10015],{"class":159}," after ",[145,10017,685],{"class":155},[145,10019,5468],{"class":263},[145,10021,5471],{"class":259},[145,10023,691],{"class":155},[145,10025,1025],{"class":159},[145,10027,407],{"class":263},[145,10029,10030],{"class":147,"line":7527},[145,10031,5501],{"class":263},[145,10033,10034],{"class":147,"line":7559},[145,10035,5506],{"class":259},[145,10037,10038,10040],{"class":147,"line":7571},[145,10039,5515],{"class":259},[145,10041,10042],{"class":263}," requests.exceptions.RequestException:\n",[145,10044,10045,10047,10049,10051,10053,10055,10057,10059,10061,10063,10065,10067],{"class":147,"line":7581},[145,10046,5530],{"class":263},[145,10048,267],{"class":259},[145,10050,1219],{"class":263},[145,10052,5400],{"class":155},[145,10054,5403],{"class":259},[145,10056,5406],{"class":263},[145,10058,5409],{"class":259},[145,10060,5412],{"class":263},[145,10062,783],{"class":155},[145,10064,401],{"class":263},[145,10066,5419],{"class":155},[145,10068,407],{"class":263},[145,10070,10071,10073,10075,10077,10079,10081,10083,10085,10087,10089,10091,10093,10095,10097,10099,10101,10103,10105,10107],{"class":147,"line":7586},[145,10072,5558],{"class":155},[145,10074,794],{"class":263},[145,10076,441],{"class":259},[145,10078,5433],{"class":159},[145,10080,685],{"class":155},[145,10082,9999],{"class":263},[145,10084,5409],{"class":259},[145,10086,10004],{"class":155},[145,10088,1227],{"class":159},[145,10090,685],{"class":155},[145,10092,5450],{"class":263},[145,10094,691],{"class":155},[145,10096,10015],{"class":159},[145,10098,685],{"class":155},[145,10100,5468],{"class":263},[145,10102,5471],{"class":259},[145,10104,691],{"class":155},[145,10106,1025],{"class":159},[145,10108,407],{"class":263},[145,10110,10111],{"class":147,"line":7593},[145,10112,5609],{"class":263},[145,10114,10115],{"class":147,"line":7615},[145,10116,5615],{"class":259},[145,10118,10119,10121,10123,10125,10127,10129,10131,10133,10135,10137],{"class":147,"line":7646},[145,10120,997],{"class":259},[145,10122,909],{"class":155},[145,10124,794],{"class":263},[145,10126,441],{"class":259},[145,10128,5754],{"class":159},[145,10130,685],{"class":155},[145,10132,5450],{"class":263},[145,10134,691],{"class":155},[145,10136,5763],{"class":159},[145,10138,407],{"class":263},[145,10140,10141],{"class":147,"line":7651},[145,10142,377],{"emptyLinePlaceholder":58},[145,10144,10145],{"class":147,"line":7657},[145,10146,377],{"emptyLinePlaceholder":58},[145,10148,10149,10151,10153],{"class":147,"line":7682},[145,10150,526],{"class":259},[145,10152,5825],{"class":151},[145,10154,5828],{"class":263},[145,10156,10157],{"class":147,"line":7687},[145,10158,10159],{"class":159},"    \"\"\"在 API 调用前校验生成 payload。\"\"\"\n",[145,10161,10162,10164,10166],{"class":147,"line":7692},[145,10163,5851],{"class":263},[145,10165,267],{"class":259},[145,10167,5856],{"class":263},[145,10169,10170,10172,10174,10176,10178],{"class":147,"line":7715},[145,10171,2501],{"class":259},[145,10173,5872],{"class":259},[145,10175,5875],{"class":263},[145,10177,5878],{"class":159},[145,10179,548],{"class":263},[145,10181,10182,10184,10186],{"class":147,"line":7725},[145,10183,5885],{"class":263},[145,10185,5888],{"class":159},[145,10187,407],{"class":263},[145,10189,10190,10192,10194,10196,10198,10200,10202,10204,10206,10208],{"class":147,"line":7731},[145,10191,2501],{"class":259},[145,10193,5872],{"class":259},[145,10195,5875],{"class":263},[145,10197,5901],{"class":159},[145,10199,1164],{"class":263},[145,10201,5906],{"class":259},[145,10203,5872],{"class":259},[145,10205,5911],{"class":263},[145,10207,5901],{"class":159},[145,10209,5916],{"class":263},[145,10211,10212,10214,10217],{"class":147,"line":7749},[145,10213,5885],{"class":263},[145,10215,10216],{"class":159},"\"'prompt' is required\"",[145,10218,407],{"class":263},[145,10220,10221,10223,10225,10227,10229,10231,10233],{"class":147,"line":7754},[145,10222,5939],{"class":263},[145,10224,267],{"class":259},[145,10226,5875],{"class":263},[145,10228,5946],{"class":159},[145,10230,401],{"class":263},[145,10232,1353],{"class":155},[145,10234,407],{"class":263},[145,10236,10237,10239,10241,10243,10245,10247,10249,10251,10253],{"class":147,"line":7759},[145,10238,2501],{"class":259},[145,10240,5959],{"class":263},[145,10242,648],{"class":259},[145,10244,5964],{"class":155},[145,10246,5967],{"class":259},[145,10248,5959],{"class":263},[145,10250,5972],{"class":259},[145,10252,5975],{"class":155},[145,10254,860],{"class":263},[145,10256,10257,10259,10261,10263,10265,10267,10269,10271],{"class":147,"line":7772},[145,10258,5885],{"class":263},[145,10260,441],{"class":259},[145,10262,5986],{"class":159},[145,10264,685],{"class":155},[145,10266,1774],{"class":263},[145,10268,691],{"class":155},[145,10270,450],{"class":159},[145,10272,407],{"class":263},[145,10274,10275,10277,10279,10281,10283,10285,10287],{"class":147,"line":7786},[145,10276,6032],{"class":263},[145,10278,267],{"class":259},[145,10280,5875],{"class":263},[145,10282,6039],{"class":159},[145,10284,401],{"class":263},[145,10286,1369],{"class":159},[145,10288,407],{"class":263},[145,10290,10291,10293,10295,10297,10299,10301,10303,10305,10307,10309,10311],{"class":147,"line":7813},[145,10292,2501],{"class":259},[145,10294,6052],{"class":263},[145,10296,6055],{"class":259},[145,10298,6058],{"class":259},[145,10300,6015],{"class":263},[145,10302,4006],{"class":159},[145,10304,401],{"class":263},[145,10306,1369],{"class":159},[145,10308,401],{"class":263},[145,10310,3703],{"class":159},[145,10312,10313],{"class":263},"}:\n",[145,10315,10316,10318,10320,10323,10325,10327,10329,10331],{"class":147,"line":7827},[145,10317,5885],{"class":263},[145,10319,441],{"class":259},[145,10321,10322],{"class":159},"\"Invalid quality: ",[145,10324,685],{"class":155},[145,10326,1782],{"class":263},[145,10328,691],{"class":155},[145,10330,450],{"class":159},[145,10332,407],{"class":263},[145,10334,10336,10338],{"class":147,"line":10335},99,[145,10337,2501],{"class":259},[145,10339,6327],{"class":263},[145,10341,10343,10345,10347,10349,10352,10354,10356,10358,10360,10362,10364,10366,10368,10370,10372,10374,10376,10378,10380,10382,10384],{"class":147,"line":10342},100,[145,10344,6332],{"class":259},[145,10346,5320],{"class":155},[145,10348,794],{"class":263},[145,10350,10351],{"class":159},"\"Validation failed:",[145,10353,1671],{"class":155},[145,10355,450],{"class":159},[145,10357,6348],{"class":259},[145,10359,6351],{"class":159},[145,10361,1671],{"class":155},[145,10363,450],{"class":159},[145,10365,6358],{"class":263},[145,10367,441],{"class":259},[145,10369,6363],{"class":159},[145,10371,685],{"class":155},[145,10373,5683],{"class":263},[145,10375,691],{"class":155},[145,10377,450],{"class":159},[145,10379,6374],{"class":259},[145,10381,6377],{"class":263},[145,10383,1181],{"class":259},[145,10385,6382],{"class":263},[145,10387,10389],{"class":147,"line":10388},101,[145,10390,377],{"emptyLinePlaceholder":58},[145,10392,10394],{"class":147,"line":10393},102,[145,10395,377],{"emptyLinePlaceholder":58},[145,10397,10399,10401,10403],{"class":147,"line":10398},103,[145,10400,526],{"class":259},[145,10402,2447],{"class":151},[145,10404,2450],{"class":263},[145,10406,10408],{"class":147,"line":10407},104,[145,10409,10410],{"class":159},"    \"\"\"取消 pending 或 processing 状态的任务。\"\"\"\n",[145,10412,10414,10416,10418],{"class":147,"line":10413},105,[145,10415,1428],{"class":263},[145,10417,267],{"class":259},[145,10419,1433],{"class":263},[145,10421,10423,10425,10427,10429,10431,10433,10435,10437,10439],{"class":147,"line":10422},106,[145,10424,1438],{"class":259},[145,10426,450],{"class":159},[145,10428,679],{"class":155},[145,10430,682],{"class":159},[145,10432,685],{"class":155},[145,10434,688],{"class":263},[145,10436,691],{"class":155},[145,10438,2482],{"class":159},[145,10440,453],{"class":263},[145,10442,10444,10446,10448],{"class":147,"line":10443},107,[145,10445,1456],{"class":701},[145,10447,267],{"class":259},[145,10449,707],{"class":155},[145,10451,10453],{"class":147,"line":10452},108,[145,10454,1484],{"class":263},[145,10456,10458,10460,10462,10464,10466],{"class":147,"line":10457},109,[145,10459,2501],{"class":259},[145,10461,2504],{"class":263},[145,10463,854],{"class":259},[145,10465,2509],{"class":155},[145,10467,860],{"class":263},[145,10469,10471,10473,10475,10477,10479,10481,10483,10485,10488],{"class":147,"line":10470},110,[145,10472,791],{"class":155},[145,10474,794],{"class":263},[145,10476,441],{"class":259},[145,10478,921],{"class":159},[145,10480,685],{"class":155},[145,10482,688],{"class":263},[145,10484,691],{"class":155},[145,10486,10487],{"class":159}," cancelled.\"",[145,10489,407],{"class":263},[145,10491,10493,10495],{"class":147,"line":10492},111,[145,10494,2537],{"class":259},[145,10496,860],{"class":263},[145,10498,10500,10502,10504,10506,10508,10510,10512,10514,10516],{"class":147,"line":10499},112,[145,10501,791],{"class":155},[145,10503,794],{"class":263},[145,10505,441],{"class":259},[145,10507,2550],{"class":159},[145,10509,685],{"class":155},[145,10511,2555],{"class":263},[145,10513,691],{"class":155},[145,10515,450],{"class":159},[145,10517,407],{"class":263},[145,10519,10521],{"class":147,"line":10520},113,[145,10522,377],{"emptyLinePlaceholder":58},[145,10524,10526],{"class":147,"line":10525},114,[145,10527,377],{"emptyLinePlaceholder":58},[145,10529,10531],{"class":147,"line":10530},115,[145,10532,10533],{"class":174},"# ── 示例 1：文生视频 ─────────────────────────────────────────\n",[145,10535,10537,10539,10541],{"class":147,"line":10536},116,[145,10538,526],{"class":259},[145,10540,1287],{"class":151},[145,10542,1290],{"class":263},[145,10544,10546,10548,10550],{"class":147,"line":10545},117,[145,10547,1295],{"class":263},[145,10549,267],{"class":259},[145,10551,429],{"class":263},[145,10553,10555,10557,10559,10561],{"class":147,"line":10554},118,[145,10556,1304],{"class":159},[145,10558,438],{"class":263},[145,10560,1309],{"class":159},[145,10562,453],{"class":263},[145,10564,10566,10568],{"class":147,"line":10565},119,[145,10567,1320],{"class":159},[145,10569,1323],{"class":263},[145,10571,10573],{"class":147,"line":10572},120,[145,10574,1328],{"class":159},[145,10576,10578],{"class":147,"line":10577},121,[145,10579,1333],{"class":159},[145,10581,10583],{"class":147,"line":10582},122,[145,10584,1338],{"class":159},[145,10586,10588],{"class":147,"line":10587},123,[145,10589,1343],{"class":263},[145,10591,10593,10595,10597,10599],{"class":147,"line":10592},124,[145,10594,1348],{"class":159},[145,10596,438],{"class":263},[145,10598,1353],{"class":155},[145,10600,453],{"class":263},[145,10602,10604,10606,10608,10610],{"class":147,"line":10603},125,[145,10605,1364],{"class":159},[145,10607,438],{"class":263},[145,10609,1369],{"class":159},[145,10611,453],{"class":263},[145,10613,10615,10617,10619,10621],{"class":147,"line":10614},126,[145,10616,1380],{"class":159},[145,10618,438],{"class":263},[145,10620,1385],{"class":159},[145,10622,453],{"class":263},[145,10624,10626,10628,10630],{"class":147,"line":10625},127,[145,10627,1396],{"class":159},[145,10629,438],{"class":263},[145,10631,3731],{"class":155},[145,10633,10635],{"class":147,"line":10634},128,[145,10636,1408],{"class":263},[145,10638,10640],{"class":147,"line":10639},129,[145,10641,10642],{"class":263},"    validate_payload(payload)\n",[145,10644,10646,10648,10650],{"class":147,"line":10645},130,[145,10647,1497],{"class":263},[145,10649,267],{"class":259},[145,10651,8509],{"class":263},[145,10653,10655,10657,10659,10661,10664,10666,10668,10670,10672,10674,10677,10679,10681,10683,10685,10687,10689,10691,10694],{"class":147,"line":10654},131,[145,10656,1103],{"class":155},[145,10658,794],{"class":263},[145,10660,441],{"class":259},[145,10662,10663],{"class":159},"\"Task: ",[145,10665,685],{"class":155},[145,10667,1530],{"class":263},[145,10669,1533],{"class":159},[145,10671,1536],{"class":263},[145,10673,691],{"class":155},[145,10675,10676],{"class":159}," (ETA: ",[145,10678,685],{"class":155},[145,10680,1530],{"class":263},[145,10682,1560],{"class":159},[145,10684,1563],{"class":263},[145,10686,1566],{"class":159},[145,10688,1536],{"class":263},[145,10690,691],{"class":155},[145,10692,10693],{"class":159},"s)\"",[145,10695,407],{"class":263},[145,10697,10699,10701,10703,10705,10707],{"class":147,"line":10698},132,[145,10700,1619],{"class":263},[145,10702,267],{"class":259},[145,10704,1624],{"class":263},[145,10706,1627],{"class":159},[145,10708,1630],{"class":263},[145,10710,10712,10715,10717,10719,10721,10724,10727],{"class":147,"line":10711},133,[145,10713,10714],{"class":263},"    download_video(result[",[145,10716,1652],{"class":159},[145,10718,1563],{"class":263},[145,10720,783],{"class":155},[145,10722,10723],{"class":263},"], ",[145,10725,10726],{"class":159},"\"text_to_video.mp4\"",[145,10728,407],{"class":263},[145,10730,10732],{"class":147,"line":10731},134,[145,10733,377],{"emptyLinePlaceholder":58},[145,10735,10737],{"class":147,"line":10736},135,[145,10738,377],{"emptyLinePlaceholder":58},[145,10740,10742],{"class":147,"line":10741},136,[145,10743,10744],{"class":174},"# ── 示例 2：图生视频 ─────────────────────────────────────────\n",[145,10746,10748,10750,10752],{"class":147,"line":10747},137,[145,10749,526],{"class":259},[145,10751,2633],{"class":151},[145,10753,1290],{"class":263},[145,10755,10757,10759,10761],{"class":147,"line":10756},138,[145,10758,1295],{"class":263},[145,10760,267],{"class":259},[145,10762,429],{"class":263},[145,10764,10766,10768,10770,10772],{"class":147,"line":10765},139,[145,10767,1304],{"class":159},[145,10769,438],{"class":263},[145,10771,1309],{"class":159},[145,10773,453],{"class":263},[145,10775,10777,10779],{"class":147,"line":10776},140,[145,10778,1320],{"class":159},[145,10780,1323],{"class":263},[145,10782,10784],{"class":147,"line":10783},141,[145,10785,2664],{"class":159},[145,10787,10789],{"class":147,"line":10788},142,[145,10790,2669],{"class":159},[145,10792,10794],{"class":147,"line":10793},143,[145,10795,10796],{"class":159},"            \"across the frame.\"\n",[145,10798,10800],{"class":147,"line":10799},144,[145,10801,1343],{"class":263},[145,10803,10805,10807,10810,10813],{"class":147,"line":10804},145,[145,10806,2683],{"class":159},[145,10808,10809],{"class":263},": [",[145,10811,10812],{"class":159},"\"https://example.com/your-image.jpg\"",[145,10814,10815],{"class":263},"],\n",[145,10817,10819,10821,10823,10825],{"class":147,"line":10818},146,[145,10820,1348],{"class":159},[145,10822,438],{"class":263},[145,10824,1353],{"class":155},[145,10826,453],{"class":263},[145,10828,10830,10832,10834],{"class":147,"line":10829},147,[145,10831,1364],{"class":159},[145,10833,438],{"class":263},[145,10835,8488],{"class":159},[145,10837,10839],{"class":147,"line":10838},148,[145,10840,1408],{"class":263},[145,10842,10844],{"class":147,"line":10843},149,[145,10845,10642],{"class":263},[145,10847,10849,10851,10853],{"class":147,"line":10848},150,[145,10850,1497],{"class":263},[145,10852,267],{"class":259},[145,10854,8509],{"class":263},[145,10856,10858,10860,10862,10864,10866,10868,10870,10872,10874,10876,10878],{"class":147,"line":10857},151,[145,10859,1103],{"class":155},[145,10861,794],{"class":263},[145,10863,441],{"class":259},[145,10865,10663],{"class":159},[145,10867,685],{"class":155},[145,10869,1530],{"class":263},[145,10871,1533],{"class":159},[145,10873,1536],{"class":263},[145,10875,691],{"class":155},[145,10877,450],{"class":159},[145,10879,407],{"class":263},[145,10881,10883,10885,10887,10889,10891],{"class":147,"line":10882},152,[145,10884,1619],{"class":263},[145,10886,267],{"class":259},[145,10888,1624],{"class":263},[145,10890,1627],{"class":159},[145,10892,1630],{"class":263},[145,10894,10896,10898,10900,10902,10904,10906,10909],{"class":147,"line":10895},153,[145,10897,10714],{"class":263},[145,10899,1652],{"class":159},[145,10901,1563],{"class":263},[145,10903,783],{"class":155},[145,10905,10723],{"class":263},[145,10907,10908],{"class":159},"\"image_to_video.mp4\"",[145,10910,407],{"class":263},[145,10912,10914],{"class":147,"line":10913},154,[145,10915,377],{"emptyLinePlaceholder":58},[145,10917,10919],{"class":147,"line":10918},155,[145,10920,377],{"emptyLinePlaceholder":58},[145,10922,10924],{"class":147,"line":10923},156,[145,10925,10926],{"class":174},"# ── 示例 3：竖版社交媒体视频 ─────────────────────────────────\n",[145,10928,10930,10932,10935],{"class":147,"line":10929},157,[145,10931,526],{"class":259},[145,10933,10934],{"class":151}," social_media_video",[145,10936,1290],{"class":263},[145,10938,10940,10942,10944],{"class":147,"line":10939},158,[145,10941,1295],{"class":263},[145,10943,267],{"class":259},[145,10945,429],{"class":263},[145,10947,10949,10951,10953,10955],{"class":147,"line":10948},159,[145,10950,1304],{"class":159},[145,10952,438],{"class":263},[145,10954,1309],{"class":159},[145,10956,453],{"class":263},[145,10958,10960,10962],{"class":147,"line":10959},160,[145,10961,1320],{"class":159},[145,10963,1323],{"class":263},[145,10965,10967],{"class":147,"line":10966},161,[145,10968,10969],{"class":159},"            \"A barista pours latte art in slow motion. \"\n",[145,10971,10973],{"class":147,"line":10972},162,[145,10974,10975],{"class":159},"            \"Close-up overhead shot, warm cafe lighting.\"\n",[145,10977,10979],{"class":147,"line":10978},163,[145,10980,1343],{"class":263},[145,10982,10984,10986,10988,10990],{"class":147,"line":10983},164,[145,10985,1348],{"class":159},[145,10987,438],{"class":263},[145,10989,3691],{"class":155},[145,10991,453],{"class":263},[145,10993,10995,10997,10999,11001],{"class":147,"line":10994},165,[145,10996,1364],{"class":159},[145,10998,438],{"class":263},[145,11000,3703],{"class":159},[145,11002,453],{"class":263},[145,11004,11006,11008,11010,11012],{"class":147,"line":11005},166,[145,11007,1380],{"class":159},[145,11009,438],{"class":263},[145,11011,3715],{"class":159},[145,11013,453],{"class":263},[145,11015,11017,11019,11021],{"class":147,"line":11016},167,[145,11018,1396],{"class":159},[145,11020,438],{"class":263},[145,11022,3731],{"class":155},[145,11024,11026],{"class":147,"line":11025},168,[145,11027,1408],{"class":263},[145,11029,11031],{"class":147,"line":11030},169,[145,11032,10642],{"class":263},[145,11034,11036,11038,11040],{"class":147,"line":11035},170,[145,11037,1497],{"class":263},[145,11039,267],{"class":259},[145,11041,8509],{"class":263},[145,11043,11045,11047,11049,11051,11053,11055,11057,11059,11061,11063,11065],{"class":147,"line":11044},171,[145,11046,1103],{"class":155},[145,11048,794],{"class":263},[145,11050,441],{"class":259},[145,11052,10663],{"class":159},[145,11054,685],{"class":155},[145,11056,1530],{"class":263},[145,11058,1533],{"class":159},[145,11060,1536],{"class":263},[145,11062,691],{"class":155},[145,11064,450],{"class":159},[145,11066,407],{"class":263},[145,11068,11070,11072,11074,11076,11078],{"class":147,"line":11069},172,[145,11071,1619],{"class":263},[145,11073,267],{"class":259},[145,11075,1624],{"class":263},[145,11077,1627],{"class":159},[145,11079,1630],{"class":263},[145,11081,11083,11085,11087,11089,11091,11093,11096],{"class":147,"line":11082},173,[145,11084,10714],{"class":263},[145,11086,1652],{"class":159},[145,11088,1563],{"class":263},[145,11090,783],{"class":155},[145,11092,10723],{"class":263},[145,11094,11095],{"class":159},"\"social_video.mp4\"",[145,11097,407],{"class":263},[145,11099,11101],{"class":147,"line":11100},174,[145,11102,377],{"emptyLinePlaceholder":58},[145,11104,11106],{"class":147,"line":11105},175,[145,11107,377],{"emptyLinePlaceholder":58},[145,11109,11111,11113,11115,11117,11119],{"class":147,"line":11110},176,[145,11112,1720],{"class":259},[145,11114,1723],{"class":155},[145,11116,1726],{"class":259},[145,11118,1729],{"class":159},[145,11120,860],{"class":263},[145,11122,11124,11126,11128,11131],{"class":147,"line":11123},177,[145,11125,1103],{"class":155},[145,11127,794],{"class":263},[145,11129,11130],{"class":159},"\"=== 文生视频 ===\"",[145,11132,407],{"class":263},[145,11134,11136],{"class":147,"line":11135},178,[145,11137,1736],{"class":263},[145,11139,11141],{"class":147,"line":11140},179,[145,11142,11143],{"class":174},"    # print(\"\\n=== 图生视频 ===\")\n",[145,11145,11147],{"class":147,"line":11146},180,[145,11148,11149],{"class":174},"    # image_to_video()  # 取消注释并设置你的图片 URL\n",[145,11151,11153],{"class":147,"line":11152},181,[145,11154,11155],{"class":174},"    # print(\"\\n=== 社交媒体视频 ===\")\n",[145,11157,11159],{"class":147,"line":11158},182,[145,11160,11161],{"class":174},"    # social_media_video()\n",[18,11163,11164],{},[11,11165,11166,11169,11170,11172,11173,11176],{},[23,11167,11168],{},"提示："," 要用当前可用的模型测试，把 ",[28,11171,1309],{}," 改成 ",[28,11174,11175],{},"\"seedance-1.5-pro\"","。API 接口完全一致——相同的端点、相同的参数、相同的响应格式。等 Seedance 2.0 全面上线后，再把模型名改回来就行。",[11,11178,11179],{},[23,11180,11181],{},[37,11182,11184],{"href":39,"rel":11183},[41],"开始构建 → 免费获取 EvoLink API Key",[11186,11187,11188],"style",{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}",{"title":141,"searchDepth":166,"depth":166,"links":11190},[11191,11194,11195,11196,11200,11205,11210,11214,11220,11228,11229,11234,11246],{"id":50,"depth":166,"text":51,"children":11192},[11193],{"id":94,"depth":178,"text":94},{"id":204,"depth":166,"text":205},{"id":311,"depth":166,"text":312},{"id":1266,"depth":166,"text":1267,"children":11197},[11198,11199],{"id":1845,"depth":178,"text":1846},{"id":2172,"depth":178,"text":2172},{"id":2215,"depth":166,"text":2216,"children":11201},[11202,11203,11204],{"id":2265,"depth":178,"text":2265},{"id":2344,"depth":178,"text":2344},{"id":2432,"depth":178,"text":2432},{"id":2597,"depth":166,"text":2598,"children":11206},[11207,11208,11209],{"id":2934,"depth":178,"text":2935},{"id":3212,"depth":178,"text":3212},{"id":3287,"depth":178,"text":3288},{"id":3382,"depth":166,"text":3382,"children":11211},[11212,11213],{"id":3635,"depth":178,"text":3635},{"id":4043,"depth":178,"text":4043},{"id":4153,"depth":166,"text":4153,"children":11215},[11216,11217,11218,11219],{"id":4159,"depth":178,"text":4159},{"id":4792,"depth":178,"text":4792},{"id":5005,"depth":178,"text":5005},{"id":5810,"depth":178,"text":5810},{"id":6409,"depth":166,"text":6410,"children":11221},[11222,11223,11224,11225,11226,11227],{"id":6420,"depth":178,"text":6420},{"id":6598,"depth":178,"text":6599},{"id":6664,"depth":178,"text":6665},{"id":7918,"depth":178,"text":7919},{"id":8055,"depth":178,"text":8056},{"id":8234,"depth":178,"text":8235},{"id":8325,"depth":166,"text":8326},{"id":8912,"depth":166,"text":8912,"children":11230},[11231,11232,11233],{"id":8918,"depth":178,"text":8918},{"id":8960,"depth":178,"text":8960},{"id":8985,"depth":178,"text":8985},{"id":9036,"depth":166,"text":9036,"children":11235},[11236,11237,11238,11239,11240,11241,11242,11243,11244,11245],{"id":9039,"depth":178,"text":9040},{"id":9049,"depth":178,"text":9050},{"id":9059,"depth":178,"text":9060},{"id":9069,"depth":178,"text":9070},{"id":9084,"depth":178,"text":9085},{"id":9101,"depth":178,"text":9102},{"id":9115,"depth":178,"text":9116},{"id":9134,"depth":178,"text":9135},{"id":9145,"depth":178,"text":9146},{"id":9165,"depth":178,"text":9166},{"id":9178,"depth":166,"text":9178},"手把手教你用 Python 调用 Seedance 2.0 API 生成 AI 视频。涵盖文生视频、图生视频、异步轮询、Webhook 回调和错误处理的完整教程。","md",{"date":11250,"image":11251,"seoTitle":11252,"author":11253},"2026-02-27","/s2-hero-api-tutorial.webp","Seedance 2.0 API 教程：Python 生成第一个 AI 视频（2026）","J @ EvoLink","/zh/blog/seedance-2-api-tutorial-python",{"title":6,"description":11247},"zh/blog/seedance-2-api-tutorial-python","QU0n5tAToiMW--aUHN3skyrEGJQmhwmAs6fjifeBMUs",{"id":11259,"title":11260,"body":11261,"description":13441,"extension":11248,"meta":13442,"navigation":58,"path":13445,"seo":13446,"stem":13447,"__hash__":13448},"content/zh/blog/seedance-2-camera-movement-api.md","如何使用 Seedance 2.0 API 复刻镜头运动",{"type":8,"value":11262,"toc":13392},[11263,11266,11272,11279,11286,11306,11309,11320,11322,11326,11329,11336,11362,11365,11368,11370,11374,11383,11387,11393,11396,11401,11407,11412,11418,11425,11428,11500,11509,11519,11521,11524,11527,11546,11549,11561,11565,11916,11919,11930,11932,11936,11939,11942,11945,11951,11961,11964,11970,11973,11996,12000,12203,12206,12212,12217,12222,12228,12230,12234,12237,12240,12243,12248,12253,12256,12262,12265,12467,12470,12477,12483,12485,12489,12492,12495,12500,12505,12508,12514,12517,12714,12717,12720,12766,12769,12771,12775,12778,12782,12785,12802,13043,13046,13049,13128,13134,13139,13141,13144,13148,13153,13159,13165,13170,13176,13180,13183,13189,13193,13204,13210,13214,13217,13229,13233,13236,13250,13252,13256,13260,13273,13277,13280,13284,13290,13294,13297,13301,13310,13312,13315,13321,13324,13343,13346,13354,13356,13361,13382,13384,13389],[11,11264,11265],{},"镜头运动是区分平淡静态视频与电影质感画面的关键。推拉变焦（dolly zoom）营造紧张感，环绕镜头增添气势，一镜到底的跟踪镜头构建沉浸体验。传统拍摄中，实现这些效果需要昂贵的设备——稳定器、摇臂、无人机、斯坦尼康——还需要专业操作人员。",[11,11267,11268,11269,11271],{},"Seedance 2.0 消除了硬件依赖。上传一段包含你想要的镜头运动的参考视频，通过 ",[28,11270,2954],{}," 标签告诉模型如何使用它，API 就会生成精确复刻原始镜头语言的全新内容——速度、轨迹、节奏、加速曲线，一一还原。",[11,11273,11274],{},[11275,11276],"img",{"alt":11277,"src":11278},"使用 Seedance 2.0 API 进行电影级镜头运动复刻——推轨可视化","/s4-hero-camera-movement.webp",[11,11280,11281,11282,11285],{},"本教程通过 ",[37,11283,213],{"href":211,"rel":11284},[41]," 提供的 Seedance 2.0 API，带你完成三个完整的镜头复刻案例：",[70,11287,11288,11294,11300],{},[73,11289,11290,11293],{},[23,11291,11292],{},"一镜到底跟踪镜头"," — 摄影机连续跟随主体穿越多个场景",[73,11295,11296,11299],{},[23,11297,11298],{},"希区柯克变焦（推拉变焦）"," — 经典的眩晕效果",[73,11301,11302,11305],{},[23,11303,11304],{},"环绕镜头"," — 绕主体 360° 旋转拍摄",[11,11307,11308],{},"每个案例都包含完整的 Python 脚本，你可以直接复制、粘贴并运行。",[11,11310,11311,11314,11315,11319],{},[23,11312,11313],{},"前置条件："," Python 3.8+，一个 ",[37,11316,11318],{"href":211,"rel":11317},[41],"EvoLink API Key","（有免费额度），以及每种镜头类型的参考视频。",[45,11321],{},[48,11323,11325],{"id":11324},"为什么镜头运动复刻改变了-ai-视频","为什么镜头运动复刻改变了 AI 视频",[11,11327,11328],{},"大多数 AI 视频生成器只提供基于文本的基础镜头控制。你输入\"dolly in\"或\"pan left\"，然后祈祷模型能正确理解。结果很不稳定——有时你得到的是平滑的推进，有时是抖动的摇镜，有时什么都没变。",[11,11330,11331,11332,11335],{},"Seedance 2.0 采用了根本不同的方式：",[23,11333,11334],{},"用视频示范，而非文字描述","。你不再用语言描述镜头运动，而是上传一段展示你想要的精确运动的视频。模型分析参考视频并复刻：",[96,11337,11338,11344,11350,11356],{},[73,11339,11340,11343],{},[23,11341,11342],{},"镜头轨迹"," — 跟踪路径、环绕弧线、摇臂运动",[73,11345,11346,11349],{},[23,11347,11348],{},"速度与加速度"," — 缓入、缓出、急停、平滑滑行",[73,11351,11352,11355],{},[23,11353,11354],{},"焦点行为"," — 焦点转换时机、景深变化",[73,11357,11358,11361],{},[23,11359,11360],{},"构图节奏"," — 每个画面构图保持多久后镜头才开始移动",[11,11363,11364],{},"这意味着你可以从好莱坞电影中提取镜头运动，从 YouTube 上的无人机镜头中提取，或者从你自己拍摄的稳定器片段中提取——然后将完全相同的运动方式应用于全新内容。",[11,11366,11367],{},"其他 AI 视频 API 都无法提供这种级别的镜头控制。Sora 2 和 Kling 3.0 依赖文本提示词控制镜头方向。Veo 3.1 支持基础镜头关键词。只有 Seedance 2.0 接受专门用于镜头语言提取的参考视频输入。",[45,11369],{},[48,11371,11373],{"id":11372},"seedance-20-如何解读镜头语言","Seedance 2.0 如何解读镜头语言",[11,11375,11376,11378,11379,11382],{},[28,11377,2954],{}," 标签是核心机制。当你上传一段参考视频并在提示词中使用标签时，你需要指定模型应该从中",[2614,11380,11381],{},"提取什么","。这一点至关重要——一段参考视频中包含镜头运动、主体动作、视觉效果、灯光和节奏等多种元素。你需要告诉模型使用哪个元素。",[92,11384,11386],{"id":11385},"video-标签语法","@Video 标签语法",[11,11388,11389,11392],{},[28,11390,11391],{},"@Video1"," — 引用镜头运动和跟踪轨迹",[11,11394,11395],{},"提示词中需要明确指定引用内容。对比以下两种方式：",[11,11397,11398],{},[23,11399,11400],{},"模糊（不可靠）：",[136,11402,11405],{"className":11403,"code":11404,"language":2183},[2181],"Use @Video1 as reference. Generate a city scene.\n",[28,11406,11404],{"__ignoreMap":141},[11,11408,11409],{},[23,11410,11411],{},"精确（可靠）：",[136,11413,11416],{"className":11414,"code":11415,"language":2183},[2181],"Replicate @Video1's camera movement exactly — the tracking speed,\ntrajectory, and push-in timing. Apply this camera work to a new scene:\na samurai walking through a bamboo forest at dawn.\n",[28,11417,11415],{"__ignoreMap":141},[11,11419,11420,11421,11424],{},"第二种写法告诉模型：",[2614,11422,11423],{},"只","从参考视频中提取镜头语言。生成全新内容（武士、竹林），但虚拟摄影机的运动方式要与参考视频完全一致。",[92,11426,11427],{"id":11427},"可提取的元素",[2036,11429,11430,11443],{},[2039,11431,11432],{},[2042,11433,11434,11437,11440],{},[2045,11435,11436],{},"参考元素",[2045,11438,11439],{},"提示词语言",[2045,11441,11442],{},"示例",[2052,11444,11445,11456,11467,11478,11489],{},[2042,11446,11447,11450,11453],{},[2057,11448,11449],{},"镜头路径/轨迹",[2057,11451,11452],{},"\"replicate camera movement\"",[2057,11454,11455],{},"跟踪、推拉、环绕、摇臂",[2042,11457,11458,11461,11464],{},[2057,11459,11460],{},"镜头速度",[2057,11462,11463],{},"\"match camera pacing\"",[2057,11465,11466],{},"缓慢推进、快速甩镜",[2042,11468,11469,11472,11475],{},[2057,11470,11471],{},"镜头 + 主体动作",[2057,11473,11474],{},"\"replicate camera and choreography\"",[2057,11476,11477],{},"舞蹈 + 镜头组合",[2042,11479,11480,11483,11486],{},[2057,11481,11482],{},"仅主体动作",[2057,11484,11485],{},"\"replicate movement/action from @Video1\"",[2057,11487,11488],{},"角色行走模式",[2042,11490,11491,11494,11497],{},[2057,11492,11493],{},"视觉效果",[2057,11495,11496],{},"\"replicate transition effects\"",[2057,11498,11499],{},"甩镜转场、变形效果",[11,11501,11502,11505,11506,11508],{},[23,11503,11504],{},"核心原则："," 明确指定你要引用的内容。如果你",[2614,11507,11423],{},"想要镜头运动，就说\"camera movement\"。如果你还想要动作编排，就两者都说。模糊表述会导致混合结果。",[11,11510,11511,11512,11515,11516,298],{},"关于 ",[28,11513,11514],{},"@"," 标签引用系统的完整指南，请参阅我们的 ",[37,11517,11518],{"href":2962},"多模态引用：@Tags 完全指南",[45,11520],{},[48,11522,11523],{"id":11523},"环境搭建",[92,11525,11526],{"id":11526},"前置要求",[96,11528,11529,11531,11536,11543],{},[73,11530,102],{},[73,11532,11533,11535],{},[28,11534,112],{}," 库",[73,11537,11538,11539,117],{},"EvoLink API Key（",[37,11540,11542],{"href":211,"rel":11541},[41],"免费注册",[73,11544,11545],{},"参考视频文件（MP4，2-15 秒，小于 50MB，480p-720p）",[92,11547,11548],{"id":11548},"安装依赖",[136,11550,11551],{"className":138,"code":318,"language":140,"meta":141,"style":141},[28,11552,11553],{"__ignoreMap":141},[145,11554,11555,11557,11559],{"class":147,"line":148},[145,11556,190],{"class":151},[145,11558,193],{"class":159},[145,11560,329],{"class":159},[92,11562,11564],{"id":11563},"基础-api-配置","基础 API 配置",[136,11566,11568],{"className":339,"code":11567,"language":341,"meta":141,"style":141},"import requests\nimport time\n\nEVOLINK_API_KEY = \"your-evolink-api-key\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {EVOLINK_API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\ndef poll_task(task_id, interval=5, timeout=300):\n    elapsed = 0\n    while elapsed \u003C timeout:\n        resp = requests.get(\n            f\"{BASE_URL}/tasks/{task_id}\",\n            headers=HEADERS\n        )\n        result = resp.json()\n        status = result.get(\"status\")\n\n        if status == \"completed\":\n            print(f\"Video ready: {result['results'][0]}\")\n            return result\n        elif status == \"failed\":\n            print(f\"Generation failed: {result.get('error')}\")\n            return result\n\n        print(f\"Status: {status} ({elapsed}s elapsed)\")\n        time.sleep(interval)\n        elapsed += interval\n\n    print(\"Timeout reached\")\n    return None\n",[28,11569,11570,11576,11582,11586,11595,11603,11611,11628,11636,11640,11644,11667,11675,11685,11693,11713,11721,11725,11735,11748,11752,11764,11795,11801,11813,11840,11846,11850,11880,11885,11894,11898,11909],{"__ignoreMap":141},[145,11571,11572,11574],{"class":147,"line":148},[145,11573,348],{"class":259},[145,11575,329],{"class":263},[145,11577,11578,11580],{"class":147,"line":166},[145,11579,348],{"class":259},[145,11581,357],{"class":263},[145,11583,11584],{"class":147,"line":178},[145,11585,377],{"emptyLinePlaceholder":58},[145,11587,11588,11590,11592],{"class":147,"line":187},[145,11589,276],{"class":155},[145,11591,392],{"class":259},[145,11593,11594],{"class":159}," \"your-evolink-api-key\"\n",[145,11596,11597,11599,11601],{"class":147,"line":374},[145,11598,413],{"class":155},[145,11600,392],{"class":259},[145,11602,418],{"class":159},[145,11604,11605,11607,11609],{"class":147,"line":380},[145,11606,424],{"class":155},[145,11608,392],{"class":259},[145,11610,429],{"class":263},[145,11612,11613,11615,11617,11619,11621,11624,11626],{"class":147,"line":386},[145,11614,435],{"class":159},[145,11616,438],{"class":263},[145,11618,441],{"class":259},[145,11620,444],{"class":159},[145,11622,11623],{"class":155},"{EVOLINK_API_KEY}",[145,11625,450],{"class":159},[145,11627,453],{"class":263},[145,11629,11630,11632,11634],{"class":147,"line":410},[145,11631,459],{"class":159},[145,11633,438],{"class":263},[145,11635,464],{"class":159},[145,11637,11638],{"class":147,"line":421},[145,11639,470],{"class":263},[145,11641,11642],{"class":147,"line":432},[145,11643,377],{"emptyLinePlaceholder":58},[145,11645,11646,11648,11651,11654,11656,11658,11660,11662,11665],{"class":147,"line":456},[145,11647,526],{"class":259},[145,11649,11650],{"class":151}," poll_task",[145,11652,11653],{"class":263},"(task_id, interval",[145,11655,267],{"class":259},[145,11657,1353],{"class":155},[145,11659,540],{"class":263},[145,11661,267],{"class":259},[145,11663,11664],{"class":155},"300",[145,11666,548],{"class":263},[145,11668,11669,11671,11673],{"class":147,"line":467},[145,11670,631],{"class":263},[145,11672,267],{"class":259},[145,11674,636],{"class":155},[145,11676,11677,11679,11681,11683],{"class":147,"line":600},[145,11678,642],{"class":259},[145,11680,645],{"class":263},[145,11682,648],{"class":259},[145,11684,651],{"class":263},[145,11686,11687,11689,11691],{"class":147,"line":605},[145,11688,6908],{"class":263},[145,11690,267],{"class":259},[145,11692,668],{"class":263},[145,11694,11695,11697,11699,11701,11703,11705,11707,11709,11711],{"class":147,"line":611},[145,11696,674],{"class":259},[145,11698,450],{"class":159},[145,11700,679],{"class":155},[145,11702,682],{"class":159},[145,11704,685],{"class":155},[145,11706,688],{"class":263},[145,11708,691],{"class":155},[145,11710,450],{"class":159},[145,11712,453],{"class":263},[145,11714,11715,11717,11719],{"class":147,"line":617},[145,11716,702],{"class":701},[145,11718,267],{"class":259},[145,11720,707],{"class":155},[145,11722,11723],{"class":147,"line":623},[145,11724,713],{"class":263},[145,11726,11727,11730,11732],{"class":147,"line":628},[145,11728,11729],{"class":263},"        result ",[145,11731,267],{"class":259},[145,11733,11734],{"class":263}," resp.json()\n",[145,11736,11737,11739,11741,11744,11746],{"class":147,"line":639},[145,11738,753],{"class":263},[145,11740,267],{"class":259},[145,11742,11743],{"class":263}," result.get(",[145,11745,761],{"class":159},[145,11747,407],{"class":263},[145,11749,11750],{"class":147,"line":654},[145,11751,377],{"emptyLinePlaceholder":58},[145,11753,11754,11756,11758,11760,11762],{"class":147,"line":660},[145,11755,848],{"class":259},[145,11757,851],{"class":263},[145,11759,854],{"class":259},[145,11761,857],{"class":159},[145,11763,860],{"class":263},[145,11765,11766,11768,11770,11772,11775,11777,11780,11783,11785,11787,11789,11791,11793],{"class":147,"line":671},[145,11767,5558],{"class":155},[145,11769,794],{"class":263},[145,11771,441],{"class":259},[145,11773,11774],{"class":159},"\"Video ready: ",[145,11776,685],{"class":155},[145,11778,11779],{"class":263},"result[",[145,11781,11782],{"class":159},"'results'",[145,11784,1563],{"class":263},[145,11786,783],{"class":155},[145,11788,1536],{"class":263},[145,11790,691],{"class":155},[145,11792,450],{"class":159},[145,11794,407],{"class":263},[145,11796,11797,11799],{"class":147,"line":698},[145,11798,866],{"class":259},[145,11800,1707],{"class":263},[145,11802,11803,11805,11807,11809,11811],{"class":147,"line":710},[145,11804,875],{"class":259},[145,11806,851],{"class":263},[145,11808,854],{"class":259},[145,11810,882],{"class":159},[145,11812,860],{"class":263},[145,11814,11815,11817,11819,11821,11824,11826,11829,11832,11834,11836,11838],{"class":147,"line":716},[145,11816,5558],{"class":155},[145,11818,794],{"class":263},[145,11820,441],{"class":259},[145,11822,11823],{"class":159},"\"Generation failed: ",[145,11825,685],{"class":155},[145,11827,11828],{"class":263},"result.get(",[145,11830,11831],{"class":159},"'error'",[145,11833,946],{"class":263},[145,11835,691],{"class":155},[145,11837,450],{"class":159},[145,11839,407],{"class":263},[145,11841,11842,11844],{"class":147,"line":722},[145,11843,866],{"class":259},[145,11845,1707],{"class":263},[145,11847,11848],{"class":147,"line":728},[145,11849,377],{"emptyLinePlaceholder":58},[145,11851,11852,11854,11856,11858,11861,11863,11865,11867,11869,11871,11873,11875,11878],{"class":147,"line":739},[145,11853,791],{"class":155},[145,11855,794],{"class":263},[145,11857,441],{"class":259},[145,11859,11860],{"class":159},"\"Status: ",[145,11862,685],{"class":155},[145,11864,814],{"class":263},[145,11866,691],{"class":155},[145,11868,1219],{"class":159},[145,11870,685],{"class":155},[145,11872,804],{"class":263},[145,11874,691],{"class":155},[145,11876,11877],{"class":159},"s elapsed)\"",[145,11879,407],{"class":263},[145,11881,11882],{"class":147,"line":744},[145,11883,11884],{"class":263},"        time.sleep(interval)\n",[145,11886,11887,11889,11891],{"class":147,"line":750},[145,11888,980],{"class":263},[145,11890,983],{"class":259},[145,11892,11893],{"class":263}," interval\n",[145,11895,11896],{"class":147,"line":767},[145,11897,377],{"emptyLinePlaceholder":58},[145,11899,11900,11902,11904,11907],{"class":147,"line":788},[145,11901,1103],{"class":155},[145,11903,794],{"class":263},[145,11905,11906],{"class":159},"\"Timeout reached\"",[145,11908,407],{"class":263},[145,11910,11911,11913],{"class":147,"line":834},[145,11912,1704],{"class":259},[145,11914,11915],{"class":155}," None\n",[11,11917,11918],{},"这段基础代码处理身份验证和任务轮询。下面每个案例都基于此构建。",[11,11920,11921,11924,11925,11929],{},[23,11922,11923],{},"获取免费 EvoLink API Key："," 前往 ",[37,11926,11928],{"href":211,"rel":11927},[41],"evolink.ai"," 注册，即可跟随下方示例操作。",[45,11931],{},[48,11933,11935],{"id":11934},"案例-1一镜到底跟踪镜头","案例 1：一镜到底跟踪镜头",[11,11937,11938],{},"一镜到底跟踪镜头是电影制作中最惊艳的镜头技术之一。摄影机以单一连续镜头跟随主体穿越多个环境——没有剪切。想想《好家伙》中经典的科帕卡巴纳长镜头，或者《老男孩》中的走廊打斗场景。",[11,11940,11941],{},"使用 Seedance 2.0，你只需上传一段展示连续跟踪运动的参考视频，然后生成遵循相同镜头路径的全新内容。",[92,11943,11944],{"id":11944},"你需要什么",[11,11946,11947,11950],{},[23,11948,11949],{},"参考视频："," 任何展示连续跟踪镜头运动的片段（2-15 秒）。稳定器行走拍摄、无人机跟随拍摄或斯坦尼康片段都可以。",[11,11952,11953,11956,11957,11960],{},[23,11954,11955],{},"提示词："," 描述要生成的",[2614,11958,11959],{},"新内容","，同时引用你视频中的镜头运动。",[92,11962,11963],{"id":11963},"提示词示例",[136,11965,11968],{"className":11966,"code":11967,"language":2183},[2181],"Replicate @Video1's camera movement exactly — continuous one-take\ntracking shot, maintaining the same speed, trajectory, and smooth\nforward motion throughout.\n\nApply this camera work to a new scene: a parkour runner sprinting\nthrough narrow city alleyways, leaping over obstacles, vaulting up\na staircase, and reaching a rooftop overlooking the city skyline.\nGolden sunset lighting. Dynamic and energetic. No cuts.\n",[28,11969,11967],{"__ignoreMap":141},[11,11971,11972],{},"提示词要点解析：",[96,11974,11975,11984,11990],{},[73,11976,11977,11980,11981,11983],{},[23,11978,11979],{},"第 1-3 行："," 明确告诉模型从 ",[28,11982,11391],{}," 提取镜头运动",[73,11985,11986,11989],{},[23,11987,11988],{},"第 5-8 行："," 描述全新的内容——模型生成这些画面",[73,11991,11992,11995],{},[23,11993,11994],{},"\"No cuts\"："," 强化一镜到底的要求",[92,11997,11999],{"id":11998},"完整-python-代码","完整 Python 代码",[136,12001,12003],{"className":339,"code":12002,"language":341,"meta":141,"style":141},"# Case 1: One-Take Tracking Shot\n\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"Replicate @Video1's camera movement exactly — continuous \"\n            \"one-take tracking shot, maintaining the same speed, \"\n            \"trajectory, and smooth forward motion throughout.\\n\\n\"\n            \"Apply this camera work to a new scene: a parkour runner \"\n            \"sprinting through narrow city alleyways, leaping over \"\n            \"obstacles, vaulting up a staircase, and reaching a rooftop \"\n            \"overlooking the city skyline. Golden sunset lighting. \"\n            \"Dynamic and energetic. No cuts.\"\n        ),\n        \"video_urls\": [\"https://your-cdn.com/tracking_reference.mp4\"],\n        \"duration\": 10,\n        \"quality\": \"720p\"\n    }\n)\n\ntask_id = response.json()[\"id\"]\nprint(f\"Task created: {task_id}\")\nresult = poll_task(task_id)\n",[28,12004,12005,12010,12014,12022,12034,12044,12052,12062,12068,12073,12078,12088,12093,12098,12103,12108,12113,12117,12129,12139,12147,12151,12155,12159,12173,12193],{"__ignoreMap":141},[145,12006,12007],{"class":147,"line":148},[145,12008,12009],{"class":174},"# Case 1: One-Take Tracking Shot\n",[145,12011,12012],{"class":147,"line":166},[145,12013,377],{"emptyLinePlaceholder":58},[145,12015,12016,12018,12020],{"class":147,"line":178},[145,12017,6508],{"class":263},[145,12019,267],{"class":259},[145,12021,1433],{"class":263},[145,12023,12024,12026,12028,12030,12032],{"class":147,"line":187},[145,12025,6517],{"class":259},[145,12027,450],{"class":159},[145,12029,679],{"class":155},[145,12031,1445],{"class":159},[145,12033,453],{"class":263},[145,12035,12036,12038,12040,12042],{"class":147,"line":374},[145,12037,6530],{"class":701},[145,12039,267],{"class":259},[145,12041,424],{"class":155},[145,12043,453],{"class":263},[145,12045,12046,12048,12050],{"class":147,"line":380},[145,12047,6541],{"class":701},[145,12049,267],{"class":259},[145,12051,1865],{"class":263},[145,12053,12054,12056,12058,12060],{"class":147,"line":386},[145,12055,1304],{"class":159},[145,12057,438],{"class":263},[145,12059,1309],{"class":159},[145,12061,453],{"class":263},[145,12063,12064,12066],{"class":147,"line":410},[145,12065,1320],{"class":159},[145,12067,1323],{"class":263},[145,12069,12070],{"class":147,"line":421},[145,12071,12072],{"class":159},"            \"Replicate @Video1's camera movement exactly — continuous \"\n",[145,12074,12075],{"class":147,"line":432},[145,12076,12077],{"class":159},"            \"one-take tracking shot, maintaining the same speed, \"\n",[145,12079,12080,12083,12086],{"class":147,"line":456},[145,12081,12082],{"class":159},"            \"trajectory, and smooth forward motion throughout.",[145,12084,12085],{"class":155},"\\n\\n",[145,12087,951],{"class":159},[145,12089,12090],{"class":147,"line":467},[145,12091,12092],{"class":159},"            \"Apply this camera work to a new scene: a parkour runner \"\n",[145,12094,12095],{"class":147,"line":600},[145,12096,12097],{"class":159},"            \"sprinting through narrow city alleyways, leaping over \"\n",[145,12099,12100],{"class":147,"line":605},[145,12101,12102],{"class":159},"            \"obstacles, vaulting up a staircase, and reaching a rooftop \"\n",[145,12104,12105],{"class":147,"line":611},[145,12106,12107],{"class":159},"            \"overlooking the city skyline. Golden sunset lighting. \"\n",[145,12109,12110],{"class":147,"line":617},[145,12111,12112],{"class":159},"            \"Dynamic and energetic. No cuts.\"\n",[145,12114,12115],{"class":147,"line":623},[145,12116,1343],{"class":263},[145,12118,12119,12122,12124,12127],{"class":147,"line":628},[145,12120,12121],{"class":159},"        \"video_urls\"",[145,12123,10809],{"class":263},[145,12125,12126],{"class":159},"\"https://your-cdn.com/tracking_reference.mp4\"",[145,12128,10815],{"class":263},[145,12130,12131,12133,12135,12137],{"class":147,"line":639},[145,12132,1348],{"class":159},[145,12134,438],{"class":263},[145,12136,537],{"class":155},[145,12138,453],{"class":263},[145,12140,12141,12143,12145],{"class":147,"line":654},[145,12142,1364],{"class":159},[145,12144,438],{"class":263},[145,12146,8488],{"class":159},[145,12148,12149],{"class":147,"line":660},[145,12150,1408],{"class":263},[145,12152,12153],{"class":147,"line":671},[145,12154,407],{"class":263},[145,12156,12157],{"class":147,"line":698},[145,12158,377],{"emptyLinePlaceholder":58},[145,12160,12161,12164,12166,12169,12171],{"class":147,"line":710},[145,12162,12163],{"class":263},"task_id ",[145,12165,267],{"class":259},[145,12167,12168],{"class":263}," response.json()[",[145,12170,1627],{"class":159},[145,12172,764],{"class":263},[145,12174,12175,12177,12179,12181,12183,12185,12187,12189,12191],{"class":147,"line":716},[145,12176,6563],{"class":155},[145,12178,794],{"class":263},[145,12180,441],{"class":259},[145,12182,1525],{"class":159},[145,12184,685],{"class":155},[145,12186,688],{"class":263},[145,12188,691],{"class":155},[145,12190,450],{"class":159},[145,12192,407],{"class":263},[145,12194,12195,12198,12200],{"class":147,"line":722},[145,12196,12197],{"class":263},"result ",[145,12199,267],{"class":259},[145,12201,12202],{"class":263}," poll_task(task_id)\n",[92,12204,12205],{"id":12205},"预期效果",[11,12207,12208,12209,298],{},"生成的视频会展示城市环境中的跑酷运动员——但镜头运动（跟踪速度、前进动量、平滑连续运动）来自你的参考视频。模型不会复制参考视频中的主体或场景，它只复制",[2614,12210,12211],{},"镜头的运动方式",[56,12213,60,12214],{"controls":58,"playsInline":58,"style":59},[62,12215],{"src":12216,"type":65},"https://cdn.evolink.ai/seedance2api/%E5%9F%8E%E5%B8%82%E8%B7%91%E9%85%B7.mp4",[11,12218,12219],{},[2614,12220,12221],{},"示例输出：一镜到底跟踪镜头跟随跑酷运动员穿越城市环境。镜头保持连续前进运动，具有平滑的稳定器级稳定性。",[11,12223,12224,12227],{},[23,12225,12226],{},"自己试试："," 换上你自己的参考视频——无人机跟拍、行车记录仪片段或稳定器行走视频——然后修改提示词以匹配你想要的场景。镜头运动会自动迁移。",[45,12229],{},[48,12231,12233],{"id":12232},"案例-2希区柯克变焦推拉变焦","案例 2：希区柯克变焦（推拉变焦）",[11,12235,12236],{},"推拉变焦（dolly zoom）——为阿尔弗雷德·希区柯克的《迷魂记》（1958 年）而发明——是电影史上最令人眩晕、最具视觉冲击力的镜头技术之一。摄影机物理上朝向（或远离）主体移动，同时镜头反向变焦。主体在画面中保持相同大小，但背景发生剧烈扭曲。它能创造出一种本能的不安感、恍然大悟感或情绪转变感。",[11,12238,12239],{},"在真实的电影拍摄中，这需要推拉轨道和精确的变焦时机配合。而使用 Seedance 2.0，你只需要一段参考视频。",[92,12241,11944],{"id":12242},"你需要什么-1",[11,12244,12245,12247],{},[23,12246,11949],{}," 一段展示推拉变焦效果的片段。你可以在 YouTube 上搜索 \"dolly zoom effect\" 或 \"vertigo effect tutorial\" 找到示例。片段应为 3-8 秒，展示主体不动的情况下背景的压缩/膨胀效果。",[11,12249,12250,12252],{},[23,12251,11955],{}," 全新的画面主体，明确引用推拉变焦。",[92,12254,11963],{"id":12255},"提示词示例-1",[136,12257,12260],{"className":12258,"code":12259,"language":2183},[2181],"Replicate @Video1's camera technique exactly — the dolly zoom\n(Hitchcock zoom) effect where the camera moves forward while\nzooming out, keeping the subject the same size while the\nbackground dramatically stretches.\n\nApply this effect to: a detective standing in a dim corridor.\nAs the dolly zoom activates, the corridor behind him stretches\nimpossibly long, creating a sense of dawning horror.\nDramatic side lighting with deep shadows. Film noir atmosphere.\n",[28,12261,12259],{"__ignoreMap":141},[92,12263,11999],{"id":12264},"完整-python-代码-1",[136,12266,12268],{"className":339,"code":12267,"language":341,"meta":141,"style":141},"# Case 2: Hitchcock Zoom (Dolly Zoom)\n\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"Replicate @Video1's camera technique exactly — the dolly \"\n            \"zoom (Hitchcock zoom) effect where the camera moves forward \"\n            \"while zooming out, keeping the subject the same size while \"\n            \"the background dramatically stretches.\\n\\n\"\n            \"Apply this effect to: a detective standing in a dim \"\n            \"corridor. As the dolly zoom activates, the corridor behind \"\n            \"him stretches impossibly long, creating a sense of dawning \"\n            \"horror. Dramatic side lighting with deep shadows. \"\n            \"Film noir atmosphere.\"\n        ),\n        \"video_urls\": [\"https://your-cdn.com/dolly_zoom_reference.mp4\"],\n        \"duration\": 8,\n        \"quality\": \"720p\"\n    }\n)\n\ntask_id = response.json()[\"id\"]\nprint(f\"Task created: {task_id}\")\nresult = poll_task(task_id)\n",[28,12269,12270,12275,12279,12287,12299,12309,12317,12327,12333,12338,12343,12348,12357,12362,12367,12372,12377,12382,12386,12397,12407,12415,12419,12423,12427,12439,12459],{"__ignoreMap":141},[145,12271,12272],{"class":147,"line":148},[145,12273,12274],{"class":174},"# Case 2: Hitchcock Zoom (Dolly Zoom)\n",[145,12276,12277],{"class":147,"line":166},[145,12278,377],{"emptyLinePlaceholder":58},[145,12280,12281,12283,12285],{"class":147,"line":178},[145,12282,6508],{"class":263},[145,12284,267],{"class":259},[145,12286,1433],{"class":263},[145,12288,12289,12291,12293,12295,12297],{"class":147,"line":187},[145,12290,6517],{"class":259},[145,12292,450],{"class":159},[145,12294,679],{"class":155},[145,12296,1445],{"class":159},[145,12298,453],{"class":263},[145,12300,12301,12303,12305,12307],{"class":147,"line":374},[145,12302,6530],{"class":701},[145,12304,267],{"class":259},[145,12306,424],{"class":155},[145,12308,453],{"class":263},[145,12310,12311,12313,12315],{"class":147,"line":380},[145,12312,6541],{"class":701},[145,12314,267],{"class":259},[145,12316,1865],{"class":263},[145,12318,12319,12321,12323,12325],{"class":147,"line":386},[145,12320,1304],{"class":159},[145,12322,438],{"class":263},[145,12324,1309],{"class":159},[145,12326,453],{"class":263},[145,12328,12329,12331],{"class":147,"line":410},[145,12330,1320],{"class":159},[145,12332,1323],{"class":263},[145,12334,12335],{"class":147,"line":421},[145,12336,12337],{"class":159},"            \"Replicate @Video1's camera technique exactly — the dolly \"\n",[145,12339,12340],{"class":147,"line":432},[145,12341,12342],{"class":159},"            \"zoom (Hitchcock zoom) effect where the camera moves forward \"\n",[145,12344,12345],{"class":147,"line":456},[145,12346,12347],{"class":159},"            \"while zooming out, keeping the subject the same size while \"\n",[145,12349,12350,12353,12355],{"class":147,"line":467},[145,12351,12352],{"class":159},"            \"the background dramatically stretches.",[145,12354,12085],{"class":155},[145,12356,951],{"class":159},[145,12358,12359],{"class":147,"line":600},[145,12360,12361],{"class":159},"            \"Apply this effect to: a detective standing in a dim \"\n",[145,12363,12364],{"class":147,"line":605},[145,12365,12366],{"class":159},"            \"corridor. As the dolly zoom activates, the corridor behind \"\n",[145,12368,12369],{"class":147,"line":611},[145,12370,12371],{"class":159},"            \"him stretches impossibly long, creating a sense of dawning \"\n",[145,12373,12374],{"class":147,"line":617},[145,12375,12376],{"class":159},"            \"horror. Dramatic side lighting with deep shadows. \"\n",[145,12378,12379],{"class":147,"line":623},[145,12380,12381],{"class":159},"            \"Film noir atmosphere.\"\n",[145,12383,12384],{"class":147,"line":628},[145,12385,1343],{"class":263},[145,12387,12388,12390,12392,12395],{"class":147,"line":639},[145,12389,12121],{"class":159},[145,12391,10809],{"class":263},[145,12393,12394],{"class":159},"\"https://your-cdn.com/dolly_zoom_reference.mp4\"",[145,12396,10815],{"class":263},[145,12398,12399,12401,12403,12405],{"class":147,"line":654},[145,12400,1348],{"class":159},[145,12402,438],{"class":263},[145,12404,3691],{"class":155},[145,12406,453],{"class":263},[145,12408,12409,12411,12413],{"class":147,"line":660},[145,12410,1364],{"class":159},[145,12412,438],{"class":263},[145,12414,8488],{"class":159},[145,12416,12417],{"class":147,"line":671},[145,12418,1408],{"class":263},[145,12420,12421],{"class":147,"line":698},[145,12422,407],{"class":263},[145,12424,12425],{"class":147,"line":710},[145,12426,377],{"emptyLinePlaceholder":58},[145,12428,12429,12431,12433,12435,12437],{"class":147,"line":716},[145,12430,12163],{"class":263},[145,12432,267],{"class":259},[145,12434,12168],{"class":263},[145,12436,1627],{"class":159},[145,12438,764],{"class":263},[145,12440,12441,12443,12445,12447,12449,12451,12453,12455,12457],{"class":147,"line":722},[145,12442,6563],{"class":155},[145,12444,794],{"class":263},[145,12446,441],{"class":259},[145,12448,1525],{"class":159},[145,12450,685],{"class":155},[145,12452,688],{"class":263},[145,12454,691],{"class":155},[145,12456,450],{"class":159},[145,12458,407],{"class":263},[145,12460,12461,12463,12465],{"class":147,"line":728},[145,12462,12197],{"class":263},[145,12464,267],{"class":259},[145,12466,12202],{"class":263},[92,12468,12469],{"id":12469},"为什么这种方法有效",[11,12471,12472,12473,12476],{},"推拉变焦出了名地难以用文字描述。在其他 AI 视频工具中使用\"zoom in while moving backward\"这样的提示词，往往会得到混乱的结果。通过提供一段",[2614,12474,12475],{},"演示","该技术的参考视频，Seedance 2.0 可以分析空间关系的变化——背景如何相对于前景压缩/膨胀——并精确复刻。",[11,12478,12479,12482],{},[23,12480,12481],{},"技巧："," 参考视频中的推拉变焦越干净、越独立，效果越好。避免使用包含大量主体运动或场景切换的参考视频——模型可能会将镜头运动与主体运动混淆。",[45,12484],{},[48,12486,12488],{"id":12487},"案例-3环绕镜头360-旋转","案例 3：环绕镜头（360° 旋转）",[11,12490,12491],{},"环绕镜头让摄影机绕主体旋转，创造出震撼的揭示效果或建立角色的存在感。它是音乐视频、英雄登场和产品展示中的常用技巧。",[92,12493,11944],{"id":12494},"你需要什么-2",[11,12496,12497,12499],{},[23,12498,11949],{}," 一段展示摄影机绕主体环绕的片段。平滑的 180° 或 360° 旋转效果最好。转盘产品拍摄或角色揭示镜头是理想的参考。",[11,12501,12502,12504],{},[23,12503,11955],{}," 全新主体 + 明确的环绕引用。",[92,12506,11963],{"id":12507},"提示词示例-2",[136,12509,12512],{"className":12510,"code":12511,"language":2183},[2181],"Replicate @Video1's orbital camera movement — the smooth 360°\nrotation around the subject, maintaining consistent distance\nand speed throughout the arc.\n\nApply this camera movement to: a lone astronaut standing on\nthe surface of Mars. Red desert landscape stretches to the\nhorizon. The orbital camera reveals the astronaut from all\nangles as dust particles float in the thin atmosphere.\nEpic cinematic scale. Golden hour Martian lighting.\n",[28,12513,12511],{"__ignoreMap":141},[92,12515,11999],{"id":12516},"完整-python-代码-2",[136,12518,12520],{"className":339,"code":12519,"language":341,"meta":141,"style":141},"# Case 3: Orbital Camera (360 Rotation)\n\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"Replicate @Video1's orbital camera movement — the smooth \"\n            \"360 degree rotation around the subject, maintaining consistent \"\n            \"distance and speed throughout the arc.\\n\\n\"\n            \"Apply this camera movement to: a lone astronaut standing \"\n            \"on the surface of Mars. Red desert landscape stretches to \"\n            \"the horizon. The orbital camera reveals the astronaut from \"\n            \"all angles as dust particles float in the thin atmosphere. \"\n            \"Epic cinematic scale. Golden hour Martian lighting.\"\n        ),\n        \"video_urls\": [\"https://your-cdn.com/orbital_reference.mp4\"],\n        \"duration\": 10,\n        \"quality\": \"720p\"\n    }\n)\n\ntask_id = response.json()[\"id\"]\nprint(f\"Task created: {task_id}\")\nresult = poll_task(task_id)\n",[28,12521,12522,12527,12531,12539,12551,12561,12569,12579,12585,12590,12595,12604,12609,12614,12619,12624,12629,12633,12644,12654,12662,12666,12670,12674,12686,12706],{"__ignoreMap":141},[145,12523,12524],{"class":147,"line":148},[145,12525,12526],{"class":174},"# Case 3: Orbital Camera (360 Rotation)\n",[145,12528,12529],{"class":147,"line":166},[145,12530,377],{"emptyLinePlaceholder":58},[145,12532,12533,12535,12537],{"class":147,"line":178},[145,12534,6508],{"class":263},[145,12536,267],{"class":259},[145,12538,1433],{"class":263},[145,12540,12541,12543,12545,12547,12549],{"class":147,"line":187},[145,12542,6517],{"class":259},[145,12544,450],{"class":159},[145,12546,679],{"class":155},[145,12548,1445],{"class":159},[145,12550,453],{"class":263},[145,12552,12553,12555,12557,12559],{"class":147,"line":374},[145,12554,6530],{"class":701},[145,12556,267],{"class":259},[145,12558,424],{"class":155},[145,12560,453],{"class":263},[145,12562,12563,12565,12567],{"class":147,"line":380},[145,12564,6541],{"class":701},[145,12566,267],{"class":259},[145,12568,1865],{"class":263},[145,12570,12571,12573,12575,12577],{"class":147,"line":386},[145,12572,1304],{"class":159},[145,12574,438],{"class":263},[145,12576,1309],{"class":159},[145,12578,453],{"class":263},[145,12580,12581,12583],{"class":147,"line":410},[145,12582,1320],{"class":159},[145,12584,1323],{"class":263},[145,12586,12587],{"class":147,"line":421},[145,12588,12589],{"class":159},"            \"Replicate @Video1's orbital camera movement — the smooth \"\n",[145,12591,12592],{"class":147,"line":432},[145,12593,12594],{"class":159},"            \"360 degree rotation around the subject, maintaining consistent \"\n",[145,12596,12597,12600,12602],{"class":147,"line":456},[145,12598,12599],{"class":159},"            \"distance and speed throughout the arc.",[145,12601,12085],{"class":155},[145,12603,951],{"class":159},[145,12605,12606],{"class":147,"line":467},[145,12607,12608],{"class":159},"            \"Apply this camera movement to: a lone astronaut standing \"\n",[145,12610,12611],{"class":147,"line":600},[145,12612,12613],{"class":159},"            \"on the surface of Mars. Red desert landscape stretches to \"\n",[145,12615,12616],{"class":147,"line":605},[145,12617,12618],{"class":159},"            \"the horizon. The orbital camera reveals the astronaut from \"\n",[145,12620,12621],{"class":147,"line":611},[145,12622,12623],{"class":159},"            \"all angles as dust particles float in the thin atmosphere. \"\n",[145,12625,12626],{"class":147,"line":617},[145,12627,12628],{"class":159},"            \"Epic cinematic scale. Golden hour Martian lighting.\"\n",[145,12630,12631],{"class":147,"line":623},[145,12632,1343],{"class":263},[145,12634,12635,12637,12639,12642],{"class":147,"line":628},[145,12636,12121],{"class":159},[145,12638,10809],{"class":263},[145,12640,12641],{"class":159},"\"https://your-cdn.com/orbital_reference.mp4\"",[145,12643,10815],{"class":263},[145,12645,12646,12648,12650,12652],{"class":147,"line":639},[145,12647,1348],{"class":159},[145,12649,438],{"class":263},[145,12651,537],{"class":155},[145,12653,453],{"class":263},[145,12655,12656,12658,12660],{"class":147,"line":654},[145,12657,1364],{"class":159},[145,12659,438],{"class":263},[145,12661,8488],{"class":159},[145,12663,12664],{"class":147,"line":660},[145,12665,1408],{"class":263},[145,12667,12668],{"class":147,"line":671},[145,12669,407],{"class":263},[145,12671,12672],{"class":147,"line":698},[145,12673,377],{"emptyLinePlaceholder":58},[145,12675,12676,12678,12680,12682,12684],{"class":147,"line":710},[145,12677,12163],{"class":263},[145,12679,267],{"class":259},[145,12681,12168],{"class":263},[145,12683,1627],{"class":159},[145,12685,764],{"class":263},[145,12687,12688,12690,12692,12694,12696,12698,12700,12702,12704],{"class":147,"line":716},[145,12689,6563],{"class":155},[145,12691,794],{"class":263},[145,12693,441],{"class":259},[145,12695,1525],{"class":159},[145,12697,685],{"class":155},[145,12699,688],{"class":263},[145,12701,691],{"class":155},[145,12703,450],{"class":159},[145,12705,407],{"class":263},[145,12707,12708,12710,12712],{"class":147,"line":722},[145,12709,12197],{"class":263},[145,12711,267],{"class":259},[145,12713,12202],{"class":263},[92,12715,12716],{"id":12716},"选择合适的环绕参考",[11,12718,12719],{},"不同的环绕镜头效果差异很大。参考视频决定了：",[2036,12721,12722,12732],{},[2039,12723,12724],{},[2042,12725,12726,12729],{},[2045,12727,12728],{},"参考视频特征",[2045,12730,12731],{},"生成效果",[2052,12733,12734,12742,12750,12758],{},[2042,12735,12736,12739],{},[2057,12737,12738],{},"匀速平滑稳定旋转",[2057,12740,12741],{},"干净、专业的环绕镜头",[2042,12743,12744,12747],{},[2057,12745,12746],{},"手持晃动旋转",[2057,12748,12749],{},"有机的纪录片风格环绕",[2042,12751,12752,12755],{},[2057,12753,12754],{},"快速甩拍旋转",[2057,12756,12757],{},"充满动感的高能量揭示",[2042,12759,12760,12763],{},[2057,12761,12762],{},"缓慢 90° 局部环绕",[2057,12764,12765],{},"微妙而富有戏剧性的角度变化",[11,12767,12768],{},"选择与你想要的能量感匹配的参考。转盘产品视频给你机器般平滑的旋转，手持环绕拍摄给你有机的运动感。",[45,12770],{},[48,12772,12774],{"id":12773},"进阶组合镜头运动与其他引用","进阶：组合镜头运动与其他引用",[11,12776,12777],{},"Seedance 2.0 引用系统的真正威力在于将镜头运动与其他输入类型组合使用。你不局限于单一引用——最多可以使用 3 个视频引用和 9 个图像引用（共 12 个文件）。",[92,12779,12781],{"id":12780},"镜头-角色-风格","镜头 + 角色 + 风格",[11,12783,12784],{},"以下是一个三重输入组合：",[96,12786,12787,12792,12797],{},[73,12788,12789,12791],{},[28,12790,11391],{}," — 镜头运动（环绕镜头）",[73,12793,12794,12796],{},[28,12795,2903],{}," — 角色外观（特定角色设计）",[73,12798,12799,12801],{},[28,12800,2914],{}," — 风格参考（特定艺术风格或调色板）",[136,12803,12805],{"className":339,"code":12804,"language":341,"meta":141,"style":141},"# Advanced: Camera + Character + Style combination\n\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"Replicate @Video1's orbital camera movement — smooth \"\n            \"rotation around the subject.\\n\\n\"\n            \"@Image1 is the character — maintain this character's \"\n            \"appearance exactly.\\n\\n\"\n            \"@Image2 is the visual style reference — match its color \"\n            \"palette, lighting mood, and artistic treatment.\\n\\n\"\n            \"Scene: The character from @Image1 stands in the center \"\n            \"of a grand cathedral. The orbital camera from @Video1 \"\n            \"slowly reveals the architecture. Visual style matches \"\n            \"@Image2 throughout.\"\n        ),\n        \"image_urls\": [\n            \"https://your-cdn.com/character_design.png\",\n            \"https://your-cdn.com/art_style_reference.jpg\"\n        ],\n        \"video_urls\": [\n            \"https://your-cdn.com/orbital_reference.mp4\"\n        ],\n        \"duration\": 10,\n        \"quality\": \"720p\"\n    }\n)\n\ntask_id = response.json()[\"id\"]\nprint(f\"Task created: {task_id}\")\nresult = poll_task(task_id)\n",[28,12806,12807,12812,12816,12824,12836,12846,12854,12864,12870,12875,12884,12889,12898,12903,12912,12917,12922,12927,12932,12936,12942,12949,12954,12958,12964,12969,12973,12983,12991,12995,12999,13003,13015,13035],{"__ignoreMap":141},[145,12808,12809],{"class":147,"line":148},[145,12810,12811],{"class":174},"# Advanced: Camera + Character + Style combination\n",[145,12813,12814],{"class":147,"line":166},[145,12815,377],{"emptyLinePlaceholder":58},[145,12817,12818,12820,12822],{"class":147,"line":178},[145,12819,6508],{"class":263},[145,12821,267],{"class":259},[145,12823,1433],{"class":263},[145,12825,12826,12828,12830,12832,12834],{"class":147,"line":187},[145,12827,6517],{"class":259},[145,12829,450],{"class":159},[145,12831,679],{"class":155},[145,12833,1445],{"class":159},[145,12835,453],{"class":263},[145,12837,12838,12840,12842,12844],{"class":147,"line":374},[145,12839,6530],{"class":701},[145,12841,267],{"class":259},[145,12843,424],{"class":155},[145,12845,453],{"class":263},[145,12847,12848,12850,12852],{"class":147,"line":380},[145,12849,6541],{"class":701},[145,12851,267],{"class":259},[145,12853,1865],{"class":263},[145,12855,12856,12858,12860,12862],{"class":147,"line":386},[145,12857,1304],{"class":159},[145,12859,438],{"class":263},[145,12861,1309],{"class":159},[145,12863,453],{"class":263},[145,12865,12866,12868],{"class":147,"line":410},[145,12867,1320],{"class":159},[145,12869,1323],{"class":263},[145,12871,12872],{"class":147,"line":421},[145,12873,12874],{"class":159},"            \"Replicate @Video1's orbital camera movement — smooth \"\n",[145,12876,12877,12880,12882],{"class":147,"line":432},[145,12878,12879],{"class":159},"            \"rotation around the subject.",[145,12881,12085],{"class":155},[145,12883,951],{"class":159},[145,12885,12886],{"class":147,"line":456},[145,12887,12888],{"class":159},"            \"@Image1 is the character — maintain this character's \"\n",[145,12890,12891,12894,12896],{"class":147,"line":467},[145,12892,12893],{"class":159},"            \"appearance exactly.",[145,12895,12085],{"class":155},[145,12897,951],{"class":159},[145,12899,12900],{"class":147,"line":600},[145,12901,12902],{"class":159},"            \"@Image2 is the visual style reference — match its color \"\n",[145,12904,12905,12908,12910],{"class":147,"line":605},[145,12906,12907],{"class":159},"            \"palette, lighting mood, and artistic treatment.",[145,12909,12085],{"class":155},[145,12911,951],{"class":159},[145,12913,12914],{"class":147,"line":611},[145,12915,12916],{"class":159},"            \"Scene: The character from @Image1 stands in the center \"\n",[145,12918,12919],{"class":147,"line":617},[145,12920,12921],{"class":159},"            \"of a grand cathedral. The orbital camera from @Video1 \"\n",[145,12923,12924],{"class":147,"line":623},[145,12925,12926],{"class":159},"            \"slowly reveals the architecture. Visual style matches \"\n",[145,12928,12929],{"class":147,"line":628},[145,12930,12931],{"class":159},"            \"@Image2 throughout.\"\n",[145,12933,12934],{"class":147,"line":639},[145,12935,1343],{"class":263},[145,12937,12938,12940],{"class":147,"line":654},[145,12939,2683],{"class":159},[145,12941,2686],{"class":263},[145,12943,12944,12947],{"class":147,"line":660},[145,12945,12946],{"class":159},"            \"https://your-cdn.com/character_design.png\"",[145,12948,453],{"class":263},[145,12950,12951],{"class":147,"line":671},[145,12952,12953],{"class":159},"            \"https://your-cdn.com/art_style_reference.jpg\"\n",[145,12955,12956],{"class":147,"line":698},[145,12957,2696],{"class":263},[145,12959,12960,12962],{"class":147,"line":710},[145,12961,12121],{"class":159},[145,12963,2686],{"class":263},[145,12965,12966],{"class":147,"line":716},[145,12967,12968],{"class":159},"            \"https://your-cdn.com/orbital_reference.mp4\"\n",[145,12970,12971],{"class":147,"line":722},[145,12972,2696],{"class":263},[145,12974,12975,12977,12979,12981],{"class":147,"line":728},[145,12976,1348],{"class":159},[145,12978,438],{"class":263},[145,12980,537],{"class":155},[145,12982,453],{"class":263},[145,12984,12985,12987,12989],{"class":147,"line":739},[145,12986,1364],{"class":159},[145,12988,438],{"class":263},[145,12990,8488],{"class":159},[145,12992,12993],{"class":147,"line":744},[145,12994,1408],{"class":263},[145,12996,12997],{"class":147,"line":750},[145,12998,407],{"class":263},[145,13000,13001],{"class":147,"line":767},[145,13002,377],{"emptyLinePlaceholder":58},[145,13004,13005,13007,13009,13011,13013],{"class":147,"line":788},[145,13006,12163],{"class":263},[145,13008,267],{"class":259},[145,13010,12168],{"class":263},[145,13012,1627],{"class":159},[145,13014,764],{"class":263},[145,13016,13017,13019,13021,13023,13025,13027,13029,13031,13033],{"class":147,"line":834},[145,13018,6563],{"class":155},[145,13020,794],{"class":263},[145,13022,441],{"class":259},[145,13024,1525],{"class":159},[145,13026,685],{"class":155},[145,13028,688],{"class":263},[145,13030,691],{"class":155},[145,13032,450],{"class":159},[145,13034,407],{"class":263},[145,13036,13037,13039,13041],{"class":147,"line":839},[145,13038,12197],{"class":263},[145,13040,267],{"class":259},[145,13042,12202],{"class":263},[92,13044,13045],{"id":13045},"引用分配策略",[11,13047,13048],{},"混合使用多种引用类型时，要合理规划你的 12 文件预算：",[2036,13050,13051,13066],{},[2039,13052,13053],{},[2042,13054,13055,13057,13060,13063],{},[2045,13056,8244],{},[2045,13058,13059],{},"视频引用",[2045,13061,13062],{},"图像引用",[2045,13064,13065],{},"音频引用",[2052,13067,13068,13080,13092,13103,13115],{},[2042,13069,13070,13073,13076,13078],{},[2057,13071,13072],{},"仅镜头复刻",[2057,13074,13075],{},"1（镜头）",[2057,13077,783],{},[2057,13079,783],{},[2042,13081,13082,13085,13087,13090],{},[2057,13083,13084],{},"镜头 + 角色",[2057,13086,13075],{},[2057,13088,13089],{},"1（角色）",[2057,13091,783],{},[2042,13093,13094,13096,13098,13101],{},[2057,13095,12781],{},[2057,13097,13075],{},[2057,13099,13100],{},"2（角色 + 风格）",[2057,13102,783],{},[2042,13104,13105,13108,13111,13113],{},[2057,13106,13107],{},"镜头 + 编舞 + 角色",[2057,13109,13110],{},"2（镜头 + 舞蹈）",[2057,13112,13089],{},[2057,13114,783],{},[2042,13116,13117,13120,13122,13125],{},[2057,13118,13119],{},"完整制作",[2057,13121,13075],{},[2057,13123,13124],{},"3（角色 + 场景 + 风格）",[2057,13126,13127],{},"1（音乐）",[11,13129,13130,13133],{},[23,13131,13132],{},"经验法则："," 从 2-3 个引用开始。增加更多引用并不总能改善效果——反而可能引入冲突信号。使用传达意图所需的最少引用数量。",[11,13135,13136,13137,298],{},"更多关于多引用策略的内容，请参阅我们的 ",[37,13138,11518],{"href":2962},[45,13140],{},[48,13142,13143],{"id":13143},"常见错误及修复方法",[92,13145,13147],{"id":13146},"错误-1未指定引用内容","错误 1：未指定引用内容",[11,13149,13150],{},[23,13151,13152],{},"错误写法：",[136,13154,13157],{"className":13155,"code":13156,"language":2183},[2181],"Use @Video1. A knight rides a horse through a valley.\n",[28,13158,13156],{"__ignoreMap":141},[11,13160,13161,13162,13164],{},"模型不知道你想要 ",[28,13163,11391],{}," 中的镜头运动、主体动作、视觉风格还是全部。",[11,13166,13167],{},[23,13168,13169],{},"正确写法：",[136,13171,13174],{"className":13172,"code":13173,"language":2183},[2181],"Replicate @Video1's camera movement and tracking trajectory.\nA knight rides a horse through a green valley at sunrise.\n",[28,13175,13173],{"__ignoreMap":141},[92,13177,13179],{"id":13178},"错误-2参考视频过长或过于复杂","错误 2：参考视频过长或过于复杂",[11,13181,13182],{},"参考视频应为 2-15 秒，展示干净、可识别的镜头运动。一段包含三种不同镜头技术（先摇镜、再变焦、再环绕）的 15 秒片段会给出混乱的信号。",[11,13184,13185,13188],{},[23,13186,13187],{},"修复："," 裁剪你的参考视频，只保留你想要的特定镜头运动。使用该技术最简洁、最干净的示例。",[92,13190,13192],{"id":13191},"错误-3混淆镜头运动与主体运动","错误 3：混淆镜头运动与主体运动",[11,13194,13195,13196,13199,13200,13203],{},"一段有人跳舞的参考视频包含两样东西：",[2614,13197,13198],{},"镜头","的运动方式和",[2614,13201,13202],{},"主体","的运动方式。如果你只想要镜头运动，要明确说明：",[136,13205,13208],{"className":13206,"code":13207,"language":2183},[2181],"Replicate ONLY @Video1's camera movement — the pan speed, tracking\ntrajectory, and framing rhythm. Ignore the subject's actions.\n\nNew subject: a robot assembling car parts on a factory floor.\n",[28,13209,13207],{"__ignoreMap":141},[92,13211,13213],{"id":13212},"错误-4提示词与参考视频冲突","错误 4：提示词与参考视频冲突",[11,13215,13216],{},"如果你的参考视频展示的是缓慢平滑的推进，但提示词写的是\"fast-paced action with rapid cuts\"，模型会收到矛盾信号。",[11,13218,13219,13221,13222,13225,13226,298],{},[23,13220,13187],{}," 让文本提示词与参考视频的能量感保持一致。提示词描述",[2614,13223,13224],{},"内容","，参考视频演示",[2614,13227,13228],{},"技术",[92,13230,13232],{"id":13231},"错误-5期望一次出完美结果","错误 5：期望一次出完美结果",[11,13234,13235],{},"镜头复刻是一项复杂的技术。第一次尝试可能无法完美还原参考效果。迭代优化：",[70,13237,13238,13241,13244,13247],{},[73,13239,13240],{},"从简单的提示词 + 干净的参考开始",[73,13242,13243],{},"查看输出——镜头运动是否接近？",[73,13245,13246],{},"调整提示词语言，更具体地描述哪里不对",[73,13248,13249],{},"如果技术迁移效果不佳，尝试换一段不同的参考视频",[45,13251],{},[48,13253,13255],{"id":13254},"faq","FAQ",[92,13257,13259],{"id":13258},"我可以将一个视频的镜头运动与另一个视频的编舞动作组合使用吗","我可以将一个视频的镜头运动与另一个视频的编舞动作组合使用吗？",[11,13261,13262,13263,13265,13266,13268,13269,13272],{},"可以。使用两个 ",[28,13264,2954],{}," 引用：",[28,13267,11391],{}," 用于镜头运动，",[28,13270,13271],{},"@Video2"," 用于编舞/动作。在提示词中说明：\"Replicate @Video1's camera movement and @Video2's dance choreography.\" Seedance 2.0 支持最多同时使用 3 个视频引用。",[92,13274,13276],{"id":13275},"镜头参考最适合什么视频格式和时长","镜头参考最适合什么视频格式和时长？",[11,13278,13279],{},"MP4 格式，480p-720p 分辨率，2-15 秒时长，50MB 以下。对于镜头运动参考，通常越短越好——一段干净的 3-5 秒单一镜头技术片段比包含多种技术的长片段迁移效果更可靠。",[92,13281,13283],{"id":13282},"这与-sora-或-kling-的镜头控制有什么不同","这与 Sora 或 Kling 的镜头控制有什么不同？",[11,13285,13286,13287,13289],{},"Sora 2 和 Kling 3.0 使用基于文本的镜头指令——你用文字描述运动方式（\"dolly in\"，\"pan left\"）。效果取决于模型对文本的理解程度。Seedance 2.0 使用基于参考的镜头控制——你通过 ",[28,13288,2954],{}," 标签向模型展示你想要什么。这产生更精确、更一致的镜头复刻，尤其对于希区柯克变焦或一镜到底跟踪镜头等难以用文字描述的复杂运动。",[92,13291,13293],{"id":13292},"我可以使用屏幕录制或手机视频作为镜头参考吗","我可以使用屏幕录制或手机视频作为镜头参考吗？",[11,13295,13296],{},"可以。任何展示你想要的镜头运动的视频都可以作为参考。你边走边用手机拍摄的视频会产生手持跟踪镜头效果。一段电影片段的屏幕录制会迁移该电影的镜头语言。模型提取镜头行为时不受原始制作质量的影响。",[92,13298,13300],{"id":13299},"镜头复刻可以与图生视频一起使用吗","镜头复刻可以与图生视频一起使用吗？",[11,13302,13303,13304,13306,13307,13309],{},"可以。你可以将 ",[28,13305,11391],{},"（镜头运动参考）与 ",[28,13308,2903],{},"（首帧/角色）组合使用，生成一个从你的图像开始、按照视频参考移动镜头的视频。这对产品视频和角色展示非常强大。",[45,13311],{},[48,13313,13314],{"id":13314},"开始复刻任何镜头运动",[11,13316,13317,13318,13320],{},"镜头运动不再受限于设备或专业技能。借助参考视频和 Seedance 2.0 的 ",[28,13319,2954],{}," 标签系统，你可以复刻任何镜头技术——从微妙的焦点变换到完整的希区柯克变焦——并将其应用到你能描述的任何内容上。",[11,13322,13323],{},"本教程中的三个案例涵盖了最热门的镜头技术：",[96,13325,13326,13332,13338],{},[73,13327,13328,13331],{},[23,13329,13330],{},"一镜到底跟踪"," 用于沉浸式连续运动",[73,13333,13334,13337],{},[23,13335,13336],{},"推拉变焦"," 用于制造戏剧张力和心理冲击",[73,13339,13340,13342],{},[23,13341,11304],{}," 用于角色揭示和产品展示",[11,13344,13345],{},"每种方法的工作方式相同：上传参考、添加标签、描述场景、让模型处理镜头。",[11,13347,13348,13349,13353],{},"准备好试试了吗？",[37,13350,13352],{"href":211,"rel":13351},[41],"注册免费 EvoLink API Key","，开始使用精确的镜头控制生成电影级 AI 视频。",[45,13355],{},[11,13357,13358],{},[2614,13359,13360],{},"相关阅读：",[96,13362,13363,13373],{},[73,13364,13365,13368,13369,13372],{},[37,13366,13367],{"href":1766},"Seedance 2.0 提示词：多模态视频生成完整指南"," — 掌握",[37,13370,13371],{"href":1766},"分镜脚本提示词格式","处理复杂场景",[73,13374,13375,13378,13379],{},[37,13376,13377],{"href":2962},"Seedance 2.0 多模态引用：@Tags 完全指南"," — 深入了解完整的 ",[37,13380,13381],{"href":2962},"@tag 引用系统",[45,13383],{},[11,13385,13386],{},[2614,13387,13388],{},"最后更新：2026 年 2 月 20 日 | 作者：J，EvoLink 增长负责人",[11186,13390,13391],{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":141,"searchDepth":166,"depth":166,"links":13393},[13394,13395,13399,13404,13410,13416,13422,13426,13433,13440],{"id":11324,"depth":166,"text":11325},{"id":11372,"depth":166,"text":11373,"children":13396},[13397,13398],{"id":11385,"depth":178,"text":11386},{"id":11427,"depth":178,"text":11427},{"id":11523,"depth":166,"text":11523,"children":13400},[13401,13402,13403],{"id":11526,"depth":178,"text":11526},{"id":11548,"depth":178,"text":11548},{"id":11563,"depth":178,"text":11564},{"id":11934,"depth":166,"text":11935,"children":13405},[13406,13407,13408,13409],{"id":11944,"depth":178,"text":11944},{"id":11963,"depth":178,"text":11963},{"id":11998,"depth":178,"text":11999},{"id":12205,"depth":178,"text":12205},{"id":12232,"depth":166,"text":12233,"children":13411},[13412,13413,13414,13415],{"id":12242,"depth":178,"text":11944},{"id":12255,"depth":178,"text":11963},{"id":12264,"depth":178,"text":11999},{"id":12469,"depth":178,"text":12469},{"id":12487,"depth":166,"text":12488,"children":13417},[13418,13419,13420,13421],{"id":12494,"depth":178,"text":11944},{"id":12507,"depth":178,"text":11963},{"id":12516,"depth":178,"text":11999},{"id":12716,"depth":178,"text":12716},{"id":12773,"depth":166,"text":12774,"children":13423},[13424,13425],{"id":12780,"depth":178,"text":12781},{"id":13045,"depth":178,"text":13045},{"id":13143,"depth":166,"text":13143,"children":13427},[13428,13429,13430,13431,13432],{"id":13146,"depth":178,"text":13147},{"id":13178,"depth":178,"text":13179},{"id":13191,"depth":178,"text":13192},{"id":13212,"depth":178,"text":13213},{"id":13231,"depth":178,"text":13232},{"id":13254,"depth":166,"text":13255,"children":13434},[13435,13436,13437,13438,13439],{"id":13258,"depth":178,"text":13259},{"id":13275,"depth":178,"text":13276},{"id":13282,"depth":178,"text":13283},{"id":13292,"depth":178,"text":13293},{"id":13299,"depth":178,"text":13300},{"id":13314,"depth":166,"text":13314},"学习使用 Seedance 2.0 API 复刻希区柯克变焦、一镜到底跟踪镜头和环绕镜头。3 个完整的 Python 示例，使用 @Video 标签。",{"date":13443,"image":11278,"seoTitle":13444},"2026-02-20","使用 Seedance 2.0 API 复刻镜头运动 | 教程","/zh/blog/seedance-2-camera-movement-api",{"title":11260,"description":13441},"zh/blog/seedance-2-camera-movement-api","rSQXn9yRwEdwbkR2i9Ku_RZvduc90jLypr8pIfHfkD8",{"id":13450,"title":13451,"body":13452,"description":17313,"extension":11248,"meta":17314,"navigation":58,"path":17319,"seo":17320,"stem":17321,"__hash__":17322},"content/zh/blog/seedance-2-copyright-api-guide.md","Seedance 2.0 版权争议：API 开发者必须了解的一切",{"type":8,"value":13453,"toc":17268},[13454,13457,13460,13464,13467,13470,13474,13485,13488,13500,13515,13518,13522,13538,13547,13567,13575,13592,13600,13619,13627,13631,13634,13666,13674,13678,13681,13684,13687,13695,13698,13701,13704,13710,13716,13722,13728,13739,13742,13745,13868,13871,13874,13878,13881,13884,13887,13890,13894,13897,13901,13917,13942,13945,13948,13954,13960,13966,13971,13974,13977,13980,13986,13992,13998,14004,14021,14027,14033,14041,14044,14050,14053,14056,14059,14064,14067,14070,14073,14078,14081,14098,14101,14104,14204,14207,14210,14298,14306,14324,14328,14334,14337,14340,14343,14444,14447,14450,14453,14523,14526,14529,14549,14552,14572,14575,14579,14582,15006,15009,15235,15238,15242,15250,15370,15375,15383,15386,15389,16046,16051,16055,16072,16075,16079,16082,16091,16206,16211,16215,16221,16390,16394,16410,16414,16417,16599,16605,16620,16624,16627,17042,17046,17049,17052,17058,17061,17065,17078,17082,17090,17094,17097,17101,17107,17111,17114,17193,17200,17202,17205,17208,17211,17243,17246,17260,17265],[11,13455,13456],{},"Seedance 2.0 API 原定于 2026 年 2 月 24 日发布，但目前已被搁置。好莱坞五大电影公司已向 ByteDance 发出停止侵权通知函（cease-and-desist），美国电影协会（MPA）更是将 Seedance 2.0 定性为\"一台为系统性侵权而打造的机器\"。正在基于这一模型进行开发的开发者们，如今不得不面对关于时间线、法律风险和商业可行性的严峻问题。",[11,13458,13459],{},"如果你正在将 Seedance 2.0 集成到你的视频生成流水线中，本指南涵盖了你需要了解的所有内容：完整的版权事件时间线、好莱坞为何专门针对这一模型、API 延期在实践中意味着什么、如何保护你的商业项目、附代码示例的安全提示词工程策略，以及如何在事态解决期间通过统一的多模型 API 保持流水线正常运行。",[48,13461,13463],{"id":13462},"事件始末seedance-20-版权事件时间线","事件始末：Seedance 2.0 版权事件时间线",[11,13465,13466],{},"Seedance 2.0 的版权危机并非一夜之间发生，但一旦引爆便迅速升级。2026 年 2 月的短短一周内，ByteDance 就从收到非正式投诉演变为面对好莱坞各大制片厂的联合法律行动。",[11,13468,13469],{},"以下是基于主要新闻媒体报道整理的经过验证的事件时间线：",[92,13471,13473],{"id":13472},"第一周风暴酝酿2-月-14-16-日","第一周：风暴酝酿（2 月 14-16 日）",[11,13475,13476,1062,13479,13484],{},[23,13477,13478],{},"2026 年 2 月 15 日",[37,13480,13483],{"href":13481,"rel":13482},"https://techcrunch.com",[41],"TechCrunch 报道","好莱坞制片厂对 Seedance 2.0 的能力\"非常不满\"。文章详细介绍了该模型如何能够生成与受版权保护的电影和电视剧高度相似的视频内容。此时投诉仍属非正式——尚未采取法律行动，但措辞已相当尖锐。",[11,13486,13487],{},"事件的导火索是社交媒体上一波病毒式传播的帖子，展示了 Seedance 2.0 生成的画面中出现了可辨识的 Disney 角色、Marvel 超级英雄，以及明显模仿特定电影的场景片段。这些演示视频迅速走红，好莱坞注意到了。",[11,13489,13490,13493,13494,13499],{},[23,13491,13492],{},"2026 年 2 月 16 日"," — 事件在多家媒体上成为头条新闻。",[37,13495,13498],{"href":13496,"rel":13497},"https://www.cnbc.com",[41],"CNBC 报道"," ByteDance 已承认相关关切并承诺为 Seedance 2.0 添加安全防护措施。最值得关注的引述来自 MPA 首席执行官 Charles Rivkin，他将此事件描述为\"大规模的未经授权使用\"。",[11,13501,13502,13503,13508,13509,13514],{},"同日，",[37,13504,13507],{"href":13505,"rel":13506},"https://www.aljazeera.com",[41],"Al Jazeera 报道","了 ByteDance 公开承诺实施修复措施。",[37,13510,13513],{"href":13511,"rel":13512},"https://www.nbcnews.com",[41],"NBC News"," 也对 ByteDance 的回应进行了报道。ByteDance 的声明措辞审慎——承认了相关关切但未承认过错，承诺推出\"增强的内容保护措施\"但未说明具体内容和时间。",[11,13516,13517],{},"在这一阶段，许多开发者以为这只是科技行业常见的争议，做一些公关应对和产品微调就能平息。然而事实并非如此。",[92,13519,13521],{"id":13520},"第二周协调性法律行动2-月-20-22-日","第二周：协调性法律行动（2 月 20-22 日）",[11,13523,13524,13527,13528,13533,13534,13537],{},[23,13525,13526],{},"2026 年 2 月 20 日"," — 事态从公关问题升级为法律危机。",[37,13529,13532],{"href":13530,"rel":13531},"https://www.axios.com",[41],"Axios 报道","五大制片厂——Disney、Warner Bros. Discovery、Paramount、Netflix 和 Sony——分别向 ByteDance 发出了",[23,13535,13536],{},"独立的","停止侵权通知函。这是一个关键细节：这些并非通过 MPA 发出的联合函件（虽然后来 MPA 也发了函）。每家制片厂的法务团队独立判定 Seedance 2.0 的威胁已足以需要采取直接法律行动。",[11,13539,13540,13541,13546],{},"据 ",[37,13542,13545],{"href":13543,"rel":13544},"https://copyrightlately.com",[41],"Copyright Lately"," 的报道，这些信函的措辞对于初始停止侵权通知函而言异常强硬：",[96,13548,13549,13555,13561],{},[73,13550,13551,13554],{},[23,13552,13553],{},"Disney"," 称 Seedance 2.0 是对受版权保护内容的\"虚拟打砸抢\"（virtual smash-and-grab）——这一措辞将问题定性为蓄意盗窃而非偶然事件",[73,13556,13557,13560],{},[23,13558,13559],{},"Paramount"," 表示 Seedance 2.0 的输出内容与其受版权保护的作品\"无法区分\"——这是一个在法律上意义重大的主张，可支持侵权诉讼",[73,13562,13563,13566],{},[23,13564,13565],{},"Warner Bros. Discovery、Netflix 和 Sony"," 各自发出的信函也使用了类似的强硬措辞",[11,13568,13569,13574],{},[37,13570,13573],{"href":13571,"rel":13572},"https://reddit.com/r/comfyui",[41],"Reddit r/comfyui 社区讨论 (2/20)"," 开始出现关于计划中的 API 发布因 deepfake 和版权问题而被推迟的报告。各大开发者论坛上关于时间线和影响的讨论沸沸扬扬。",[11,13576,13577,13580,13581,2955,13586,13591],{},[23,13578,13579],{},"2026 年 2 月 21 日"," — MPA 正式表明了行业立场。",[37,13582,13585],{"href":13583,"rel":13584},"https://www.hollywoodreporter.com",[41],"The Hollywood Reporter",[37,13587,13590],{"href":13588,"rel":13589},"https://variety.com",[41],"Variety"," 均报道 MPA 已向 ByteDance 发出了自己的停止侵权通知函，将 Seedance 2.0 称为\"系统性侵权的工具\"。作为代表所有五大制片厂及其他公司的行业协会，MPA 以其机构力量为各制片厂的个别行动增添了分量。",[11,13593,13594,13599],{},[37,13595,13598],{"href":13596,"rel":13597},"https://news.ycombinator.com",[41],"Hacker News 讨论 (2/21)"," 确认 API 发布已被正式推迟，据报道 ByteDance 正在添加\"预发布安全防护措施\"。",[11,13601,13602,1062,13605,13610,13611,13614,13615,13618],{},[23,13603,13604],{},"2026 年 2 月 22 日",[37,13606,13609],{"href":13607,"rel":13608},"https://the-decoder.com",[41],"The Decoder 报道","了 MPA 对 Seedance 2.0 的完整定性：\"一台为系统性侵权而打造的机器。\"这个由 MPA 律师精心选择的措辞，不仅仅是声称该工具",[2614,13612,13613],{},"可以","被用于侵权，而是断言该工具就是",[2614,13616,13617],{},"为侵权而设计","的——如果案件进入法庭，这一措辞具有重大法律意义。",[11,13620,13502,13621,13626],{},[37,13622,13625],{"href":13623,"rel":13624},"https://www.chosun.com",[41],"韩国朝鲜日报（Chosun）","报道 ByteDance 已因版权纠纷正式推迟 Seedance 2.0 API 的发布。这是来自 ByteDance 内部消息源的首次直接确认：API 时间线的变更是专门由法律行动导致的，而非常规的开发延期。",[92,13628,13630],{"id":13629},"事态现状2026-年-2-月-23-日","事态现状（2026 年 2 月 23 日）",[11,13632,13633],{},"截至今日：",[96,13635,13636,13642,13648,13654,13660],{},[73,13637,13638,13641],{},[23,13639,13640],{},"五封独立停止侵权通知函","，分别来自 Disney、WBD、Paramount、Netflix 和 Sony",[73,13643,13644,13647],{},[23,13645,13646],{},"一封机构性停止侵权通知函","，来自 MPA",[73,13649,13650,13653],{},[23,13651,13652],{},"API 发布推迟","，从 2 月 24 日延期至未确定的日期",[73,13655,13656,13659],{},[23,13657,13658],{},"ByteDance 承诺添加安全防护措施","，但未明确实施细节或时间表",[73,13661,13662,13665],{},[23,13663,13664],{},"尚未提起诉讼","——但停止侵权通知函通常是在诉求未被满足时启动诉讼的前奏",[18,13667,13668],{},[11,13669,13670,13673],{},[23,13671,13672],{},"开发者关键要点："," 这不是一个会快速解决的小型公关事件。五大制片厂加上 MPA 的协调法律行动意味着 ByteDance 面临巨大压力，必须在 API 发布前做出实质性改变。请做好相应规划。",[48,13675,13677],{"id":13676},"好莱坞为何专门针对-seedance-20","好莱坞为何专门针对 Seedance 2.0",[11,13679,13680],{},"市场上已有其他 AI 视频生成工具——Kling、Sora、Veo、Runway Gen-3、Pika——为什么偏偏 Seedance 2.0 招致了如此猛烈的法律攻势？答案在于一个特定的组合：出众的能力、卓越的输出质量，以及缺失的安全防护，三者叠加使其对好莱坞的内容构成了独特威胁。",[92,13682,13683],{"id":13683},"训练数据之问",[11,13685,13686],{},"所有停止侵权通知函背后的核心指控是：Seedance 2.0 在未经授权的情况下使用了受版权保护的电影和电视内容进行训练。这并非 Seedance 独有的问题——几乎每个大型生成模型都面临类似质疑——但 MPA 的措辞表明他们认为 ByteDance 的训练数据集大量使用了好莱坞内容。",[11,13688,13689,13690,13694],{},"MPA 首席执行官 Rivkin \"大规模未经授权使用\"的措辞（",[37,13691,13693],{"href":13496,"rel":13692},[41],"CNBC, 2/16","）暗示制片厂掌握了关于训练数据构成的证据（或至少是有力的怀疑）。Disney \"打砸抢\"式的定性则表明他们认为这是蓄意为之而非无心之举。",[11,13696,13697],{},"Seedance 2.0 在训练数据问题上格外引人关注，与 ByteDance 作为中国科技公司的身份密不可分。ByteDance 运营着 TikTok，其上托管了数十亿条视频剪辑——其中许多包含用户上传的受版权保护的内容。制片厂可能怀疑（虽然尚未公开证实）Seedance 2.0 的训练数据包含了 TikTok 海量的用户上传电影片段、电视节目和音乐视频。",[92,13699,13700],{"id":13700},"输出保真度问题",[11,13702,13703],{},"Seedance 2.0 与早期 AI 视频工具的本质区别在于其输出质量，尤其是在好莱坞最为关注的方面。该模型恰恰在那些使版权侵权更加容易的能力上表现出色：",[11,13705,13706,13709],{},[23,13707,13708],{},"跨镜头角色一致性。"," Seedance 2.0 能在整个视频中保持角色外观的一致性——同样的面容、同样的服装、同样的比例。早期模型生成的角色往往在帧与帧之间发生外观漂移。这种一致性意味着，如果用户生成包含受版权保护角色的内容，该角色在整个视频中都像那个角色，而不仅仅是某一帧。",[11,13711,13712,13715],{},[23,13713,13714],{},"精确的面部表情与情感控制。"," 该模型能够生成细腻的情感表演——角色从惊讶过渡到喜悦，或从平静转为恐慌。这使得创造受版权保护角色的全新\"表演\"成为可能，而且看起来真实可信，符合其既定的角色性格。",[11,13717,13718,13721],{},[23,13719,13720],{},"电影级运镜。"," Seedance 2.0 能够复现特定的电影摄影技法：希区柯克式变焦、跟踪镜头、摇臂运动、一镜到底。这些都是好莱坞电影制作的视觉标志，而该模型能够高保真地复现。",[11,13723,13724,13727],{},[23,13725,13726],{},"原生音频生成。"," 与大多数竞品不同，Seedance 2.0 在生成视频的同时还能生成同步音频——对白、音效和音乐。这意味着生成的内容不仅仅是视觉上的复制；它是完整的视听作品，可以包含角色的声音。",[11,13729,13730,2423,13733,13736,13737,298],{},[23,13731,13732],{},"多模态引用。",[28,13734,13735],{},"@-reference"," 系统允许用户上传图片、视频和音频作为创作参考素材。用户可以上传一张受版权保护角色的剧照和一段展示特定运镜的片段，模型就能将两者结合生成新内容。关于该系统的更多信息，请参阅我们的 ",[37,13738,8927],{"href":2962},[92,13740,13741],{"id":13741},"缺失的安全护栏",[11,13743,13744],{},"在发布之初，Seedance 2.0 据报道仅有极少的内容过滤机制。用户可以在没有任何系统级干预的情况下生成包含可辨识的 Disney 角色、Marvel 英雄、Star Wars 场景和其他受保护知识产权的视频。这与竞品形成了鲜明对比：",[2036,13746,13747,13770],{},[2039,13748,13749],{},[2042,13750,13751,13754,13758,13761,13764,13767],{},[2045,13752,13753],{},"平台",[2045,13755,13757],{"align":13756},"center","版权过滤",[2045,13759,13760],{"align":13756},"角色屏蔽",[2045,13762,13763],{"align":13756},"名人检测",[2045,13765,13766],{"align":13756},"数字水印",[2045,13768,13769],{"align":13756},"内容政策",[2052,13771,13772,13789,13806,13821,13838,13853],{},[2042,13773,13774,13777,13780,13782,13784,13786],{},[2057,13775,13776],{},"Seedance 2.0（发布时）",[2057,13778,13779],{"align":13756},"❌",[2057,13781,13779],{"align":13756},[2057,13783,13779],{"align":13756},[2057,13785,13779],{"align":13756},[2057,13787,13788],{"align":13756},"极少",[2042,13790,13791,13794,13797,13799,13801,13803],{},[2057,13792,13793],{},"OpenAI Sora",[2057,13795,13796],{"align":13756},"✅",[2057,13798,13796],{"align":13756},[2057,13800,13796],{"align":13756},[2057,13802,13796],{"align":13756},[2057,13804,13805],{"align":13756},"严格",[2042,13807,13808,13811,13813,13815,13817,13819],{},[2057,13809,13810],{},"Google Veo 2",[2057,13812,13796],{"align":13756},[2057,13814,13796],{"align":13756},[2057,13816,13796],{"align":13756},[2057,13818,13796],{"align":13756},[2057,13820,13805],{"align":13756},[2042,13822,13823,13826,13829,13831,13833,13835],{},[2057,13824,13825],{},"Runway Gen-3",[2057,13827,13828],{"align":13756},"部分",[2057,13830,13828],{"align":13756},[2057,13832,13779],{"align":13756},[2057,13834,13796],{"align":13756},[2057,13836,13837],{"align":13756},"中等",[2042,13839,13840,13843,13845,13847,13849,13851],{},[2057,13841,13842],{},"Kling",[2057,13844,13828],{"align":13756},[2057,13846,13779],{"align":13756},[2057,13848,13828],{"align":13756},[2057,13850,13796],{"align":13756},[2057,13852,13837],{"align":13756},[2042,13854,13855,13858,13860,13862,13864,13866],{},[2057,13856,13857],{},"Pika",[2057,13859,13828],{"align":13756},[2057,13861,13779],{"align":13756},[2057,13863,13779],{"align":13756},[2057,13865,13796],{"align":13756},[2057,13867,13837],{"align":13756},[11,13869,13870],{},"OpenAI 和 Google 在发布视频模型之前就在内容安全系统上投入了大量资源。Sora 拥有多层过滤机制：屏蔽按名称引用受版权保护角色的提示词、检测与真实公众人物相似的生成面孔、添加可见和不可见水印，并针对边缘情况设有人工审核流程。",[11,13872,13873],{},"ByteDance 显然在 Seedance 2.0 的首发版本中优先考虑了能力而非安全——结果就是一个能用好莱坞自身的 IP 生成好莱坞级别内容的模型，且毫无阻拦。",[92,13875,13877],{"id":13876},"为何其他-ai-视频工具未遭受类似行动","为何其他 AI 视频工具未遭受类似行动",[11,13879,13880],{},"简单来说：输出质量较弱、安全过滤更强、且在美国有法律实体使其更容易进行谈判，三者兼具。",[11,13882,13883],{},"Sora 和 Veo 均由美国公司（OpenAI 和 Google）开发，这些公司拥有成熟的法务团队和与内容版权方的既有关系。他们已主动与版权持有人沟通、实施了健全的内容过滤，部分情况下还在推进授权许可协议。",[11,13885,13886],{},"Runway 和 Kling 虽然也遭受了一些批评，但其输出保真度尚未达到让好莱坞律师视为生存威胁的门槛。Seedance 2.0 跨过了这个门槛。",[11,13888,13889],{},"业界最高水准的输出保真度、缺失的安全护栏，加上母公司位于美国司法管辖范围之外——三者结合，形成了引发法律行动的完美风暴。",[48,13891,13893],{"id":13892},"api-延期我们已知的信息","API 延期：我们已知的信息",[11,13895,13896],{},"Seedance 2.0 API 原定于 2026 年 2 月 24 日向公众发布。该日期已被推迟，目前没有确认的新发布日期。",[92,13898,13900],{"id":13899},"bytedance-的承诺","ByteDance 的承诺",[11,13902,13903,13904,2911,13908,2955,13912,13916],{},"面对法律压力，ByteDance 承诺在 API 发布前实施多项安全防护措施。根据 ",[37,13905,13907],{"href":13496,"rel":13906},[41],"CNBC (2/16)",[37,13909,13911],{"href":13596,"rel":13910},[41],"Hacker News (2/21)",[37,13913,13915],{"href":13505,"rel":13914},[41],"Al Jazeera (2/16)"," 的报道：",[96,13918,13919,13925,13931,13936],{},[73,13920,13921,13924],{},[23,13922,13923],{},"人脸检测与屏蔽"," — 阻止生成可辨识的真实人物。包括演员、公众人物，以及训练数据中可能出现的任何真实个人。系统需要将生成的面孔与已知人物数据库进行比对。",[73,13926,13927,13930],{},[23,13928,13929],{},"受版权保护角色拦截"," — 屏蔽引用已知 IP 的提示词。这包括文本级过滤（捕获\"Spider-Man\"或\"Elsa\"等关键词）和视觉级检测（捕获上传的受版权保护角色的参考图片）。两者在规模化实现上都具有相当的技术复杂性。",[73,13932,13933,13935],{},[23,13934,13766],{}," — 为所有生成内容添加不可见水印以追踪来源。这使得版权持有人能够识别 AI 生成内容，并将其追溯到平台乃至生成内容的具体用户。",[73,13937,13938,13941],{},[23,13939,13940],{},"内容相似度检测"," — 更广泛的过滤机制，防止生成与特定受版权保护作品高度相似的内容。这可能涉及将生成的帧与受版权保护的内容数据库进行比对——计算成本高昂但法律上不可或缺。",[92,13943,13944],{"id":13944},"实施挑战",[11,13946,13947],{},"这些安全防护措施的构建绝非轻而易举。每一项都涉及大量工程工作：",[11,13949,13950,13953],{},[23,13951,13952],{},"文本级过滤","是最容易实现的——维护一个包含角色名称、系列名称和商标术语的屏蔽词表。但它也最容易被绕过（比如\"一只戴圆耳朵、穿红色短裤的老鼠\"）。",[11,13955,13956,13959],{},[23,13957,13958],{},"视觉级检测","更加困难。系统需要识别被间接描述的受版权保护角色，并检测生成输出是否与特定受版权保护内容相似。这需要在受版权保护的内容上单独训练检测模型——而这本身又引发新的授权许可问题。",[11,13961,13962,13965],{},[23,13963,13964],{},"人脸识别","用于名人/演员屏蔽，需要一个全面的人脸数据库和生成过程中的实时比对。系统需要处理多种角度、光照条件和艺术风格。",[11,13967,13968,13970],{},[23,13969,13766],{},"要在压缩、裁剪和格式转换后仍然存活，目前仍是一个活跃的研究领域。ByteDance 需要的水印既要对观看者不可察觉，又要足够强健以经受住社交媒体传播中的各种处理。",[11,13972,13973],{},"MPA 不会接受走过场式的应付。这些安全防护措施必须真正有效，而验证其有效性需要时间。",[92,13975,13976],{"id":13976},"这对开发者当下意味着什么",[11,13978,13979],{},"如果你一直在围绕 Seedance 2.0 API 进行开发，这次延期带来了几个亟待解决的现实问题：",[11,13981,13982,13985],{},[23,13983,13984],{},"1. 没有确认的发布日期。"," ByteDance 尚未公布新的时间表。安全防护措施需要满足五大制片厂加上 MPA 的法务团队——这不是一个快速的过程。根据安全防护要求的严格程度，合理的估计范围从数周到数月不等。",[11,13987,13988,13991],{},[23,13989,13990],{},"2. API 行为将发生变化。"," 内容过滤功能的加入意味着新的错误代码、修改后的提示词处理逻辑，以及此前在网页界面中可以正常使用的输入被拒绝。引用与受版权保护材料过于接近的特定视觉风格的提示词很可能会失败。你需要在代码中优雅地处理这些拒绝。",[11,13993,13994,13997],{},[23,13995,13996],{},"3. 定价不确定性。"," 内容过滤基础设施需要成本——既包括实时检测的计算资源，也包括构建和维护系统的工程投入。每次生成的成本可能因额外开销而上升。ByteDance 也可能根据内容过滤级别实施分层定价。",[11,13999,14000,14003],{},[23,14001,14002],{},"4. 服务条款将收紧。"," 预计会有更严格的使用政策，特别是在以下方面：",[96,14005,14006,14009,14012,14015,14018],{},[73,14007,14008],{},"生成内容的商业使用",[73,14010,14011],{},"侵权输出的责任归属",[73,14013,14014],{},"提示词文档记录要求",[73,14016,14017],{},"特定类别内容生成的限制",[73,14019,14020],{},"免责赔偿条款（或其缺失）",[11,14022,14023,14026],{},[23,14024,14025],{},"5. 速率限制与审核流程。"," 对于企业级 API 用户，ByteDance 可能会对高用量账户或特定类别的内容实施额外的审核流程。",[11,14028,14029,14032],{},[23,14030,14031],{},"6. 下游平台风险。"," 如果你在 Seedance 2.0 API 之上构建产品并向自己的用户提供视频生成服务，你将继承其中存在的所有责任缺口。你的用户可能通过你的平台生成侵权内容，而你可能面临来自版权持有人的索赔。",[11,14034,14035,14036,14040],{},"对于当下就需要视频生成能力、无法等待 Seedance 延期解决的开发者来说，实现多模型故障转移是最务实的解决方案。我们在下文的 ",[37,14037,14039],{"href":14038},"#how-to-access-seedance-20-api-through-evolink","EvoLink 集成部分","中详细介绍了这一方案。",[48,14042,14043],{"id":14043},"这对你的商业项目意味着什么",[11,14045,14046,14047],{},"每个基于 AI 视频生成进行开发的开发者都在问一个核心问题：",[23,14048,14049],{},"我能否安全地将 Seedance 2.0 API 生成的内容用于商业产品？",[11,14051,14052],{},"坦诚的回答是：完全取决于你生成什么以及如何生成。风险不是非黑即白的——它存在于一个谱系上，理解你的具体用例落在这个谱系的哪个位置至关重要。",[92,14054,14055],{"id":14055},"两个不同层面的版权风险",[11,14057,14058],{},"AI 生成内容中的版权风险存在于两个独立的法律维度。将它们混为一谈，要么导致过度谨慎（完全回避技术），要么导致危险的麻痹大意（认为一切正常）。两种态度都对你不利。",[11,14060,14061],{},[23,14062,14063],{},"第一层：训练数据责任（模型层面风险）",[11,14065,14066],{},"这是 MPA 的首要关切，也是停止侵权通知函的基础。如果 Seedance 2.0 在未经授权许可的情况下使用受版权保护的内容进行训练，ByteDance 将面临潜在的法定赔偿。但对于开发者来说，关键问题是：这一责任是否会延伸到下游 API 用户？",[11,14068,14069],{},"截至 2026 年 2 月，美国尚无法院裁定 AI 模型的下游用户需要为模型训练数据的构成承担责任。最接近的先例来自针对 Stability AI、Midjourney 等公司的持续诉讼——但这些都是针对模型创建者，而非最终用户。",[11,14071,14072],{},"然而，法律格局正在快速演变。如果法院最终确立了\"基于侵权训练数据生成的 AI 内容本身即为衍生作品\"的原则，那些将此类内容商业化的开发者可能面临追溯性索赔。这一概率见仁见智，但潜在影响不容忽视。",[11,14074,14075],{},[23,14076,14077],{},"第二层：输出内容责任（用户层面风险）",[11,14079,14080],{},"这是对开发者更为紧迫且可操作的风险。无论训练数据问题如何，如果你用 Seedance 生成的视频：",[96,14082,14083,14086,14089,14092,14095],{},[73,14084,14085],{},"包含可辨识的受版权保护角色（Mickey Mouse、Spider-Man、Darth Vader）",[73,14087,14088],{},"高度复制了特定受版权保护的场景或片段",[73,14090,14091],{},"包含未经同意的可辨识真实人物",[73,14093,14094],{},"复制了注册商标的标志、品牌元素或独特视觉标识",[73,14096,14097],{},"对某个特定艺术家或制片厂受保护的视觉风格的模仿程度足以造成混淆",[11,14099,14100],{},"...那么你将面临直接的版权、商标或公开权/肖像权责任。无论训练数据问题如何、无论你使用哪个 AI 模型，这一风险都存在。",[92,14102,14103],{"id":14103},"常见用例风险谱系",[2036,14105,14106,14119],{},[2039,14107,14108],{},[2042,14109,14110,14113,14116],{},[2045,14111,14112],{},"用例",[2045,14114,14115],{},"风险等级",[2045,14117,14118],{},"关键因素",[2052,14120,14121,14132,14142,14152,14163,14173,14184,14194],{},[2042,14122,14123,14126,14129],{},[2057,14124,14125],{},"使用你自己产品图片的原创产品展示视频",[2057,14127,14128],{},"🟢 低",[2057,14130,14131],{},"你自己的素材，通用描述，无 IP 引用",[2042,14133,14134,14137,14139],{},[2057,14135,14136],{},"使用原创角色和场景的营销视频",[2057,14138,14128],{},[2057,14140,14141],{},"原创的创意方向，不涉及现有 IP",[2042,14143,14144,14147,14149],{},[2057,14145,14146],{},"通用素材类视频（自然、城市风光、抽象）",[2057,14148,14128],{},[2057,14150,14151],{},"不涉及角色或 IP",[2042,14153,14154,14157,14160],{},[2057,14155,14156],{},"模仿特定电影视觉风格的视频",[2057,14158,14159],{},"🟡 中",[2057,14161,14162],{},"风格本身不受版权保护，但过于接近的复制存在风险",[2042,14164,14165,14168,14170],{},[2057,14166,14167],{},"包含类似于受版权保护角色的原创角色的内容",[2057,14169,14159],{},[2057,14171,14172],{},"\"受启发\"vs.\"实质性相似\"——灰色地带",[2042,14174,14175,14178,14181],{},[2057,14176,14177],{},"包含可辨识受版权保护角色的视频",[2057,14179,14180],{},"🔴 高",[2057,14182,14183],{},"无论使用何种工具均构成直接侵权",[2042,14185,14186,14189,14191],{},[2057,14187,14188],{},"包含真实名人肖像的内容",[2057,14190,14180],{},[2057,14192,14193],{},"违反公开权/肖像权",[2042,14195,14196,14199,14201],{},[2057,14197,14198],{},"复制特定受版权保护场景",[2057,14200,14180],{},[2057,14202,14203],{},"直接复制受保护的表达",[92,14205,14206],{"id":14206},"企业合规检查清单",[11,14208,14209],{},"在将任何 AI 视频生成工具用于商业内容之前，请逐项完成以下检查清单：",[96,14211,14214,14226,14235,14244,14253,14262,14271,14280,14289],{"className":14212},[14213],"contains-task-list",[73,14215,14218,2423,14222,14225],{"className":14216},[14217],"task-list-item",[14219,14220],"input",{"disabled":58,"type":14221},"checkbox",[23,14223,14224],{},"审查平台服务条款"," — 具体关注：谁拥有输出内容的所有权？授予了哪些商业使用权利？适用哪些使用限制？平台是否为你提供侵权索赔的免责赔偿？",[73,14227,14229,2423,14231,14234],{"className":14228},[14217],[14219,14230],{"disabled":58,"type":14221},[23,14232,14233],{},"建立内�� AI 使用政策"," — 记录哪些类型的内容可以用 AI 生成，哪些需要人工创作。对团队进行政策培训。",[73,14236,14238,2423,14240,14243],{"className":14237},[14217],[14219,14239],{"disabled":58,"type":14221},[23,14241,14242],{},"提交前审核每一条提示词"," — 是否引用了特定受版权保护的角色、真实人物或注册商标？为商业项目实施提示词审核机制。",[73,14245,14247,2423,14249,14252],{"className":14246},[14217],[14219,14248],{"disabled":58,"type":14221},[23,14250,14251],{},"发布前检查输出相似度"," — 生成的内容是否与特定受版权保护的作品高度相似？使用反向图片/视频搜索和人工审核。",[73,14254,14256,2423,14258,14261],{"className":14255},[14217],[14219,14257],{"disabled":58,"type":14221},[23,14259,14260],{},"记录完整流程"," — 保留提示词、参数、创意意图和审核步骤的记录。如果受到质疑，这些记录可以证明你的善意合规态度。",[73,14263,14265,2423,14267,14270],{"className":14264},[14217],[14219,14266],{"disabled":58,"type":14221},[23,14268,14269],{},"对高风险内容进行法律审查"," — 对于广告投放、品牌娱乐内容或大范围传播的内容，请知识产权律师同时审查平台条款和你的具体输出。",[73,14272,14274,2423,14276,14279],{"className":14273},[14217],[14219,14275],{"disabled":58,"type":14221},[23,14277,14278],{},"考虑购买 E&O 保险"," — 明确覆盖 AI 生成内容的错误与遗漏保险（E&O Insurance）正在变得越来越普及，对于商业视频制作来说也越来越有必要。",[73,14281,14283,2423,14285,14288],{"className":14282},[14217],[14219,14284],{"disabled":58,"type":14221},[23,14286,14287],{},"持续关注法律动态"," — 订阅 AI 版权法律更新。法律格局每月都在变化。今天可接受的做法，明天可能就面临诉讼。",[73,14290,14292,2423,14294,14297],{"className":14291},[14217],[14219,14293],{"disabled":58,"type":14221},[23,14295,14296],{},"制定内容召回预案"," — 如果某项法律裁决改变了你已发布内容的风险评估，你需要一个识别和处理受影响资产的流程。",[18,14299,14300],{},[11,14301,14302,14305],{},[23,14303,14304],{},"核心结论："," 使用描述性提示词生成的通用、原创内容——不包含角色名称、品牌引用、演员肖像、也不刻意复制特定作品——风险最低。有意或疏忽地复制现有 IP 的内容风险最高，使用 API 并不能让你免受这一风险。",[14307,14308,14310,14315,14318],"div",{"style":14309},"background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 12px; padding: 2em; margin: 2em 0; color: white;",[11,14311,14312],{},[23,14313,14314],{},"需要不因某个模型延期就停摆的视频生成服务？",[11,14316,14317],{},"EvoLink 为 Seedance 2.0、Kling、Veo、Sora 等模型提供统一 API。即使 Seedance 不可用，你的生产流水线也不会中断——它会自动切换模型。",[11,14319,14320],{},[37,14321,14323],{"href":14322},"/docs/video-generation","探索视频生成 API →",[48,14325,14327],{"id":14326},"安全提示词实践规避版权触发","安全提示词实践：规避版权触发",[11,14329,14330,14331],{},"无论你使用的是 Seedance 2.0、Sora、Veo 还是任何其他 AI 视频生成模型，安全的提示词实践都能保护你的项目免受版权风险。基本原则是：",[23,14332,14333],{},"描述你想要创造的，而非你想要复制的。",[11,14335,14336],{},"本节提供具体、可操作的指南和代码示例，可直接用于你的 Seedance 2.0 API 集成。",[92,14338,14339],{"id":14339},"应避免的提示词模式",[11,14341,14342],{},"以下模式很可能会触发版权过滤器（一旦实施），且无论是否有过滤器都会产生法律风险：",[2036,14344,14345,14358],{},[2039,14346,14347],{},[2042,14348,14349,14352,14355],{},[2045,14350,14351],{},"❌ 危险提示词模式",[2045,14353,14354],{},"风险原因",[2045,14356,14357],{},"法律后果",[2052,14359,14360,14371,14381,14391,14401,14411,14422,14433],{},[2042,14361,14362,14365,14368],{},[2057,14363,14364],{},"\"Generate a video of Spider-Man swinging through New York\"",[2057,14366,14367],{},"直接引用受版权保护的角色",[2057,14369,14370],{},"版权侵权",[2042,14372,14373,14376,14379],{},[2057,14374,14375],{},"\"Create a scene that looks like it's from Frozen\"",[2057,14377,14378],{},"蓄意复制受版权保护的作品",[2057,14380,14370],{},[2042,14382,14383,14386,14389],{},[2057,14384,14385],{},"\"Make a video featuring someone who looks like Scarlett Johansson\"",[2057,14387,14388],{},"侵犯人格权",[2057,14390,14193],{},[2042,14392,14393,14396,14399],{},[2057,14394,14395],{},"\"Replicate the opening sequence of Blade Runner 2049\"",[2057,14397,14398],{},"直接复制场景",[2057,14400,14370],{},[2042,14402,14403,14406,14409],{},[2057,14404,14405],{},"\"A character that looks like Elsa with ice powers\"",[2057,14407,14408],{},"间接引用受版权保护的角色",[2057,14410,14370],{},[2042,14412,14413,14416,14419],{},[2057,14414,14415],{},"\"Generate a video with the Nike swoosh logo\"",[2057,14417,14418],{},"使用商标",[2057,14420,14421],{},"商标侵权",[2042,14423,14424,14427,14430],{},[2057,14425,14426],{},"\"A wizard school that looks like Hogwarts\"",[2057,14428,14429],{},"复制受商标保护的场景设定",[2057,14431,14432],{},"商标淡化",[2042,14434,14435,14438,14441],{},[2057,14436,14437],{},"\"An anime girl in the exact style of Studio Ghibli\"",[2057,14439,14440],{},"复制制片厂风格",[2057,14442,14443],{},"灰色地带，存在潜在风险",[11,14445,14446],{},"间接引用尤其危险，因为它们可能通过文本级过滤器，但仍然产生侵权输出。\"一个有铂金色长发、冰雪魔力、穿蓝色裙子的公主\"没有提到\"Elsa\"，但输出几乎肯定看起来就是 Elsa。",[92,14448,14449],{"id":14449},"安全有效的提示词模式",[11,14451,14452],{},"以下模式能生成引人注目的原创内容，且不涉及版权纠葛：",[2036,14454,14455,14465],{},[2039,14456,14457],{},[2042,14458,14459,14462],{},[2045,14460,14461],{},"✅ 安全提示词模式",[2045,14463,14464],{},"安全原因",[2052,14466,14467,14475,14483,14491,14499,14507,14515],{},[2042,14468,14469,14472],{},[2057,14470,14471],{},"\"A superhero in an original red and gold suit flies over a futuristic city at sunset\"",[2057,14473,14474],{},"原创角色，原创场景",[2042,14476,14477,14480],{},[2057,14478,14479],{},"\"Cinematic drone shot over a coastal city at golden hour, warm color palette, anamorphic lens\"",[2057,14481,14482],{},"通用场景搭配电影摄影技法描述",[2042,14484,14485,14488],{},[2057,14486,14487],{},"\"A young woman in a flowing blue dress walks through a sunlit Mediterranean village\"",[2057,14489,14490],{},"原创角色，通用场景",[2042,14492,14493,14496],{},[2057,14494,14495],{},"\"Product showcase: silver smartwatch rotating on marble surface, studio lighting\"",[2057,14497,14498],{},"你自己的产品，通用布景",[2042,14500,14501,14504],{},[2057,14502,14503],{},"\"@Image1 as first frame, tracking shot following the subject through a forest\"",[2057,14505,14506],{},"你自己的参考素材",[2042,14508,14509,14512],{},[2057,14510,14511],{},"\"Anime-style warrior in ornate jade armor standing on a cliff overlooking a stormy sea\"",[2057,14513,14514],{},"通用风格类别中的原创角色",[2042,14516,14517,14520],{},[2057,14518,14519],{},"\"Pixar-quality 3D animation: a wise old cat in spectacles sits at a cafe table\"",[2057,14521,14522],{},"风格品质参考（非特定 Pixar 作品）",[92,14524,14525],{"id":14525},"风格与角色的区分",[11,14527,14528],{},"这是一个在法律上很重要的细微差别。你通常可以引用：",[96,14530,14531,14537,14543],{},[73,14532,14533,14536],{},[23,14534,14535],{},"广义的艺术风格"," — \"动漫风格\"\"Pixar 品质 3D\"\"油画质感\"\"黑色电影摄影\"",[73,14538,14539,14542],{},[23,14540,14541],{},"电影摄影技法"," — \"希区柯克式变焦\"\"Steadicam 跟踪镜头\"\"荷兰式倾斜\"",[73,14544,14545,14548],{},[23,14546,14547],{},"类型惯例"," — \"赛博朋克城市景观\"\"奇幻中世纪村庄\"\"太空歌剧\"",[11,14550,14551],{},"你不应引用：",[96,14553,14554,14560,14566],{},[73,14555,14556,14559],{},[23,14557,14558],{},"特定作品"," — \"像《蝙蝠侠：黑暗骑士》中的追逐场景那样\"",[73,14561,14562,14565],{},[23,14563,14564],{},"特定角色"," — 即使是间接描述",[73,14567,14568,14571],{},[23,14569,14570],{},"特定制片厂的专有风格"," — 如果描述足够具体到可以识别出来源",[11,14573,14574],{},"界限是模糊的，拿不准的时候，让描述更加通用化。",[92,14576,14578],{"id":14577},"代码示例安全与危险提示词实战对比","代码示例：安全与危险提示词实战对比",[11,14580,14581],{},"以下是本指南中所有代码示例的完整初始设置，通过 EvoLink 使用 Seedance 2.0 API：",[136,14583,14585],{"className":339,"code":14584,"language":341,"meta":141,"style":141},"import requests\nimport time\n\nAPI_KEY = \"your-evolink-api-key\"  # Get yours at evolink.ai/early-access\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\ndef generate_video(payload):\n    \"\"\"Submit a video generation task and poll until complete.\"\"\"\n    response = requests.post(\n        f\"{BASE_URL}/videos/generations\",\n        headers=HEADERS,\n        json=payload\n    )\n    response.raise_for_status()\n    task = response.json()\n    task_id = task[\"id\"]\n    print(f\"Task created: {task_id} (model: {task['model']})\")\n\n    # Poll for completion\n    while True:\n        status_resp = requests.get(\n            f\"{BASE_URL}/tasks/{task_id}\",\n            headers=HEADERS\n        )\n        status_resp.raise_for_status()\n        result = status_resp.json()\n\n        if result[\"status\"] == \"completed\":\n            video_url = result[\"task_info\"][\"video_url\"]\n            print(f\"✅ Video ready: {video_url}\")\n            return result\n        elif result[\"status\"] == \"failed\":\n            raise Exception(f\"Task failed: {result.get('error', 'Unknown')}\")\n\n        print(f\"⏳ Progress: {result.get('progress', 0)}%\")\n        time.sleep(10)\n",[28,14586,14587,14593,14599,14603,14615,14623,14631,14647,14655,14659,14663,14672,14677,14685,14697,14707,14715,14719,14723,14731,14743,14777,14781,14786,14795,14804,14824,14832,14836,14841,14850,14854,14871,14889,14910,14916,14932,14963,14967,14997],{"__ignoreMap":141},[145,14588,14589,14591],{"class":147,"line":148},[145,14590,348],{"class":259},[145,14592,329],{"class":263},[145,14594,14595,14597],{"class":147,"line":166},[145,14596,348],{"class":259},[145,14598,357],{"class":263},[145,14600,14601],{"class":147,"line":178},[145,14602,377],{"emptyLinePlaceholder":58},[145,14604,14605,14607,14609,14612],{"class":147,"line":187},[145,14606,389],{"class":155},[145,14608,392],{"class":259},[145,14610,14611],{"class":159}," \"your-evolink-api-key\"",[145,14613,14614],{"class":174},"  # Get yours at evolink.ai/early-access\n",[145,14616,14617,14619,14621],{"class":147,"line":374},[145,14618,413],{"class":155},[145,14620,392],{"class":259},[145,14622,418],{"class":159},[145,14624,14625,14627,14629],{"class":147,"line":380},[145,14626,424],{"class":155},[145,14628,392],{"class":259},[145,14630,429],{"class":263},[145,14632,14633,14635,14637,14639,14641,14643,14645],{"class":147,"line":386},[145,14634,435],{"class":159},[145,14636,438],{"class":263},[145,14638,441],{"class":259},[145,14640,444],{"class":159},[145,14642,447],{"class":155},[145,14644,450],{"class":159},[145,14646,453],{"class":263},[145,14648,14649,14651,14653],{"class":147,"line":410},[145,14650,459],{"class":159},[145,14652,438],{"class":263},[145,14654,464],{"class":159},[145,14656,14657],{"class":147,"line":421},[145,14658,470],{"class":263},[145,14660,14661],{"class":147,"line":432},[145,14662,377],{"emptyLinePlaceholder":58},[145,14664,14665,14667,14670],{"class":147,"line":456},[145,14666,526],{"class":259},[145,14668,14669],{"class":151}," generate_video",[145,14671,5828],{"class":263},[145,14673,14674],{"class":147,"line":467},[145,14675,14676],{"class":159},"    \"\"\"Submit a video generation task and poll until complete.\"\"\"\n",[145,14678,14679,14681,14683],{"class":147,"line":600},[145,14680,1428],{"class":263},[145,14682,267],{"class":259},[145,14684,1433],{"class":263},[145,14686,14687,14689,14691,14693,14695],{"class":147,"line":605},[145,14688,1438],{"class":259},[145,14690,450],{"class":159},[145,14692,679],{"class":155},[145,14694,1445],{"class":159},[145,14696,453],{"class":263},[145,14698,14699,14701,14703,14705],{"class":147,"line":611},[145,14700,1456],{"class":701},[145,14702,267],{"class":259},[145,14704,424],{"class":155},[145,14706,453],{"class":263},[145,14708,14709,14711,14713],{"class":147,"line":617},[145,14710,1471],{"class":701},[145,14712,267],{"class":259},[145,14714,2783],{"class":263},[145,14716,14717],{"class":147,"line":623},[145,14718,1484],{"class":263},[145,14720,14721],{"class":147,"line":628},[145,14722,2792],{"class":263},[145,14724,14725,14727,14729],{"class":147,"line":639},[145,14726,1497],{"class":263},[145,14728,267],{"class":259},[145,14730,736],{"class":263},[145,14732,14733,14735,14737,14739,14741],{"class":147,"line":654},[145,14734,7197],{"class":263},[145,14736,267],{"class":259},[145,14738,758],{"class":263},[145,14740,1627],{"class":159},[145,14742,764],{"class":263},[145,14744,14745,14747,14749,14751,14753,14755,14757,14759,14762,14764,14766,14769,14771,14773,14775],{"class":147,"line":660},[145,14746,1103],{"class":155},[145,14748,794],{"class":263},[145,14750,441],{"class":259},[145,14752,1525],{"class":159},[145,14754,685],{"class":155},[145,14756,688],{"class":263},[145,14758,691],{"class":155},[145,14760,14761],{"class":159}," (model: ",[145,14763,685],{"class":155},[145,14765,1530],{"class":263},[145,14767,14768],{"class":159},"'model'",[145,14770,1536],{"class":263},[145,14772,691],{"class":155},[145,14774,5494],{"class":159},[145,14776,407],{"class":263},[145,14778,14779],{"class":147,"line":671},[145,14780,377],{"emptyLinePlaceholder":58},[145,14782,14783],{"class":147,"line":698},[145,14784,14785],{"class":174},"    # Poll for completion\n",[145,14787,14788,14790,14793],{"class":147,"line":710},[145,14789,642],{"class":259},[145,14791,14792],{"class":155}," True",[145,14794,860],{"class":263},[145,14796,14797,14800,14802],{"class":147,"line":716},[145,14798,14799],{"class":263},"        status_resp ",[145,14801,267],{"class":259},[145,14803,668],{"class":263},[145,14805,14806,14808,14810,14812,14814,14816,14818,14820,14822],{"class":147,"line":722},[145,14807,674],{"class":259},[145,14809,450],{"class":159},[145,14811,679],{"class":155},[145,14813,682],{"class":159},[145,14815,685],{"class":155},[145,14817,688],{"class":263},[145,14819,691],{"class":155},[145,14821,450],{"class":159},[145,14823,453],{"class":263},[145,14825,14826,14828,14830],{"class":147,"line":728},[145,14827,702],{"class":701},[145,14829,267],{"class":259},[145,14831,707],{"class":155},[145,14833,14834],{"class":147,"line":739},[145,14835,713],{"class":263},[145,14837,14838],{"class":147,"line":744},[145,14839,14840],{"class":263},"        status_resp.raise_for_status()\n",[145,14842,14843,14845,14847],{"class":147,"line":750},[145,14844,11729],{"class":263},[145,14846,267],{"class":259},[145,14848,14849],{"class":263}," status_resp.json()\n",[145,14851,14852],{"class":147,"line":767},[145,14853,377],{"emptyLinePlaceholder":58},[145,14855,14856,14858,14860,14862,14865,14867,14869],{"class":147,"line":788},[145,14857,848],{"class":259},[145,14859,1649],{"class":263},[145,14861,761],{"class":159},[145,14863,14864],{"class":263},"] ",[145,14866,854],{"class":259},[145,14868,857],{"class":159},[145,14870,860],{"class":263},[145,14872,14873,14875,14877,14879,14882,14884,14887],{"class":147,"line":834},[145,14874,7383],{"class":263},[145,14876,267],{"class":259},[145,14878,1649],{"class":263},[145,14880,14881],{"class":159},"\"task_info\"",[145,14883,1563],{"class":263},[145,14885,14886],{"class":159},"\"video_url\"",[145,14888,764],{"class":263},[145,14890,14891,14893,14895,14897,14900,14902,14904,14906,14908],{"class":147,"line":839},[145,14892,5558],{"class":155},[145,14894,794],{"class":263},[145,14896,441],{"class":259},[145,14898,14899],{"class":159},"\"✅ Video ready: ",[145,14901,685],{"class":155},[145,14903,1679],{"class":263},[145,14905,691],{"class":155},[145,14907,450],{"class":159},[145,14909,407],{"class":263},[145,14911,14912,14914],{"class":147,"line":845},[145,14913,866],{"class":259},[145,14915,1707],{"class":263},[145,14917,14918,14920,14922,14924,14926,14928,14930],{"class":147,"line":863},[145,14919,875],{"class":259},[145,14921,1649],{"class":263},[145,14923,761],{"class":159},[145,14925,14864],{"class":263},[145,14927,854],{"class":259},[145,14929,882],{"class":159},[145,14931,860],{"class":263},[145,14933,14934,14936,14938,14940,14942,14945,14947,14949,14951,14953,14955,14957,14959,14961],{"class":147,"line":872},[145,14935,906],{"class":259},[145,14937,7041],{"class":155},[145,14939,794],{"class":263},[145,14941,441],{"class":259},[145,14943,14944],{"class":159},"\"Task failed: ",[145,14946,685],{"class":155},[145,14948,11828],{"class":263},[145,14950,11831],{"class":159},[145,14952,401],{"class":263},[145,14954,9922],{"class":159},[145,14956,946],{"class":263},[145,14958,691],{"class":155},[145,14960,450],{"class":159},[145,14962,407],{"class":263},[145,14964,14965],{"class":147,"line":887},[145,14966,377],{"emptyLinePlaceholder":58},[145,14968,14969,14971,14973,14975,14978,14980,14982,14985,14987,14989,14991,14993,14995],{"class":147,"line":903},[145,14970,791],{"class":155},[145,14972,794],{"class":263},[145,14974,441],{"class":259},[145,14976,14977],{"class":159},"\"⏳ Progress: ",[145,14979,685],{"class":155},[145,14981,11828],{"class":263},[145,14983,14984],{"class":159},"'progress'",[145,14986,401],{"class":263},[145,14988,783],{"class":155},[145,14990,946],{"class":263},[145,14992,691],{"class":155},[145,14994,829],{"class":159},[145,14996,407],{"class":263},[145,14998,14999,15002,15004],{"class":147,"line":915},[145,15000,15001],{"class":263},"        time.sleep(",[145,15003,537],{"class":155},[145,15005,407],{"class":263},[11,15007,15008],{},"现在对比一个危险提示词与其安全等效版本——两者实现类似的创意效果：",[136,15010,15012],{"className":339,"code":15011,"language":341,"meta":141,"style":141},"# ❌ DANGEROUS — references copyrighted character and specific film\ndangerous_payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"Spider-Man swings between skyscrapers in New York City, \"\n              \"wearing his classic red and blue suit. He shoots a web \"\n              \"line and does a backflip, landing on a rooftop. \"\n              \"Marvel cinematic style, dramatic lighting.\",\n    \"duration\": 10,\n    \"quality\": \"720p\",\n    \"aspect_ratio\": \"16:9\",\n    \"generate_audio\": True\n}\n# This will likely be rejected by copyright filters AND exposes you legally\n\n# ✅ SAFE — original character, similar visual impact\nsafe_payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"A masked vigilante in a sleek crimson and silver suit \"\n              \"swings between futuristic skyscrapers using retractable \"\n              \"grappling cables. Dynamic tracking shot follows the arc \"\n              \"of movement as the figure performs an acrobatic flip \"\n              \"mid-air and lands on a glass rooftop. Cinematic action \"\n              \"sequence, golden hour lighting, anamorphic lens flare. \"\n              \"The city below is a mix of neon signs and steam vents.\",\n    \"duration\": 10,\n    \"quality\": \"720p\",\n    \"aspect_ratio\": \"16:9\",\n    \"generate_audio\": True\n}\n\nresult = generate_video(safe_payload)\n",[28,15013,15014,15019,15028,15038,15047,15052,15057,15064,15074,15084,15094,15102,15106,15111,15115,15120,15129,15139,15148,15153,15158,15163,15168,15173,15180,15190,15200,15210,15218,15222,15226],{"__ignoreMap":141},[145,15015,15016],{"class":147,"line":148},[145,15017,15018],{"class":174},"# ❌ DANGEROUS — references copyrighted character and specific film\n",[145,15020,15021,15024,15026],{"class":147,"line":166},[145,15022,15023],{"class":263},"dangerous_payload ",[145,15025,267],{"class":259},[145,15027,429],{"class":263},[145,15029,15030,15032,15034,15036],{"class":147,"line":178},[145,15031,3663],{"class":159},[145,15033,438],{"class":263},[145,15035,1309],{"class":159},[145,15037,453],{"class":263},[145,15039,15040,15042,15044],{"class":147,"line":187},[145,15041,3674],{"class":159},[145,15043,438],{"class":263},[145,15045,15046],{"class":159},"\"Spider-Man swings between skyscrapers in New York City, \"\n",[145,15048,15049],{"class":147,"line":374},[145,15050,15051],{"class":159},"              \"wearing his classic red and blue suit. He shoots a web \"\n",[145,15053,15054],{"class":147,"line":380},[145,15055,15056],{"class":159},"              \"line and does a backflip, landing on a rooftop. \"\n",[145,15058,15059,15062],{"class":147,"line":386},[145,15060,15061],{"class":159},"              \"Marvel cinematic style, dramatic lighting.\"",[145,15063,453],{"class":263},[145,15065,15066,15068,15070,15072],{"class":147,"line":410},[145,15067,3686],{"class":159},[145,15069,438],{"class":263},[145,15071,537],{"class":155},[145,15073,453],{"class":263},[145,15075,15076,15078,15080,15082],{"class":147,"line":421},[145,15077,3698],{"class":159},[145,15079,438],{"class":263},[145,15081,1369],{"class":159},[145,15083,453],{"class":263},[145,15085,15086,15088,15090,15092],{"class":147,"line":432},[145,15087,3710],{"class":159},[145,15089,438],{"class":263},[145,15091,1385],{"class":159},[145,15093,453],{"class":263},[145,15095,15096,15098,15100],{"class":147,"line":456},[145,15097,3726],{"class":159},[145,15099,438],{"class":263},[145,15101,3731],{"class":155},[145,15103,15104],{"class":147,"line":467},[145,15105,470],{"class":263},[145,15107,15108],{"class":147,"line":600},[145,15109,15110],{"class":174},"# This will likely be rejected by copyright filters AND exposes you legally\n",[145,15112,15113],{"class":147,"line":605},[145,15114,377],{"emptyLinePlaceholder":58},[145,15116,15117],{"class":147,"line":611},[145,15118,15119],{"class":174},"# ✅ SAFE — original character, similar visual impact\n",[145,15121,15122,15125,15127],{"class":147,"line":617},[145,15123,15124],{"class":263},"safe_payload ",[145,15126,267],{"class":259},[145,15128,429],{"class":263},[145,15130,15131,15133,15135,15137],{"class":147,"line":623},[145,15132,3663],{"class":159},[145,15134,438],{"class":263},[145,15136,1309],{"class":159},[145,15138,453],{"class":263},[145,15140,15141,15143,15145],{"class":147,"line":628},[145,15142,3674],{"class":159},[145,15144,438],{"class":263},[145,15146,15147],{"class":159},"\"A masked vigilante in a sleek crimson and silver suit \"\n",[145,15149,15150],{"class":147,"line":639},[145,15151,15152],{"class":159},"              \"swings between futuristic skyscrapers using retractable \"\n",[145,15154,15155],{"class":147,"line":654},[145,15156,15157],{"class":159},"              \"grappling cables. Dynamic tracking shot follows the arc \"\n",[145,15159,15160],{"class":147,"line":660},[145,15161,15162],{"class":159},"              \"of movement as the figure performs an acrobatic flip \"\n",[145,15164,15165],{"class":147,"line":671},[145,15166,15167],{"class":159},"              \"mid-air and lands on a glass rooftop. Cinematic action \"\n",[145,15169,15170],{"class":147,"line":698},[145,15171,15172],{"class":159},"              \"sequence, golden hour lighting, anamorphic lens flare. \"\n",[145,15174,15175,15178],{"class":147,"line":710},[145,15176,15177],{"class":159},"              \"The city below is a mix of neon signs and steam vents.\"",[145,15179,453],{"class":263},[145,15181,15182,15184,15186,15188],{"class":147,"line":716},[145,15183,3686],{"class":159},[145,15185,438],{"class":263},[145,15187,537],{"class":155},[145,15189,453],{"class":263},[145,15191,15192,15194,15196,15198],{"class":147,"line":722},[145,15193,3698],{"class":159},[145,15195,438],{"class":263},[145,15197,1369],{"class":159},[145,15199,453],{"class":263},[145,15201,15202,15204,15206,15208],{"class":147,"line":728},[145,15203,3710],{"class":159},[145,15205,438],{"class":263},[145,15207,1385],{"class":159},[145,15209,453],{"class":263},[145,15211,15212,15214,15216],{"class":147,"line":739},[145,15213,3726],{"class":159},[145,15215,438],{"class":263},[145,15217,3731],{"class":155},[145,15219,15220],{"class":147,"line":744},[145,15221,470],{"class":263},[145,15223,15224],{"class":147,"line":750},[145,15225,377],{"emptyLinePlaceholder":58},[145,15227,15228,15230,15232],{"class":147,"line":767},[145,15229,12197],{"class":263},[145,15231,267],{"class":259},[145,15233,15234],{"class":263}," generate_video(safe_payload)\n",[11,15236,15237],{},"安全提示词同样能生成引人注目的视频——原创角色设计、动感十足的动作、电影级品质——且不引用任何受版权保护的作品。输出内容可用于商业用途，因为它是原创的创意表达。",[92,15239,15241],{"id":15240},"产品与品牌内容安全使用你自己的素材","产品与品牌内容：安全使用你自己的素材",[11,15243,15244,15245,2955,15247,15249],{},"对于商业产品视频，最安全也最有效的方法是通过 ",[28,15246,4136],{},[28,15248,2954],{}," 引用标签使用你自己的素材。这从设计上就保证了版权安全：",[136,15251,15253],{"className":339,"code":15252,"language":341,"meta":141,"style":141},"# ✅ Product showcase using your own brand assets\nproduct_payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"@Image1 as the hero product. Cinematic product reveal: \"\n              \"camera orbits slowly around the product on a clean white \"\n              \"marble surface. Soft studio lighting with a single dramatic \"\n              \"key light creating elegant shadows. Shallow depth of field. \"\n              \"Premium commercial photography aesthetic. Camera movement: \"\n              \"smooth 180-degree orbit, then slow push-in to detail shot.\",\n    \"image_urls\": [\"https://your-cdn.com/your-product-photo.jpg\"],\n    \"duration\": 8,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\",\n    \"generate_audio\": False\n}\n",[28,15254,15255,15260,15269,15279,15288,15293,15298,15303,15308,15315,15327,15337,15347,15357,15366],{"__ignoreMap":141},[145,15256,15257],{"class":147,"line":148},[145,15258,15259],{"class":174},"# ✅ Product showcase using your own brand assets\n",[145,15261,15262,15265,15267],{"class":147,"line":166},[145,15263,15264],{"class":263},"product_payload ",[145,15266,267],{"class":259},[145,15268,429],{"class":263},[145,15270,15271,15273,15275,15277],{"class":147,"line":178},[145,15272,3663],{"class":159},[145,15274,438],{"class":263},[145,15276,1309],{"class":159},[145,15278,453],{"class":263},[145,15280,15281,15283,15285],{"class":147,"line":187},[145,15282,3674],{"class":159},[145,15284,438],{"class":263},[145,15286,15287],{"class":159},"\"@Image1 as the hero product. Cinematic product reveal: \"\n",[145,15289,15290],{"class":147,"line":374},[145,15291,15292],{"class":159},"              \"camera orbits slowly around the product on a clean white \"\n",[145,15294,15295],{"class":147,"line":380},[145,15296,15297],{"class":159},"              \"marble surface. Soft studio lighting with a single dramatic \"\n",[145,15299,15300],{"class":147,"line":386},[145,15301,15302],{"class":159},"              \"key light creating elegant shadows. Shallow depth of field. \"\n",[145,15304,15305],{"class":147,"line":410},[145,15306,15307],{"class":159},"              \"Premium commercial photography aesthetic. Camera movement: \"\n",[145,15309,15310,15313],{"class":147,"line":421},[145,15311,15312],{"class":159},"              \"smooth 180-degree orbit, then slow push-in to detail shot.\"",[145,15314,453],{"class":263},[145,15316,15317,15320,15322,15325],{"class":147,"line":432},[145,15318,15319],{"class":159},"    \"image_urls\"",[145,15321,10809],{"class":263},[145,15323,15324],{"class":159},"\"https://your-cdn.com/your-product-photo.jpg\"",[145,15326,10815],{"class":263},[145,15328,15329,15331,15333,15335],{"class":147,"line":456},[145,15330,3686],{"class":159},[145,15332,438],{"class":263},[145,15334,3691],{"class":155},[145,15336,453],{"class":263},[145,15338,15339,15341,15343,15345],{"class":147,"line":467},[145,15340,3698],{"class":159},[145,15342,438],{"class":263},[145,15344,3703],{"class":159},[145,15346,453],{"class":263},[145,15348,15349,15351,15353,15355],{"class":147,"line":600},[145,15350,3710],{"class":159},[145,15352,438],{"class":263},[145,15354,1385],{"class":159},[145,15356,453],{"class":263},[145,15358,15359,15361,15363],{"class":147,"line":605},[145,15360,3726],{"class":159},[145,15362,438],{"class":263},[145,15364,15365],{"class":155},"False\n",[145,15367,15368],{"class":147,"line":611},[145,15369,470],{"class":263},[11,15371,15372],{},[2614,15373,15374],{},"使用与第一个示例相同的初始设置和轮询函数。",[11,15376,15377,15378,15380,15381,298],{},"如需了解更多提示词工程技巧——包括基于时间描述的分镜脚本格式和高级 ",[28,15379,13735],{}," 组合用法——请参阅我们的完整版 ",[37,15382,2209],{"href":1766},[92,15384,15385],{"id":15385},"在你的应用中构建提示词安全层",[11,15387,15388],{},"如果你正在构建一个允许用户生成视频内容的产品，请考虑在向 API 发送请求之前实现客户端提示词安全检查：",[136,15390,15392],{"className":339,"code":15391,"language":341,"meta":141,"style":141},"import re\n\n# Basic copyright safety check — extend as needed\nBLOCKED_TERMS = {\n    # Characters\n    \"spider-man\", \"spiderman\", \"batman\", \"superman\", \"iron man\",\n    \"mickey mouse\", \"elsa\", \"buzz lightyear\", \"pikachu\", \"mario\",\n    \"harry potter\", \"darth vader\", \"baby yoda\", \"grogu\",\n    # Franchises\n    \"marvel\", \"disney\", \"pixar movie\", \"star wars\", \"pokemon\",\n    \"lord of the rings\", \"game of thrones\", \"hogwarts\",\n    # Studios (when used to replicate their specific works)\n    \"studio ghibli film\", \"dreamworks movie\",\n    # Brands\n    \"nike swoosh\", \"coca-cola\", \"apple logo\",\n}\n\nBLOCKED_PATTERNS = [\n    r\"looks?\\s+like\\s+\\w+\\s+(from|in)\\s+\",  # \"looks like X from Y\"\n    r\"(scene|sequence)\\s+(from|in)\\s+[A-Z]\",  # \"scene from [Movie]\"\n    r\"in\\s+the\\s+style\\s+of\\s+[A-Z]\\w+\\s+[A-Z]\",  # \"in the style of [Studio Name]\"\n]\n\ndef check_prompt_safety(prompt: str) -> dict:\n    \"\"\"Check a prompt for potential copyright issues.\"\"\"\n    prompt_lower = prompt.lower()\n    issues = []\n\n    for term in BLOCKED_TERMS:\n        if term in prompt_lower:\n            issues.append(f\"Blocked term found: '{term}'\")\n\n    for pattern in BLOCKED_PATTERNS:\n        if re.search(pattern, prompt, re.IGNORECASE):\n            issues.append(f\"Risky pattern detected: {pattern}\")\n\n    return {\n        \"safe\": len(issues) == 0,\n        \"issues\": issues,\n        \"recommendation\": \"Revise prompt to use original descriptions\"\n                          if issues else \"Prompt appears safe\"\n    }\n\n# Usage\nresult = check_prompt_safety(\n    \"A Spider-Man style hero swinging through New York\"\n)\nprint(result)\n# {'safe': False, 'issues': ['Blocked term found: \\'spider-man\\''],\n#  'recommendation': 'Revise prompt to use original descriptions'}\n\nresult = check_prompt_safety(\n    \"A masked hero in crimson armor swings between futuristic towers\"\n)\nprint(result)\n# {'safe': True, 'issues': [], 'recommendation': 'Prompt appears safe'}\n",[28,15393,15394,15401,15405,15410,15419,15424,15451,15478,15500,15505,15532,15549,15554,15566,15571,15588,15592,15596,15605,15661,15703,15753,15757,15761,15780,15785,15795,15804,15808,15822,15833,15854,15858,15872,15884,15904,15908,15914,15934,15942,15952,15966,15970,15974,15979,15988,15993,15997,16004,16009,16014,16018,16026,16031,16035,16041],{"__ignoreMap":141},[145,15395,15396,15398],{"class":147,"line":148},[145,15397,348],{"class":259},[145,15399,15400],{"class":263}," re\n",[145,15402,15403],{"class":147,"line":166},[145,15404,377],{"emptyLinePlaceholder":58},[145,15406,15407],{"class":147,"line":178},[145,15408,15409],{"class":174},"# Basic copyright safety check — extend as needed\n",[145,15411,15412,15415,15417],{"class":147,"line":187},[145,15413,15414],{"class":155},"BLOCKED_TERMS",[145,15416,392],{"class":259},[145,15418,429],{"class":263},[145,15420,15421],{"class":147,"line":374},[145,15422,15423],{"class":174},"    # Characters\n",[145,15425,15426,15429,15431,15434,15436,15439,15441,15444,15446,15449],{"class":147,"line":380},[145,15427,15428],{"class":159},"    \"spider-man\"",[145,15430,401],{"class":263},[145,15432,15433],{"class":159},"\"spiderman\"",[145,15435,401],{"class":263},[145,15437,15438],{"class":159},"\"batman\"",[145,15440,401],{"class":263},[145,15442,15443],{"class":159},"\"superman\"",[145,15445,401],{"class":263},[145,15447,15448],{"class":159},"\"iron man\"",[145,15450,453],{"class":263},[145,15452,15453,15456,15458,15461,15463,15466,15468,15471,15473,15476],{"class":147,"line":386},[145,15454,15455],{"class":159},"    \"mickey mouse\"",[145,15457,401],{"class":263},[145,15459,15460],{"class":159},"\"elsa\"",[145,15462,401],{"class":263},[145,15464,15465],{"class":159},"\"buzz lightyear\"",[145,15467,401],{"class":263},[145,15469,15470],{"class":159},"\"pikachu\"",[145,15472,401],{"class":263},[145,15474,15475],{"class":159},"\"mario\"",[145,15477,453],{"class":263},[145,15479,15480,15483,15485,15488,15490,15493,15495,15498],{"class":147,"line":410},[145,15481,15482],{"class":159},"    \"harry potter\"",[145,15484,401],{"class":263},[145,15486,15487],{"class":159},"\"darth vader\"",[145,15489,401],{"class":263},[145,15491,15492],{"class":159},"\"baby yoda\"",[145,15494,401],{"class":263},[145,15496,15497],{"class":159},"\"grogu\"",[145,15499,453],{"class":263},[145,15501,15502],{"class":147,"line":421},[145,15503,15504],{"class":174},"    # Franchises\n",[145,15506,15507,15510,15512,15515,15517,15520,15522,15525,15527,15530],{"class":147,"line":432},[145,15508,15509],{"class":159},"    \"marvel\"",[145,15511,401],{"class":263},[145,15513,15514],{"class":159},"\"disney\"",[145,15516,401],{"class":263},[145,15518,15519],{"class":159},"\"pixar movie\"",[145,15521,401],{"class":263},[145,15523,15524],{"class":159},"\"star wars\"",[145,15526,401],{"class":263},[145,15528,15529],{"class":159},"\"pokemon\"",[145,15531,453],{"class":263},[145,15533,15534,15537,15539,15542,15544,15547],{"class":147,"line":456},[145,15535,15536],{"class":159},"    \"lord of the rings\"",[145,15538,401],{"class":263},[145,15540,15541],{"class":159},"\"game of thrones\"",[145,15543,401],{"class":263},[145,15545,15546],{"class":159},"\"hogwarts\"",[145,15548,453],{"class":263},[145,15550,15551],{"class":147,"line":467},[145,15552,15553],{"class":174},"    # Studios (when used to replicate their specific works)\n",[145,15555,15556,15559,15561,15564],{"class":147,"line":600},[145,15557,15558],{"class":159},"    \"studio ghibli film\"",[145,15560,401],{"class":263},[145,15562,15563],{"class":159},"\"dreamworks movie\"",[145,15565,453],{"class":263},[145,15567,15568],{"class":147,"line":605},[145,15569,15570],{"class":174},"    # Brands\n",[145,15572,15573,15576,15578,15581,15583,15586],{"class":147,"line":611},[145,15574,15575],{"class":159},"    \"nike swoosh\"",[145,15577,401],{"class":263},[145,15579,15580],{"class":159},"\"coca-cola\"",[145,15582,401],{"class":263},[145,15584,15585],{"class":159},"\"apple logo\"",[145,15587,453],{"class":263},[145,15589,15590],{"class":147,"line":617},[145,15591,470],{"class":263},[145,15593,15594],{"class":147,"line":623},[145,15595,377],{"emptyLinePlaceholder":58},[145,15597,15598,15601,15603],{"class":147,"line":628},[145,15599,15600],{"class":155},"BLOCKED_PATTERNS",[145,15602,392],{"class":259},[145,15604,8843],{"class":263},[145,15606,15607,15610,15612,15616,15619,15622,15624,15627,15629,15631,15634,15636,15638,15640,15642,15644,15647,15649,15652,15654,15656,15658],{"class":147,"line":639},[145,15608,15609],{"class":259},"    r",[145,15611,450],{"class":159},[145,15613,15615],{"class":15614},"sns5M","looks",[145,15617,15618],{"class":259},"?",[145,15620,15621],{"class":155},"\\s",[145,15623,5409],{"class":259},[145,15625,15626],{"class":15614},"like",[145,15628,15621],{"class":155},[145,15630,5409],{"class":259},[145,15632,15633],{"class":155},"\\w",[145,15635,5409],{"class":259},[145,15637,15621],{"class":155},[145,15639,5409],{"class":259},[145,15641,794],{"class":155},[145,15643,6707],{"class":15614},[145,15645,15646],{"class":259},"|",[145,15648,1181],{"class":15614},[145,15650,15651],{"class":155},")\\s",[145,15653,5409],{"class":259},[145,15655,450],{"class":159},[145,15657,1448],{"class":263},[145,15659,15660],{"class":174},"# \"looks like X from Y\"\n",[145,15662,15663,15665,15667,15669,15672,15674,15677,15679,15681,15683,15685,15687,15689,15691,15693,15696,15698,15700],{"class":147,"line":654},[145,15664,15609],{"class":259},[145,15666,450],{"class":159},[145,15668,794],{"class":155},[145,15670,15671],{"class":15614},"scene",[145,15673,15646],{"class":259},[145,15675,15676],{"class":15614},"sequence",[145,15678,15651],{"class":155},[145,15680,5409],{"class":259},[145,15682,794],{"class":155},[145,15684,6707],{"class":15614},[145,15686,15646],{"class":259},[145,15688,1181],{"class":15614},[145,15690,15651],{"class":155},[145,15692,5409],{"class":259},[145,15694,15695],{"class":155},"[A-Z]",[145,15697,450],{"class":159},[145,15699,1448],{"class":263},[145,15701,15702],{"class":174},"# \"scene from [Movie]\"\n",[145,15704,15705,15707,15709,15711,15713,15715,15718,15720,15722,15724,15726,15728,15731,15733,15735,15738,15740,15742,15744,15746,15748,15750],{"class":147,"line":660},[145,15706,15609],{"class":259},[145,15708,450],{"class":159},[145,15710,1181],{"class":15614},[145,15712,15621],{"class":155},[145,15714,5409],{"class":259},[145,15716,15717],{"class":15614},"the",[145,15719,15621],{"class":155},[145,15721,5409],{"class":259},[145,15723,11186],{"class":15614},[145,15725,15621],{"class":155},[145,15727,5409],{"class":259},[145,15729,15730],{"class":15614},"of",[145,15732,15621],{"class":155},[145,15734,5409],{"class":259},[145,15736,15737],{"class":155},"[A-Z]\\w",[145,15739,5409],{"class":259},[145,15741,15621],{"class":155},[145,15743,5409],{"class":259},[145,15745,15695],{"class":155},[145,15747,450],{"class":159},[145,15749,1448],{"class":263},[145,15751,15752],{"class":174},"# \"in the style of [Studio Name]\"\n",[145,15754,15755],{"class":147,"line":671},[145,15756,764],{"class":263},[145,15758,15759],{"class":147,"line":698},[145,15760,377],{"emptyLinePlaceholder":58},[145,15762,15763,15765,15768,15771,15773,15776,15778],{"class":147,"line":710},[145,15764,526],{"class":259},[145,15766,15767],{"class":151}," check_prompt_safety",[145,15769,15770],{"class":263},"(prompt: ",[145,15772,8649],{"class":155},[145,15774,15775],{"class":263},") -> ",[145,15777,8774],{"class":155},[145,15779,860],{"class":263},[145,15781,15782],{"class":147,"line":716},[145,15783,15784],{"class":159},"    \"\"\"Check a prompt for potential copyright issues.\"\"\"\n",[145,15786,15787,15790,15792],{"class":147,"line":722},[145,15788,15789],{"class":263},"    prompt_lower ",[145,15791,267],{"class":259},[145,15793,15794],{"class":263}," prompt.lower()\n",[145,15796,15797,15800,15802],{"class":147,"line":728},[145,15798,15799],{"class":263},"    issues ",[145,15801,267],{"class":259},[145,15803,5856],{"class":263},[145,15805,15806],{"class":147,"line":739},[145,15807,377],{"emptyLinePlaceholder":58},[145,15809,15810,15812,15815,15817,15820],{"class":147,"line":744},[145,15811,5101],{"class":259},[145,15813,15814],{"class":263}," term ",[145,15816,1181],{"class":259},[145,15818,15819],{"class":155}," BLOCKED_TERMS",[145,15821,860],{"class":263},[145,15823,15824,15826,15828,15830],{"class":147,"line":750},[145,15825,848],{"class":259},[145,15827,15814],{"class":263},[145,15829,1181],{"class":259},[145,15831,15832],{"class":263}," prompt_lower:\n",[145,15834,15835,15838,15840,15843,15845,15848,15850,15852],{"class":147,"line":767},[145,15836,15837],{"class":263},"            issues.append(",[145,15839,441],{"class":259},[145,15841,15842],{"class":159},"\"Blocked term found: '",[145,15844,685],{"class":155},[145,15846,15847],{"class":263},"term",[145,15849,691],{"class":155},[145,15851,6089],{"class":159},[145,15853,407],{"class":263},[145,15855,15856],{"class":147,"line":788},[145,15857,377],{"emptyLinePlaceholder":58},[145,15859,15860,15862,15865,15867,15870],{"class":147,"line":834},[145,15861,5101],{"class":259},[145,15863,15864],{"class":263}," pattern ",[145,15866,1181],{"class":259},[145,15868,15869],{"class":155}," BLOCKED_PATTERNS",[145,15871,860],{"class":263},[145,15873,15874,15876,15879,15882],{"class":147,"line":839},[145,15875,848],{"class":259},[145,15877,15878],{"class":263}," re.search(pattern, prompt, re.",[145,15880,15881],{"class":155},"IGNORECASE",[145,15883,548],{"class":263},[145,15885,15886,15888,15890,15893,15895,15898,15900,15902],{"class":147,"line":845},[145,15887,15837],{"class":263},[145,15889,441],{"class":259},[145,15891,15892],{"class":159},"\"Risky pattern detected: ",[145,15894,685],{"class":155},[145,15896,15897],{"class":263},"pattern",[145,15899,691],{"class":155},[145,15901,450],{"class":159},[145,15903,407],{"class":263},[145,15905,15906],{"class":147,"line":863},[145,15907,377],{"emptyLinePlaceholder":58},[145,15909,15910,15912],{"class":147,"line":872},[145,15911,1704],{"class":259},[145,15913,429],{"class":263},[145,15915,15916,15919,15921,15924,15927,15929,15932],{"class":147,"line":887},[145,15917,15918],{"class":159},"        \"safe\"",[145,15920,438],{"class":263},[145,15922,15923],{"class":155},"len",[145,15925,15926],{"class":263},"(issues) ",[145,15928,854],{"class":259},[145,15930,15931],{"class":155}," 0",[145,15933,453],{"class":263},[145,15935,15936,15939],{"class":147,"line":903},[145,15937,15938],{"class":159},"        \"issues\"",[145,15940,15941],{"class":263},": issues,\n",[145,15943,15944,15947,15949],{"class":147,"line":915},[145,15945,15946],{"class":159},"        \"recommendation\"",[145,15948,438],{"class":263},[145,15950,15951],{"class":159},"\"Revise prompt to use original descriptions\"\n",[145,15953,15954,15957,15960,15963],{"class":147,"line":954},[145,15955,15956],{"class":259},"                          if",[145,15958,15959],{"class":263}," issues ",[145,15961,15962],{"class":259},"else",[145,15964,15965],{"class":159}," \"Prompt appears safe\"\n",[145,15967,15968],{"class":147,"line":960},[145,15969,1408],{"class":263},[145,15971,15972],{"class":147,"line":965},[145,15973,377],{"emptyLinePlaceholder":58},[145,15975,15976],{"class":147,"line":971},[145,15977,15978],{"class":174},"# Usage\n",[145,15980,15981,15983,15985],{"class":147,"line":977},[145,15982,12197],{"class":263},[145,15984,267],{"class":259},[145,15986,15987],{"class":263}," check_prompt_safety(\n",[145,15989,15990],{"class":147,"line":989},[145,15991,15992],{"class":159},"    \"A Spider-Man style hero swinging through New York\"\n",[145,15994,15995],{"class":147,"line":994},[145,15996,407],{"class":263},[145,15998,15999,16001],{"class":147,"line":5521},[145,16000,6563],{"class":155},[145,16002,16003],{"class":263},"(result)\n",[145,16005,16006],{"class":147,"line":5527},[145,16007,16008],{"class":174},"# {'safe': False, 'issues': ['Blocked term found: \\'spider-man\\''],\n",[145,16010,16011],{"class":147,"line":5555},[145,16012,16013],{"class":174},"#  'recommendation': 'Revise prompt to use original descriptions'}\n",[145,16015,16016],{"class":147,"line":5586},[145,16017,377],{"emptyLinePlaceholder":58},[145,16019,16020,16022,16024],{"class":147,"line":5606},[145,16021,12197],{"class":263},[145,16023,267],{"class":259},[145,16025,15987],{"class":263},[145,16027,16028],{"class":147,"line":5612},[145,16029,16030],{"class":159},"    \"A masked hero in crimson armor swings between futuristic towers\"\n",[145,16032,16033],{"class":147,"line":5618},[145,16034,407],{"class":263},[145,16036,16037,16039],{"class":147,"line":5623},[145,16038,6563],{"class":155},[145,16040,16003],{"class":263},[145,16042,16043],{"class":147,"line":5636},[145,16044,16045],{"class":174},"# {'safe': True, 'issues': [], 'recommendation': 'Prompt appears safe'}\n",[11,16047,16048],{},[2614,16049,16050],{},"这只是一个基本的起点。生产环境应使用更成熟的基于 NLP 的检测方案、定期更新的屏蔽词表，以及针对边缘情况的人工审核。",[48,16052,16054],{"id":16053},"如何通过-evolink-访问-seedance-20-api","如何通过 EvoLink 访问 Seedance 2.0 API",[18,16056,16057],{},[11,16058,16059,16060,16063,16064,16067,16068,16071],{},"⚠️ ",[23,16061,16062],{},"重要声明："," EvoLink 是一个面向多个视频生成模型的统一 API 网关。EvoLink ",[23,16065,16066],{},"不","充当合规中介，也",[23,16069,16070],{},"不保证","任何模型输出的版权状态。版权合规是开发者自身的责任。EvoLink 提供的是访问和基础设施——而非法律保护。",[11,16073,16074],{},"明确了这一点后，以下是 EvoLink 为使用 Seedance 2.0 的开发者提供的服务。",[92,16076,16078],{"id":16077},"api-集成现已就绪bytedance-开放后即刻上线","API 集成：现已就绪，ByteDance 开放后即刻上线",[11,16080,16081],{},"EvoLink 已完成 Seedance 2.0 API 适配器的开发。端点、参数和响应格式已经确定并有完整文档。当 ByteDance 在实施版权安全防护措施后正式启用 API 时，你的 EvoLink 集成将立即上线——无需任何代码改动。",[11,16083,16084,16085,16090],{},"该集成遵循 ",[37,16086,16089],{"href":16087,"rel":16088},"https://docs.evolink.ai/en/api-manual/video-series/seedance2.0/seedance-2.0-video-generate",[41],"EvoLink Seedance 2.0 视频生成 API"," 规范：",[136,16092,16094],{"className":339,"code":16093,"language":341,"meta":141,"style":141},"# Text-to-video: Seedance 2.0 via EvoLink\ntext_to_video = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"A wise old cat in round spectacles sits at a cozy cafe \"\n              \"table, paws wrapped around a tiny porcelain cup. Steam \"\n              \"curls upward. The cat speaks in a calm, measured tone. \"\n              \"Warm afternoon light through the cafe window, Pixar-quality \"\n              \"3D animation, warm color palette, expressive character acting.\",\n    \"duration\": 10,\n    \"quality\": \"720p\",\n    \"aspect_ratio\": \"16:9\",\n    \"generate_audio\": True\n}\n\nresult = generate_video(text_to_video)\n",[28,16095,16096,16101,16110,16120,16129,16134,16139,16144,16151,16161,16171,16181,16189,16193,16197],{"__ignoreMap":141},[145,16097,16098],{"class":147,"line":148},[145,16099,16100],{"class":174},"# Text-to-video: Seedance 2.0 via EvoLink\n",[145,16102,16103,16106,16108],{"class":147,"line":166},[145,16104,16105],{"class":263},"text_to_video ",[145,16107,267],{"class":259},[145,16109,429],{"class":263},[145,16111,16112,16114,16116,16118],{"class":147,"line":178},[145,16113,3663],{"class":159},[145,16115,438],{"class":263},[145,16117,1309],{"class":159},[145,16119,453],{"class":263},[145,16121,16122,16124,16126],{"class":147,"line":187},[145,16123,3674],{"class":159},[145,16125,438],{"class":263},[145,16127,16128],{"class":159},"\"A wise old cat in round spectacles sits at a cozy cafe \"\n",[145,16130,16131],{"class":147,"line":374},[145,16132,16133],{"class":159},"              \"table, paws wrapped around a tiny porcelain cup. Steam \"\n",[145,16135,16136],{"class":147,"line":380},[145,16137,16138],{"class":159},"              \"curls upward. The cat speaks in a calm, measured tone. \"\n",[145,16140,16141],{"class":147,"line":386},[145,16142,16143],{"class":159},"              \"Warm afternoon light through the cafe window, Pixar-quality \"\n",[145,16145,16146,16149],{"class":147,"line":410},[145,16147,16148],{"class":159},"              \"3D animation, warm color palette, expressive character acting.\"",[145,16150,453],{"class":263},[145,16152,16153,16155,16157,16159],{"class":147,"line":421},[145,16154,3686],{"class":159},[145,16156,438],{"class":263},[145,16158,537],{"class":155},[145,16160,453],{"class":263},[145,16162,16163,16165,16167,16169],{"class":147,"line":432},[145,16164,3698],{"class":159},[145,16166,438],{"class":263},[145,16168,1369],{"class":159},[145,16170,453],{"class":263},[145,16172,16173,16175,16177,16179],{"class":147,"line":456},[145,16174,3710],{"class":159},[145,16176,438],{"class":263},[145,16178,1385],{"class":159},[145,16180,453],{"class":263},[145,16182,16183,16185,16187],{"class":147,"line":467},[145,16184,3726],{"class":159},[145,16186,438],{"class":263},[145,16188,3731],{"class":155},[145,16190,16191],{"class":147,"line":600},[145,16192,470],{"class":263},[145,16194,16195],{"class":147,"line":605},[145,16196,377],{"emptyLinePlaceholder":58},[145,16198,16199,16201,16203],{"class":147,"line":611},[145,16200,12197],{"class":263},[145,16202,267],{"class":259},[145,16204,16205],{"class":263}," generate_video(text_to_video)\n",[11,16207,16208],{},[2614,16209,16210],{},"使用与第一个代码示例相同的初始设置和轮询函数。",[92,16212,16214],{"id":16213},"完整多模态生成图片-视频-音频","完整多模态生成：图片 + 视频 + 音频",[11,16216,16217,16218,16220],{},"Seedance 2.0 的突出特性是其多模态 ",[28,16219,13735],{}," 系统——能够在单个生成请求中将图片、视频和音频输入作为创作参考进行组合。通过 EvoLink，所有输入模态均获得完整支持：",[136,16222,16224],{"className":339,"code":16223,"language":341,"meta":141,"style":141},"# Multimodal generation — character ref + camera ref + audio sync\nmultimodal_payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"@Image1 as character reference — dancer in athletic wear. \"\n              \"Reference @Video1 camera movement style: rhythmic push-pull \"\n              \"pan and tilt movements. @Audio1 for BGM rhythm — align cuts \"\n              \"and motion energy to the beat. The dancer performs energetically \"\n              \"on a colorful LED-lit stage. Spotlights shift colors in sync \"\n              \"with the rhythm. Smoke effects catch the colored lighting.\",\n    \"image_urls\": [\n        \"https://your-cdn.com/character-design.png\"\n    ],\n    \"video_urls\": [\n        \"https://your-cdn.com/camera-reference.mp4\"\n    ],\n    \"audio_urls\": [\n        \"https://your-cdn.com/background-track.mp3\"\n    ],\n    \"duration\": 12,\n    \"quality\": \"720p\",\n    \"aspect_ratio\": \"16:9\",\n    \"generate_audio\": True\n}\n\nresult = generate_video(multimodal_payload)\n",[28,16225,16226,16231,16240,16250,16259,16264,16269,16274,16279,16286,16292,16297,16302,16309,16314,16318,16325,16330,16334,16345,16355,16365,16373,16377,16381],{"__ignoreMap":141},[145,16227,16228],{"class":147,"line":148},[145,16229,16230],{"class":174},"# Multimodal generation — character ref + camera ref + audio sync\n",[145,16232,16233,16236,16238],{"class":147,"line":166},[145,16234,16235],{"class":263},"multimodal_payload ",[145,16237,267],{"class":259},[145,16239,429],{"class":263},[145,16241,16242,16244,16246,16248],{"class":147,"line":178},[145,16243,3663],{"class":159},[145,16245,438],{"class":263},[145,16247,1309],{"class":159},[145,16249,453],{"class":263},[145,16251,16252,16254,16256],{"class":147,"line":187},[145,16253,3674],{"class":159},[145,16255,438],{"class":263},[145,16257,16258],{"class":159},"\"@Image1 as character reference — dancer in athletic wear. \"\n",[145,16260,16261],{"class":147,"line":374},[145,16262,16263],{"class":159},"              \"Reference @Video1 camera movement style: rhythmic push-pull \"\n",[145,16265,16266],{"class":147,"line":380},[145,16267,16268],{"class":159},"              \"pan and tilt movements. @Audio1 for BGM rhythm — align cuts \"\n",[145,16270,16271],{"class":147,"line":386},[145,16272,16273],{"class":159},"              \"and motion energy to the beat. The dancer performs energetically \"\n",[145,16275,16276],{"class":147,"line":410},[145,16277,16278],{"class":159},"              \"on a colorful LED-lit stage. Spotlights shift colors in sync \"\n",[145,16280,16281,16284],{"class":147,"line":421},[145,16282,16283],{"class":159},"              \"with the rhythm. Smoke effects catch the colored lighting.\"",[145,16285,453],{"class":263},[145,16287,16288,16290],{"class":147,"line":432},[145,16289,15319],{"class":159},[145,16291,2686],{"class":263},[145,16293,16294],{"class":147,"line":456},[145,16295,16296],{"class":159},"        \"https://your-cdn.com/character-design.png\"\n",[145,16298,16299],{"class":147,"line":467},[145,16300,16301],{"class":263},"    ],\n",[145,16303,16304,16307],{"class":147,"line":600},[145,16305,16306],{"class":159},"    \"video_urls\"",[145,16308,2686],{"class":263},[145,16310,16311],{"class":147,"line":605},[145,16312,16313],{"class":159},"        \"https://your-cdn.com/camera-reference.mp4\"\n",[145,16315,16316],{"class":147,"line":611},[145,16317,16301],{"class":263},[145,16319,16320,16323],{"class":147,"line":617},[145,16321,16322],{"class":159},"    \"audio_urls\"",[145,16324,2686],{"class":263},[145,16326,16327],{"class":147,"line":623},[145,16328,16329],{"class":159},"        \"https://your-cdn.com/background-track.mp3\"\n",[145,16331,16332],{"class":147,"line":628},[145,16333,16301],{"class":263},[145,16335,16336,16338,16340,16343],{"class":147,"line":639},[145,16337,3686],{"class":159},[145,16339,438],{"class":263},[145,16341,16342],{"class":155},"12",[145,16344,453],{"class":263},[145,16346,16347,16349,16351,16353],{"class":147,"line":654},[145,16348,3698],{"class":159},[145,16350,438],{"class":263},[145,16352,1369],{"class":159},[145,16354,453],{"class":263},[145,16356,16357,16359,16361,16363],{"class":147,"line":660},[145,16358,3710],{"class":159},[145,16360,438],{"class":263},[145,16362,1385],{"class":159},[145,16364,453],{"class":263},[145,16366,16367,16369,16371],{"class":147,"line":671},[145,16368,3726],{"class":159},[145,16370,438],{"class":263},[145,16372,3731],{"class":155},[145,16374,16375],{"class":147,"line":698},[145,16376,470],{"class":263},[145,16378,16379],{"class":147,"line":710},[145,16380,377],{"emptyLinePlaceholder":58},[145,16382,16383,16385,16387],{"class":147,"line":716},[145,16384,12197],{"class":263},[145,16386,267],{"class":259},[145,16388,16389],{"class":263}," generate_video(multimodal_payload)\n",[11,16391,16392],{},[2614,16393,16210],{},[14307,16395,16396,16401,16404],{"style":14309},[11,16397,16398],{},[23,16399,16400],{},"开始使用 EvoLink 视频生成 API",[11,16402,16403],{},"提供免费套餐。一个 API Key，多个模型。Seedance 2.0 集成已就绪——ByteDance 开放接入的那一刻即刻上线。",[11,16405,16406],{},[37,16407,16409],{"href":16408},"/early-access","获取你的免费 API Key →",[92,16411,16413],{"id":16412},"完整-api-参数参考","完整 API 参数参考",[11,16415,16416],{},"以下是通过 EvoLink 访问 Seedance 2.0 时支持的完整参数集：",[2036,16418,16419,16432],{},[2039,16420,16421],{},[2042,16422,16423,16425,16427,16430],{},[2045,16424,3394],{},[2045,16426,3397],{},[2045,16428,16429],{"align":13756},"必填",[2045,16431,3406],{},[2052,16433,16434,16448,16469,16484,16499,16514,16527,16546,16573,16586],{},[2042,16435,16436,16440,16442,16444],{},[2057,16437,16438],{},[28,16439,1748],{},[2057,16441,3417],{},[2057,16443,13796],{"align":13756},[2057,16445,16446],{},[28,16447,1309],{},[2042,16449,16450,16454,16456,16458],{},[2057,16451,16452],{},[28,16453,1762],{},[2057,16455,3417],{},[2057,16457,13796],{"align":13756},[2057,16459,16460,16461,2911,16463,2911,16465,16468],{},"最多 2000 个 token。支持 ",[28,16462,2903],{},[28,16464,11391],{},[28,16466,16467],{},"@Audio1"," 引用",[2042,16470,16471,16475,16479,16481],{},[2057,16472,16473],{},[28,16474,2891],{},[2057,16476,3417,16477],{},[145,16478],{},[2057,16480,3420],{"align":13756},[2057,16482,16483],{},"最多 9 张图片，每张最大 30MB。支持格式：jpeg, png, webp, bmp, tiff, gif",[2042,16485,16486,16490,16494,16496],{},[2057,16487,16488],{},[28,16489,3561],{},[2057,16491,3417,16492],{},[145,16493],{},[2057,16495,3420],{"align":13756},[2057,16497,16498],{},"最多 3 个视频，总时长 2-15 秒，每个最大 50MB。支持格式：mp4, mov",[2042,16500,16501,16505,16509,16511],{},[2057,16502,16503],{},[28,16504,3578],{},[2057,16506,3417,16507],{},[145,16508],{},[2057,16510,3420],{"align":13756},[2057,16512,16513],{},"最多 3 条音频，总时长 ≤15 秒，每条最大 15MB。支持格式：mp3, wav",[2042,16515,16516,16520,16522,16524],{},[2057,16517,16518],{},[28,16519,1774],{},[2057,16521,3452],{},[2057,16523,3420],{"align":13756},[2057,16525,16526],{},"4-15 秒（默认：5）",[2042,16528,16529,16533,16535,16537],{},[2057,16530,16531],{},[28,16532,1782],{},[2057,16534,3417],{},[2057,16536,3420],{"align":13756},[2057,16538,16539,2911,16541,16543,16544],{},[28,16540,4006],{},[28,16542,1369],{},"（默认）、",[28,16545,3703],{},[2042,16547,16548,16552,16554,16556],{},[2057,16549,16550],{},[28,16551,1802],{},[2057,16553,3417],{},[2057,16555,3420],{"align":13756},[2057,16557,16558,16543,16560,2911,16562,2911,16564,2911,16566,2911,16568,2911,16570],{},[28,16559,1385],{},[28,16561,3715],{},[28,16563,6120],{},[28,16565,6125],{},[28,16567,6130],{},[28,16569,3826],{},[28,16571,16572],{},"\"adaptive\"",[2042,16574,16575,16579,16581,16583],{},[2057,16576,16577],{},[28,16578,1822],{},[2057,16580,3524],{},[2057,16582,3420],{"align":13756},[2057,16584,16585],{},"启用同步音频生成（默认：true）",[2042,16587,16588,16592,16594,16596],{},[2057,16589,16590],{},[28,16591,3595],{},[2057,16593,3417],{},[2057,16595,3420],{"align":13756},[2057,16597,16598],{},"任务完成通知的 HTTPS webhook URL",[11,16600,16601,16604],{},[23,16602,16603],{},"输入限制："," 所有模态的文件总数最多 12 个。包含真实人脸的上传会被自动拒绝。所有 URL 必须可被服务器直接访问。",[11,16606,16607,16610,16611,16616,16617,16619],{},[23,16608,16609],{},"任务流程："," API 会立即返回一个任务 ID。可轮询",[37,16612,16615],{"href":16613,"rel":16614},"https://docs.evolink.ai/en/api-manual/task-management/get-task-detail",[41],"任务状态端点","或使用 ",[28,16618,3595],{}," webhook 接收完成通知。生成的视频 URL 有效期为 24 小时——请及时下载存储。",[92,16621,16623],{"id":16622},"多模型故障转移延期期间保持流水线持续运行","多模型故障转移：延期期间保持流水线持续运行",[11,16625,16626],{},"这正是 EvoLink 统一 API 架构在 Seedance 2.0 版权延期期间体现具体价值的地方。无需为每个模型构建和维护单独的集成，你只需通过单一代码路径实现自动故障转移：",[136,16628,16630],{"className":339,"code":16629,"language":341,"meta":141,"style":141},"# Multi-model failover — your pipeline never stops\nMODEL_PRIORITY = [\n    \"seedance-2.0\",  # Preferred: best multimodal capabilities\n    \"kling\",          # Fallback 1: strong motion quality\n    \"veo-2\",          # Fallback 2: high visual fidelity\n    \"sora\",           # Fallback 3: robust safety, good adherence\n]\n\ndef generate_with_failover(prompt, duration=10, quality=\"720p\",\n                           aspect_ratio=\"16:9\", **kwargs):\n    \"\"\"Try models in priority order. First success wins.\"\"\"\n    errors = {}\n    for model in MODEL_PRIORITY:\n        try:\n            payload = {\n                \"model\": model,\n                \"prompt\": prompt,\n                \"duration\": duration,\n                \"quality\": quality,\n                \"aspect_ratio\": aspect_ratio,\n                **kwargs\n            }\n            result = generate_video(payload)\n            print(f\"✅ Generated with: {model}\")\n            return result\n        except Exception as e:\n            errors[model] = str(e)\n            print(f\"⚠️ {model} unavailable: {e}\")\n            continue\n\n    raise Exception(f\"All models failed: {errors}\")\n\n# Your application code stays the same regardless of model availability\nresult = generate_with_failover(\n    prompt=\"Cinematic drone shot over a mountain lake at sunrise. \"\n           \"Mist rises from the water surface. Golden light breaks \"\n           \"through clouds and reflects off the still water. \"\n           \"Slow, majestic camera movement.\",\n    duration=10,\n    quality=\"720p\",\n    aspect_ratio=\"16:9\",\n    generate_audio=True\n)\n",[28,16631,16632,16637,16646,16656,16666,16676,16687,16691,16695,16718,16735,16740,16749,16763,16769,16778,16786,16793,16801,16809,16817,16825,16830,16839,16860,16866,16876,16889,16919,16923,16927,16951,16955,16960,16969,16979,16984,16989,16996,17007,17018,17029,17038],{"__ignoreMap":141},[145,16633,16634],{"class":147,"line":148},[145,16635,16636],{"class":174},"# Multi-model failover — your pipeline never stops\n",[145,16638,16639,16642,16644],{"class":147,"line":166},[145,16640,16641],{"class":155},"MODEL_PRIORITY",[145,16643,392],{"class":259},[145,16645,8843],{"class":263},[145,16647,16648,16651,16653],{"class":147,"line":178},[145,16649,16650],{"class":159},"    \"seedance-2.0\"",[145,16652,1448],{"class":263},[145,16654,16655],{"class":174},"# Preferred: best multimodal capabilities\n",[145,16657,16658,16661,16663],{"class":147,"line":187},[145,16659,16660],{"class":159},"    \"kling\"",[145,16662,1312],{"class":263},[145,16664,16665],{"class":174},"# Fallback 1: strong motion quality\n",[145,16667,16668,16671,16673],{"class":147,"line":374},[145,16669,16670],{"class":159},"    \"veo-2\"",[145,16672,1312],{"class":263},[145,16674,16675],{"class":174},"# Fallback 2: high visual fidelity\n",[145,16677,16678,16681,16684],{"class":147,"line":380},[145,16679,16680],{"class":159},"    \"sora\"",[145,16682,16683],{"class":263},",           ",[145,16685,16686],{"class":174},"# Fallback 3: robust safety, good adherence\n",[145,16688,16689],{"class":147,"line":386},[145,16690,764],{"class":263},[145,16692,16693],{"class":147,"line":410},[145,16694,377],{"emptyLinePlaceholder":58},[145,16696,16697,16699,16702,16705,16707,16709,16712,16714,16716],{"class":147,"line":421},[145,16698,526],{"class":259},[145,16700,16701],{"class":151}," generate_with_failover",[145,16703,16704],{"class":263},"(prompt, duration",[145,16706,267],{"class":259},[145,16708,537],{"class":155},[145,16710,16711],{"class":263},", quality",[145,16713,267],{"class":259},[145,16715,1369],{"class":159},[145,16717,453],{"class":263},[145,16719,16720,16723,16725,16727,16729,16732],{"class":147,"line":432},[145,16721,16722],{"class":263},"                           aspect_ratio",[145,16724,267],{"class":259},[145,16726,1385],{"class":159},[145,16728,401],{"class":263},[145,16730,16731],{"class":259},"**",[145,16733,16734],{"class":263},"kwargs):\n",[145,16736,16737],{"class":147,"line":456},[145,16738,16739],{"class":159},"    \"\"\"Try models in priority order. First success wins.\"\"\"\n",[145,16741,16742,16744,16746],{"class":147,"line":467},[145,16743,5851],{"class":263},[145,16745,267],{"class":259},[145,16747,16748],{"class":263}," {}\n",[145,16750,16751,16753,16756,16758,16761],{"class":147,"line":600},[145,16752,5101],{"class":259},[145,16754,16755],{"class":263}," model ",[145,16757,1181],{"class":259},[145,16759,16760],{"class":155}," MODEL_PRIORITY",[145,16762,860],{"class":263},[145,16764,16765,16767],{"class":147,"line":605},[145,16766,5117],{"class":259},[145,16768,860],{"class":263},[145,16770,16771,16774,16776],{"class":147,"line":611},[145,16772,16773],{"class":263},"            payload ",[145,16775,267],{"class":259},[145,16777,429],{"class":263},[145,16779,16780,16783],{"class":147,"line":617},[145,16781,16782],{"class":159},"                \"model\"",[145,16784,16785],{"class":263},": model,\n",[145,16787,16788,16791],{"class":147,"line":623},[145,16789,16790],{"class":159},"                \"prompt\"",[145,16792,8467],{"class":263},[145,16794,16795,16798],{"class":147,"line":628},[145,16796,16797],{"class":159},"                \"duration\"",[145,16799,16800],{"class":263},": duration,\n",[145,16802,16803,16806],{"class":147,"line":639},[145,16804,16805],{"class":159},"                \"quality\"",[145,16807,16808],{"class":263},": quality,\n",[145,16810,16811,16814],{"class":147,"line":654},[145,16812,16813],{"class":159},"                \"aspect_ratio\"",[145,16815,16816],{"class":263},": aspect_ratio,\n",[145,16818,16819,16822],{"class":147,"line":660},[145,16820,16821],{"class":259},"                **",[145,16823,16824],{"class":263},"kwargs\n",[145,16826,16827],{"class":147,"line":671},[145,16828,16829],{"class":263},"            }\n",[145,16831,16832,16834,16836],{"class":147,"line":698},[145,16833,8549],{"class":263},[145,16835,267],{"class":259},[145,16837,16838],{"class":263}," generate_video(payload)\n",[145,16840,16841,16843,16845,16847,16850,16852,16854,16856,16858],{"class":147,"line":710},[145,16842,5558],{"class":155},[145,16844,794],{"class":263},[145,16846,441],{"class":259},[145,16848,16849],{"class":159},"\"✅ Generated with: ",[145,16851,685],{"class":155},[145,16853,1748],{"class":263},[145,16855,691],{"class":155},[145,16857,450],{"class":159},[145,16859,407],{"class":263},[145,16861,16862,16864],{"class":147,"line":716},[145,16863,866],{"class":259},[145,16865,1707],{"class":263},[145,16867,16868,16870,16872,16874],{"class":147,"line":722},[145,16869,5515],{"class":259},[145,16871,7041],{"class":155},[145,16873,7044],{"class":259},[145,16875,5633],{"class":263},[145,16877,16878,16881,16883,16886],{"class":147,"line":728},[145,16879,16880],{"class":263},"            errors[model] ",[145,16882,267],{"class":259},[145,16884,16885],{"class":155}," str",[145,16887,16888],{"class":263},"(e)\n",[145,16890,16891,16893,16895,16897,16900,16902,16904,16906,16909,16911,16913,16915,16917],{"class":147,"line":739},[145,16892,5558],{"class":155},[145,16894,794],{"class":263},[145,16896,441],{"class":259},[145,16898,16899],{"class":159},"\"⚠️ ",[145,16901,685],{"class":155},[145,16903,1748],{"class":263},[145,16905,691],{"class":155},[145,16907,16908],{"class":159}," unavailable: ",[145,16910,685],{"class":155},[145,16912,5683],{"class":263},[145,16914,691],{"class":155},[145,16916,450],{"class":159},[145,16918,407],{"class":263},[145,16920,16921],{"class":147,"line":744},[145,16922,5615],{"class":259},[145,16924,16925],{"class":147,"line":750},[145,16926,377],{"emptyLinePlaceholder":58},[145,16928,16929,16931,16933,16935,16937,16940,16942,16945,16947,16949],{"class":147,"line":767},[145,16930,997],{"class":259},[145,16932,7041],{"class":155},[145,16934,794],{"class":263},[145,16936,441],{"class":259},[145,16938,16939],{"class":159},"\"All models failed: ",[145,16941,685],{"class":155},[145,16943,16944],{"class":263},"errors",[145,16946,691],{"class":155},[145,16948,450],{"class":159},[145,16950,407],{"class":263},[145,16952,16953],{"class":147,"line":788},[145,16954,377],{"emptyLinePlaceholder":58},[145,16956,16957],{"class":147,"line":834},[145,16958,16959],{"class":174},"# Your application code stays the same regardless of model availability\n",[145,16961,16962,16964,16966],{"class":147,"line":839},[145,16963,12197],{"class":263},[145,16965,267],{"class":259},[145,16967,16968],{"class":263}," generate_with_failover(\n",[145,16970,16971,16974,16976],{"class":147,"line":845},[145,16972,16973],{"class":701},"    prompt",[145,16975,267],{"class":259},[145,16977,16978],{"class":159},"\"Cinematic drone shot over a mountain lake at sunrise. \"\n",[145,16980,16981],{"class":147,"line":863},[145,16982,16983],{"class":159},"           \"Mist rises from the water surface. Golden light breaks \"\n",[145,16985,16986],{"class":147,"line":872},[145,16987,16988],{"class":159},"           \"through clouds and reflects off the still water. \"\n",[145,16990,16991,16994],{"class":147,"line":887},[145,16992,16993],{"class":159},"           \"Slow, majestic camera movement.\"",[145,16995,453],{"class":263},[145,16997,16998,17001,17003,17005],{"class":147,"line":903},[145,16999,17000],{"class":701},"    duration",[145,17002,267],{"class":259},[145,17004,537],{"class":155},[145,17006,453],{"class":263},[145,17008,17009,17012,17014,17016],{"class":147,"line":915},[145,17010,17011],{"class":701},"    quality",[145,17013,267],{"class":259},[145,17015,1369],{"class":159},[145,17017,453],{"class":263},[145,17019,17020,17023,17025,17027],{"class":147,"line":954},[145,17021,17022],{"class":701},"    aspect_ratio",[145,17024,267],{"class":259},[145,17026,1385],{"class":159},[145,17028,453],{"class":263},[145,17030,17031,17034,17036],{"class":147,"line":960},[145,17032,17033],{"class":701},"    generate_audio",[145,17035,267],{"class":259},[145,17037,3731],{"class":155},[145,17039,17040],{"class":147,"line":965},[145,17041,407],{"class":263},[11,17043,17044],{},[2614,17045,16210],{},[11,17047,17048],{},"在 Seedance 2.0 延期期间，你的流水线通过同一个 EvoLink 端点使用 Kling、Veo 或 Sora 生成视频。Seedance 一旦恢复上线，就会重新进入优先级列表——无需迁移、无需代码改动、无需停机。",[11,17050,17051],{},"这不仅仅关乎当前的延期。模型可用性本质上是不可预测的——速率限制、维护窗口、政策变更，以及法律行动，都可能让任何模型随时下线。从第一天起就构建模型无关的架构，是一个每次行业格局变化时都能获得回报的战略决策。",[11,17053,17054,17055,298],{},"如需完整的 API 文档，包括任务管理、webhook、错误处理，以及 Python、Node.js 和 cURL 的 SDK 示例，请参阅 ",[37,17056,17057],{"href":14322},"EvoLink 视频生成文档",[48,17059,17060],{"id":17060},"常见问题解答",[92,17062,17064],{"id":17063},"seedance-20-api-还会发布吗","Seedance 2.0 API 还会发布吗？",[11,17066,17067,17068,17072,17073,17077],{},"会的，但时间表尚不确定。ByteDance 推迟了原定于 2026 年 2 月 24 日的发布计划，以实施包括人脸检测、受版权保护角色屏蔽和数字水印在内的版权安全防护措施（",[37,17069,17071],{"href":13623,"rel":17070},[41],"Chosun, 2/22","；",[37,17074,17076],{"href":13596,"rel":17075},[41],"Hacker News, 2/21","）。目前尚未公布新的发布日期。延期将持续到 ByteDance 的安全防护实施既满足其自身法务团队的要求，也在一定程度上解决了 MPA 停止侵权通知函中提出的核心关切为止。合理的估计范围从数周到数月不等。",[92,17079,17081],{"id":17080},"我可以将-seedance-20-用于商业项目吗","我可以将 Seedance 2.0 用于商业项目吗？",[11,17083,17084,17085,17089],{},"完全取决于你生成的内容。使用原创提示词描述原创角色和场景的内容——不引用受版权保护的作品、真实人物或注册商标——法律风险最低。蓄意或疏忽地复制现有 IP 的内容则风险显著，无论使用哪个 AI 模型都是如此。当 API 发布后，请仔细审查 Seedance 2.0 的服务条款中关于商业使用的具体规定，并就高风险或大规模传播的商业项目咨询知识产权律师。请参阅上文的",[37,17086,17088],{"href":17087},"#enterprise-compliance-checklist","合规检查清单","获取实用框架。",[92,17091,17093],{"id":17092},"我已经生成的-seedance-视频会被下架吗","我已经生成的 Seedance 视频会被下架吗？",[11,17095,17096],{},"目前没有迹象表明 ByteDance 计划追溯删除已通过 Seedance 2.0 网页界面生成的内容。MPA 的停止侵权通知函针对的是 ByteDance 作为平台的行为——而非个人用户或其输出。不过，如果你已经生成并发布了包含可辨识受版权保护角色或真实人物的内容，你可能面临来自版权持有人的独立下架请求（DMCA 通知或同等效力的通知）。这一风险与使用何种生成工具无关。",[92,17098,17100],{"id":17099},"evolink-如何处理版权合规","EvoLink 如何处理版权合规？",[11,17102,17103,17104,17106],{},"EvoLink 是一个统一 API 网关——它通过单一集成点提供对多个视频生成模型的访问。EvoLink ",[23,17105,16066],{},"过滤、审核或验证提示词或生成输出的版权状态。版权合规完全是开发者自身的责任。EvoLink 提供的是基础设施层面的灵活性：如果某个模型的内容政策、可用性或法律状况不满足你的需求，你可以通过同一个 API 切换到另一个模型，无需修改代码。这种模型多样性本身就是一种务实的风险缓解策略——你永远不会被单一模型的可用性或政策决定所绑定。",[92,17108,17110],{"id":17109},"如果-seedance-api-持续延期有哪些替代方案","如果 Seedance API 持续延期，有哪些替代方案？",[11,17112,17113],{},"通过 EvoLink 的统一 API，你可以使用与 Seedance 相同的集成代码访问多个生产就绪的替代方案：",[2036,17115,17116,17131],{},[2039,17117,17118],{},[2042,17119,17120,17123,17126,17128],{},[2045,17121,17122],{},"模型",[2045,17124,17125],{},"优势",[2045,17127,13769],{},[2045,17129,17130],{},"最适合",[2052,17132,17133,17148,17164,17179],{},[2042,17134,17135,17139,17142,17145],{},[2057,17136,17137],{},[23,17138,13842],{},[2057,17140,17141],{},"出色的运动质量、角色一致性",[2057,17143,17144],{},"中等过滤",[2057,17146,17147],{},"动作场景、角色动画",[2042,17149,17150,17155,17158,17161],{},[2057,17151,17152],{},[23,17153,17154],{},"Veo 2",[2057,17156,17157],{},"高视觉保真度、Google 安全基础设施",[2057,17159,17160],{},"严格过滤",[2057,17162,17163],{},"高端品质、品牌安全内容",[2042,17165,17166,17171,17174,17176],{},[2057,17167,17168],{},[23,17169,17170],{},"Sora",[2057,17172,17173],{},"强提示词遵循度、OpenAI 安全体系",[2057,17175,17160],{},[2057,17177,17178],{},"叙事内容、精确导演",[2042,17180,17181,17185,17188,17190],{},[2057,17182,17183],{},[23,17184,13825],{},[2057,17186,17187],{},"成熟的生态系统、良好的运动表现",[2057,17189,17144],{},[2057,17191,17192],{},"通用场景、快速迭代",[11,17194,17195,17196,17199],{},"每个模型在能力、内容政策、定价和可用性上各有不同。EvoLink 的多模型架构让你无需构建单独集成即可评估所有模型。上文的故障转移代码示例展示了如何根据可用性自动在模型之间切换。请参阅",[37,17197,17198],{"href":14322},"视频生成 API 文档","了解模型特定参数和能力对比。",[45,17201],{},[48,17203,17204],{"id":17204},"下一步展望",[11,17206,17207],{},"Seedance 2.0 的版权事态仍在持续演变。ByteDance 实施的安全防护措施将重新定义 API 能够生成和不能生成的内容。围绕 AI 视频生成而确立的法律先例将影响这一领域的所有平台，而非仅限于 Seedance。",[11,17209,17210],{},"对于开发者而言，务实的前进路径是明确的：",[70,17212,17213,17219,17225,17231,17237],{},[73,17214,17215,17218],{},[23,17216,17217],{},"构建模型无关的架构。"," 不要将你的生产流水线押注在单一模型的可用性或法律状态上。使用统一 API，让你无需修改代码即可切换模型。",[73,17220,17221,17224],{},[23,17222,17223],{},"安全使用提示词。"," 原创描述、原创角色、你自己的参考素材。在法律上最安全的内容，同时也是商业价值最高的内容——因为它属于你。",[73,17226,17227,17230],{},[23,17228,17229],{},"保持信息更新。"," AI 生成内容的法律格局每月都在变化。持续关注 MPA 诉 ByteDance 案的进展，以及正在法院审理的更广泛的 AI 版权案件。",[73,17232,17233,17236],{},[23,17234,17235],{},"记录一切。"," 保留提示词、参数、创意意图和审核流程的记录。如果遇到质疑，善意的合规努力至关重要。",[73,17238,17239,17242],{},[23,17240,17241],{},"不必恐慌。"," 天不会塌下来。AI 视频生成是一项变革性的能力，法律框架终将演变以适应它。现在负责任地进行开发的开发者，将在规则确立之后占据有利位置。",[11,17244,17245],{},"我们将随着事态发展持续更新本指南。请收藏本页，有新动态时回来查看。",[14307,17247,17248,17253,17256],{"style":14309},[11,17249,17250],{},[23,17251,17252],{},"跨多个 AI 视频模型，自信开发",[11,17254,17255],{},"EvoLink 为你提供一个 API，覆盖 Seedance 2.0、Kling、Veo、Sora 等模型。免费开始——随时切换模型，无绑定。",[11,17257,17258],{},[37,17259,16409],{"href":16408},[11,17261,17262],{},[2614,17263,17264],{},"最后更新：2026 年 2 月 23 日。本文将随着 Seedance 2.0 版权事态的发展持续更新。",[11186,17266,17267],{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sns5M, html code.shiki .sns5M{--shiki-default:#DBEDFF}",{"title":141,"searchDepth":166,"depth":166,"links":17269},[17270,17275,17281,17286,17291,17299,17305,17312],{"id":13462,"depth":166,"text":13463,"children":17271},[17272,17273,17274],{"id":13472,"depth":178,"text":13473},{"id":13520,"depth":178,"text":13521},{"id":13629,"depth":178,"text":13630},{"id":13676,"depth":166,"text":13677,"children":17276},[17277,17278,17279,17280],{"id":13683,"depth":178,"text":13683},{"id":13700,"depth":178,"text":13700},{"id":13741,"depth":178,"text":13741},{"id":13876,"depth":178,"text":13877},{"id":13892,"depth":166,"text":13893,"children":17282},[17283,17284,17285],{"id":13899,"depth":178,"text":13900},{"id":13944,"depth":178,"text":13944},{"id":13976,"depth":178,"text":13976},{"id":14043,"depth":166,"text":14043,"children":17287},[17288,17289,17290],{"id":14055,"depth":178,"text":14055},{"id":14103,"depth":178,"text":14103},{"id":14206,"depth":178,"text":14206},{"id":14326,"depth":166,"text":14327,"children":17292},[17293,17294,17295,17296,17297,17298],{"id":14339,"depth":178,"text":14339},{"id":14449,"depth":178,"text":14449},{"id":14525,"depth":178,"text":14525},{"id":14577,"depth":178,"text":14578},{"id":15240,"depth":178,"text":15241},{"id":15385,"depth":178,"text":15385},{"id":16053,"depth":166,"text":16054,"children":17300},[17301,17302,17303,17304],{"id":16077,"depth":178,"text":16078},{"id":16213,"depth":178,"text":16214},{"id":16412,"depth":178,"text":16413},{"id":16622,"depth":178,"text":16623},{"id":17060,"depth":166,"text":17060,"children":17306},[17307,17308,17309,17310,17311],{"id":17063,"depth":178,"text":17064},{"id":17080,"depth":178,"text":17081},{"id":17092,"depth":178,"text":17093},{"id":17099,"depth":178,"text":17100},{"id":17109,"depth":178,"text":17110},{"id":17204,"depth":166,"text":17204},"MPA 停止侵权通知函、API 延期发布及其对你项目的影响。全面指南：如何安全地将 Seedance 2.0 API 用于商业视频生成。",{"date":17315,"image":17316,"seoTitle":17317,"author":17318},"2026-02-23","/copyright-guide-hero.webp","Seedance 2.0 版权合规指南：API 开发者必读（2026）","EvoLink Team","/zh/blog/seedance-2-copyright-api-guide",{"title":13451,"description":17313},"zh/blog/seedance-2-copyright-api-guide","LfYhU2bvjIHdgvQB6vZ6j8KmkYuFxo7Jw_Avc_me1Os",{"id":17324,"title":17325,"body":17326,"description":23013,"extension":11248,"meta":23014,"navigation":58,"path":23018,"seo":23019,"stem":23020,"__hash__":23021},"content/zh/blog/seedance-2-ecommerce-product-videos.md","使用 Seedance 2.0 API 为电商构建 AI 产品视频",{"type":8,"value":17327,"toc":22962},[17328,17337,17341,17356,17359,17453,17456,17459,17462,17465,17468,17471,17475,17487,17490,17502,17505,17508,18049,18057,18063,18074,18081,18087,18091,18094,18099,18102,18215,18218,18232,18238,18244,18250,18253,18311,18314,18317,18320,18326,18332,18338,18344,18351,18354,18358,18361,18366,18483,18486,18489,18495,18501,18507,18513,18519,18525,18528,18531,18534,18560,18563,18570,18574,18577,18586,18716,18719,18724,18732,18741,18744,18826,18829,18833,18842,18845,18859,18868,18878,18882,18885,19012,19015,19018,19050,19053,19059,19065,19071,19077,19083,19089,19095,19101,19107,19111,19114,19241,19244,19247,19250,19256,19262,19268,19271,19277,19280,19283,19286,19289,19292,19318,19321,19324,19328,19331,19463,19466,19469,19913,19916,19919,19922,19925,19928,19931,19934,19966,19971,19975,19978,19981,20018,20023,21837,21840,21843,21853,21941,21944,21947,21993,21996,21999,22009,22018,22024,22030,22033,22039,22789,22796,22799,22802,22805,22831,22834,22836,22840,22849,22853,22856,22860,22866,22870,22873,22877,22880,22884,22887,22891,22904,22908,22917,22921,22924,22927,22930,22933,22936,22943,22945,22960],[11,17329,17330,17331,17336],{},"目录中的每一款产品都值得拥有视频。一张产品照片现在可以在三分钟内变成一条精美的视频广告。无需摄制团队，无需租用摄影棚，无需后期制作排期。",[37,17332,17335],{"href":17333,"rel":17334},"https://seed.bytedance.com/en/seedance2_0",[41],"Seedance 2.0"," —— 字节跳动最新的视频生成模型 —— 通过一次简单的 API 调用，将静态产品图片转化为可直接播出的视频片段。本指南将带你了解五种不同的电商视频类型、整个目录的批量处理流水线，以及多平台导出策略。所有代码示例均为可直接生产使用的 Python。",[48,17338,17340],{"id":17339},"为什么产品视频很重要以及为什么摄影棚已经过时","为什么产品视频很重要（以及为什么摄影棚已经过时）",[11,17342,17343,17344,17349,17350,17355],{},"带有视频的产品列表在表现上始终优于没有视频的列表。根据 ",[37,17345,17348],{"href":17346,"rel":17347},"https://www.shopify.com/blog/product-photography-tips",[41],"Shopify 的产品媒体最佳实践","，在产品页面添加视频的商家在互动率和转化率方面都有显著提升。Amazon 自己的",[37,17351,17354],{"href":17352,"rel":17353},"https://sellercentral.amazon.com/help/hub/reference/G202124160",[41],"卖家指南","现在积极鼓励每个列表都配备视频，其 A+ Content 项目也在搜索结果中优先展示带有视频的页面。",[11,17357,17358],{},"\"知道视频有用\"与\"实际制作视频\"之间的鸿沟一直以来都是巨大的。一次产品视频拍摄 —— 包括棚拍时间、灯光、设备、摄影师和基本剪辑 —— 每个 SKU 通常需要 $500–$2,000。对于 200 款产品的目录来说，还没上传一个文件就已经是六位数的成本了。",[2036,17360,17361,17373],{},[2039,17362,17363],{},[2042,17364,17365,17367,17370],{},[2045,17366],{},[2045,17368,17369],{},"传统摄影棚",[2045,17371,17372],{},"Seedance 2.0 API",[2052,17374,17375,17388,17401,17414,17427,17440],{},[2042,17376,17377,17382,17385],{},[2057,17378,17379],{},[23,17380,17381],{},"每条视频成本",[2057,17383,17384],{},"$500–$2,000",[2057,17386,17387],{},"$0.02–$0.15",[2042,17389,17390,17395,17398],{},[2057,17391,17392],{},[23,17393,17394],{},"交付周期",[2057,17396,17397],{},"3–10 个工作日",[2057,17399,17400],{},"60–180 秒",[2042,17402,17403,17408,17411],{},[2057,17404,17405],{},[23,17406,17407],{},"所需准备",[2057,17409,17410],{},"摄影棚、团队、设备",[2057,17412,17413],{},"一张产品照片",[2042,17415,17416,17421,17424],{},[2057,17417,17418],{},[23,17419,17420],{},"扩展到 500 个 SKU",[2057,17422,17423],{},"$250K–$1M+",[2057,17425,17426],{},"不到 $75",[2042,17428,17429,17434,17437],{},[2057,17430,17431],{},[23,17432,17433],{},"迭代速度",[2057,17435,17436],{},"需要重新拍摄",[2057,17438,17439],{},"修改提示词，重新生成",[2042,17441,17442,17447,17450],{},[2057,17443,17444],{},[23,17445,17446],{},"宽高比变体",[2057,17448,17449],{},"每种格式单独编辑",[2057,17451,17452],{},"修改一个参数",[11,17454,17455],{},"两者的经济性不可同日而语。AI 产品视频生成并不是要取代一部价值 $50,000 的品牌大片 —— 它取代的是那些重复性的、按 SKU 计费的视频制作工作，而大多数电商团队要么完全跳过这些工作，要么以痛苦的利润率外包出去。",[11,17457,17458],{},"以一个拥有 300 个 SKU 的中型 Shopify 店铺为例。为整个目录制作传统摄影棚视频：$150K–$600K，外加数月的排期和制作时间。使用 Seedance 2.0 API 处理同样的目录：总计不到 $50，一个下午即可完成。即使算上开发者搭建流水线的时间，投资回报率也高出几个数量级。",[11,17460,17461],{},"这一转变与十年前产品摄影领域发生的变化如出一辙。摄影棚并没有消失，但日常工作转向了自动化解决方案。视频正在沿着同样的轨迹前进，只是速度更快。",[92,17463,17464],{"id":17464},"视频对转化率的影响",[11,17466,17467],{},"行业报告一致表明，带有视频的产品页面表现优于没有视频的页面。Shopify 自己的研究强调，视频能增加页面停留时间并降低退货率，因为它帮助客户更好地了解他们要购买的商品。Amazon 报告称，带有视频的列表在搜索结果中获得了更高的点击率。",[11,17469,17470],{},"具体数据因品类和市场而异，但方向是明确的：视频能卖出更多产品。问题从来不是视频是否有效，而是投资回报率是否能证明制作成本合理。在 API 定价下，这个计算已经有了定论。",[48,17472,17474],{"id":17473},"准备工作api-key-和基础代码","准备工作：API Key 和基础代码",[11,17476,17477,17478,17481,17482,17486],{},"你需要一个 ",[37,17479,213],{"href":211,"rel":17480},[41]," 账户和一个 API Key。EvoLink 提供对 Seedance 2.0 的访问，使用简洁的 REST API。如果你尚未创建账户，请参阅",[37,17483,17485],{"href":17484},"/docs/getting-started","入门指南","获取操作说明。",[11,17488,17489],{},"安装唯一的依赖：",[136,17491,17492],{"className":138,"code":318,"language":140,"meta":141,"style":141},[28,17493,17494],{"__ignoreMap":141},[145,17495,17496,17498,17500],{"class":147,"line":148},[145,17497,190],{"class":151},[145,17499,193],{"class":159},[145,17501,329],{"class":159},[11,17503,17504],{},"无需 GPU。无需下载模型。无需管理任何基础设施。API 在服务端处理所有计算。你的本地机器只需发送 HTTP 请求并接收视频 URL。",[11,17506,17507],{},"以下是完整的基础代码。本指南中的每个示例都基于此构建：",[136,17509,17511],{"className":339,"code":17510,"language":341,"meta":141,"style":141},"import requests\nimport time\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\n\nheaders = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\n\ndef generate_video(payload: dict) -> dict:\n    \"\"\"Submit a video generation request and return the task response.\"\"\"\n    response = requests.post(\n        f\"{BASE_URL}/videos/generations\",\n        headers=headers,\n        json=payload\n    )\n    response.raise_for_status()\n    return response.json()\n\n\ndef wait_for_video(task_id: str, poll_interval: int = 5, timeout: int = 300) -> dict:\n    \"\"\"Poll a task until it completes or fails. Returns the final task object.\"\"\"\n    elapsed = 0\n    while elapsed \u003C timeout:\n        resp = requests.get(f\"{BASE_URL}/tasks/{task_id}\", headers=headers)\n        resp.raise_for_status()\n        task = resp.json()\n        status = task.get(\"status\")\n\n        if status == \"completed\":\n            print(f\"✅ Video ready: {task['output']['video_url']}\")\n            return task\n        elif status == \"failed\":\n            raise RuntimeError(f\"Task failed: {task.get('error', 'Unknown error')}\")\n\n        print(f\"⏳ Status: {status} ({elapsed}s elapsed)\")\n        time.sleep(poll_interval)\n        elapsed += poll_interval\n\n    raise TimeoutError(f\"Task {task_id} did not complete within {timeout}s\")\n\n\ndef create_and_wait(payload: dict) -> dict:\n    \"\"\"Generate a video and wait for the result. Returns the completed task.\"\"\"\n    task = generate_video(payload)\n    task_id = task[\"task_id\"]\n    print(f\"🎬 Task created: {task_id}\")\n    return wait_for_video(task_id)\n",[28,17512,17513,17519,17525,17529,17538,17546,17550,17559,17575,17583,17587,17591,17595,17612,17617,17625,17637,17646,17654,17658,17662,17668,17672,17676,17714,17719,17727,17737,17772,17776,17784,17796,17800,17812,17842,17848,17860,17891,17895,17924,17928,17936,17940,17971,17975,17979,17996,18001,18009,18021,18042],{"__ignoreMap":141},[145,17514,17515,17517],{"class":147,"line":148},[145,17516,348],{"class":259},[145,17518,329],{"class":263},[145,17520,17521,17523],{"class":147,"line":166},[145,17522,348],{"class":259},[145,17524,357],{"class":263},[145,17526,17527],{"class":147,"line":178},[145,17528,377],{"emptyLinePlaceholder":58},[145,17530,17531,17533,17535],{"class":147,"line":187},[145,17532,389],{"class":155},[145,17534,392],{"class":259},[145,17536,17537],{"class":159}," \"YOUR_API_KEY\"\n",[145,17539,17540,17542,17544],{"class":147,"line":374},[145,17541,413],{"class":155},[145,17543,392],{"class":259},[145,17545,418],{"class":159},[145,17547,17548],{"class":147,"line":380},[145,17549,377],{"emptyLinePlaceholder":58},[145,17551,17552,17555,17557],{"class":147,"line":386},[145,17553,17554],{"class":263},"headers ",[145,17556,267],{"class":259},[145,17558,429],{"class":263},[145,17560,17561,17563,17565,17567,17569,17571,17573],{"class":147,"line":410},[145,17562,435],{"class":159},[145,17564,438],{"class":263},[145,17566,441],{"class":259},[145,17568,444],{"class":159},[145,17570,447],{"class":155},[145,17572,450],{"class":159},[145,17574,453],{"class":263},[145,17576,17577,17579,17581],{"class":147,"line":421},[145,17578,459],{"class":159},[145,17580,438],{"class":263},[145,17582,464],{"class":159},[145,17584,17585],{"class":147,"line":432},[145,17586,470],{"class":263},[145,17588,17589],{"class":147,"line":456},[145,17590,377],{"emptyLinePlaceholder":58},[145,17592,17593],{"class":147,"line":467},[145,17594,377],{"emptyLinePlaceholder":58},[145,17596,17597,17599,17601,17604,17606,17608,17610],{"class":147,"line":600},[145,17598,526],{"class":259},[145,17600,14669],{"class":151},[145,17602,17603],{"class":263},"(payload: ",[145,17605,8774],{"class":155},[145,17607,15775],{"class":263},[145,17609,8774],{"class":155},[145,17611,860],{"class":263},[145,17613,17614],{"class":147,"line":605},[145,17615,17616],{"class":159},"    \"\"\"Submit a video generation request and return the task response.\"\"\"\n",[145,17618,17619,17621,17623],{"class":147,"line":611},[145,17620,1428],{"class":263},[145,17622,267],{"class":259},[145,17624,1433],{"class":263},[145,17626,17627,17629,17631,17633,17635],{"class":147,"line":617},[145,17628,1438],{"class":259},[145,17630,450],{"class":159},[145,17632,679],{"class":155},[145,17634,1445],{"class":159},[145,17636,453],{"class":263},[145,17638,17639,17641,17643],{"class":147,"line":623},[145,17640,1456],{"class":701},[145,17642,267],{"class":259},[145,17644,17645],{"class":263},"headers,\n",[145,17647,17648,17650,17652],{"class":147,"line":628},[145,17649,1471],{"class":701},[145,17651,267],{"class":259},[145,17653,2783],{"class":263},[145,17655,17656],{"class":147,"line":639},[145,17657,1484],{"class":263},[145,17659,17660],{"class":147,"line":654},[145,17661,2792],{"class":263},[145,17663,17664,17666],{"class":147,"line":660},[145,17665,1704],{"class":259},[145,17667,736],{"class":263},[145,17669,17670],{"class":147,"line":671},[145,17671,377],{"emptyLinePlaceholder":58},[145,17673,17674],{"class":147,"line":698},[145,17675,377],{"emptyLinePlaceholder":58},[145,17677,17678,17680,17682,17685,17687,17690,17693,17695,17698,17701,17703,17705,17708,17710,17712],{"class":147,"line":710},[145,17679,526],{"class":259},[145,17681,529],{"class":151},[145,17683,17684],{"class":263},"(task_id: ",[145,17686,8649],{"class":155},[145,17688,17689],{"class":263},", poll_interval: ",[145,17691,17692],{"class":155},"int",[145,17694,392],{"class":259},[145,17696,17697],{"class":155}," 5",[145,17699,17700],{"class":263},", timeout: ",[145,17702,17692],{"class":155},[145,17704,392],{"class":259},[145,17706,17707],{"class":155}," 300",[145,17709,15775],{"class":263},[145,17711,8774],{"class":155},[145,17713,860],{"class":263},[145,17715,17716],{"class":147,"line":716},[145,17717,17718],{"class":159},"    \"\"\"Poll a task until it completes or fails. Returns the final task object.\"\"\"\n",[145,17720,17721,17723,17725],{"class":147,"line":722},[145,17722,631],{"class":263},[145,17724,267],{"class":259},[145,17726,636],{"class":155},[145,17728,17729,17731,17733,17735],{"class":147,"line":728},[145,17730,642],{"class":259},[145,17732,645],{"class":263},[145,17734,648],{"class":259},[145,17736,651],{"class":263},[145,17738,17739,17741,17743,17746,17748,17750,17752,17754,17756,17758,17760,17762,17764,17767,17769],{"class":147,"line":739},[145,17740,6908],{"class":263},[145,17742,267],{"class":259},[145,17744,17745],{"class":263}," requests.get(",[145,17747,441],{"class":259},[145,17749,450],{"class":159},[145,17751,679],{"class":155},[145,17753,682],{"class":159},[145,17755,685],{"class":155},[145,17757,688],{"class":263},[145,17759,691],{"class":155},[145,17761,450],{"class":159},[145,17763,401],{"class":263},[145,17765,17766],{"class":701},"headers",[145,17768,267],{"class":259},[145,17770,17771],{"class":263},"headers)\n",[145,17773,17774],{"class":147,"line":744},[145,17775,6935],{"class":263},[145,17777,17778,17780,17782],{"class":147,"line":750},[145,17779,731],{"class":263},[145,17781,267],{"class":259},[145,17783,11734],{"class":263},[145,17785,17786,17788,17790,17792,17794],{"class":147,"line":767},[145,17787,753],{"class":263},[145,17789,267],{"class":259},[145,17791,775],{"class":263},[145,17793,761],{"class":159},[145,17795,407],{"class":263},[145,17797,17798],{"class":147,"line":788},[145,17799,377],{"emptyLinePlaceholder":58},[145,17801,17802,17804,17806,17808,17810],{"class":147,"line":834},[145,17803,848],{"class":259},[145,17805,851],{"class":263},[145,17807,854],{"class":259},[145,17809,857],{"class":159},[145,17811,860],{"class":263},[145,17813,17814,17816,17818,17820,17822,17824,17826,17829,17831,17834,17836,17838,17840],{"class":147,"line":839},[145,17815,5558],{"class":155},[145,17817,794],{"class":263},[145,17819,441],{"class":259},[145,17821,14899],{"class":159},[145,17823,685],{"class":155},[145,17825,1530],{"class":263},[145,17827,17828],{"class":159},"'output'",[145,17830,1563],{"class":263},[145,17832,17833],{"class":159},"'video_url'",[145,17835,1536],{"class":263},[145,17837,691],{"class":155},[145,17839,450],{"class":159},[145,17841,407],{"class":263},[145,17843,17844,17846],{"class":147,"line":845},[145,17845,866],{"class":259},[145,17847,869],{"class":263},[145,17849,17850,17852,17854,17856,17858],{"class":147,"line":863},[145,17851,875],{"class":259},[145,17853,851],{"class":263},[145,17855,854],{"class":259},[145,17857,882],{"class":159},[145,17859,860],{"class":263},[145,17861,17862,17864,17866,17868,17870,17872,17874,17877,17879,17881,17883,17885,17887,17889],{"class":147,"line":872},[145,17863,906],{"class":259},[145,17865,909],{"class":155},[145,17867,794],{"class":263},[145,17869,441],{"class":259},[145,17871,14944],{"class":159},[145,17873,685],{"class":155},[145,17875,17876],{"class":263},"task.get(",[145,17878,11831],{"class":159},[145,17880,401],{"class":263},[145,17882,943],{"class":159},[145,17884,946],{"class":263},[145,17886,691],{"class":155},[145,17888,450],{"class":159},[145,17890,407],{"class":263},[145,17892,17893],{"class":147,"line":887},[145,17894,377],{"emptyLinePlaceholder":58},[145,17896,17897,17899,17901,17903,17906,17908,17910,17912,17914,17916,17918,17920,17922],{"class":147,"line":903},[145,17898,791],{"class":155},[145,17900,794],{"class":263},[145,17902,441],{"class":259},[145,17904,17905],{"class":159},"\"⏳ Status: ",[145,17907,685],{"class":155},[145,17909,814],{"class":263},[145,17911,691],{"class":155},[145,17913,1219],{"class":159},[145,17915,685],{"class":155},[145,17917,804],{"class":263},[145,17919,691],{"class":155},[145,17921,11877],{"class":159},[145,17923,407],{"class":263},[145,17925,17926],{"class":147,"line":915},[145,17927,974],{"class":263},[145,17929,17930,17932,17934],{"class":147,"line":954},[145,17931,980],{"class":263},[145,17933,983],{"class":259},[145,17935,986],{"class":263},[145,17937,17938],{"class":147,"line":960},[145,17939,377],{"emptyLinePlaceholder":58},[145,17941,17942,17944,17946,17948,17950,17952,17954,17956,17958,17961,17963,17965,17967,17969],{"class":147,"line":965},[145,17943,997],{"class":259},[145,17945,1000],{"class":155},[145,17947,794],{"class":263},[145,17949,441],{"class":259},[145,17951,921],{"class":159},[145,17953,685],{"class":155},[145,17955,688],{"class":263},[145,17957,691],{"class":155},[145,17959,17960],{"class":159}," did not complete within ",[145,17962,685],{"class":155},[145,17964,1020],{"class":263},[145,17966,691],{"class":155},[145,17968,1025],{"class":159},[145,17970,407],{"class":263},[145,17972,17973],{"class":147,"line":971},[145,17974,377],{"emptyLinePlaceholder":58},[145,17976,17977],{"class":147,"line":977},[145,17978,377],{"emptyLinePlaceholder":58},[145,17980,17981,17983,17986,17988,17990,17992,17994],{"class":147,"line":989},[145,17982,526],{"class":259},[145,17984,17985],{"class":151}," create_and_wait",[145,17987,17603],{"class":263},[145,17989,8774],{"class":155},[145,17991,15775],{"class":263},[145,17993,8774],{"class":155},[145,17995,860],{"class":263},[145,17997,17998],{"class":147,"line":994},[145,17999,18000],{"class":159},"    \"\"\"Generate a video and wait for the result. Returns the completed task.\"\"\"\n",[145,18002,18003,18005,18007],{"class":147,"line":5521},[145,18004,1497],{"class":263},[145,18006,267],{"class":259},[145,18008,16838],{"class":263},[145,18010,18011,18013,18015,18017,18019],{"class":147,"line":5527},[145,18012,7197],{"class":263},[145,18014,267],{"class":259},[145,18016,758],{"class":263},[145,18018,7673],{"class":159},[145,18020,764],{"class":263},[145,18022,18023,18025,18027,18029,18032,18034,18036,18038,18040],{"class":147,"line":5555},[145,18024,1103],{"class":155},[145,18026,794],{"class":263},[145,18028,441],{"class":259},[145,18030,18031],{"class":159},"\"🎬 Task created: ",[145,18033,685],{"class":155},[145,18035,688],{"class":263},[145,18037,691],{"class":155},[145,18039,450],{"class":159},[145,18041,407],{"class":263},[145,18043,18044,18046],{"class":147,"line":5586},[145,18045,1704],{"class":259},[145,18047,18048],{"class":263}," wait_for_video(task_id)\n",[18,18050,18051],{},[11,18052,18053,18056],{},[23,18054,18055],{},"以下所有代码示例均使用相同的基础设置。"," 我们只展示每种视频类型特有的 payload。",[11,18058,18059,18062],{},[28,18060,18061],{},"create_and_wait"," 函数处理完整的生命周期：提交任务、轮询直到完成、返回视频 URL。视频 URL 在 24 小时后过期，因此请及时下载或直接将其导入你的资产管理系统。",[11,18064,18065,18066,18068,18069,18073],{},"轮询方式适用于交互式脚本和小批量处理。对于处理数百个产品的生产流水线，",[28,18067,3595],{}," 参数（在",[37,18070,18072],{"href":18071},"#%E6%89%B9%E9%87%8F%E6%B5%81%E6%B0%B4%E7%BA%BF%E4%BB%8E-csv-%E7%9B%AE%E5%BD%95%E5%88%B0%E8%A7%86%E9%A2%91%E5%BA%93","批量流水线章节","中介绍）可以完全消除轮询开销。",[11,18075,18076,18077,18080],{},"以下每个代码示例都使用不同的 payload 字典调用 ",[28,18078,18079],{},"create_and_wait(payload)","。上面的基础代码是你唯一需要的样板代码。",[11,18082,18083],{},[37,18084,18086],{"href":211,"rel":18085},[41],"免费获取 EvoLink API Key →",[48,18088,18090],{"id":18089},"视频类型-1360-产品旋转","视频类型 1：360° 产品旋转",[11,18092,18093],{},"转盘旋转是电商视频的主力格式。一张白底产品照片即可变成流畅的旋转展示 —— 这类片段过去需要电动转盘和精心的灯光布置。这种格式适用于所有场景：Amazon 列表、Shopify 产品页面和社交广告。",[56,18095,60,18096],{"controls":58,"playsInline":58,"style":59},[62,18097],{"src":18098,"type":65},"https://cdn.evolink.ai/seedance2api/%E6%89%8B%E8%A1%A8%E5%B9%BF%E5%91%8A.mp4",[11,18100,18101],{},"以下是一个奢侈手表旋转的 payload：",[136,18103,18105],{"className":339,"code":18104,"language":341,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"image_urls\": [\n        \"https://your-cdn.com/products/watch-front.jpg\"\n    ],\n    \"prompt\": (\n        \"@Image1 is a luxury wristwatch. The watch rotates slowly under \"\n        \"dramatic studio lighting on a dark reflective surface. Light catches \"\n        \"the polished metal case and sapphire crystal. Slow cinematic rotation. \"\n        \"Premium advertisement quality.\"\n    ),\n    \"duration\": 8,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\"\n}\n\nresult = create_and_wait(payload)\n",[28,18106,18107,18115,18125,18131,18136,18140,18146,18151,18156,18161,18166,18170,18180,18190,18198,18202,18206],{"__ignoreMap":141},[145,18108,18109,18111,18113],{"class":147,"line":148},[145,18110,3654],{"class":263},[145,18112,267],{"class":259},[145,18114,429],{"class":263},[145,18116,18117,18119,18121,18123],{"class":147,"line":166},[145,18118,3663],{"class":159},[145,18120,438],{"class":263},[145,18122,1309],{"class":159},[145,18124,453],{"class":263},[145,18126,18127,18129],{"class":147,"line":178},[145,18128,15319],{"class":159},[145,18130,2686],{"class":263},[145,18132,18133],{"class":147,"line":187},[145,18134,18135],{"class":159},"        \"https://your-cdn.com/products/watch-front.jpg\"\n",[145,18137,18138],{"class":147,"line":374},[145,18139,16301],{"class":263},[145,18141,18142,18144],{"class":147,"line":380},[145,18143,3674],{"class":159},[145,18145,1323],{"class":263},[145,18147,18148],{"class":147,"line":386},[145,18149,18150],{"class":159},"        \"@Image1 is a luxury wristwatch. The watch rotates slowly under \"\n",[145,18152,18153],{"class":147,"line":410},[145,18154,18155],{"class":159},"        \"dramatic studio lighting on a dark reflective surface. Light catches \"\n",[145,18157,18158],{"class":147,"line":421},[145,18159,18160],{"class":159},"        \"the polished metal case and sapphire crystal. Slow cinematic rotation. \"\n",[145,18162,18163],{"class":147,"line":432},[145,18164,18165],{"class":159},"        \"Premium advertisement quality.\"\n",[145,18167,18168],{"class":147,"line":456},[145,18169,3797],{"class":263},[145,18171,18172,18174,18176,18178],{"class":147,"line":467},[145,18173,3686],{"class":159},[145,18175,438],{"class":263},[145,18177,3691],{"class":155},[145,18179,453],{"class":263},[145,18181,18182,18184,18186,18188],{"class":147,"line":600},[145,18183,3698],{"class":159},[145,18185,438],{"class":263},[145,18187,3703],{"class":159},[145,18189,453],{"class":263},[145,18191,18192,18194,18196],{"class":147,"line":605},[145,18193,3710],{"class":159},[145,18195,438],{"class":263},[145,18197,2725],{"class":159},[145,18199,18200],{"class":147,"line":611},[145,18201,470],{"class":263},[145,18203,18204],{"class":147,"line":617},[145,18205,377],{"emptyLinePlaceholder":58},[145,18207,18208,18210,18212],{"class":147,"line":623},[145,18209,12197],{"class":263},[145,18211,267],{"class":259},[145,18213,18214],{"class":263}," create_and_wait(payload)\n",[11,18216,18217],{},"提示词的结构很重要。将其分层可以在任何产品上获得一致的效果：",[11,18219,18220,18223,18224,18227,18228,18231],{},[23,18221,18222],{},"第一层 —— 主体识别。"," 以 ",[28,18225,18226],{},"@Image1 is a [product]."," 开头。这将模型锚定到你的源图像。参阅 ",[37,18229,18230],{"href":2962},"@tags 指南","了解 Seedance 2.0 如何解读图像引用。",[11,18233,18234,18237],{},[23,18235,18236],{},"第二层 —— 运动描述。"," \"Rotates slowly\" 比 \"spins\" 更好 —— 它暗示着匀速运动。添加 \"smooth turntable rotation\" 或 \"360-degree rotation\" 可以强化运动模式。",[11,18239,18240,18243],{},[23,18241,18242],{},"第三层 —— 灯光和环境。"," 模型对以下摄影棚灯光术语反应良好：\"dramatic studio lighting\"、\"soft diffused light\"、\"rim lighting\"、\"three-point lighting setup\"。背景选择 —— 深色反射表面、白色无缝背景、渐变背景 —— 完全决定了整体基调。",[11,18245,18246,18249],{},[23,18247,18248],{},"第四层 —— 品质修饰语。"," 以品质提示语结尾：\"premium advertisement quality\"、\"commercial-grade\" 或 \"4K product showcase\"。这些术语会推动模型输出更干净、更精致的效果。",[92,18251,18252],{"id":18252},"旋转技巧",[2036,18254,18255,18266],{},[2039,18256,18257],{},[2042,18258,18259,18261,18264],{},[2045,18260,3394],{},[2045,18262,18263],{},"推荐值",[2045,18265,8250],{},[2052,18267,18268,18279,18290,18300],{},[2042,18269,18270,18273,18276],{},[2057,18271,18272],{},"时长",[2057,18274,18275],{},"6–10 秒",[2057,18277,18278],{},"完整旋转至少需要 6 秒以避免看起来太仓促",[2042,18280,18281,18284,18287],{},[2057,18282,18283],{},"宽高比",[2057,18285,18286],{},"16:9 或 1:1",[2057,18288,18289],{},"16:9 适用于网页/Amazon，1:1 适用于社交信息流",[2042,18291,18292,18295,18297],{},[2057,18293,18294],{},"画质",[2057,18296,1794],{},[2057,18298,18299],{},"产品内容始终使用 1080p",[2042,18301,18302,18305,18308],{},[2057,18303,18304],{},"提示词中的背景",[2057,18306,18307],{},"深色反射面或白色",[2057,18309,18310],{},"匹配你品牌产品页面的视觉风格",[11,18312,18313],{},"对于细节复杂的产品 —— 珠宝、手表、电子产品 —— 将时长增加到 10 秒。额外的帧数让模型在旋转过程中能够渲染表面细节，而不会出现运动模糊伪影。",[92,18315,18316],{"id":18316},"旋转视频的背景策略",[11,18318,18319],{},"源图像的背景会显著影响输出效果。以下是处理常见情况的方法：",[11,18321,18322,18325],{},[23,18323,18324],{},"白色背景（理想选择）。"," 标准的白底电商产品照片效果完美。模型会保留产品并生成干净的旋转运动。你可以保留白色背景，也可以在提示词中描述不同的背景。",[11,18327,18328,18331],{},[23,18329,18330],{},"透明背景（PNG）。"," 同样出色。模型会根据你的提示词描述填充背景，让你完全控制最终效果。",[11,18333,18334,18337],{},[23,18335,18336],{},"杂乱或生活场景背景。"," 可用但不太可预测。模型可能会将不需要的背景元素纳入旋转中。为获得最佳效果，请在提示词中明确描述所需背景：\"on a clean white surface\" 或 \"on a dark gradient background\"。",[11,18339,18340,18343],{},[23,18341,18342],{},"可控背景的摄影棚照片。"," 很好的起点。如果你现有的照片已经有专业灯光，模型会将该灯光质量延伸到视频中。",[11,18345,18346,18347,18350],{},"如果你的源照片背景杂乱，请在提示词中明确描述所需背景。Seedance 2.0 可以将产品重新置于干净的表面上。为获得最佳效果，请使用白底或透明背景的产品照片。阅读",[37,18348,18349],{"href":3376},"图生视频基础","了解更多源图像最佳实践。",[11,18352,18353],{},"用你自己的产品照片试试吧 —— 3 分钟内即可看到结果。",[48,18355,18357],{"id":18356},"视频类型-2主视觉产品发布预告片","视频类型 2：主视觉（产品发布预告片）",[11,18359,18360],{},"发布预告片能制造期待感。它们是电影般的揭幕时刻 —— 烟雾、光束、戏剧性的角度 —— 压缩成几秒钟。这种格式在社交广告和着陆页主视觉区域占据主导地位，因为第一印象决定了点击率。",[56,18362,60,18363],{"controls":58,"playsInline":58,"style":59},[62,18364],{"src":18365,"type":65},"https://cdn.evolink.ai/seedance2api/%E8%80%B3%E6%9C%BA%E5%B9%BF%E5%91%8A%E5%9B%9B%E4%B8%AA%E9%A2%9C%E8%89%B2.mp4",[136,18367,18369],{"className":339,"code":18368,"language":341,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"image_urls\": [\n        \"https://your-cdn.com/products/headphones-lineup.jpg\"\n    ],\n    \"prompt\": (\n        \"@Image1 shows premium over-ear headphones in four colors. \"\n        \"Rapid four-frame flash cuts, each color freeze-framed. \"\n        \"Extreme close-up of hinge mechanism unfolding in slow motion. \"\n        \"Quick-cut lifestyle montage. Final lineup on white pedestal. \"\n        \"Brand text fades in. Commercial-grade lighting.\"\n    ),\n    \"duration\": 10,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\"\n}\n\nresult = create_and_wait(payload)\n",[28,18370,18371,18379,18389,18395,18400,18404,18410,18415,18420,18425,18430,18435,18439,18449,18459,18467,18471,18475],{"__ignoreMap":141},[145,18372,18373,18375,18377],{"class":147,"line":148},[145,18374,3654],{"class":263},[145,18376,267],{"class":259},[145,18378,429],{"class":263},[145,18380,18381,18383,18385,18387],{"class":147,"line":166},[145,18382,3663],{"class":159},[145,18384,438],{"class":263},[145,18386,1309],{"class":159},[145,18388,453],{"class":263},[145,18390,18391,18393],{"class":147,"line":178},[145,18392,15319],{"class":159},[145,18394,2686],{"class":263},[145,18396,18397],{"class":147,"line":187},[145,18398,18399],{"class":159},"        \"https://your-cdn.com/products/headphones-lineup.jpg\"\n",[145,18401,18402],{"class":147,"line":374},[145,18403,16301],{"class":263},[145,18405,18406,18408],{"class":147,"line":380},[145,18407,3674],{"class":159},[145,18409,1323],{"class":263},[145,18411,18412],{"class":147,"line":386},[145,18413,18414],{"class":159},"        \"@Image1 shows premium over-ear headphones in four colors. \"\n",[145,18416,18417],{"class":147,"line":410},[145,18418,18419],{"class":159},"        \"Rapid four-frame flash cuts, each color freeze-framed. \"\n",[145,18421,18422],{"class":147,"line":421},[145,18423,18424],{"class":159},"        \"Extreme close-up of hinge mechanism unfolding in slow motion. \"\n",[145,18426,18427],{"class":147,"line":432},[145,18428,18429],{"class":159},"        \"Quick-cut lifestyle montage. Final lineup on white pedestal. \"\n",[145,18431,18432],{"class":147,"line":456},[145,18433,18434],{"class":159},"        \"Brand text fades in. Commercial-grade lighting.\"\n",[145,18436,18437],{"class":147,"line":467},[145,18438,3797],{"class":263},[145,18440,18441,18443,18445,18447],{"class":147,"line":600},[145,18442,3686],{"class":159},[145,18444,438],{"class":263},[145,18446,537],{"class":155},[145,18448,453],{"class":263},[145,18450,18451,18453,18455,18457],{"class":147,"line":605},[145,18452,3698],{"class":159},[145,18454,438],{"class":263},[145,18456,3703],{"class":159},[145,18458,453],{"class":263},[145,18460,18461,18463,18465],{"class":147,"line":611},[145,18462,3710],{"class":159},[145,18464,438],{"class":263},[145,18466,2725],{"class":159},[145,18468,18469],{"class":147,"line":617},[145,18470,470],{"class":263},[145,18472,18473],{"class":147,"line":623},[145,18474,377],{"emptyLinePlaceholder":58},[145,18476,18477,18479,18481],{"class":147,"line":628},[145,18478,12197],{"class":263},[145,18480,267],{"class":259},[145,18482,18214],{"class":263},[11,18484,18485],{},"主视觉的提示词使用的词汇与旋转不同。这里你是在导演一个序列，而不是单一的连续运动。将每个句子视为分镜脚本中的一个场景。",[92,18487,18488],{"id":18488},"主视觉提示词模式",[11,18490,18491,18494],{},[23,18492,18493],{},"浮现式："," 产品从烟雾、雾气或粒子中升起。适用于科技产品、香水、高端商品。",[136,18496,18499],{"className":18497,"code":18498,"language":2183},[2181],"@Image1 is [product]. It emerges from dense volumetric fog,\nbacklit by a single golden spotlight. Particles drift upward.\nSlow reveal. Cinematic depth of field. Premium commercial aesthetic.\n",[28,18500,18498],{"__ignoreMap":141},[11,18502,18503,18506],{},[23,18504,18505],{},"冲击着陆式："," 产品带着能量落入画面 —— 水花、碎裂、爆发。",[136,18508,18511],{"className":18509,"code":18510,"language":2183},[2181],"@Image1 is [product]. It lands on a glossy black surface with a\nsubtle shockwave ripple. Dust particles scatter on impact.\nCamera pushes in slowly. Dramatic rim lighting. High-end advertisement.\n",[28,18512,18510],{"__ignoreMap":141},[11,18514,18515,18518],{},[23,18516,18517],{},"组装式："," 组件飞到一起组成完整产品。非常适合科技产品和模块化商品。",[136,18520,18523],{"className":18521,"code":18522,"language":2183},[2181],"@Image1 is [product]. Individual components float in space, then\nsmoothly assemble into the final product. Each piece locks into\nplace with a satisfying precision. Clean white environment.\nStudio lighting. Commercial quality.\n",[28,18524,18522],{"__ignoreMap":141},[11,18526,18527],{},"主视觉格式受益于较长的时长 —— 8 到 12 秒让模型有足够的空间来构建张力并完成揭幕。较短的片段会显得突兀；过长的片段则有失去观众注意力的风险。",[92,18529,18530],{"id":18530},"何时使用主视觉",[11,18532,18533],{},"主视觉最适用于以下场景：",[96,18535,18536,18542,18548,18554],{},[73,18537,18538,18541],{},[23,18539,18540],{},"产品发布。"," 在社交媒体和着陆页上发布新产品。戏剧性的揭幕能营造期待感并传达高端定位。",[73,18543,18544,18547],{},[23,18545,18546],{},"季节性活动。"," 节日促销、黑五、新品上市。电影级的品质让活动内容脱颖而出。",[73,18549,18550,18553],{},[23,18551,18552],{},"广告素材。"," Facebook、Instagram 和 TikTok 广告受益于戏剧性产品揭幕带来的视觉冲击力。这些片段能在快速滑动的信息流中抓住注意力。",[73,18555,18556,18559],{},[23,18557,18558],{},"网站主视觉区域。"," 首屏自动播放的主视觉片段能即时传达品牌品质。主视觉横幅的时长建议控制在 6 秒以内，以避免性能问题。",[11,18561,18562],{},"主视觉不太适合产品详情页，因为客户在那里需要的是信息性内容。将戏剧性效果留给营销漏斗顶部；产品页面本身使用旋转和微距视频即可。",[11,18564,18565,18566,18569],{},"关于更多电商之外的",[37,18567,18568],{"href":1766},"提示词工程技巧","，包括 Seedance 2.0 如何解读电影术语，请查看专门的提示词指南。",[48,18571,18573],{"id":18572},"视频类型-3生活场景","视频类型 3：生活场景",[11,18575,18576],{},"白底静态产品照片能促成转化。但生活场景素材 —— 产品在具体场景中、被使用中、在真实环境中 —— 能建立情感连接。生活场景视频是让客户产生\"我想要那种生活\"而不仅仅是\"我想要那个东西\"的格式。",[11,18578,18579,18580,18582,18583,18585],{},"Seedance 2.0 支持多图输入。使用 ",[28,18581,2903],{}," 指代产品，",[28,18584,2914],{}," 指代你想要放置产品的环境或场景。模型会将产品合成到场景中，并匹配自然的光照和透视。",[136,18587,18589],{"className":339,"code":18588,"language":341,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"image_urls\": [\n        \"https://your-cdn.com/products/ceramic-mug.jpg\",\n        \"https://your-cdn.com/scenes/cafe-table-morning.jpg\"\n    ],\n    \"prompt\": (\n        \"@Image1 is a handmade ceramic coffee mug. @Image2 is a cozy \"\n        \"café table by a window on a rainy morning. The mug sits on the \"\n        \"table, steam rising gently from fresh coffee. Soft natural light \"\n        \"from the window. Shallow depth of field. A hand reaches in and \"\n        \"wraps around the mug. Warm, inviting atmosphere. Lifestyle \"\n        \"advertisement quality.\"\n    ),\n    \"duration\": 8,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"9:16\"\n}\n\nresult = create_and_wait(payload)\n",[28,18590,18591,18599,18609,18615,18622,18627,18631,18637,18642,18647,18652,18657,18662,18667,18671,18681,18691,18700,18704,18708],{"__ignoreMap":141},[145,18592,18593,18595,18597],{"class":147,"line":148},[145,18594,3654],{"class":263},[145,18596,267],{"class":259},[145,18598,429],{"class":263},[145,18600,18601,18603,18605,18607],{"class":147,"line":166},[145,18602,3663],{"class":159},[145,18604,438],{"class":263},[145,18606,1309],{"class":159},[145,18608,453],{"class":263},[145,18610,18611,18613],{"class":147,"line":178},[145,18612,15319],{"class":159},[145,18614,2686],{"class":263},[145,18616,18617,18620],{"class":147,"line":187},[145,18618,18619],{"class":159},"        \"https://your-cdn.com/products/ceramic-mug.jpg\"",[145,18621,453],{"class":263},[145,18623,18624],{"class":147,"line":374},[145,18625,18626],{"class":159},"        \"https://your-cdn.com/scenes/cafe-table-morning.jpg\"\n",[145,18628,18629],{"class":147,"line":380},[145,18630,16301],{"class":263},[145,18632,18633,18635],{"class":147,"line":386},[145,18634,3674],{"class":159},[145,18636,1323],{"class":263},[145,18638,18639],{"class":147,"line":410},[145,18640,18641],{"class":159},"        \"@Image1 is a handmade ceramic coffee mug. @Image2 is a cozy \"\n",[145,18643,18644],{"class":147,"line":421},[145,18645,18646],{"class":159},"        \"café table by a window on a rainy morning. The mug sits on the \"\n",[145,18648,18649],{"class":147,"line":432},[145,18650,18651],{"class":159},"        \"table, steam rising gently from fresh coffee. Soft natural light \"\n",[145,18653,18654],{"class":147,"line":456},[145,18655,18656],{"class":159},"        \"from the window. Shallow depth of field. A hand reaches in and \"\n",[145,18658,18659],{"class":147,"line":467},[145,18660,18661],{"class":159},"        \"wraps around the mug. Warm, inviting atmosphere. Lifestyle \"\n",[145,18663,18664],{"class":147,"line":600},[145,18665,18666],{"class":159},"        \"advertisement quality.\"\n",[145,18668,18669],{"class":147,"line":605},[145,18670,3797],{"class":263},[145,18672,18673,18675,18677,18679],{"class":147,"line":611},[145,18674,3686],{"class":159},[145,18676,438],{"class":263},[145,18678,3691],{"class":155},[145,18680,453],{"class":263},[145,18682,18683,18685,18687,18689],{"class":147,"line":617},[145,18684,3698],{"class":159},[145,18686,438],{"class":263},[145,18688,3703],{"class":159},[145,18690,453],{"class":263},[145,18692,18693,18695,18697],{"class":147,"line":623},[145,18694,3710],{"class":159},[145,18696,438],{"class":263},[145,18698,18699],{"class":159},"\"9:16\"\n",[145,18701,18702],{"class":147,"line":628},[145,18703,470],{"class":263},[145,18705,18706],{"class":147,"line":639},[145,18707,377],{"emptyLinePlaceholder":58},[145,18709,18710,18712,18714],{"class":147,"line":654},[145,18711,12197],{"class":263},[145,18713,267],{"class":259},[145,18715,18214],{"class":263},[11,18717,18718],{},"以下是实际效果展示 —— 一个画中角色伸手去拿放在她画框前面的产品（一杯咖啡）：",[56,18720,60,18721],{"controls":58,"playsInline":58,"style":59},[62,18722],{"src":18723,"type":65},"https://cdn.evolink.ai/seedance2api/%E7%94%BB%E4%B8%AD%E5%A5%B3%E4%BA%BA%E5%81%B7%E5%96%9D%E5%92%96%E5%95%A1.mp4",[11,18725,18726],{},[2614,18727,18728,18729,18731],{},"此演示展示了 ",[28,18730,2903],{},"（角色/产品引用）如何保持视觉一致性，同时模型生成与道具和环境的自然交互。同样的原理适用于任何产品场景化视频。",[11,18733,18734,18736,18737,18740],{},[28,18735,2914],{}," 引用为模型提供了一个具体的环境参考，而不是仅凭文本描述来凭空生成。这会产生更真实、更一致的结果。",[37,18738,18739],{"href":2962},"@tags 系统","支持最多九张图片，因此你可以为复杂场景叠加多张参考图。",[92,18742,18743],{"id":18743},"按品类推荐的生活场景",[2036,18745,18746,18758],{},[2039,18747,18748],{},[2042,18749,18750,18753,18755],{},[2045,18751,18752],{},"产品品类",[2045,18754,8244],{},[2045,18756,18757],{},"提示词关键词",[2052,18759,18760,18771,18782,18793,18804,18815],{},[2042,18761,18762,18765,18768],{},[2057,18763,18764],{},"饮具",[2057,18766,18767],{},"咖啡馆桌面、厨房台面、户外露台",[2057,18769,18770],{},"steam rising, morning light, cozy atmosphere",[2042,18772,18773,18776,18779],{},[2057,18774,18775],{},"手表",[2057,18777,18778],{},"手握方向盘、办公桌旁、户外探险",[2057,18780,18781],{},"natural wrist movement, lifestyle context, candid feel",[2042,18783,18784,18787,18790],{},[2057,18785,18786],{},"耳机",[2057,18788,18789],{},"火车上的通勤者、公园跑步者、课桌前的学生",[2057,18791,18792],{},"wearing naturally, ambient environment, in-use",[2042,18794,18795,18798,18801],{},[2057,18796,18797],{},"护肤品",[2057,18799,18800],{},"浴室梳妆台、水疗场景、卧室床头柜",[2057,18802,18803],{},"soft lighting, clean aesthetic, self-care moment",[2042,18805,18806,18809,18812],{},[2057,18807,18808],{},"家具",[2057,18810,18811],{},"阳光充足的客厅、精心布置的公寓",[2057,18813,18814],{},"room context, natural scale, interior design",[2042,18816,18817,18820,18823],{},[2057,18818,18819],{},"箱包",[2057,18821,18822],{},"街头风格、机场航站楼、办公室入口",[2057,18824,18825],{},"walking motion, casual carry, urban setting",[11,18827,18828],{},"生活场景视频的关键在于具体性。\"A person using the product\" 会生成泛泛的结果。\"A hand reaches in and wraps around the mug\" 则创造了一个有意图的瞬间。描述微观动作，而非宏观概念。",[92,18830,18832],{"id":18831},"单图-vs-双图生活场景","单图 vs. 双图生活场景",[11,18834,18835,18836,18838,18839,18841],{},"你可以仅用一张产品图片生成生活场景视频 —— 在提示词中完整描述场景即可。双图模式（",[28,18837,2903],{}," + ",[28,18840,2914],{},"）能产生更一致的环境效果，因为模型有场景的视觉参考，而不仅仅是文本描述。",[11,18843,18844],{},"各方式的适用场景：",[96,18846,18847,18853],{},[73,18848,18849,18852],{},[23,18850,18851],{},"单图 + 描述性提示词："," 快速简便。适合场景较为通用的情况（如 \"on a desk\"、\"in a kitchen\"）。无需准备第二张参考图。",[73,18854,18855,18858],{},[23,18856,18857],{},"双图（产品 + 场景参考）："," 合成质量更高。适用于特定环境很重要的场景 —— 特定的咖啡馆美学、品牌零售空间、与品牌指南匹配的精心策划的生活场景。",[11,18860,18861,18862,18864,18865,18867],{},"在双图模式中，场景参考图不一定要是你自己拍的照片。库存图片也可以很好地作为环境参考。模型会从 ",[28,18863,2914],{}," 中提取光照、色彩方案和空间布局，用于为 ",[28,18866,2903],{}," 建立场景上下文。",[11,18869,18870,18871,18873,18874,298],{},"注意宽高比的变化：Instagram Reels 和 TikTok 的生活场景内容使用 ",[28,18872,1810],{},"。将宽高比与视频将要发布的平台匹配。更多内容请参阅下方的",[37,18875,18877],{"href":18876},"#%E5%A4%9A%E5%B9%B3%E5%8F%B0%E5%AF%BC%E5%87%BA%E4%B8%BA%E6%AF%8F%E4%B8%AA%E6%B8%A0%E9%81%93%E5%8C%B9%E9%85%8D%E5%AE%BD%E9%AB%98%E6%AF%94","多平台导出章节",[48,18879,18881],{"id":18880},"视频类型-4材质特写微距细节","视频类型 4：材质特写（微距细节）",[11,18883,18884],{},"质感能卖出高端产品。皮革的纹理、铝材的拉丝处理、羊绒毛衣的编织 —— 这些细节以全景镜头无法实现的方式传达品质。缓慢展示表面细节的微距特写视频是奢侈品和手工制品中转化率最高的格式之一。",[136,18886,18888],{"className":339,"code":18887,"language":341,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"image_urls\": [\n        \"https://your-cdn.com/products/leather-wallet.jpg\"\n    ],\n    \"prompt\": (\n        \"@Image1 is a full-grain leather bifold wallet. Extreme macro \"\n        \"close-up. The camera slowly glides across the leather surface, \"\n        \"revealing grain texture and hand-stitched seams. Shallow depth \"\n        \"of field with creamy bokeh. Warm directional lighting rakes \"\n        \"across the surface, emphasizing every pore and fiber. The camera \"\n        \"pulls back gradually to reveal the full wallet. Luxury product \"\n        \"photography in motion.\"\n    ),\n    \"duration\": 8,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\"\n}\n\nresult = create_and_wait(payload)\n",[28,18889,18890,18898,18908,18914,18919,18923,18929,18934,18939,18944,18949,18954,18959,18964,18968,18978,18988,18996,19000,19004],{"__ignoreMap":141},[145,18891,18892,18894,18896],{"class":147,"line":148},[145,18893,3654],{"class":263},[145,18895,267],{"class":259},[145,18897,429],{"class":263},[145,18899,18900,18902,18904,18906],{"class":147,"line":166},[145,18901,3663],{"class":159},[145,18903,438],{"class":263},[145,18905,1309],{"class":159},[145,18907,453],{"class":263},[145,18909,18910,18912],{"class":147,"line":178},[145,18911,15319],{"class":159},[145,18913,2686],{"class":263},[145,18915,18916],{"class":147,"line":187},[145,18917,18918],{"class":159},"        \"https://your-cdn.com/products/leather-wallet.jpg\"\n",[145,18920,18921],{"class":147,"line":374},[145,18922,16301],{"class":263},[145,18924,18925,18927],{"class":147,"line":380},[145,18926,3674],{"class":159},[145,18928,1323],{"class":263},[145,18930,18931],{"class":147,"line":386},[145,18932,18933],{"class":159},"        \"@Image1 is a full-grain leather bifold wallet. Extreme macro \"\n",[145,18935,18936],{"class":147,"line":410},[145,18937,18938],{"class":159},"        \"close-up. The camera slowly glides across the leather surface, \"\n",[145,18940,18941],{"class":147,"line":421},[145,18942,18943],{"class":159},"        \"revealing grain texture and hand-stitched seams. Shallow depth \"\n",[145,18945,18946],{"class":147,"line":432},[145,18947,18948],{"class":159},"        \"of field with creamy bokeh. Warm directional lighting rakes \"\n",[145,18950,18951],{"class":147,"line":456},[145,18952,18953],{"class":159},"        \"across the surface, emphasizing every pore and fiber. The camera \"\n",[145,18955,18956],{"class":147,"line":467},[145,18957,18958],{"class":159},"        \"pulls back gradually to reveal the full wallet. Luxury product \"\n",[145,18960,18961],{"class":147,"line":600},[145,18962,18963],{"class":159},"        \"photography in motion.\"\n",[145,18965,18966],{"class":147,"line":605},[145,18967,3797],{"class":263},[145,18969,18970,18972,18974,18976],{"class":147,"line":611},[145,18971,3686],{"class":159},[145,18973,438],{"class":263},[145,18975,3691],{"class":155},[145,18977,453],{"class":263},[145,18979,18980,18982,18984,18986],{"class":147,"line":617},[145,18981,3698],{"class":159},[145,18983,438],{"class":263},[145,18985,3703],{"class":159},[145,18987,453],{"class":263},[145,18989,18990,18992,18994],{"class":147,"line":623},[145,18991,3710],{"class":159},[145,18993,438],{"class":263},[145,18995,2725],{"class":159},[145,18997,18998],{"class":147,"line":628},[145,18999,470],{"class":263},[145,19001,19002],{"class":147,"line":639},[145,19003,377],{"emptyLinePlaceholder":58},[145,19005,19006,19008,19010],{"class":147,"line":654},[145,19007,12197],{"class":263},[145,19009,267],{"class":259},[145,19011,18214],{"class":263},[92,19013,19014],{"id":19014},"微距提示词词汇表",[11,19016,19017],{},"模型对特定的电影摄影术语反应强烈。使用以下术语来控制微距效果：",[96,19019,19020,19026,19032,19038,19044],{},[73,19021,19022,19025],{},[23,19023,19024],{},"\"Extreme macro close-up\""," —— 触发对表面细节的紧凑取景",[73,19027,19028,19031],{},[23,19029,19030],{},"\"Shallow depth of field\" / \"creamy bokeh\""," —— 模糊背景，突出细节",[73,19033,19034,19037],{},[23,19035,19036],{},"\"Raking light\" / \"directional lighting\""," —— 通过阴影强调表面纹理",[73,19039,19040,19043],{},[23,19041,19042],{},"\"Camera glides across\""," —— 平滑的横向运动，逐步展示纹理",[73,19045,19046,19049],{},[23,19047,19048],{},"\"Surface texture reveal\""," —— 明确指示聚焦材质品质",[92,19051,19052],{"id":19052},"针对不同材质的提示词",[11,19054,19055,19058],{},[23,19056,19057],{},"皮革："," 聚焦纹理、缝线、包浆。使用暖色灯光。",[136,19060,19063],{"className":19061,"code":19062,"language":2183},[2181],"Extreme macro on full-grain leather surface. Raking warm light reveals\nnatural grain variation and hand-stitched seam detail. Camera drifts\nslowly across the material. Shallow depth of field.\n",[28,19064,19062],{"__ignoreMap":141},[11,19066,19067,19070],{},[23,19068,19069],{},"金属（拉丝/抛光）："," 聚焦反射、加工痕迹、精密度。",[136,19072,19075],{"className":19073,"code":19074,"language":2183},[2181],"Extreme close-up of brushed stainless steel surface. Cool directional\nlight creates long specular highlights across machined grooves. Camera\ntracks along the edge. Mirror-like reflections shift with the angle.\n",[28,19076,19074],{"__ignoreMap":141},[11,19078,19079,19082],{},[23,19080,19081],{},"面料/纺织品："," 聚焦编织图案、纤维细节、垂坠感。",[136,19084,19087],{"className":19085,"code":19086,"language":2183},[2181],"Macro view of cashmere knit fabric. Soft diffused light reveals\nindividual fiber structure and weave pattern. Camera slowly pans\nacross the textile. Gentle motion shows natural drape and softness.\n",[28,19088,19086],{"__ignoreMap":141},[11,19090,19091,19094],{},[23,19092,19093],{},"木纹："," 聚焦年轮、涂层、自然纹理变化。",[136,19096,19099],{"className":19097,"code":19098,"language":2183},[2181],"Extreme macro of walnut wood surface with oil finish. Warm side\nlighting reveals growth rings and natural color variation. Camera\nglides along the grain direction. Rich, organic texture detail.\n",[28,19100,19098],{"__ignoreMap":141},[11,19102,19103,19104,298],{},"这些材质特写作为产品列表中的第二或第三个视频特别有效。在客户看到完整产品（旋转或主视觉）之后，微距细节视频能进一步强化品质认知。关于增强这些展示效果的镜头运动技巧，请参阅",[37,19105,19106],{"href":3849},"镜头运动指南",[48,19108,19110],{"id":19109},"视频类型-5开箱揭幕","视频类型 5：开箱揭幕",[11,19112,19113],{},"开箱视频在 YouTube 和社交平台上大行其道是有原因的：它们模拟了购买体验。打开包装的期待、第一眼看到产品的惊喜、精心设计的开箱体验带来的满足感 —— 这种格式触及了购买行为的情感高峰。",[136,19115,19117],{"className":339,"code":19116,"language":341,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"image_urls\": [\n        \"https://your-cdn.com/products/smartwatch-boxed.jpg\"\n    ],\n    \"prompt\": (\n        \"@Image1 is a premium smartwatch in its retail packaging. \"\n        \"Hands gently lift the box lid, revealing tissue paper inside. \"\n        \"The tissue parts to unveil the watch nestled in a molded insert. \"\n        \"Soft overhead lighting. The watch face catches the light as \"\n        \"it's lifted from the box. Close-up of the clasp clicking shut \"\n        \"on a wrist. Smooth, deliberate pacing. Unboxing experience \"\n        \"video. Premium commercial quality.\"\n    ),\n    \"duration\": 12,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"9:16\"\n}\n\nresult = create_and_wait(payload)\n",[28,19118,19119,19127,19137,19143,19148,19152,19158,19163,19168,19173,19178,19183,19188,19193,19197,19207,19217,19225,19229,19233],{"__ignoreMap":141},[145,19120,19121,19123,19125],{"class":147,"line":148},[145,19122,3654],{"class":263},[145,19124,267],{"class":259},[145,19126,429],{"class":263},[145,19128,19129,19131,19133,19135],{"class":147,"line":166},[145,19130,3663],{"class":159},[145,19132,438],{"class":263},[145,19134,1309],{"class":159},[145,19136,453],{"class":263},[145,19138,19139,19141],{"class":147,"line":178},[145,19140,15319],{"class":159},[145,19142,2686],{"class":263},[145,19144,19145],{"class":147,"line":187},[145,19146,19147],{"class":159},"        \"https://your-cdn.com/products/smartwatch-boxed.jpg\"\n",[145,19149,19150],{"class":147,"line":374},[145,19151,16301],{"class":263},[145,19153,19154,19156],{"class":147,"line":380},[145,19155,3674],{"class":159},[145,19157,1323],{"class":263},[145,19159,19160],{"class":147,"line":386},[145,19161,19162],{"class":159},"        \"@Image1 is a premium smartwatch in its retail packaging. \"\n",[145,19164,19165],{"class":147,"line":410},[145,19166,19167],{"class":159},"        \"Hands gently lift the box lid, revealing tissue paper inside. \"\n",[145,19169,19170],{"class":147,"line":421},[145,19171,19172],{"class":159},"        \"The tissue parts to unveil the watch nestled in a molded insert. \"\n",[145,19174,19175],{"class":147,"line":432},[145,19176,19177],{"class":159},"        \"Soft overhead lighting. The watch face catches the light as \"\n",[145,19179,19180],{"class":147,"line":456},[145,19181,19182],{"class":159},"        \"it's lifted from the box. Close-up of the clasp clicking shut \"\n",[145,19184,19185],{"class":147,"line":467},[145,19186,19187],{"class":159},"        \"on a wrist. Smooth, deliberate pacing. Unboxing experience \"\n",[145,19189,19190],{"class":147,"line":600},[145,19191,19192],{"class":159},"        \"video. Premium commercial quality.\"\n",[145,19194,19195],{"class":147,"line":605},[145,19196,3797],{"class":263},[145,19198,19199,19201,19203,19205],{"class":147,"line":611},[145,19200,3686],{"class":159},[145,19202,438],{"class":263},[145,19204,16342],{"class":155},[145,19206,453],{"class":263},[145,19208,19209,19211,19213,19215],{"class":147,"line":617},[145,19210,3698],{"class":159},[145,19212,438],{"class":263},[145,19214,3703],{"class":159},[145,19216,453],{"class":263},[145,19218,19219,19221,19223],{"class":147,"line":623},[145,19220,3710],{"class":159},[145,19222,438],{"class":263},[145,19224,18699],{"class":159},[145,19226,19227],{"class":147,"line":628},[145,19228,470],{"class":263},[145,19230,19231],{"class":147,"line":639},[145,19232,377],{"emptyLinePlaceholder":58},[145,19234,19235,19237,19239],{"class":147,"line":654},[145,19236,12197],{"class":263},[145,19238,267],{"class":259},[145,19240,18214],{"class":263},[11,19242,19243],{},"开箱格式在较长时长下效果最好 —— 10 到 15 秒 —— 因为它讲述了一个有开头（密封盒子）、中间（揭幕）和结尾（产品使用或展示）的故事。较短的片段会截断叙事弧线并失去情感回报。",[92,19245,19246],{"id":19246},"开箱提示词结构",[11,19248,19249],{},"一条有效的开箱提示词遵循三幕结构：",[11,19251,19252,19255],{},[23,19253,19254],{},"第一幕 —— 包装（2–3 秒）。"," 建立包装场景。描述双手与密封盒子的互动、包装材质、任何品牌元素。",[11,19257,19258,19261],{},[23,19259,19260],{},"第二幕 —— 揭幕（4–6 秒）。"," 盒盖打开。薄纸、泡沫衬垫或保护层分开。产品首次可见。这是情感高潮 —— 用感官细节来描述。",[11,19263,19264,19267],{},[23,19265,19266],{},"第三幕 —— 产品（3–5 秒）。"," 产品被取出、展示或投入使用。手表戴上手腕。耳机放入耳中。手机屏幕亮起。这完成了购买的想象体验。",[11,19269,19270],{},"对于包装独特或高端的产品，使用展示盒子的照片作为输入图像。如果你只有白底产品照片，在提示词中描述包装，让模型生成。当你提供实际包装的参考图像时，结果会更加一致。",[11,19272,19273,19274,19276],{},"9:16 竖屏格式在这里占主导地位，因为开箱内容主要存在于 Instagram Reels、TikTok 和 YouTube Shorts。对于产品页面，可以考虑使用更紧凑取景的 16:9 版本。",[37,19275,19106],{"href":3849},"介绍了如何描述戏剧性揭幕和俯拍角度以增强开箱序列。",[92,19278,19279],{"id":19279},"包装作为营销资产",[11,19281,19282],{},"高端品牌在包装设计上投入大量资源 —— 而开箱视频正是这项投资在镜头前得到回报的地方。如果你的产品拥有独特包装（定制盒子、磁吸扣、浮雕 logo、品牌薄纸），请确保输入图像捕捉的是包装状态，而不仅仅是产品本身。",[11,19284,19285],{},"对于没有奢华包装的产品 —— 标准牛皮纸盒、塑料快递袋、简约零售包装 —— 你仍然可以创造出令人向往的开箱体验。包装平淡的产品同样可以制作出引人注目的开箱视频。将提示词聚焦于揭幕时刻 —— 密封盒子和内部产品之间的对比。即使包装普通，叙事弧线也能撑起整个视频。",[92,19287,19288],{"id":19288},"组合视频类型打造完整的产品列表",[11,19290,19291],{},"最有效的产品列表会组合使用多种视频类型。产品页面的强力组合：",[70,19293,19294,19300,19306,19312],{},[73,19295,19296,19299],{},[23,19297,19298],{},"主视觉","（第一个视频）—— 抓住注意力，建立高端定位",[73,19301,19302,19305],{},[23,19303,19304],{},"360° 旋转","（第二个视频）—— 从各个角度展示产品",[73,19307,19308,19311],{},[23,19309,19310],{},"微距特写","（第三个视频）—— 通过材质细节证明品质",[73,19313,19314,19317],{},[23,19315,19316],{},"生活场景","（第四个视频）—— 帮助客户想象拥有后的感觉",[11,19319,19320],{},"在社交媒体推广同一产品时，以主视觉或开箱揭幕打头阵（两者都针对信息流中的快速滑动优化），然后用生活场景和旋转内容进行再营销。",[11,19322,19323],{},"从一张产品照片出发，在一次流水线运行中生成所有五种类型。下一章节的批量系统会自动处理这一切。",[48,19325,19327],{"id":19326},"多平台导出为每个渠道匹配宽高比","多平台导出：为每个渠道匹配宽高比",[11,19329,19330],{},"一条产品视频是有用的。同一视频在你所有渠道所需的每种格式中都有，这才是一套系统。每个平台都有不同的宽高比偏好、自动播放行为和时长最佳范围。生成一条视频然后裁剪来适配会破坏构图。原生为每种比例生成则能产出针对每个屏幕正确构图的视频。",[2036,19332,19333,19347],{},[2039,19334,19335],{},[2042,19336,19337,19339,19341,19344],{},[2045,19338,13753],{},[2045,19340,18283],{},[2045,19342,19343],{},"推荐时长",[2045,19345,19346],{},"备注",[2052,19348,19349,19362,19374,19387,19400,19412,19426,19439,19451],{},[2042,19350,19351,19354,19356,19359],{},[2057,19352,19353],{},"Amazon 产品页",[2057,19355,1806],{},[2057,19357,19358],{},"6–8 秒",[2057,19360,19361],{},"简洁、信息丰富。列表中自动播放。",[2042,19363,19364,19367,19369,19371],{},[2057,19365,19366],{},"Shopify 产品页",[2057,19368,1806],{},[2057,19370,18275],{},[2057,19372,19373],{},"主视觉自动播放或图库嵌入。",[2042,19375,19376,19379,19381,19384],{},[2057,19377,19378],{},"Instagram Reels",[2057,19380,1810],{},[2057,19382,19383],{},"8–10 秒",[2057,19385,19386],{},"吸引眼球，偏好快节奏。",[2042,19388,19389,19392,19394,19397],{},[2057,19390,19391],{},"TikTok",[2057,19393,1810],{},[2057,19395,19396],{},"8–15 秒",[2057,19398,19399],{},"潮流风格，动态转场。",[2042,19401,19402,19405,19407,19409],{},[2057,19403,19404],{},"Facebook 信息流",[2057,19406,1814],{},[2057,19408,19358],{},[2057,19410,19411],{},"方形格式最大化信息流展示面积。",[2042,19413,19414,19417,19420,19423],{},[2057,19415,19416],{},"Pinterest 视频图钉",[2057,19418,19419],{},"1:1 或 9:16",[2057,19421,19422],{},"6–15 秒",[2057,19424,19425],{},"竖版在移动端表现最佳。",[2042,19427,19428,19431,19433,19436],{},[2057,19429,19430],{},"网站主视觉横幅",[2057,19432,1806],{},[2057,19434,19435],{},"4–6 秒",[2057,19437,19438],{},"短循环，自动播放，无音频。",[2042,19440,19441,19444,19446,19448],{},[2057,19442,19443],{},"YouTube Shorts",[2057,19445,1810],{},[2057,19447,19396],{},[2057,19449,19450],{},"类似 TikTok 格式。",[2042,19452,19453,19456,19458,19460],{},[2057,19454,19455],{},"邮件营销",[2057,19457,1806],{},[2057,19459,19435],{},[2057,19461,19462],{},"GIF 降级方案，控制文件大小。",[92,19464,19465],{"id":19465},"一次性生成所有比例",[11,19467,19468],{},"使用简单的循环为你所有渠道所需的每种比例生成同一产品视频：",[136,19470,19472],{"className":339,"code":19471,"language":341,"meta":141,"style":141},"platform_configs = [\n    {\"name\": \"amazon\",    \"aspect_ratio\": \"16:9\", \"duration\": 8},\n    {\"name\": \"instagram\", \"aspect_ratio\": \"9:16\", \"duration\": 10},\n    {\"name\": \"facebook\",  \"aspect_ratio\": \"1:1\",  \"duration\": 8},\n    {\"name\": \"website\",   \"aspect_ratio\": \"16:9\", \"duration\": 5},\n]\n\nbase_prompt = (\n    \"@Image1 is a premium wireless speaker. The speaker rotates slowly \"\n    \"on a matte black surface under soft studio lighting. Clean, minimal \"\n    \"aesthetic. Commercial product video quality.\"\n)\n\ntasks = []\nfor config in platform_configs:\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"image_urls\": [\"https://your-cdn.com/products/speaker.jpg\"],\n        \"prompt\": base_prompt,\n        \"duration\": config[\"duration\"],\n        \"quality\": \"1080p\",\n        \"aspect_ratio\": config[\"aspect_ratio\"]\n    }\n    task = generate_video(payload)\n    tasks.append({\"platform\": config[\"name\"], \"task_id\": task[\"task_id\"]})\n    print(f\"📐 {config['name']} ({config['aspect_ratio']}): {task['task_id']}\")\n    time.sleep(1)  # Rate limiting\n\n# Collect results\nfor t in tasks:\n    result = wait_for_video(t[\"task_id\"])\n    print(f\"✅ {t['platform']}: {result['output']['video_url']}\")\n",[28,19473,19474,19483,19516,19545,19574,19604,19608,19612,19622,19627,19632,19637,19641,19645,19654,19666,19674,19684,19695,19702,19713,19723,19733,19737,19745,19769,19823,19836,19840,19845,19857,19870],{"__ignoreMap":141},[145,19475,19476,19479,19481],{"class":147,"line":148},[145,19477,19478],{"class":263},"platform_configs ",[145,19480,267],{"class":259},[145,19482,8843],{"class":263},[145,19484,19485,19488,19491,19493,19496,19499,19501,19503,19505,19507,19509,19511,19513],{"class":147,"line":166},[145,19486,19487],{"class":263},"    {",[145,19489,19490],{"class":159},"\"name\"",[145,19492,438],{"class":263},[145,19494,19495],{"class":159},"\"amazon\"",[145,19497,19498],{"class":263},",    ",[145,19500,6148],{"class":159},[145,19502,438],{"class":263},[145,19504,1385],{"class":159},[145,19506,401],{"class":263},[145,19508,5946],{"class":159},[145,19510,438],{"class":263},[145,19512,3691],{"class":155},[145,19514,19515],{"class":263},"},\n",[145,19517,19518,19520,19522,19524,19527,19529,19531,19533,19535,19537,19539,19541,19543],{"class":147,"line":178},[145,19519,19487],{"class":263},[145,19521,19490],{"class":159},[145,19523,438],{"class":263},[145,19525,19526],{"class":159},"\"instagram\"",[145,19528,401],{"class":263},[145,19530,6148],{"class":159},[145,19532,438],{"class":263},[145,19534,3715],{"class":159},[145,19536,401],{"class":263},[145,19538,5946],{"class":159},[145,19540,438],{"class":263},[145,19542,537],{"class":155},[145,19544,19515],{"class":263},[145,19546,19547,19549,19551,19553,19556,19558,19560,19562,19564,19566,19568,19570,19572],{"class":147,"line":187},[145,19548,19487],{"class":263},[145,19550,19490],{"class":159},[145,19552,438],{"class":263},[145,19554,19555],{"class":159},"\"facebook\"",[145,19557,1448],{"class":263},[145,19559,6148],{"class":159},[145,19561,438],{"class":263},[145,19563,6120],{"class":159},[145,19565,1448],{"class":263},[145,19567,5946],{"class":159},[145,19569,438],{"class":263},[145,19571,3691],{"class":155},[145,19573,19515],{"class":263},[145,19575,19576,19578,19580,19582,19585,19588,19590,19592,19594,19596,19598,19600,19602],{"class":147,"line":374},[145,19577,19487],{"class":263},[145,19579,19490],{"class":159},[145,19581,438],{"class":263},[145,19583,19584],{"class":159},"\"website\"",[145,19586,19587],{"class":263},",   ",[145,19589,6148],{"class":159},[145,19591,438],{"class":263},[145,19593,1385],{"class":159},[145,19595,401],{"class":263},[145,19597,5946],{"class":159},[145,19599,438],{"class":263},[145,19601,1353],{"class":155},[145,19603,19515],{"class":263},[145,19605,19606],{"class":147,"line":380},[145,19607,764],{"class":263},[145,19609,19610],{"class":147,"line":386},[145,19611,377],{"emptyLinePlaceholder":58},[145,19613,19614,19617,19619],{"class":147,"line":410},[145,19615,19616],{"class":263},"base_prompt ",[145,19618,267],{"class":259},[145,19620,19621],{"class":263}," (\n",[145,19623,19624],{"class":147,"line":421},[145,19625,19626],{"class":159},"    \"@Image1 is a premium wireless speaker. The speaker rotates slowly \"\n",[145,19628,19629],{"class":147,"line":432},[145,19630,19631],{"class":159},"    \"on a matte black surface under soft studio lighting. Clean, minimal \"\n",[145,19633,19634],{"class":147,"line":456},[145,19635,19636],{"class":159},"    \"aesthetic. Commercial product video quality.\"\n",[145,19638,19639],{"class":147,"line":467},[145,19640,407],{"class":263},[145,19642,19643],{"class":147,"line":600},[145,19644,377],{"emptyLinePlaceholder":58},[145,19646,19647,19650,19652],{"class":147,"line":605},[145,19648,19649],{"class":263},"tasks ",[145,19651,267],{"class":259},[145,19653,5856],{"class":263},[145,19655,19656,19658,19661,19663],{"class":147,"line":611},[145,19657,8207],{"class":259},[145,19659,19660],{"class":263}," config ",[145,19662,1181],{"class":259},[145,19664,19665],{"class":263}," platform_configs:\n",[145,19667,19668,19670,19672],{"class":147,"line":617},[145,19669,1295],{"class":263},[145,19671,267],{"class":259},[145,19673,429],{"class":263},[145,19675,19676,19678,19680,19682],{"class":147,"line":623},[145,19677,1304],{"class":159},[145,19679,438],{"class":263},[145,19681,1309],{"class":159},[145,19683,453],{"class":263},[145,19685,19686,19688,19690,19693],{"class":147,"line":628},[145,19687,2683],{"class":159},[145,19689,10809],{"class":263},[145,19691,19692],{"class":159},"\"https://your-cdn.com/products/speaker.jpg\"",[145,19694,10815],{"class":263},[145,19696,19697,19699],{"class":147,"line":639},[145,19698,1320],{"class":159},[145,19700,19701],{"class":263},": base_prompt,\n",[145,19703,19704,19706,19709,19711],{"class":147,"line":654},[145,19705,1348],{"class":159},[145,19707,19708],{"class":263},": config[",[145,19710,5946],{"class":159},[145,19712,10815],{"class":263},[145,19714,19715,19717,19719,19721],{"class":147,"line":660},[145,19716,1364],{"class":159},[145,19718,438],{"class":263},[145,19720,3703],{"class":159},[145,19722,453],{"class":263},[145,19724,19725,19727,19729,19731],{"class":147,"line":671},[145,19726,1380],{"class":159},[145,19728,19708],{"class":263},[145,19730,6148],{"class":159},[145,19732,764],{"class":263},[145,19734,19735],{"class":147,"line":698},[145,19736,1408],{"class":263},[145,19738,19739,19741,19743],{"class":147,"line":710},[145,19740,1497],{"class":263},[145,19742,267],{"class":259},[145,19744,16838],{"class":263},[145,19746,19747,19750,19753,19755,19757,19759,19761,19764,19766],{"class":147,"line":716},[145,19748,19749],{"class":263},"    tasks.append({",[145,19751,19752],{"class":159},"\"platform\"",[145,19754,19708],{"class":263},[145,19756,19490],{"class":159},[145,19758,10723],{"class":263},[145,19760,7673],{"class":159},[145,19762,19763],{"class":263},": task[",[145,19765,7673],{"class":159},[145,19767,19768],{"class":263},"]})\n",[145,19770,19771,19773,19775,19777,19780,19782,19785,19788,19790,19792,19794,19796,19798,19801,19803,19805,19808,19810,19812,19815,19817,19819,19821],{"class":147,"line":722},[145,19772,1103],{"class":155},[145,19774,794],{"class":263},[145,19776,441],{"class":259},[145,19778,19779],{"class":159},"\"📐 ",[145,19781,685],{"class":155},[145,19783,19784],{"class":263},"config[",[145,19786,19787],{"class":159},"'name'",[145,19789,1536],{"class":263},[145,19791,691],{"class":155},[145,19793,1219],{"class":159},[145,19795,685],{"class":155},[145,19797,19784],{"class":263},[145,19799,19800],{"class":159},"'aspect_ratio'",[145,19802,1536],{"class":263},[145,19804,691],{"class":155},[145,19806,19807],{"class":159},"): ",[145,19809,685],{"class":155},[145,19811,1530],{"class":263},[145,19813,19814],{"class":159},"'task_id'",[145,19816,1536],{"class":263},[145,19818,691],{"class":155},[145,19820,450],{"class":159},[145,19822,407],{"class":263},[145,19824,19825,19828,19830,19833],{"class":147,"line":728},[145,19826,19827],{"class":263},"    time.sleep(",[145,19829,5419],{"class":155},[145,19831,19832],{"class":263},")  ",[145,19834,19835],{"class":174},"# Rate limiting\n",[145,19837,19838],{"class":147,"line":739},[145,19839,377],{"emptyLinePlaceholder":58},[145,19841,19842],{"class":147,"line":744},[145,19843,19844],{"class":174},"# Collect results\n",[145,19846,19847,19849,19852,19854],{"class":147,"line":750},[145,19848,8207],{"class":259},[145,19850,19851],{"class":263}," t ",[145,19853,1181],{"class":259},[145,19855,19856],{"class":263}," tasks:\n",[145,19858,19859,19861,19863,19866,19868],{"class":147,"line":767},[145,19860,1619],{"class":263},[145,19862,267],{"class":259},[145,19864,19865],{"class":263}," wait_for_video(t[",[145,19867,7673],{"class":159},[145,19869,1630],{"class":263},[145,19871,19872,19874,19876,19878,19881,19883,19886,19889,19891,19893,19895,19897,19899,19901,19903,19905,19907,19909,19911],{"class":147,"line":788},[145,19873,1103],{"class":155},[145,19875,794],{"class":263},[145,19877,441],{"class":259},[145,19879,19880],{"class":159},"\"✅ ",[145,19882,685],{"class":155},[145,19884,19885],{"class":263},"t[",[145,19887,19888],{"class":159},"'platform'",[145,19890,1536],{"class":263},[145,19892,691],{"class":155},[145,19894,438],{"class":159},[145,19896,685],{"class":155},[145,19898,11779],{"class":263},[145,19900,17828],{"class":159},[145,19902,1563],{"class":263},[145,19904,17833],{"class":159},[145,19906,1536],{"class":263},[145,19908,691],{"class":155},[145,19910,450],{"class":159},[145,19912,407],{"class":263},[11,19914,19915],{},"这段代码并行提交所有变体（请求之间有 1 秒的间隔用于限流），然后在完成时收集结果。对于 100 款产品跨 4 个平台的目录，总共 400 条视频 —— 生成时间大约相当于看一集电视剧。",[11,19917,19918],{},"此模式提交所有四个变体，然后在完成时收集结果。总生成时间大致等于生成单条视频的时间 —— 四个变体在服务端并行处理。",[92,19920,19921],{"id":19921},"为什么原生比例优于裁剪",[11,19923,19924],{},"提示词在各比例间保持不变。Seedance 2.0 会原生重新构图场景以适配每种宽高比，调整取景和空间布局，而不是裁剪。9:16 竖版的旋转视频会将产品居中放置并留出更多纵向空间；1:1 方形版本则收紧取景以最大化信息流中的产品可见性。",[11,19926,19927],{},"传统视频编辑通过裁剪 16:9 母版文件来处理多平台需求。将中心裁剪为 9:16 会丢失画面两侧。裁剪为 1:1 会丢失上下文。使用 Seedance 2.0，每种比例都是从头生成的 —— 模型会针对每种画幅适当地构图场景。竖版 9:16 的产品旋转视频会为产品留出更多纵向呼吸空间。方形 1:1 版本则收紧取景以最大化社交信息流中的产品可见性。产品始终占据画面中合适的比例。",[92,19929,19930],{"id":19930},"针对各平台的提示词调整",[11,19932,19933],{},"虽然同一基础提示词适用于所有比例，但你可以针对每个平台的内容风格进行优化：",[96,19935,19936,19942,19948,19954,19960],{},[73,19937,19938,19941],{},[23,19939,19940],{},"Amazon/Shopify (16:9)："," 保持简洁和信息性。避免花哨的转场。专注于清晰展示产品。",[73,19943,19944,19947],{},[23,19945,19946],{},"Instagram Reels (9:16)："," 更快的节奏有效。在提示词中添加 \"dynamic\" 或 \"energetic\" 以获得更多视觉运动。",[73,19949,19950,19953],{},[23,19951,19952],{},"TikTok (9:16)："," 更加动感。\"Quick cuts\"、\"trend-style transitions\" 和 \"bold camera movements\" 符合 TikTok 的视觉语言。",[73,19955,19956,19959],{},[23,19957,19958],{},"Facebook 信息流 (1:1)："," 方形格式需要强烈的居中构图。居中描述产品：\"product centered in frame\"。",[73,19961,19962,19965],{},[23,19963,19964],{},"网站主视觉 (16:9)："," 含蓄取胜。\"Slow, hypnotic motion\" 和 \"seamless loop\" 是关键术语。这些视频静音自动播放，因此视觉质量比叙事更重要。",[11,19967,19968,19969,298],{},"完整的 API 参数文档（包括所有支持的比例）请参阅",[37,19970,17198],{"href":14322},[48,19972,19974],{"id":19973},"批量流水线从-csv-目录到视频库","批量流水线：从 CSV 目录到视频库",[11,19976,19977],{},"单个 API 调用适用于测试。生产级电商需要一条流水线：读取产品目录、为每个 SKU 生成视频、处理失败情况、组织输出。本章节将构建这条流水线。",[11,19979,19980],{},"从一个包含产品目录的 CSV 文件开始：",[136,19982,19986],{"className":19983,"code":19984,"language":19985,"meta":141,"style":141},"language-csv shiki shiki-themes github-dark","name,image_url,category,style\nLeather Bifold Wallet,https://cdn.example.com/wallet.jpg,accessories,rotation\nWireless Earbuds Pro,https://cdn.example.com/earbuds.jpg,electronics,hero\nCeramic Pour-Over Set,https://cdn.example.com/pourover.jpg,kitchen,lifestyle\nMerino Wool Scarf,https://cdn.example.com/scarf.jpg,apparel,macro\nSmart Fitness Watch,https://cdn.example.com/watch.jpg,electronics,unboxing\n","csv",[28,19987,19988,19993,19998,20003,20008,20013],{"__ignoreMap":141},[145,19989,19990],{"class":147,"line":148},[145,19991,19992],{},"name,image_url,category,style\n",[145,19994,19995],{"class":147,"line":166},[145,19996,19997],{},"Leather Bifold Wallet,https://cdn.example.com/wallet.jpg,accessories,rotation\n",[145,19999,20000],{"class":147,"line":178},[145,20001,20002],{},"Wireless Earbuds Pro,https://cdn.example.com/earbuds.jpg,electronics,hero\n",[145,20004,20005],{"class":147,"line":187},[145,20006,20007],{},"Ceramic Pour-Over Set,https://cdn.example.com/pourover.jpg,kitchen,lifestyle\n",[145,20009,20010],{"class":147,"line":374},[145,20011,20012],{},"Merino Wool Scarf,https://cdn.example.com/scarf.jpg,apparel,macro\n",[145,20014,20015],{"class":147,"line":380},[145,20016,20017],{},"Smart Fitness Watch,https://cdn.example.com/watch.jpg,electronics,unboxing\n",[11,20019,20020,20022],{},[28,20021,11186],{}," 列映射到本指南涵盖的五种视频类型。以下是完整的流水线：",[136,20024,20026],{"className":339,"code":20025,"language":341,"meta":141,"style":141},"import csv\nimport os\nimport time\nimport requests\nfrom pathlib import Path\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nOUTPUT_DIR = Path(\"./product_videos\")\nOUTPUT_DIR.mkdir(exist_ok=True)\n\nheaders = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\n# Prompt templates keyed by style\nSTYLE_PROMPTS = {\n    \"rotation\": (\n        \"@Image1 is a {name}. The product rotates slowly on a clean surface \"\n        \"under professional studio lighting. Smooth 360-degree turntable \"\n        \"rotation. Commercial product showcase quality.\"\n    ),\n    \"hero\": (\n        \"@Image1 is a {name}. The product emerges dramatically from soft \"\n        \"volumetric fog with a golden backlight. Particles drift upward. \"\n        \"Cinematic slow reveal. Premium advertisement quality.\"\n    ),\n    \"lifestyle\": (\n        \"@Image1 is a {name}. The product is shown in a natural lifestyle \"\n        \"setting, being used in an everyday context. Warm natural lighting. \"\n        \"Shallow depth of field. Authentic lifestyle commercial.\"\n    ),\n    \"macro\": (\n        \"@Image1 is a {name}. Extreme macro close-up. The camera glides \"\n        \"across the surface, revealing material texture and craftsmanship \"\n        \"details. Shallow depth of field. Raking directional light. \"\n        \"Luxury product detail shot.\"\n    ),\n    \"unboxing\": (\n        \"@Image1 is a {name} in retail packaging. Hands lift the lid to \"\n        \"reveal the product inside. Tissue paper parts. The product is \"\n        \"lifted out and displayed. Soft overhead lighting. Premium \"\n        \"unboxing experience video.\"\n    ),\n}\n\nSTYLE_DEFAULTS = {\n    \"rotation\":  {\"duration\": 8,  \"aspect_ratio\": \"16:9\"},\n    \"hero\":      {\"duration\": 10, \"aspect_ratio\": \"16:9\"},\n    \"lifestyle\": {\"duration\": 8,  \"aspect_ratio\": \"9:16\"},\n    \"macro\":     {\"duration\": 8,  \"aspect_ratio\": \"16:9\"},\n    \"unboxing\":  {\"duration\": 12, \"aspect_ratio\": \"9:16\"},\n}\n\n\ndef submit_video_task(name: str, image_url: str, style: str) -> str:\n    \"\"\"Submit a single video generation task. Returns task_id.\"\"\"\n    prompt_template = STYLE_PROMPTS.get(style, STYLE_PROMPTS[\"rotation\"])\n    defaults = STYLE_DEFAULTS.get(style, STYLE_DEFAULTS[\"rotation\"])\n\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"image_urls\": [image_url],\n        \"prompt\": prompt_template.format(name=name),\n        \"duration\": defaults[\"duration\"],\n        \"quality\": \"1080p\",\n        \"aspect_ratio\": defaults[\"aspect_ratio\"],\n    }\n\n    resp = requests.post(\n        f\"{BASE_URL}/videos/generations\", headers=headers, json=payload\n    )\n    resp.raise_for_status()\n    return resp.json()[\"task_id\"]\n\n\ndef poll_task(task_id: str, timeout: int = 300) -> dict:\n    \"\"\"Poll until task completes or fails.\"\"\"\n    elapsed = 0\n    while elapsed \u003C timeout:\n        resp = requests.get(f\"{BASE_URL}/tasks/{task_id}\", headers=headers)\n        resp.raise_for_status()\n        task = resp.json()\n\n        if task[\"status\"] == \"completed\":\n            return task\n        elif task[\"status\"] == \"failed\":\n            raise RuntimeError(f\"Task {task_id} failed: {task.get('error')}\")\n\n        time.sleep(5)\n        elapsed += 5\n\n    raise TimeoutError(f\"Task {task_id} timed out after {timeout}s\")\n\n\ndef download_video(url: str, filepath: Path):\n    \"\"\"Download a video file from a URL.\"\"\"\n    resp = requests.get(url, stream=True)\n    resp.raise_for_status()\n    with open(filepath, \"wb\") as f:\n        for chunk in resp.iter_content(chunk_size=8192):\n            f.write(chunk)\n    print(f\"💾 Saved: {filepath}\")\n\n\ndef process_catalog(csv_path: str, max_retries: int = 2):\n    \"\"\"Process an entire product catalog CSV into videos.\"\"\"\n    # Phase 1: Submit all tasks\n    pending = []\n    with open(csv_path, \"r\") as f:\n        reader = csv.DictReader(f)\n        for row in reader:\n            name = row[\"name\"]\n            image_url = row[\"image_url\"]\n            style = row.get(\"style\", \"rotation\")\n\n            for attempt in range(max_retries + 1):\n                try:\n                    task_id = submit_video_task(name, image_url, style)\n                    pending.append({\n                        \"name\": name,\n                        \"task_id\": task_id,\n                        \"style\": style,\n                    })\n                    print(f\"🎬 Submitted: {name} ({style}) → {task_id}\")\n                    time.sleep(1)  # Rate limiting: 1 request per second\n                    break\n                except requests.exceptions.RequestException as e:\n                    if attempt \u003C max_retries:\n                        print(f\"⚠️  Retry {attempt + 1} for {name}: {e}\")\n                        time.sleep(3)\n                    else:\n                        print(f\"❌ Failed to submit {name}: {e}\")\n\n    # Phase 2: Collect results\n    results = []\n    for item in pending:\n        try:\n            task = poll_task(item[\"task_id\"])\n            video_url = task[\"output\"][\"video_url\"]\n\n            # Generate safe filename\n            safe_name = item[\"name\"].lower().replace(\" \", \"-\")\n            filename = f\"{safe_name}_{item['style']}.mp4\"\n            filepath = OUTPUT_DIR / filename\n\n            download_video(video_url, filepath)\n            results.append({\n                \"name\": item[\"name\"],\n                \"style\": item[\"style\"],\n                \"file\": str(filepath),\n                \"status\": \"success\"\n            })\n        except Exception as e:\n            print(f\"❌ Failed: {item['name']}: {e}\")\n            results.append({\n                \"name\": item[\"name\"],\n                \"style\": item[\"style\"],\n                \"file\": None,\n                \"status\": f\"error: {e}\"\n            })\n\n    # Summary\n    success = sum(1 for r in results if r[\"status\"] == \"success\")\n    print(f\"\\n📊 Complete: {success}/{len(results)} videos generated\")\n    return results\n\n\n# Run it\nresults = process_catalog(\"products.csv\")\n",[28,20027,20028,20035,20041,20047,20053,20065,20069,20077,20085,20099,20114,20118,20126,20142,20150,20154,20158,20163,20172,20179,20190,20195,20200,20204,20211,20220,20225,20230,20234,20241,20250,20255,20260,20264,20271,20280,20285,20290,20295,20299,20306,20315,20320,20325,20330,20334,20338,20342,20351,20374,20397,20420,20443,20465,20469,20473,20477,20505,20510,20532,20552,20556,20564,20574,20581,20596,20607,20617,20627,20631,20635,20643,20668,20672,20676,20687,20691,20695,20719,20724,20732,20742,20774,20778,20786,20790,20806,20812,20828,20862,20866,20874,20883,20887,20917,20921,20925,20939,20944,20960,20964,20981,20999,21003,21025,21029,21033,21057,21062,21067,21076,21094,21104,21116,21130,21144,21163,21167,21187,21194,21204,21209,21217,21225,21233,21238,21277,21289,21294,21306,21318,21359,21368,21375,21404,21408,21413,21421,21433,21439,21452,21469,21473,21478,21503,21539,21555,21559,21564,21569,21581,21592,21604,21614,21619,21629,21662,21666,21676,21686,21697,21716,21720,21724,21729,21767,21803,21809,21813,21817,21822],{"__ignoreMap":141},[145,20029,20030,20032],{"class":147,"line":148},[145,20031,348],{"class":259},[145,20033,20034],{"class":263}," csv\n",[145,20036,20037,20039],{"class":147,"line":166},[145,20038,348],{"class":259},[145,20040,364],{"class":263},[145,20042,20043,20045],{"class":147,"line":178},[145,20044,348],{"class":259},[145,20046,357],{"class":263},[145,20048,20049,20051],{"class":147,"line":187},[145,20050,348],{"class":259},[145,20052,329],{"class":263},[145,20054,20055,20057,20060,20062],{"class":147,"line":374},[145,20056,6707],{"class":259},[145,20058,20059],{"class":263}," pathlib ",[145,20061,348],{"class":259},[145,20063,20064],{"class":263}," Path\n",[145,20066,20067],{"class":147,"line":380},[145,20068,377],{"emptyLinePlaceholder":58},[145,20070,20071,20073,20075],{"class":147,"line":386},[145,20072,389],{"class":155},[145,20074,392],{"class":259},[145,20076,17537],{"class":159},[145,20078,20079,20081,20083],{"class":147,"line":410},[145,20080,413],{"class":155},[145,20082,392],{"class":259},[145,20084,418],{"class":159},[145,20086,20087,20089,20091,20094,20097],{"class":147,"line":421},[145,20088,6782],{"class":155},[145,20090,392],{"class":259},[145,20092,20093],{"class":263}," Path(",[145,20095,20096],{"class":159},"\"./product_videos\"",[145,20098,407],{"class":263},[145,20100,20101,20103,20106,20108,20110,20112],{"class":147,"line":432},[145,20102,6782],{"class":155},[145,20104,20105],{"class":263},".mkdir(",[145,20107,6808],{"class":701},[145,20109,267],{"class":259},[145,20111,1140],{"class":155},[145,20113,407],{"class":263},[145,20115,20116],{"class":147,"line":456},[145,20117,377],{"emptyLinePlaceholder":58},[145,20119,20120,20122,20124],{"class":147,"line":467},[145,20121,17554],{"class":263},[145,20123,267],{"class":259},[145,20125,429],{"class":263},[145,20127,20128,20130,20132,20134,20136,20138,20140],{"class":147,"line":600},[145,20129,435],{"class":159},[145,20131,438],{"class":263},[145,20133,441],{"class":259},[145,20135,444],{"class":159},[145,20137,447],{"class":155},[145,20139,450],{"class":159},[145,20141,453],{"class":263},[145,20143,20144,20146,20148],{"class":147,"line":605},[145,20145,459],{"class":159},[145,20147,438],{"class":263},[145,20149,464],{"class":159},[145,20151,20152],{"class":147,"line":611},[145,20153,470],{"class":263},[145,20155,20156],{"class":147,"line":617},[145,20157,377],{"emptyLinePlaceholder":58},[145,20159,20160],{"class":147,"line":623},[145,20161,20162],{"class":174},"# Prompt templates keyed by style\n",[145,20164,20165,20168,20170],{"class":147,"line":628},[145,20166,20167],{"class":155},"STYLE_PROMPTS",[145,20169,392],{"class":259},[145,20171,429],{"class":263},[145,20173,20174,20177],{"class":147,"line":639},[145,20175,20176],{"class":159},"    \"rotation\"",[145,20178,1323],{"class":263},[145,20180,20181,20184,20187],{"class":147,"line":654},[145,20182,20183],{"class":159},"        \"@Image1 is a ",[145,20185,20186],{"class":155},"{name}",[145,20188,20189],{"class":159},". The product rotates slowly on a clean surface \"\n",[145,20191,20192],{"class":147,"line":660},[145,20193,20194],{"class":159},"        \"under professional studio lighting. Smooth 360-degree turntable \"\n",[145,20196,20197],{"class":147,"line":671},[145,20198,20199],{"class":159},"        \"rotation. Commercial product showcase quality.\"\n",[145,20201,20202],{"class":147,"line":698},[145,20203,3797],{"class":263},[145,20205,20206,20209],{"class":147,"line":710},[145,20207,20208],{"class":159},"    \"hero\"",[145,20210,1323],{"class":263},[145,20212,20213,20215,20217],{"class":147,"line":716},[145,20214,20183],{"class":159},[145,20216,20186],{"class":155},[145,20218,20219],{"class":159},". The product emerges dramatically from soft \"\n",[145,20221,20222],{"class":147,"line":722},[145,20223,20224],{"class":159},"        \"volumetric fog with a golden backlight. Particles drift upward. \"\n",[145,20226,20227],{"class":147,"line":728},[145,20228,20229],{"class":159},"        \"Cinematic slow reveal. Premium advertisement quality.\"\n",[145,20231,20232],{"class":147,"line":739},[145,20233,3797],{"class":263},[145,20235,20236,20239],{"class":147,"line":744},[145,20237,20238],{"class":159},"    \"lifestyle\"",[145,20240,1323],{"class":263},[145,20242,20243,20245,20247],{"class":147,"line":750},[145,20244,20183],{"class":159},[145,20246,20186],{"class":155},[145,20248,20249],{"class":159},". The product is shown in a natural lifestyle \"\n",[145,20251,20252],{"class":147,"line":767},[145,20253,20254],{"class":159},"        \"setting, being used in an everyday context. Warm natural lighting. \"\n",[145,20256,20257],{"class":147,"line":788},[145,20258,20259],{"class":159},"        \"Shallow depth of field. Authentic lifestyle commercial.\"\n",[145,20261,20262],{"class":147,"line":834},[145,20263,3797],{"class":263},[145,20265,20266,20269],{"class":147,"line":839},[145,20267,20268],{"class":159},"    \"macro\"",[145,20270,1323],{"class":263},[145,20272,20273,20275,20277],{"class":147,"line":845},[145,20274,20183],{"class":159},[145,20276,20186],{"class":155},[145,20278,20279],{"class":159},". Extreme macro close-up. The camera glides \"\n",[145,20281,20282],{"class":147,"line":863},[145,20283,20284],{"class":159},"        \"across the surface, revealing material texture and craftsmanship \"\n",[145,20286,20287],{"class":147,"line":872},[145,20288,20289],{"class":159},"        \"details. Shallow depth of field. Raking directional light. \"\n",[145,20291,20292],{"class":147,"line":887},[145,20293,20294],{"class":159},"        \"Luxury product detail shot.\"\n",[145,20296,20297],{"class":147,"line":903},[145,20298,3797],{"class":263},[145,20300,20301,20304],{"class":147,"line":915},[145,20302,20303],{"class":159},"    \"unboxing\"",[145,20305,1323],{"class":263},[145,20307,20308,20310,20312],{"class":147,"line":954},[145,20309,20183],{"class":159},[145,20311,20186],{"class":155},[145,20313,20314],{"class":159}," in retail packaging. Hands lift the lid to \"\n",[145,20316,20317],{"class":147,"line":960},[145,20318,20319],{"class":159},"        \"reveal the product inside. Tissue paper parts. The product is \"\n",[145,20321,20322],{"class":147,"line":965},[145,20323,20324],{"class":159},"        \"lifted out and displayed. Soft overhead lighting. Premium \"\n",[145,20326,20327],{"class":147,"line":971},[145,20328,20329],{"class":159},"        \"unboxing experience video.\"\n",[145,20331,20332],{"class":147,"line":977},[145,20333,3797],{"class":263},[145,20335,20336],{"class":147,"line":989},[145,20337,470],{"class":263},[145,20339,20340],{"class":147,"line":994},[145,20341,377],{"emptyLinePlaceholder":58},[145,20343,20344,20347,20349],{"class":147,"line":5521},[145,20345,20346],{"class":155},"STYLE_DEFAULTS",[145,20348,392],{"class":259},[145,20350,429],{"class":263},[145,20352,20353,20355,20358,20360,20362,20364,20366,20368,20370,20372],{"class":147,"line":5527},[145,20354,20176],{"class":159},[145,20356,20357],{"class":263},":  {",[145,20359,5946],{"class":159},[145,20361,438],{"class":263},[145,20363,3691],{"class":155},[145,20365,1448],{"class":263},[145,20367,6148],{"class":159},[145,20369,438],{"class":263},[145,20371,1385],{"class":159},[145,20373,19515],{"class":263},[145,20375,20376,20378,20381,20383,20385,20387,20389,20391,20393,20395],{"class":147,"line":5555},[145,20377,20208],{"class":159},[145,20379,20380],{"class":263},":      {",[145,20382,5946],{"class":159},[145,20384,438],{"class":263},[145,20386,537],{"class":155},[145,20388,401],{"class":263},[145,20390,6148],{"class":159},[145,20392,438],{"class":263},[145,20394,1385],{"class":159},[145,20396,19515],{"class":263},[145,20398,20399,20401,20404,20406,20408,20410,20412,20414,20416,20418],{"class":147,"line":5586},[145,20400,20238],{"class":159},[145,20402,20403],{"class":263},": {",[145,20405,5946],{"class":159},[145,20407,438],{"class":263},[145,20409,3691],{"class":155},[145,20411,1448],{"class":263},[145,20413,6148],{"class":159},[145,20415,438],{"class":263},[145,20417,3715],{"class":159},[145,20419,19515],{"class":263},[145,20421,20422,20424,20427,20429,20431,20433,20435,20437,20439,20441],{"class":147,"line":5606},[145,20423,20268],{"class":159},[145,20425,20426],{"class":263},":     {",[145,20428,5946],{"class":159},[145,20430,438],{"class":263},[145,20432,3691],{"class":155},[145,20434,1448],{"class":263},[145,20436,6148],{"class":159},[145,20438,438],{"class":263},[145,20440,1385],{"class":159},[145,20442,19515],{"class":263},[145,20444,20445,20447,20449,20451,20453,20455,20457,20459,20461,20463],{"class":147,"line":5612},[145,20446,20303],{"class":159},[145,20448,20357],{"class":263},[145,20450,5946],{"class":159},[145,20452,438],{"class":263},[145,20454,16342],{"class":155},[145,20456,401],{"class":263},[145,20458,6148],{"class":159},[145,20460,438],{"class":263},[145,20462,3715],{"class":159},[145,20464,19515],{"class":263},[145,20466,20467],{"class":147,"line":5618},[145,20468,470],{"class":263},[145,20470,20471],{"class":147,"line":5623},[145,20472,377],{"emptyLinePlaceholder":58},[145,20474,20475],{"class":147,"line":5636},[145,20476,377],{"emptyLinePlaceholder":58},[145,20478,20479,20481,20484,20487,20489,20492,20494,20497,20499,20501,20503],{"class":147,"line":5642},[145,20480,526],{"class":259},[145,20482,20483],{"class":151}," submit_video_task",[145,20485,20486],{"class":263},"(name: ",[145,20488,8649],{"class":155},[145,20490,20491],{"class":263},", image_url: ",[145,20493,8649],{"class":155},[145,20495,20496],{"class":263},", style: ",[145,20498,8649],{"class":155},[145,20500,15775],{"class":263},[145,20502,8649],{"class":155},[145,20504,860],{"class":263},[145,20506,20507],{"class":147,"line":5669},[145,20508,20509],{"class":159},"    \"\"\"Submit a single video generation task. Returns task_id.\"\"\"\n",[145,20511,20512,20515,20517,20520,20523,20525,20527,20530],{"class":147,"line":5709},[145,20513,20514],{"class":263},"    prompt_template ",[145,20516,267],{"class":259},[145,20518,20519],{"class":155}," STYLE_PROMPTS",[145,20521,20522],{"class":263},".get(style, ",[145,20524,20167],{"class":155},[145,20526,7103],{"class":263},[145,20528,20529],{"class":159},"\"rotation\"",[145,20531,1630],{"class":263},[145,20533,20534,20537,20539,20542,20544,20546,20548,20550],{"class":147,"line":5728},[145,20535,20536],{"class":263},"    defaults ",[145,20538,267],{"class":259},[145,20540,20541],{"class":155}," STYLE_DEFAULTS",[145,20543,20522],{"class":263},[145,20545,20346],{"class":155},[145,20547,7103],{"class":263},[145,20549,20529],{"class":159},[145,20551,1630],{"class":263},[145,20553,20554],{"class":147,"line":5733},[145,20555,377],{"emptyLinePlaceholder":58},[145,20557,20558,20560,20562],{"class":147,"line":5738},[145,20559,1295],{"class":263},[145,20561,267],{"class":259},[145,20563,429],{"class":263},[145,20565,20566,20568,20570,20572],{"class":147,"line":5743},[145,20567,1304],{"class":159},[145,20569,438],{"class":263},[145,20571,1309],{"class":159},[145,20573,453],{"class":263},[145,20575,20576,20578],{"class":147,"line":7416},[145,20577,2683],{"class":159},[145,20579,20580],{"class":263},": [image_url],\n",[145,20582,20583,20585,20588,20591,20593],{"class":147,"line":7422},[145,20584,1320],{"class":159},[145,20586,20587],{"class":263},": prompt_template.format(",[145,20589,20590],{"class":701},"name",[145,20592,267],{"class":259},[145,20594,20595],{"class":263},"name),\n",[145,20597,20598,20600,20603,20605],{"class":147,"line":7428},[145,20599,1348],{"class":159},[145,20601,20602],{"class":263},": defaults[",[145,20604,5946],{"class":159},[145,20606,10815],{"class":263},[145,20608,20609,20611,20613,20615],{"class":147,"line":7439},[145,20610,1364],{"class":159},[145,20612,438],{"class":263},[145,20614,3703],{"class":159},[145,20616,453],{"class":263},[145,20618,20619,20621,20623,20625],{"class":147,"line":7450},[145,20620,1380],{"class":159},[145,20622,20602],{"class":263},[145,20624,6148],{"class":159},[145,20626,10815],{"class":263},[145,20628,20629],{"class":147,"line":7461},[145,20630,1408],{"class":263},[145,20632,20633],{"class":147,"line":7466},[145,20634,377],{"emptyLinePlaceholder":58},[145,20636,20637,20639,20641],{"class":147,"line":7472},[145,20638,1127],{"class":263},[145,20640,267],{"class":259},[145,20642,1433],{"class":263},[145,20644,20645,20647,20649,20651,20653,20655,20657,20659,20662,20664,20666],{"class":147,"line":7480},[145,20646,1438],{"class":259},[145,20648,450],{"class":159},[145,20650,679],{"class":155},[145,20652,1445],{"class":159},[145,20654,401],{"class":263},[145,20656,17766],{"class":701},[145,20658,267],{"class":259},[145,20660,20661],{"class":263},"headers, ",[145,20663,1858],{"class":701},[145,20665,267],{"class":259},[145,20667,2783],{"class":263},[145,20669,20670],{"class":147,"line":7494},[145,20671,1484],{"class":263},[145,20673,20674],{"class":147,"line":7499},[145,20675,1147],{"class":263},[145,20677,20678,20680,20683,20685],{"class":147,"line":7513},[145,20679,1704],{"class":259},[145,20681,20682],{"class":263}," resp.json()[",[145,20684,7673],{"class":159},[145,20686,764],{"class":263},[145,20688,20689],{"class":147,"line":7527},[145,20690,377],{"emptyLinePlaceholder":58},[145,20692,20693],{"class":147,"line":7559},[145,20694,377],{"emptyLinePlaceholder":58},[145,20696,20697,20699,20701,20703,20705,20707,20709,20711,20713,20715,20717],{"class":147,"line":7571},[145,20698,526],{"class":259},[145,20700,11650],{"class":151},[145,20702,17684],{"class":263},[145,20704,8649],{"class":155},[145,20706,17700],{"class":263},[145,20708,17692],{"class":155},[145,20710,392],{"class":259},[145,20712,17707],{"class":155},[145,20714,15775],{"class":263},[145,20716,8774],{"class":155},[145,20718,860],{"class":263},[145,20720,20721],{"class":147,"line":7581},[145,20722,20723],{"class":159},"    \"\"\"Poll until task completes or fails.\"\"\"\n",[145,20725,20726,20728,20730],{"class":147,"line":7586},[145,20727,631],{"class":263},[145,20729,267],{"class":259},[145,20731,636],{"class":155},[145,20733,20734,20736,20738,20740],{"class":147,"line":7593},[145,20735,642],{"class":259},[145,20737,645],{"class":263},[145,20739,648],{"class":259},[145,20741,651],{"class":263},[145,20743,20744,20746,20748,20750,20752,20754,20756,20758,20760,20762,20764,20766,20768,20770,20772],{"class":147,"line":7615},[145,20745,6908],{"class":263},[145,20747,267],{"class":259},[145,20749,17745],{"class":263},[145,20751,441],{"class":259},[145,20753,450],{"class":159},[145,20755,679],{"class":155},[145,20757,682],{"class":159},[145,20759,685],{"class":155},[145,20761,688],{"class":263},[145,20763,691],{"class":155},[145,20765,450],{"class":159},[145,20767,401],{"class":263},[145,20769,17766],{"class":701},[145,20771,267],{"class":259},[145,20773,17771],{"class":263},[145,20775,20776],{"class":147,"line":7646},[145,20777,6935],{"class":263},[145,20779,20780,20782,20784],{"class":147,"line":7651},[145,20781,731],{"class":263},[145,20783,267],{"class":259},[145,20785,11734],{"class":263},[145,20787,20788],{"class":147,"line":7657},[145,20789,377],{"emptyLinePlaceholder":58},[145,20791,20792,20794,20796,20798,20800,20802,20804],{"class":147,"line":7682},[145,20793,848],{"class":259},[145,20795,758],{"class":263},[145,20797,761],{"class":159},[145,20799,14864],{"class":263},[145,20801,854],{"class":259},[145,20803,857],{"class":159},[145,20805,860],{"class":263},[145,20807,20808,20810],{"class":147,"line":7687},[145,20809,866],{"class":259},[145,20811,869],{"class":263},[145,20813,20814,20816,20818,20820,20822,20824,20826],{"class":147,"line":7692},[145,20815,875],{"class":259},[145,20817,758],{"class":263},[145,20819,761],{"class":159},[145,20821,14864],{"class":263},[145,20823,854],{"class":259},[145,20825,882],{"class":159},[145,20827,860],{"class":263},[145,20829,20830,20832,20834,20836,20838,20840,20842,20844,20846,20848,20850,20852,20854,20856,20858,20860],{"class":147,"line":7715},[145,20831,906],{"class":259},[145,20833,909],{"class":155},[145,20835,794],{"class":263},[145,20837,441],{"class":259},[145,20839,921],{"class":159},[145,20841,685],{"class":155},[145,20843,688],{"class":263},[145,20845,691],{"class":155},[145,20847,930],{"class":159},[145,20849,685],{"class":155},[145,20851,17876],{"class":263},[145,20853,11831],{"class":159},[145,20855,946],{"class":263},[145,20857,691],{"class":155},[145,20859,450],{"class":159},[145,20861,407],{"class":263},[145,20863,20864],{"class":147,"line":7725},[145,20865,377],{"emptyLinePlaceholder":58},[145,20867,20868,20870,20872],{"class":147,"line":7731},[145,20869,15001],{"class":263},[145,20871,1353],{"class":155},[145,20873,407],{"class":263},[145,20875,20876,20878,20880],{"class":147,"line":7749},[145,20877,980],{"class":263},[145,20879,983],{"class":259},[145,20881,20882],{"class":155}," 5\n",[145,20884,20885],{"class":147,"line":7754},[145,20886,377],{"emptyLinePlaceholder":58},[145,20888,20889,20891,20893,20895,20897,20899,20901,20903,20905,20907,20909,20911,20913,20915],{"class":147,"line":7759},[145,20890,997],{"class":259},[145,20892,1000],{"class":155},[145,20894,794],{"class":263},[145,20896,441],{"class":259},[145,20898,921],{"class":159},[145,20900,685],{"class":155},[145,20902,688],{"class":263},[145,20904,691],{"class":155},[145,20906,1015],{"class":159},[145,20908,685],{"class":155},[145,20910,1020],{"class":263},[145,20912,691],{"class":155},[145,20914,1025],{"class":159},[145,20916,407],{"class":263},[145,20918,20919],{"class":147,"line":7772},[145,20920,377],{"emptyLinePlaceholder":58},[145,20922,20923],{"class":147,"line":7786},[145,20924,377],{"emptyLinePlaceholder":58},[145,20926,20927,20929,20931,20934,20936],{"class":147,"line":7813},[145,20928,526],{"class":259},[145,20930,1083],{"class":151},[145,20932,20933],{"class":263},"(url: ",[145,20935,8649],{"class":155},[145,20937,20938],{"class":263},", filepath: Path):\n",[145,20940,20941],{"class":147,"line":7827},[145,20942,20943],{"class":159},"    \"\"\"Download a video file from a URL.\"\"\"\n",[145,20945,20946,20948,20950,20952,20954,20956,20958],{"class":147,"line":10335},[145,20947,1127],{"class":263},[145,20949,267],{"class":259},[145,20951,1132],{"class":263},[145,20953,1135],{"class":701},[145,20955,267],{"class":259},[145,20957,1140],{"class":155},[145,20959,407],{"class":263},[145,20961,20962],{"class":147,"line":10342},[145,20963,1147],{"class":263},[145,20965,20966,20968,20970,20973,20975,20977,20979],{"class":147,"line":10388},[145,20967,1152],{"class":259},[145,20969,1155],{"class":155},[145,20971,20972],{"class":263},"(filepath, ",[145,20974,1161],{"class":159},[145,20976,1164],{"class":263},[145,20978,1167],{"class":259},[145,20980,1170],{"class":263},[145,20982,20983,20985,20987,20989,20991,20993,20995,20997],{"class":147,"line":10393},[145,20984,1175],{"class":259},[145,20986,1178],{"class":263},[145,20988,1181],{"class":259},[145,20990,1184],{"class":263},[145,20992,1187],{"class":701},[145,20994,267],{"class":259},[145,20996,1192],{"class":155},[145,20998,548],{"class":263},[145,21000,21001],{"class":147,"line":10398},[145,21002,1199],{"class":263},[145,21004,21005,21007,21009,21011,21014,21016,21019,21021,21023],{"class":147,"line":10407},[145,21006,1103],{"class":155},[145,21008,794],{"class":263},[145,21010,441],{"class":259},[145,21012,21013],{"class":159},"\"💾 Saved: ",[145,21015,685],{"class":155},[145,21017,21018],{"class":263},"filepath",[145,21020,691],{"class":155},[145,21022,450],{"class":159},[145,21024,407],{"class":263},[145,21026,21027],{"class":147,"line":10413},[145,21028,377],{"emptyLinePlaceholder":58},[145,21030,21031],{"class":147,"line":10422},[145,21032,377],{"emptyLinePlaceholder":58},[145,21034,21035,21037,21040,21043,21045,21048,21050,21052,21055],{"class":147,"line":10443},[145,21036,526],{"class":259},[145,21038,21039],{"class":151}," process_catalog",[145,21041,21042],{"class":263},"(csv_path: ",[145,21044,8649],{"class":155},[145,21046,21047],{"class":263},", max_retries: ",[145,21049,17692],{"class":155},[145,21051,392],{"class":259},[145,21053,21054],{"class":155}," 2",[145,21056,548],{"class":263},[145,21058,21059],{"class":147,"line":10452},[145,21060,21061],{"class":159},"    \"\"\"Process an entire product catalog CSV into videos.\"\"\"\n",[145,21063,21064],{"class":147,"line":10457},[145,21065,21066],{"class":174},"    # Phase 1: Submit all tasks\n",[145,21068,21069,21072,21074],{"class":147,"line":10470},[145,21070,21071],{"class":263},"    pending ",[145,21073,267],{"class":259},[145,21075,5856],{"class":263},[145,21077,21078,21080,21082,21085,21088,21090,21092],{"class":147,"line":10492},[145,21079,1152],{"class":259},[145,21081,1155],{"class":155},[145,21083,21084],{"class":263},"(csv_path, ",[145,21086,21087],{"class":159},"\"r\"",[145,21089,1164],{"class":263},[145,21091,1167],{"class":259},[145,21093,1170],{"class":263},[145,21095,21096,21099,21101],{"class":147,"line":10499},[145,21097,21098],{"class":263},"        reader ",[145,21100,267],{"class":259},[145,21102,21103],{"class":263}," csv.DictReader(f)\n",[145,21105,21106,21108,21111,21113],{"class":147,"line":10520},[145,21107,1175],{"class":259},[145,21109,21110],{"class":263}," row ",[145,21112,1181],{"class":259},[145,21114,21115],{"class":263}," reader:\n",[145,21117,21118,21121,21123,21126,21128],{"class":147,"line":10525},[145,21119,21120],{"class":263},"            name ",[145,21122,267],{"class":259},[145,21124,21125],{"class":263}," row[",[145,21127,19490],{"class":159},[145,21129,764],{"class":263},[145,21131,21132,21135,21137,21139,21142],{"class":147,"line":10530},[145,21133,21134],{"class":263},"            image_url ",[145,21136,267],{"class":259},[145,21138,21125],{"class":263},[145,21140,21141],{"class":159},"\"image_url\"",[145,21143,764],{"class":263},[145,21145,21146,21149,21151,21154,21157,21159,21161],{"class":147,"line":10536},[145,21147,21148],{"class":263},"            style ",[145,21150,267],{"class":259},[145,21152,21153],{"class":263}," row.get(",[145,21155,21156],{"class":159},"\"style\"",[145,21158,401],{"class":263},[145,21160,20529],{"class":159},[145,21162,407],{"class":263},[145,21164,21165],{"class":147,"line":10545},[145,21166,377],{"emptyLinePlaceholder":58},[145,21168,21169,21171,21173,21175,21177,21180,21182,21185],{"class":147,"line":10554},[145,21170,6957],{"class":259},[145,21172,5104],{"class":263},[145,21174,1181],{"class":259},[145,21176,5109],{"class":155},[145,21178,21179],{"class":263},"(max_retries ",[145,21181,5409],{"class":259},[145,21183,21184],{"class":155}," 1",[145,21186,548],{"class":263},[145,21188,21189,21192],{"class":147,"line":10565},[145,21190,21191],{"class":259},"                try",[145,21193,860],{"class":263},[145,21195,21196,21199,21201],{"class":147,"line":10572},[145,21197,21198],{"class":263},"                    task_id ",[145,21200,267],{"class":259},[145,21202,21203],{"class":263}," submit_video_task(name, image_url, style)\n",[145,21205,21206],{"class":147,"line":10577},[145,21207,21208],{"class":263},"                    pending.append({\n",[145,21210,21211,21214],{"class":147,"line":10582},[145,21212,21213],{"class":159},"                        \"name\"",[145,21215,21216],{"class":263},": name,\n",[145,21218,21219,21222],{"class":147,"line":10587},[145,21220,21221],{"class":159},"                        \"task_id\"",[145,21223,21224],{"class":263},": task_id,\n",[145,21226,21227,21230],{"class":147,"line":10592},[145,21228,21229],{"class":159},"                        \"style\"",[145,21231,21232],{"class":263},": style,\n",[145,21234,21235],{"class":147,"line":10603},[145,21236,21237],{"class":263},"                    })\n",[145,21239,21240,21243,21245,21247,21250,21252,21254,21256,21258,21260,21262,21264,21267,21269,21271,21273,21275],{"class":147,"line":10614},[145,21241,21242],{"class":155},"                    print",[145,21244,794],{"class":263},[145,21246,441],{"class":259},[145,21248,21249],{"class":159},"\"🎬 Submitted: ",[145,21251,685],{"class":155},[145,21253,20590],{"class":263},[145,21255,691],{"class":155},[145,21257,1219],{"class":159},[145,21259,685],{"class":155},[145,21261,11186],{"class":263},[145,21263,691],{"class":155},[145,21265,21266],{"class":159},") → ",[145,21268,685],{"class":155},[145,21270,688],{"class":263},[145,21272,691],{"class":155},[145,21274,450],{"class":159},[145,21276,407],{"class":263},[145,21278,21279,21282,21284,21286],{"class":147,"line":10625},[145,21280,21281],{"class":263},"                    time.sleep(",[145,21283,5419],{"class":155},[145,21285,19832],{"class":263},[145,21287,21288],{"class":174},"# Rate limiting: 1 request per second\n",[145,21290,21291],{"class":147,"line":10634},[145,21292,21293],{"class":259},"                    break\n",[145,21295,21296,21299,21302,21304],{"class":147,"line":10639},[145,21297,21298],{"class":259},"                except",[145,21300,21301],{"class":263}," requests.exceptions.RequestException ",[145,21303,1167],{"class":259},[145,21305,5633],{"class":263},[145,21307,21308,21311,21313,21315],{"class":147,"line":10645},[145,21309,21310],{"class":259},"                    if",[145,21312,5104],{"class":263},[145,21314,648],{"class":259},[145,21316,21317],{"class":263}," max_retries:\n",[145,21319,21320,21323,21325,21327,21330,21332,21334,21336,21338,21341,21343,21345,21347,21349,21351,21353,21355,21357],{"class":147,"line":10654},[145,21321,21322],{"class":155},"                        print",[145,21324,794],{"class":263},[145,21326,441],{"class":259},[145,21328,21329],{"class":159},"\"⚠️  Retry ",[145,21331,685],{"class":155},[145,21333,5438],{"class":263},[145,21335,5409],{"class":259},[145,21337,5443],{"class":155},[145,21339,21340],{"class":159}," for ",[145,21342,685],{"class":155},[145,21344,20590],{"class":263},[145,21346,691],{"class":155},[145,21348,438],{"class":159},[145,21350,685],{"class":155},[145,21352,5683],{"class":263},[145,21354,691],{"class":155},[145,21356,450],{"class":159},[145,21358,407],{"class":263},[145,21360,21361,21364,21366],{"class":147,"line":10698},[145,21362,21363],{"class":263},"                        time.sleep(",[145,21365,5043],{"class":155},[145,21367,407],{"class":263},[145,21369,21370,21373],{"class":147,"line":10711},[145,21371,21372],{"class":259},"                    else",[145,21374,860],{"class":263},[145,21376,21377,21379,21381,21383,21386,21388,21390,21392,21394,21396,21398,21400,21402],{"class":147,"line":10731},[145,21378,21322],{"class":155},[145,21380,794],{"class":263},[145,21382,441],{"class":259},[145,21384,21385],{"class":159},"\"❌ Failed to submit ",[145,21387,685],{"class":155},[145,21389,20590],{"class":263},[145,21391,691],{"class":155},[145,21393,438],{"class":159},[145,21395,685],{"class":155},[145,21397,5683],{"class":263},[145,21399,691],{"class":155},[145,21401,450],{"class":159},[145,21403,407],{"class":263},[145,21405,21406],{"class":147,"line":10736},[145,21407,377],{"emptyLinePlaceholder":58},[145,21409,21410],{"class":147,"line":10741},[145,21411,21412],{"class":174},"    # Phase 2: Collect results\n",[145,21414,21415,21417,21419],{"class":147,"line":10747},[145,21416,8415],{"class":263},[145,21418,267],{"class":259},[145,21420,5856],{"class":263},[145,21422,21423,21425,21428,21430],{"class":147,"line":10756},[145,21424,5101],{"class":259},[145,21426,21427],{"class":263}," item ",[145,21429,1181],{"class":259},[145,21431,21432],{"class":263}," pending:\n",[145,21434,21435,21437],{"class":147,"line":10765},[145,21436,5117],{"class":259},[145,21438,860],{"class":263},[145,21440,21441,21443,21445,21448,21450],{"class":147,"line":10776},[145,21442,8504],{"class":263},[145,21444,267],{"class":259},[145,21446,21447],{"class":263}," poll_task(item[",[145,21449,7673],{"class":159},[145,21451,1630],{"class":263},[145,21453,21454,21456,21458,21460,21463,21465,21467],{"class":147,"line":10783},[145,21455,7383],{"class":263},[145,21457,267],{"class":259},[145,21459,758],{"class":263},[145,21461,21462],{"class":159},"\"output\"",[145,21464,1563],{"class":263},[145,21466,14886],{"class":159},[145,21468,764],{"class":263},[145,21470,21471],{"class":147,"line":10788},[145,21472,377],{"emptyLinePlaceholder":58},[145,21474,21475],{"class":147,"line":10793},[145,21476,21477],{"class":174},"            # Generate safe filename\n",[145,21479,21480,21483,21485,21488,21490,21493,21496,21498,21501],{"class":147,"line":10799},[145,21481,21482],{"class":263},"            safe_name ",[145,21484,267],{"class":259},[145,21486,21487],{"class":263}," item[",[145,21489,19490],{"class":159},[145,21491,21492],{"class":263},"].lower().replace(",[145,21494,21495],{"class":159},"\" \"",[145,21497,401],{"class":263},[145,21499,21500],{"class":159},"\"-\"",[145,21502,407],{"class":263},[145,21504,21505,21508,21510,21512,21514,21516,21519,21521,21524,21526,21529,21532,21534,21536],{"class":147,"line":10804},[145,21506,21507],{"class":263},"            filename ",[145,21509,267],{"class":259},[145,21511,3353],{"class":259},[145,21513,450],{"class":159},[145,21515,685],{"class":155},[145,21517,21518],{"class":263},"safe_name",[145,21520,691],{"class":155},[145,21522,21523],{"class":159},"_",[145,21525,685],{"class":155},[145,21527,21528],{"class":263},"item[",[145,21530,21531],{"class":159},"'style'",[145,21533,1536],{"class":263},[145,21535,691],{"class":155},[145,21537,21538],{"class":159},".mp4\"\n",[145,21540,21541,21544,21546,21549,21552],{"class":147,"line":10818},[145,21542,21543],{"class":263},"            filepath ",[145,21545,267],{"class":259},[145,21547,21548],{"class":155}," OUTPUT_DIR",[145,21550,21551],{"class":259}," /",[145,21553,21554],{"class":263}," filename\n",[145,21556,21557],{"class":147,"line":10829},[145,21558,377],{"emptyLinePlaceholder":58},[145,21560,21561],{"class":147,"line":10838},[145,21562,21563],{"class":263},"            download_video(video_url, filepath)\n",[145,21565,21566],{"class":147,"line":10843},[145,21567,21568],{"class":263},"            results.append({\n",[145,21570,21571,21574,21577,21579],{"class":147,"line":10848},[145,21572,21573],{"class":159},"                \"name\"",[145,21575,21576],{"class":263},": item[",[145,21578,19490],{"class":159},[145,21580,10815],{"class":263},[145,21582,21583,21586,21588,21590],{"class":147,"line":10857},[145,21584,21585],{"class":159},"                \"style\"",[145,21587,21576],{"class":263},[145,21589,21156],{"class":159},[145,21591,10815],{"class":263},[145,21593,21594,21597,21599,21601],{"class":147,"line":10882},[145,21595,21596],{"class":159},"                \"file\"",[145,21598,438],{"class":263},[145,21600,8649],{"class":155},[145,21602,21603],{"class":263},"(filepath),\n",[145,21605,21606,21609,21611],{"class":147,"line":10895},[145,21607,21608],{"class":159},"                \"status\"",[145,21610,438],{"class":263},[145,21612,21613],{"class":159},"\"success\"\n",[145,21615,21616],{"class":147,"line":10913},[145,21617,21618],{"class":263},"            })\n",[145,21620,21621,21623,21625,21627],{"class":147,"line":10918},[145,21622,5515],{"class":259},[145,21624,7041],{"class":155},[145,21626,7044],{"class":259},[145,21628,5633],{"class":263},[145,21630,21631,21633,21635,21637,21640,21642,21644,21646,21648,21650,21652,21654,21656,21658,21660],{"class":147,"line":10923},[145,21632,5558],{"class":155},[145,21634,794],{"class":263},[145,21636,441],{"class":259},[145,21638,21639],{"class":159},"\"❌ Failed: ",[145,21641,685],{"class":155},[145,21643,21528],{"class":263},[145,21645,19787],{"class":159},[145,21647,1536],{"class":263},[145,21649,691],{"class":155},[145,21651,438],{"class":159},[145,21653,685],{"class":155},[145,21655,5683],{"class":263},[145,21657,691],{"class":155},[145,21659,450],{"class":159},[145,21661,407],{"class":263},[145,21663,21664],{"class":147,"line":10929},[145,21665,21568],{"class":263},[145,21667,21668,21670,21672,21674],{"class":147,"line":10939},[145,21669,21573],{"class":159},[145,21671,21576],{"class":263},[145,21673,19490],{"class":159},[145,21675,10815],{"class":263},[145,21677,21678,21680,21682,21684],{"class":147,"line":10948},[145,21679,21585],{"class":159},[145,21681,21576],{"class":263},[145,21683,21156],{"class":159},[145,21685,10815],{"class":263},[145,21687,21688,21690,21692,21695],{"class":147,"line":10959},[145,21689,21596],{"class":159},[145,21691,438],{"class":263},[145,21693,21694],{"class":155},"None",[145,21696,453],{"class":263},[145,21698,21699,21701,21703,21705,21708,21710,21712,21714],{"class":147,"line":10966},[145,21700,21608],{"class":159},[145,21702,438],{"class":263},[145,21704,441],{"class":259},[145,21706,21707],{"class":159},"\"error: ",[145,21709,685],{"class":155},[145,21711,5683],{"class":263},[145,21713,691],{"class":155},[145,21715,951],{"class":159},[145,21717,21718],{"class":147,"line":10972},[145,21719,21618],{"class":263},[145,21721,21722],{"class":147,"line":10978},[145,21723,377],{"emptyLinePlaceholder":58},[145,21725,21726],{"class":147,"line":10983},[145,21727,21728],{"class":174},"    # Summary\n",[145,21730,21731,21734,21736,21738,21740,21742,21744,21747,21749,21751,21753,21756,21758,21760,21762,21765],{"class":147,"line":10994},[145,21732,21733],{"class":263},"    success ",[145,21735,267],{"class":259},[145,21737,8749],{"class":155},[145,21739,794],{"class":263},[145,21741,5419],{"class":155},[145,21743,6374],{"class":259},[145,21745,21746],{"class":263}," r ",[145,21748,1181],{"class":259},[145,21750,8763],{"class":263},[145,21752,1720],{"class":259},[145,21754,21755],{"class":263}," r[",[145,21757,761],{"class":159},[145,21759,14864],{"class":263},[145,21761,854],{"class":259},[145,21763,21764],{"class":159}," \"success\"",[145,21766,407],{"class":263},[145,21768,21769,21771,21773,21775,21777,21779,21782,21784,21787,21789,21791,21793,21796,21798,21801],{"class":147,"line":11005},[145,21770,1103],{"class":155},[145,21772,794],{"class":263},[145,21774,441],{"class":259},[145,21776,450],{"class":159},[145,21778,1671],{"class":155},[145,21780,21781],{"class":159},"📊 Complete: ",[145,21783,685],{"class":155},[145,21785,21786],{"class":263},"success",[145,21788,691],{"class":155},[145,21790,1227],{"class":159},[145,21792,6250],{"class":155},[145,21794,21795],{"class":263},"(results)",[145,21797,691],{"class":155},[145,21799,21800],{"class":159}," videos generated\"",[145,21802,407],{"class":263},[145,21804,21805,21807],{"class":147,"line":11016},[145,21806,1704],{"class":259},[145,21808,8820],{"class":263},[145,21810,21811],{"class":147,"line":11025},[145,21812,377],{"emptyLinePlaceholder":58},[145,21814,21815],{"class":147,"line":11030},[145,21816,377],{"emptyLinePlaceholder":58},[145,21818,21819],{"class":147,"line":11035},[145,21820,21821],{"class":174},"# Run it\n",[145,21823,21824,21827,21829,21832,21835],{"class":147,"line":11044},[145,21825,21826],{"class":263},"results ",[145,21828,267],{"class":259},[145,21830,21831],{"class":263}," process_catalog(",[145,21833,21834],{"class":159},"\"products.csv\"",[145,21836,407],{"class":263},[11,21838,21839],{},"流水线分两个阶段运行。阶段一快速提交所有任务（带限流），存储任务 ID。阶段二轮询每个任务并下载结果。这最大化了并行性 —— 所有视频在服务端同时生成。",[92,21841,21842],{"id":21842},"使用回调替代轮询",[11,21844,21845,21846,21848,21849,21852],{},"对于较大的目录（100+ 产品），轮询变得低效。使用 ",[28,21847,3595],{}," 参数在每个视频完成时接收 webhook。请参阅 ",[37,21850,21851],{"href":14322},"API 文档中的回调参数","了解完整的 webhook 载荷规范。",[136,21854,21856],{"className":339,"code":21855,"language":341,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"image_urls\": [\"https://your-cdn.com/products/item.jpg\"],\n    \"prompt\": \"@Image1 is a product. Smooth rotation. Studio lighting.\",\n    \"duration\": 8,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\",\n    \"callback_url\": \"https://your-server.com/webhooks/video-ready\"\n}\n",[28,21857,21858,21866,21876,21887,21898,21908,21918,21928,21937],{"__ignoreMap":141},[145,21859,21860,21862,21864],{"class":147,"line":148},[145,21861,3654],{"class":263},[145,21863,267],{"class":259},[145,21865,429],{"class":263},[145,21867,21868,21870,21872,21874],{"class":147,"line":166},[145,21869,3663],{"class":159},[145,21871,438],{"class":263},[145,21873,1309],{"class":159},[145,21875,453],{"class":263},[145,21877,21878,21880,21882,21885],{"class":147,"line":178},[145,21879,15319],{"class":159},[145,21881,10809],{"class":263},[145,21883,21884],{"class":159},"\"https://your-cdn.com/products/item.jpg\"",[145,21886,10815],{"class":263},[145,21888,21889,21891,21893,21896],{"class":147,"line":187},[145,21890,3674],{"class":159},[145,21892,438],{"class":263},[145,21894,21895],{"class":159},"\"@Image1 is a product. Smooth rotation. Studio lighting.\"",[145,21897,453],{"class":263},[145,21899,21900,21902,21904,21906],{"class":147,"line":374},[145,21901,3686],{"class":159},[145,21903,438],{"class":263},[145,21905,3691],{"class":155},[145,21907,453],{"class":263},[145,21909,21910,21912,21914,21916],{"class":147,"line":380},[145,21911,3698],{"class":159},[145,21913,438],{"class":263},[145,21915,3703],{"class":159},[145,21917,453],{"class":263},[145,21919,21920,21922,21924,21926],{"class":147,"line":386},[145,21921,3710],{"class":159},[145,21923,438],{"class":263},[145,21925,1385],{"class":159},[145,21927,453],{"class":263},[145,21929,21930,21932,21934],{"class":147,"line":410},[145,21931,6490],{"class":159},[145,21933,438],{"class":263},[145,21935,21936],{"class":159},"\"https://your-server.com/webhooks/video-ready\"\n",[145,21938,21939],{"class":147,"line":421},[145,21940,470],{"class":263},[11,21942,21943],{},"你的 webhook 端点会收到一个包含已完成任务对象（包括视频 URL）的 POST 请求。这完全消除了轮询，让你可以异步处理结果 —— 在一个 webhook 处理器中完成视频下载、更新产品数据库并推送到 CDN。",[92,21945,21946],{"id":21946},"流水线技巧",[96,21948,21949,21955,21961,21967,21977,21983],{},[73,21950,21951,21954],{},[23,21952,21953],{},"限流："," 保持每秒 1 个请求。突发提交可能触发节流。",[73,21956,21957,21960],{},[23,21958,21959],{},"视频 URL 过期："," 24 小时内下载。上述流水线会立即下载，但如果你使用回调，请确保 webhook 处理器及时下载。",[73,21962,21963,21966],{},[23,21964,21965],{},"重试逻辑："," 网络错误在所难免。流水线对失败的提交最多重试两次，退避时间为 3 秒。",[73,21968,21969,21972,21973,21976],{},[23,21970,21971],{},"组织输出："," 文件名约定 ",[28,21974,21975],{},"{product-name}_{style}.mp4"," 让你的视频库便于浏览。如果为每个产品生成多种比例，请在文件名中加入宽高比。",[73,21978,21979,21982],{},[23,21980,21981],{},"幂等性："," 跟踪哪些产品已经有视频。在提交任务之前，检查输出文件是否已存在。这可以防止在部分失败后重新运行流水线时产生重复生成。",[73,21984,21985,21988,21989,21992],{},[23,21986,21987],{},"成本监控："," 记录每次运行生成的视频数量。每条视频只需几美分，成本很低，但失控的循环或配置错误的 CSV 可能会无意中提交数千个请求。添加确认提示或 ",[28,21990,21991],{},"--dry-run"," 标志。",[92,21994,21995],{"id":21995},"超越基础的扩展",[11,21997,21998],{},"对于超过 1,000 个 SKU 的目录，考虑以下增强方案：",[11,22000,22001,22004,22005,22008],{},[23,22002,22003],{},"并发轮询。"," 上述流水线按顺序轮询任务。使用 Python 的 ",[28,22006,22007],{},"concurrent.futures.ThreadPoolExecutor"," 并行轮询多个任务，减少总挂钟时间。",[11,22010,22011,22014,22015,22017],{},[23,22012,22013],{},"数据库追踪。"," 将内存中的 ",[28,22016,2258],{}," 列表替换为 SQLite 数据库或在运行间持久化的简单 JSON 文件。追踪任务 ID、完成状态、输出文件路径和时间戳。这使得流水线在中断后可以恢复。",[11,22019,22020,22023],{},[23,22021,22022],{},"CDN 上传。"," 下载后自动上传到你的 CDN（S3、CloudFront、Cloudflare R2）并存储公开 URL。这消除了将文件手动传输到托管基础设施的步骤。",[11,22025,22026,22029],{},[23,22027,22028],{},"元数据生成。"," 随视频生成 JSON 清单文件，包含产品名称、视频类型、宽高比、时长和 CDN URL。此清单直接接入你的 CMS 或产品信息管理（PIM）系统，实现自动化的列表更新。",[48,22031,22032],{"id":22032},"电商提示词模板库",[11,22034,22035,22036,22038],{},"为最常见的电商产品品类提供可直接复制粘贴的提示词。每个模板针对指定的产品类型设计，可直接与该品类中的任何产品照片配合使用。在 ",[28,22037,20186],{}," 占位符中替换产品名称即可。",[136,22040,22042],{"className":339,"code":22041,"language":341,"meta":141,"style":141},"ECOMMERCE_PROMPTS = {\n    \"jewelry\": {\n        \"prompt\": (\n            \"@Image1 is {name}. Extreme close-up on a black velvet surface. \"\n            \"The piece rotates slowly under pinpoint spotlights. Light refracts \"\n            \"through gemstones, casting prismatic reflections. Shallow depth of \"\n            \"field. The camera pulls back to reveal the full piece. Luxury \"\n            \"jewelry advertisement quality.\"\n        ),\n        \"duration\": 10,\n        \"aspect_ratio\": \"1:1\",\n    },\n    \"electronics\": {\n        \"prompt\": (\n            \"@Image1 is {name}. The device sits on a minimal desk setup. \"\n            \"Screen illuminates, casting a soft glow. Camera orbits slowly, \"\n            \"showing ports, buttons, and build quality from every angle. \"\n            \"Clean, modern aesthetic. Tech product showcase.\"\n        ),\n        \"duration\": 10,\n        \"aspect_ratio\": \"16:9\",\n    },\n    \"apparel\": {\n        \"prompt\": (\n            \"@Image1 is {name}. The garment is displayed on an invisible \"\n            \"mannequin form, rotating slowly. Fabric moves naturally with \"\n            \"gentle airflow, showing drape and texture. Soft diffused \"\n            \"studio lighting. Clean white background. Fashion e-commerce \"\n            \"product video.\"\n        ),\n        \"duration\": 8,\n        \"aspect_ratio\": \"9:16\",\n    },\n    \"food_beverage\": {\n        \"prompt\": (\n            \"@Image1 is {name}. Steam rises gently. Camera pushes in slowly \"\n            \"from a wide tabletop shot to an appetizing close-up. Warm, \"\n            \"golden-hour lighting. Shallow depth of field. Ingredients or \"\n            \"garnishes are visible in beautiful detail. Food photography \"\n            \"in motion.\"\n        ),\n        \"duration\": 8,\n        \"aspect_ratio\": \"1:1\",\n    },\n    \"furniture\": {\n        \"prompt\": (\n            \"@Image1 is {name}. Placed in a styled modern living room with \"\n            \"natural light streaming through large windows. Camera dollies \"\n            \"slowly around the piece, showing form and proportion in context. \"\n            \"Warm afternoon light. Interior design showcase quality.\"\n        ),\n        \"duration\": 10,\n        \"aspect_ratio\": \"16:9\",\n    },\n    \"cosmetics\": {\n        \"prompt\": (\n            \"@Image1 is {name}. The product sits on a marble surface with \"\n            \"soft pink and gold tones. A gentle pour or squeeze dispenses \"\n            \"the product, showing color and texture. Macro close-up of the \"\n            \"formula. Smooth, luxurious pacing. Beauty brand advertisement.\"\n        ),\n        \"duration\": 8,\n        \"aspect_ratio\": \"9:16\",\n    },\n    \"sports_gear\": {\n        \"prompt\": (\n            \"@Image1 is {name}. Dynamic presentation against a dark \"\n            \"background with dramatic side lighting. The product rotates \"\n            \"with energy — quick cuts between angles showing key features. \"\n            \"Subtle motion graphics energy. Athletic brand commercial style.\"\n        ),\n        \"duration\": 8,\n        \"aspect_ratio\": \"16:9\",\n    },\n    \"home_decor\": {\n        \"prompt\": (\n            \"@Image1 is {name}. Displayed in a curated shelf vignette with \"\n            \"complementary objects. Soft natural light. Camera slowly racks \"\n            \"focus from background to the product. Cozy, aspirational \"\n            \"interior styling. Lifestyle brand aesthetic.\"\n        ),\n        \"duration\": 8,\n        \"aspect_ratio\": \"1:1\",\n    },\n}\n\n\ndef generate_from_template(category: str, name: str, image_url: str) -> dict:\n    \"\"\"Generate a video using a category-specific prompt template.\"\"\"\n    template = ECOMMERCE_PROMPTS[category]\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"image_urls\": [image_url],\n        \"prompt\": template[\"prompt\"].format(name=name),\n        \"duration\": template[\"duration\"],\n        \"quality\": \"1080p\",\n        \"aspect_ratio\": template[\"aspect_ratio\"],\n    }\n    return create_and_wait(payload)\n\n\n# Example usage\nresult = generate_from_template(\n    category=\"jewelry\",\n    name=\"18K gold pendant necklace with emerald\",\n    image_url=\"https://your-cdn.com/products/emerald-pendant.jpg\"\n)\n",[28,22043,22044,22053,22060,22066,22076,22081,22086,22091,22096,22100,22110,22120,22125,22132,22138,22147,22152,22157,22162,22166,22176,22186,22190,22197,22203,22212,22217,22222,22227,22232,22236,22246,22256,22260,22267,22273,22282,22287,22292,22297,22302,22306,22316,22326,22330,22337,22343,22352,22357,22362,22367,22371,22381,22391,22395,22402,22408,22417,22422,22427,22432,22436,22446,22456,22460,22467,22473,22482,22487,22492,22497,22501,22511,22521,22525,22532,22538,22547,22552,22557,22562,22566,22576,22586,22590,22594,22598,22602,22629,22634,22647,22655,22665,22671,22689,22699,22709,22719,22723,22729,22733,22737,22742,22751,22763,22775,22785],{"__ignoreMap":141},[145,22045,22046,22049,22051],{"class":147,"line":148},[145,22047,22048],{"class":155},"ECOMMERCE_PROMPTS",[145,22050,392],{"class":259},[145,22052,429],{"class":263},[145,22054,22055,22058],{"class":147,"line":166},[145,22056,22057],{"class":159},"    \"jewelry\"",[145,22059,1943],{"class":263},[145,22061,22062,22064],{"class":147,"line":178},[145,22063,1320],{"class":159},[145,22065,1323],{"class":263},[145,22067,22068,22071,22073],{"class":147,"line":187},[145,22069,22070],{"class":159},"            \"@Image1 is ",[145,22072,20186],{"class":155},[145,22074,22075],{"class":159},". Extreme close-up on a black velvet surface. \"\n",[145,22077,22078],{"class":147,"line":374},[145,22079,22080],{"class":159},"            \"The piece rotates slowly under pinpoint spotlights. Light refracts \"\n",[145,22082,22083],{"class":147,"line":380},[145,22084,22085],{"class":159},"            \"through gemstones, casting prismatic reflections. Shallow depth of \"\n",[145,22087,22088],{"class":147,"line":386},[145,22089,22090],{"class":159},"            \"field. The camera pulls back to reveal the full piece. Luxury \"\n",[145,22092,22093],{"class":147,"line":410},[145,22094,22095],{"class":159},"            \"jewelry advertisement quality.\"\n",[145,22097,22098],{"class":147,"line":421},[145,22099,1343],{"class":263},[145,22101,22102,22104,22106,22108],{"class":147,"line":432},[145,22103,1348],{"class":159},[145,22105,438],{"class":263},[145,22107,537],{"class":155},[145,22109,453],{"class":263},[145,22111,22112,22114,22116,22118],{"class":147,"line":456},[145,22113,1380],{"class":159},[145,22115,438],{"class":263},[145,22117,6120],{"class":159},[145,22119,453],{"class":263},[145,22121,22122],{"class":147,"line":467},[145,22123,22124],{"class":263},"    },\n",[145,22126,22127,22130],{"class":147,"line":600},[145,22128,22129],{"class":159},"    \"electronics\"",[145,22131,1943],{"class":263},[145,22133,22134,22136],{"class":147,"line":605},[145,22135,1320],{"class":159},[145,22137,1323],{"class":263},[145,22139,22140,22142,22144],{"class":147,"line":611},[145,22141,22070],{"class":159},[145,22143,20186],{"class":155},[145,22145,22146],{"class":159},". The device sits on a minimal desk setup. \"\n",[145,22148,22149],{"class":147,"line":617},[145,22150,22151],{"class":159},"            \"Screen illuminates, casting a soft glow. Camera orbits slowly, \"\n",[145,22153,22154],{"class":147,"line":623},[145,22155,22156],{"class":159},"            \"showing ports, buttons, and build quality from every angle. \"\n",[145,22158,22159],{"class":147,"line":628},[145,22160,22161],{"class":159},"            \"Clean, modern aesthetic. Tech product showcase.\"\n",[145,22163,22164],{"class":147,"line":639},[145,22165,1343],{"class":263},[145,22167,22168,22170,22172,22174],{"class":147,"line":654},[145,22169,1348],{"class":159},[145,22171,438],{"class":263},[145,22173,537],{"class":155},[145,22175,453],{"class":263},[145,22177,22178,22180,22182,22184],{"class":147,"line":660},[145,22179,1380],{"class":159},[145,22181,438],{"class":263},[145,22183,1385],{"class":159},[145,22185,453],{"class":263},[145,22187,22188],{"class":147,"line":671},[145,22189,22124],{"class":263},[145,22191,22192,22195],{"class":147,"line":698},[145,22193,22194],{"class":159},"    \"apparel\"",[145,22196,1943],{"class":263},[145,22198,22199,22201],{"class":147,"line":710},[145,22200,1320],{"class":159},[145,22202,1323],{"class":263},[145,22204,22205,22207,22209],{"class":147,"line":716},[145,22206,22070],{"class":159},[145,22208,20186],{"class":155},[145,22210,22211],{"class":159},". The garment is displayed on an invisible \"\n",[145,22213,22214],{"class":147,"line":722},[145,22215,22216],{"class":159},"            \"mannequin form, rotating slowly. Fabric moves naturally with \"\n",[145,22218,22219],{"class":147,"line":728},[145,22220,22221],{"class":159},"            \"gentle airflow, showing drape and texture. Soft diffused \"\n",[145,22223,22224],{"class":147,"line":739},[145,22225,22226],{"class":159},"            \"studio lighting. Clean white background. Fashion e-commerce \"\n",[145,22228,22229],{"class":147,"line":744},[145,22230,22231],{"class":159},"            \"product video.\"\n",[145,22233,22234],{"class":147,"line":750},[145,22235,1343],{"class":263},[145,22237,22238,22240,22242,22244],{"class":147,"line":767},[145,22239,1348],{"class":159},[145,22241,438],{"class":263},[145,22243,3691],{"class":155},[145,22245,453],{"class":263},[145,22247,22248,22250,22252,22254],{"class":147,"line":788},[145,22249,1380],{"class":159},[145,22251,438],{"class":263},[145,22253,3715],{"class":159},[145,22255,453],{"class":263},[145,22257,22258],{"class":147,"line":834},[145,22259,22124],{"class":263},[145,22261,22262,22265],{"class":147,"line":839},[145,22263,22264],{"class":159},"    \"food_beverage\"",[145,22266,1943],{"class":263},[145,22268,22269,22271],{"class":147,"line":845},[145,22270,1320],{"class":159},[145,22272,1323],{"class":263},[145,22274,22275,22277,22279],{"class":147,"line":863},[145,22276,22070],{"class":159},[145,22278,20186],{"class":155},[145,22280,22281],{"class":159},". Steam rises gently. Camera pushes in slowly \"\n",[145,22283,22284],{"class":147,"line":872},[145,22285,22286],{"class":159},"            \"from a wide tabletop shot to an appetizing close-up. Warm, \"\n",[145,22288,22289],{"class":147,"line":887},[145,22290,22291],{"class":159},"            \"golden-hour lighting. Shallow depth of field. Ingredients or \"\n",[145,22293,22294],{"class":147,"line":903},[145,22295,22296],{"class":159},"            \"garnishes are visible in beautiful detail. Food photography \"\n",[145,22298,22299],{"class":147,"line":915},[145,22300,22301],{"class":159},"            \"in motion.\"\n",[145,22303,22304],{"class":147,"line":954},[145,22305,1343],{"class":263},[145,22307,22308,22310,22312,22314],{"class":147,"line":960},[145,22309,1348],{"class":159},[145,22311,438],{"class":263},[145,22313,3691],{"class":155},[145,22315,453],{"class":263},[145,22317,22318,22320,22322,22324],{"class":147,"line":965},[145,22319,1380],{"class":159},[145,22321,438],{"class":263},[145,22323,6120],{"class":159},[145,22325,453],{"class":263},[145,22327,22328],{"class":147,"line":971},[145,22329,22124],{"class":263},[145,22331,22332,22335],{"class":147,"line":977},[145,22333,22334],{"class":159},"    \"furniture\"",[145,22336,1943],{"class":263},[145,22338,22339,22341],{"class":147,"line":989},[145,22340,1320],{"class":159},[145,22342,1323],{"class":263},[145,22344,22345,22347,22349],{"class":147,"line":994},[145,22346,22070],{"class":159},[145,22348,20186],{"class":155},[145,22350,22351],{"class":159},". Placed in a styled modern living room with \"\n",[145,22353,22354],{"class":147,"line":5521},[145,22355,22356],{"class":159},"            \"natural light streaming through large windows. Camera dollies \"\n",[145,22358,22359],{"class":147,"line":5527},[145,22360,22361],{"class":159},"            \"slowly around the piece, showing form and proportion in context. \"\n",[145,22363,22364],{"class":147,"line":5555},[145,22365,22366],{"class":159},"            \"Warm afternoon light. Interior design showcase quality.\"\n",[145,22368,22369],{"class":147,"line":5586},[145,22370,1343],{"class":263},[145,22372,22373,22375,22377,22379],{"class":147,"line":5606},[145,22374,1348],{"class":159},[145,22376,438],{"class":263},[145,22378,537],{"class":155},[145,22380,453],{"class":263},[145,22382,22383,22385,22387,22389],{"class":147,"line":5612},[145,22384,1380],{"class":159},[145,22386,438],{"class":263},[145,22388,1385],{"class":159},[145,22390,453],{"class":263},[145,22392,22393],{"class":147,"line":5618},[145,22394,22124],{"class":263},[145,22396,22397,22400],{"class":147,"line":5623},[145,22398,22399],{"class":159},"    \"cosmetics\"",[145,22401,1943],{"class":263},[145,22403,22404,22406],{"class":147,"line":5636},[145,22405,1320],{"class":159},[145,22407,1323],{"class":263},[145,22409,22410,22412,22414],{"class":147,"line":5642},[145,22411,22070],{"class":159},[145,22413,20186],{"class":155},[145,22415,22416],{"class":159},". The product sits on a marble surface with \"\n",[145,22418,22419],{"class":147,"line":5669},[145,22420,22421],{"class":159},"            \"soft pink and gold tones. A gentle pour or squeeze dispenses \"\n",[145,22423,22424],{"class":147,"line":5709},[145,22425,22426],{"class":159},"            \"the product, showing color and texture. Macro close-up of the \"\n",[145,22428,22429],{"class":147,"line":5728},[145,22430,22431],{"class":159},"            \"formula. Smooth, luxurious pacing. Beauty brand advertisement.\"\n",[145,22433,22434],{"class":147,"line":5733},[145,22435,1343],{"class":263},[145,22437,22438,22440,22442,22444],{"class":147,"line":5738},[145,22439,1348],{"class":159},[145,22441,438],{"class":263},[145,22443,3691],{"class":155},[145,22445,453],{"class":263},[145,22447,22448,22450,22452,22454],{"class":147,"line":5743},[145,22449,1380],{"class":159},[145,22451,438],{"class":263},[145,22453,3715],{"class":159},[145,22455,453],{"class":263},[145,22457,22458],{"class":147,"line":7416},[145,22459,22124],{"class":263},[145,22461,22462,22465],{"class":147,"line":7422},[145,22463,22464],{"class":159},"    \"sports_gear\"",[145,22466,1943],{"class":263},[145,22468,22469,22471],{"class":147,"line":7428},[145,22470,1320],{"class":159},[145,22472,1323],{"class":263},[145,22474,22475,22477,22479],{"class":147,"line":7439},[145,22476,22070],{"class":159},[145,22478,20186],{"class":155},[145,22480,22481],{"class":159},". Dynamic presentation against a dark \"\n",[145,22483,22484],{"class":147,"line":7450},[145,22485,22486],{"class":159},"            \"background with dramatic side lighting. The product rotates \"\n",[145,22488,22489],{"class":147,"line":7461},[145,22490,22491],{"class":159},"            \"with energy — quick cuts between angles showing key features. \"\n",[145,22493,22494],{"class":147,"line":7466},[145,22495,22496],{"class":159},"            \"Subtle motion graphics energy. Athletic brand commercial style.\"\n",[145,22498,22499],{"class":147,"line":7472},[145,22500,1343],{"class":263},[145,22502,22503,22505,22507,22509],{"class":147,"line":7480},[145,22504,1348],{"class":159},[145,22506,438],{"class":263},[145,22508,3691],{"class":155},[145,22510,453],{"class":263},[145,22512,22513,22515,22517,22519],{"class":147,"line":7494},[145,22514,1380],{"class":159},[145,22516,438],{"class":263},[145,22518,1385],{"class":159},[145,22520,453],{"class":263},[145,22522,22523],{"class":147,"line":7499},[145,22524,22124],{"class":263},[145,22526,22527,22530],{"class":147,"line":7513},[145,22528,22529],{"class":159},"    \"home_decor\"",[145,22531,1943],{"class":263},[145,22533,22534,22536],{"class":147,"line":7527},[145,22535,1320],{"class":159},[145,22537,1323],{"class":263},[145,22539,22540,22542,22544],{"class":147,"line":7559},[145,22541,22070],{"class":159},[145,22543,20186],{"class":155},[145,22545,22546],{"class":159},". Displayed in a curated shelf vignette with \"\n",[145,22548,22549],{"class":147,"line":7571},[145,22550,22551],{"class":159},"            \"complementary objects. Soft natural light. Camera slowly racks \"\n",[145,22553,22554],{"class":147,"line":7581},[145,22555,22556],{"class":159},"            \"focus from background to the product. Cozy, aspirational \"\n",[145,22558,22559],{"class":147,"line":7586},[145,22560,22561],{"class":159},"            \"interior styling. Lifestyle brand aesthetic.\"\n",[145,22563,22564],{"class":147,"line":7593},[145,22565,1343],{"class":263},[145,22567,22568,22570,22572,22574],{"class":147,"line":7615},[145,22569,1348],{"class":159},[145,22571,438],{"class":263},[145,22573,3691],{"class":155},[145,22575,453],{"class":263},[145,22577,22578,22580,22582,22584],{"class":147,"line":7646},[145,22579,1380],{"class":159},[145,22581,438],{"class":263},[145,22583,6120],{"class":159},[145,22585,453],{"class":263},[145,22587,22588],{"class":147,"line":7651},[145,22589,22124],{"class":263},[145,22591,22592],{"class":147,"line":7657},[145,22593,470],{"class":263},[145,22595,22596],{"class":147,"line":7682},[145,22597,377],{"emptyLinePlaceholder":58},[145,22599,22600],{"class":147,"line":7687},[145,22601,377],{"emptyLinePlaceholder":58},[145,22603,22604,22606,22609,22612,22614,22617,22619,22621,22623,22625,22627],{"class":147,"line":7692},[145,22605,526],{"class":259},[145,22607,22608],{"class":151}," generate_from_template",[145,22610,22611],{"class":263},"(category: ",[145,22613,8649],{"class":155},[145,22615,22616],{"class":263},", name: ",[145,22618,8649],{"class":155},[145,22620,20491],{"class":263},[145,22622,8649],{"class":155},[145,22624,15775],{"class":263},[145,22626,8774],{"class":155},[145,22628,860],{"class":263},[145,22630,22631],{"class":147,"line":7715},[145,22632,22633],{"class":159},"    \"\"\"Generate a video using a category-specific prompt template.\"\"\"\n",[145,22635,22636,22639,22641,22644],{"class":147,"line":7725},[145,22637,22638],{"class":263},"    template ",[145,22640,267],{"class":259},[145,22642,22643],{"class":155}," ECOMMERCE_PROMPTS",[145,22645,22646],{"class":263},"[category]\n",[145,22648,22649,22651,22653],{"class":147,"line":7731},[145,22650,1295],{"class":263},[145,22652,267],{"class":259},[145,22654,429],{"class":263},[145,22656,22657,22659,22661,22663],{"class":147,"line":7749},[145,22658,1304],{"class":159},[145,22660,438],{"class":263},[145,22662,1309],{"class":159},[145,22664,453],{"class":263},[145,22666,22667,22669],{"class":147,"line":7754},[145,22668,2683],{"class":159},[145,22670,20580],{"class":263},[145,22672,22673,22675,22678,22680,22683,22685,22687],{"class":147,"line":7759},[145,22674,1320],{"class":159},[145,22676,22677],{"class":263},": template[",[145,22679,5901],{"class":159},[145,22681,22682],{"class":263},"].format(",[145,22684,20590],{"class":701},[145,22686,267],{"class":259},[145,22688,20595],{"class":263},[145,22690,22691,22693,22695,22697],{"class":147,"line":7772},[145,22692,1348],{"class":159},[145,22694,22677],{"class":263},[145,22696,5946],{"class":159},[145,22698,10815],{"class":263},[145,22700,22701,22703,22705,22707],{"class":147,"line":7786},[145,22702,1364],{"class":159},[145,22704,438],{"class":263},[145,22706,3703],{"class":159},[145,22708,453],{"class":263},[145,22710,22711,22713,22715,22717],{"class":147,"line":7813},[145,22712,1380],{"class":159},[145,22714,22677],{"class":263},[145,22716,6148],{"class":159},[145,22718,10815],{"class":263},[145,22720,22721],{"class":147,"line":7827},[145,22722,1408],{"class":263},[145,22724,22725,22727],{"class":147,"line":10335},[145,22726,1704],{"class":259},[145,22728,18214],{"class":263},[145,22730,22731],{"class":147,"line":10342},[145,22732,377],{"emptyLinePlaceholder":58},[145,22734,22735],{"class":147,"line":10388},[145,22736,377],{"emptyLinePlaceholder":58},[145,22738,22739],{"class":147,"line":10393},[145,22740,22741],{"class":174},"# Example usage\n",[145,22743,22744,22746,22748],{"class":147,"line":10398},[145,22745,12197],{"class":263},[145,22747,267],{"class":259},[145,22749,22750],{"class":263}," generate_from_template(\n",[145,22752,22753,22756,22758,22761],{"class":147,"line":10407},[145,22754,22755],{"class":701},"    category",[145,22757,267],{"class":259},[145,22759,22760],{"class":159},"\"jewelry\"",[145,22762,453],{"class":263},[145,22764,22765,22768,22770,22773],{"class":147,"line":10413},[145,22766,22767],{"class":701},"    name",[145,22769,267],{"class":259},[145,22771,22772],{"class":159},"\"18K gold pendant necklace with emerald\"",[145,22774,453],{"class":263},[145,22776,22777,22780,22782],{"class":147,"line":10422},[145,22778,22779],{"class":701},"    image_url",[145,22781,267],{"class":259},[145,22783,22784],{"class":159},"\"https://your-cdn.com/products/emerald-pendant.jpg\"\n",[145,22786,22787],{"class":147,"line":10443},[145,22788,407],{"class":263},[11,22790,22791,22792,22795],{},"这些模板是起点。调整灯光描述和镜头运动以匹配你品牌的视觉识别。",[37,22793,22794],{"href":1766},"完整提示词指南","涵盖了微调 Seedance 2.0 输出的高级技巧。",[92,22797,22798],{"id":22798},"为你的品牌定制模板",[11,22800,22801],{},"每个品牌都有自己的视觉语言。Apple 使用简洁的白色环境搭配精确、缓慢的镜头运动。Nike 使用动感的高对比度灯光和快速剪辑。你的产品视频应该反映品牌既有的视觉美学。",[11,22803,22804],{},"沿以下维度修改模板：",[96,22806,22807,22813,22819,22825],{},[73,22808,22809,22812],{},[23,22810,22811],{},"灯光色调："," 暖色调（金色、琥珀色）适合手工艺/奢侈品牌。冷色调（蓝色、银色）适合科技品牌。中性（白色、柔和）适合极简品牌。",[73,22814,22815,22818],{},[23,22816,22817],{},"镜头速度："," 缓慢、沉稳的运动传达高端定位。更快、更动感的运动适合年轻化或运动品牌。",[73,22820,22821,22824],{},[23,22822,22823],{},"背景："," 深色背景暗示奢华。白色背景暗示简洁/现代。环境背景暗示生活方式。",[73,22826,22827,22830],{},[23,22828,22829],{},"节奏词汇："," \"Slow, measured\" vs. \"dynamic, energetic\" vs. \"calm, meditative\" —— 这些词汇直接影响模型输出的节奏。",[11,22832,22833],{},"构建品牌的主提示词前缀 —— 一组前置于每条产品视频提示词的术语 —— 并在整个目录中一致应用。这能在数百条产品视频中创造视觉一致性，模拟你在单一摄影棚设置中获得的统一感。",[48,22835,9036],{"id":9036},[92,22837,22839],{"id":22838},"生成一条产品视频需要多少费用","生成一条产品视频需要多少费用？",[11,22841,22842,22843,22848],{},"定价取决于时长和画质设置。一条标准的 8 秒 1080p 视频只需几美分。为整个目录生成 500 条产品视频在大多数配置下远低于 $100。查看 ",[37,22844,22847],{"href":22845,"rel":22846},"https://evolink.ai/pricing",[41],"EvoLink 定价","了解当前费率。与摄影棚收取的 $500–$2,000 每条视频相比，API 成本在任何规模下都几乎可以忽略不计。",[92,22850,22852],{"id":22851},"可以使用真人模特照片作为输入吗","可以使用真人模特照片作为输入吗？",[11,22854,22855],{},"Seedance 2.0 对生成逼真人脸有限制，以防止深度伪造滥用。纯产品照片没有任何限制。如果你的产品需要展示与人的互动 —— 模特身上的服装、手腕上的手表 —— 请使用插画或风格化的人物参考，而非写实的人像照片。或者，在提示词中描述人物元素（如 \"a hand reaches into frame\"），让模型生成，而不是提供人脸照片作为输入。",[92,22857,22859],{"id":22858},"视频生成需要多长时间","视频生成需要多长时间？",[11,22861,22862,22863,22865],{},"典型的生成时间为 60–180 秒，取决于时长和画质设置。5 秒 720p 的视频大约一分钟完成。15 秒 1080p 的视频可能需要三分钟。本指南中的批量流水线通过轮询自动处理计时。对于生产系统，使用 ",[28,22864,3595],{}," 参数在完成时接收 webhook，而不是轮询。",[92,22867,22869],{"id":22868},"可以添加品牌-logo-或文字叠加吗","可以添加品牌 logo 或文字叠加吗？",[11,22871,22872],{},"有两种方法。第一种，在提示词中包含文字描述 —— \"Brand name fades in at the end\" 或 \"Logo watermark in lower right corner\"。模型可以生成类似文字的元素，但精确的排版不能保证。第二种更可靠的方法是生成不含文字的视频，然后在后期制作中使用 FFmpeg、After Effects 或你选择的视频编辑工具合成 logo、标题或字幕条。第二种方法让你对品牌资产有精确的控制。",[92,22874,22876],{"id":22875},"视频画质够商用吗","视频画质够商用吗？",[11,22878,22879],{},"在 1080p 画质下，输出适合产品列表、社交媒体广告和网站主视觉区域。视觉质量与大多数电商团队使用基础摄影棚设置制作的内容持平或更优。对于高端品牌活动或电视播出，你可能需要将 AI 生成的视频作为预览或起点，然后用传统后期制作进行精修。对于绝大多数电商使用场景 —— Amazon、Shopify、社交广告、邮件营销 —— 输出即为成品。",[92,22881,22883],{"id":22882},"输入图像最佳的格式和分辨率是什么","输入图像最佳的格式和分辨率是什么？",[11,22885,22886],{},"JPEG 和 PNG 均可。带透明通道的 PNG 对于需要干净背景替换的产品是理想选择。在分辨率方面，提供最高质量的源图像 —— 至少 1024x1024 像素。模型从更高分辨率的输入中提取更多细节，这在微距特写和旋转视频中尤其明显。避免压缩严重且有明显伪影的 JPEG，因为这些伪影会传递到生成的视频中。",[92,22888,22890],{"id":22889},"可以生成带音频或音乐的视频吗","可以生成带音频或音乐的视频吗？",[11,22892,22893,22894,22896,22897,22899,22900,298],{},"Seedance 2.0 支持 ",[28,22895,1822],{}," 参数，可为视频添加情境音效。对于产品视频，环境摄影棚声音或微妙的音效可以增强高端感。然而，大多数电商平台会静音自动播放视频，因此视觉质量远比音频重要。如果你需要特定的音乐或旁白，请在后期制作中添加。API 还支持 ",[28,22898,3578],{}," 用于音频引导生成 —— 详情请参阅",[37,22901,22903],{"href":22902},"/docs/multimodal-reference","多模态参考文档",[92,22905,22907],{"id":22906},"如何与-shopify-或-amazon-集成","如何与 Shopify 或 Amazon 集成？",[11,22909,22910,22911,22913,22914,22916],{},"工作流程是：生成视频 → 下载 MP4 → 上传到平台。对于 Shopify，通过管理后台或 Shopify API 直接上传视频到产品媒体。对于 Amazon，通过 Seller Central 的\"管理视频\"部分或 SP-API 上传。要实现完整的自动化循环，使用带 ",[28,22912,3595],{}," 的批量流水线 —— 你的 webhook 处理器可以自动下载视频并推送到平台 API。",[37,22915,22903],{"href":22902},"涵盖了用于构建集成的完整 API 响应格式。",[48,22918,22920],{"id":22919},"从摄影棚到-api你的新视频流水线","从摄影棚到 API：你的新视频流水线",[11,22922,22923],{},"五种视频类型覆盖了完整的电商产品视频需求：360° 旋转用于产品页面、主视觉用于产品发布、生活场景用于情感连接、微距特写用于品质感知、开箱揭幕用于社交内容。每种类型只需一张产品照片和一次 API 调用。",[11,22925,22926],{},"批量流水线将 CSV 目录转化为完整的视频库。多平台导出一次性生成你所有渠道所需的每种宽高比。提示词模板库为你提供了适用于任何产品品类的可直接复制使用的起点。",[11,22928,22929],{},"从产品照片到在每个销售渠道发布视频的整个工作流 —— 从数周压缩到数小时。一名开发者即可运营此前需要制作团队、摄影棚和后期编辑师的视频流水线。",[11,22931,22932],{},"这不是对传统视频制作的渐进式改进。这是一次结构性变革。电商视频的瓶颈从来不是创意愿景 —— 而是成本和物流。当一条视频只需几分钱并花费两分钟时，问题就从\"哪些产品值得拥有视频\"变成了\"为什么不是每款产品都有视频\"。",[11,22934,22935],{},"从一款产品开始。生成一条旋转视频。三分钟内看到结果。然后扩展到你的整个目录。无论你生成一条还是一万条视频，API 都是一样的。",[11,22937,22938,22939],{},"替换你的视频制作流水线。",[37,22940,22942],{"href":211,"rel":22941},[41],"在 EvoLink 免费注册 →",[45,22944],{},[11,22946,22947],{},[2614,22948,22949,22950,22952,22953,22952,22955,22952,22957],{},"本系列往期文章：",[37,22951,2209],{"href":1766}," · ",[37,22954,2963],{"href":2962},[37,22956,19106],{"href":3849},[37,22958,22959],{"href":3376},"图生视频教程",[11186,22961,13391],{},{"title":141,"searchDepth":166,"depth":166,"links":22963},[22964,22967,22968,22972,22976,22980,22984,22989,22994,22999,23002,23012],{"id":17339,"depth":166,"text":17340,"children":22965},[22966],{"id":17464,"depth":178,"text":17464},{"id":17473,"depth":166,"text":17474},{"id":18089,"depth":166,"text":18090,"children":22969},[22970,22971],{"id":18252,"depth":178,"text":18252},{"id":18316,"depth":178,"text":18316},{"id":18356,"depth":166,"text":18357,"children":22973},[22974,22975],{"id":18488,"depth":178,"text":18488},{"id":18530,"depth":178,"text":18530},{"id":18572,"depth":166,"text":18573,"children":22977},[22978,22979],{"id":18743,"depth":178,"text":18743},{"id":18831,"depth":178,"text":18832},{"id":18880,"depth":166,"text":18881,"children":22981},[22982,22983],{"id":19014,"depth":178,"text":19014},{"id":19052,"depth":178,"text":19052},{"id":19109,"depth":166,"text":19110,"children":22985},[22986,22987,22988],{"id":19246,"depth":178,"text":19246},{"id":19279,"depth":178,"text":19279},{"id":19288,"depth":178,"text":19288},{"id":19326,"depth":166,"text":19327,"children":22990},[22991,22992,22993],{"id":19465,"depth":178,"text":19465},{"id":19921,"depth":178,"text":19921},{"id":19930,"depth":178,"text":19930},{"id":19973,"depth":166,"text":19974,"children":22995},[22996,22997,22998],{"id":21842,"depth":178,"text":21842},{"id":21946,"depth":178,"text":21946},{"id":21995,"depth":178,"text":21995},{"id":22032,"depth":166,"text":22032,"children":23000},[23001],{"id":22798,"depth":178,"text":22798},{"id":9036,"depth":166,"text":9036,"children":23003},[23004,23005,23006,23007,23008,23009,23010,23011],{"id":22838,"depth":178,"text":22839},{"id":22851,"depth":178,"text":22852},{"id":22858,"depth":178,"text":22859},{"id":22868,"depth":178,"text":22869},{"id":22875,"depth":178,"text":22876},{"id":22882,"depth":178,"text":22883},{"id":22889,"depth":178,"text":22890},{"id":22906,"depth":178,"text":22907},{"id":22919,"depth":166,"text":22920},"使用 Seedance 2.0 API 从产品照片生成电商视频。5 种视频类型、批量流水线、多平台导出。包含完整 Python 代码。",{"date":23015,"image":23016,"seoTitle":23017},"2026-02-21","/s7-hero-ecommerce-product-videos.webp","使用 Seedance 2.0 API 构建电商 AI 产品视频","/zh/blog/seedance-2-ecommerce-product-videos",{"title":17325,"description":23013},"zh/blog/seedance-2-ecommerce-product-videos","k3w5jyG0dsRL-hLd-y3jsU4S_1pCiJaUh5DkFg3sm8A",{"id":23023,"title":23024,"body":23025,"description":30303,"extension":11248,"meta":30304,"navigation":58,"path":30307,"seo":30308,"stem":30309,"__hash__":30310},"content/zh/blog/seedance-2-image-to-video-api.md","Seedance 2.0 图像转视频 API：全面控制任意图像动画化",{"type":8,"value":23026,"toc":30232},[23027,23031,23034,23041,23043,23047,23050,23057,23060,23181,23186,23192,23197,23201,23204,23213,23216,23219,23226,23229,23232,23234,23238,23244,23248,23263,23272,23276,23288,23291,23295,23374,23381,23391,23394,23397,23683,23696,23701,23703,23707,23710,23712,23722,23748,23755,23759,24289,24300,24304,24308,24316,24322,24326,24331,24338,24341,24344,24347,24352,24358,24363,24369,24384,24387,24440,24448,24450,24454,24461,24464,24470,24484,24491,24494,24497,24529,24533,25049,25053,25058,25065,25068,25071,25077,25087,25093,25099,25143,25145,25149,25155,25159,25164,25170,25173,25179,25182,25186,25763,25767,25771,25778,25784,25788,25793,25886,25890,25895,25902,25907,25915,25917,25920,25930,25933,25939,26394,26398,26402,26409,26412,26415,26421,26430,26436,26445,26504,26513,26517,26520,27512,27520,27523,27526,27532,27538,27549,27551,27555,27562,27565,27568,27585,27588,27599,27603,27606,28135,28139,28143,28150,28153,28156,28162,28367,28371,28375,28382,28385,28388,28391,28978,28984,28987,28990,29149,29151,29153,29156,29160,29172,29178,29183,29246,29250,29255,29260,29265,29328,29332,29337,29342,29347,29393,29397,29402,29407,29424,29429,29468,29527,29531,29539,29547,29618,29622,29627,29632,29637,29785,29787,29791,29796,29801,29810,29863,29865,29869,29872,30076,30097,30099,30101,30105,30108,30112,30121,30125,30131,30135,30149,30153,30162,30166,30175,30179,30185,30187,30190,30197,30200,30206,30214,30216,30230],[23028,23029,23024],"h1",{"id":23030},"seedance-20-图像转视频-api全面控制任意图像动画化",[11,23032,23033],{},"一张躺在硬盘里的产品照片不会产生任何互动。而一段 10 秒的产品视频——产品在影棚灯光下旋转、配有同步音效——却能带来点击、分享和销售转化。Seedance 2.0 的图像转视频 API 可以将任何静态图片变成完全可控的视频——只需一个 POST 请求。",[11,23035,23036,23037,23040],{},"本指南涵盖三种不同的图像转视频模式：单图动画、首尾帧插值和使用 ",[28,23038,23039],{},"@tag"," 引用的多图合成。每个章节都包含完整的、可直接运行的 Python 代码、真实演示输出，以及生成这些演示所使用的确切提示词。",[45,23042],{},[48,23044,23046],{"id":23045},"seedance-20-的图像转视频有何不同","Seedance 2.0 的图像转视频有何不同",[11,23048,23049],{},"目前每个主流 AI 视频平台都提供某种形式的图像转视频生成。Sora 接受单张图片作为起始帧。Kling 提供基本运动控制的图像动画。Veo 2 支持图像条件化以进行风格引导。它们都在解决同一个表层问题：让图片动起来。",[11,23051,23052,23053,23056],{},"Seedance 2.0 解决的是一个完全不同的问题。它让你在单次生成请求中对多张图片拥有",[23,23054,23055],{},"组合式控制","——并通过一套目前其他 API 都做不到的标签系统来实现。",[92,23058,23059],{"id":23059},"核心差异",[2036,23061,23062,23077],{},[2039,23063,23064],{},[2042,23065,23066,23069,23071,23073,23075],{},[2045,23067,23068],{},"能力",[2045,23070,17170],{},[2045,23072,13842],{},[2045,23074,17154],{},[2045,23076,17335],{},[2052,23078,23079,23092,23106,23120,23139,23153,23166],{},[2042,23080,23081,23084,23086,23088,23090],{},[2057,23082,23083],{},"单图转视频",[2057,23085,13796],{},[2057,23087,13796],{},[2057,23089,13796],{},[2057,23091,13796],{},[2042,23093,23094,23097,23099,23102,23104],{},[2057,23095,23096],{},"首尾帧控制",[2057,23098,13779],{},[2057,23100,23101],{},"✅（有限）",[2057,23103,13779],{},[2057,23105,13796],{},[2042,23107,23108,23111,23113,23115,23117],{},[2057,23109,23110],{},"多图合成",[2057,23112,13779],{},[2057,23114,13779],{},[2057,23116,13779],{},[2057,23118,23119],{},"✅（最多 9 张图片）",[2042,23121,23122,23125,23127,23129,23131],{},[2057,23123,23124],{},"逐图角色分配",[2057,23126,13779],{},[2057,23128,13779],{},[2057,23130,13779],{},[2057,23132,23133,23134,2911,23136,23138],{},"✅（",[28,23135,2903],{},[28,23137,2914],{},"……）",[2042,23140,23141,23144,23146,23148,23150],{},[2057,23142,23143],{},"混合媒体（图片 + 视频 + 音频）",[2057,23145,13779],{},[2057,23147,13779],{},[2057,23149,13779],{},[2057,23151,23152],{},"✅（最多 12 个文件）",[2042,23154,23155,23158,23160,23162,23164],{},[2057,23156,23157],{},"原生音频生成",[2057,23159,13779],{},[2057,23161,13779],{},[2057,23163,13779],{},[2057,23165,13796],{},[2042,23167,23168,23171,23174,23176,23179],{},[2057,23169,23170],{},"API 优先访问",[2057,23172,23173],{},"候补名单",[2057,23175,13796],{},[2057,23177,23178],{},"有限",[2057,23180,13796],{},[11,23182,23183,23185],{},[28,23184,23039],{}," 系统是 Seedance 2.0 的领先之处。当你上传三张图片时，可以这样编写提示词：",[136,23187,23190],{"className":23188,"code":23189,"language":2183},[2181],"@Image1 is the main character. @Image2 is the background environment.\n@Image3 is the art style reference. The character walks through the environment\nin the style of @Image3.\n",[28,23191,23189],{"__ignoreMap":141},[11,23193,23194,23195,298],{},"每张图片都获得一个特定的语义角色。模型不需要猜测哪张图片是角色、哪张是背景——你明确告诉它。关于这个标签系统的深入解读，请参阅",[37,23196,2963],{"href":2962},[92,23198,23200],{"id":23199},"为什么-tags-对开发者很重要","为什么 @Tags 对开发者很重要",[11,23202,23203],{},"如果你使用过其他图像转视频 API，你一定了解那种挫败感：你上传多张图片，然后只能指望模型能猜中你的意图。有时候它把背景图当作角色使用。有时候它把所有图片混成一团不连贯的画面。这无法调试，因为你无法控制模型如何解读每个输入。",[11,23205,23206,23208,23209,23212],{},[28,23207,23039],{}," 系统消除了这种不确定性。它本质上是一个变量绑定系统——你为每个输入命名，并在指令中显式引用它。这使得图像转视频生成变得",[23,23210,23211],{},"确定且可复现","。相同的输入、相同的标签、相同的提示词，每次都会得到相同的语义解读。",[11,23214,23215],{},"对于生产流水线来说，这就是\"试试看效果\"和\"配置好就上线\"之间的区别。你可以构建模板、验证输出、针对特定元素进行迭代，而不会让整个画面构成不可预测地发生变化。",[92,23217,23218],{"id":23218},"原生音频改变了输出",[11,23220,23221,23222,23225],{},"大多数 AI 图像转视频工具生成的是无声片段。你需要单独进行音频生成、单独调用一个 API，然后通过视频编辑将二者合并。Seedance 2.0 通过设置 ",[28,23223,23224],{},"generate_audio: true","，在同一个请求中生成同步音频。脚步声与行走动作匹配。风声与户外场景匹配。这省去了整个后期制作步骤。",[92,23227,23228],{"id":23228},"不支持的功能",[11,23230,23231],{},"Seedance 2.0 不支持在图像转视频生成中使用真实人脸。如果你的输入图像包含照片级真实的人脸，API 将自动拒绝该请求。插画角色、风格化面孔、动漫角色和非写实肖像都可以正常使用。这是一项刻意的安全限制，而非技术缺陷。",[45,23233],{},[48,23235,23237],{"id":23236},"快速设置api-密钥和环境","快速设置：API 密钥和环境",[11,23239,23240,23241,23243],{},"你需要三样东西：一个 EvoLink 账户、一个 API 密钥和 ",[28,23242,112],{}," 库。整个设置不到一分钟。",[92,23245,23247],{"id":23246},"第-1-步获取-api-密钥","第 1 步：获取 API 密钥",[70,23249,23250,23257,23260],{},[73,23251,23252,23253,23256],{},"前往 ",[37,23254,11928],{"href":211,"rel":23255},[41]," 创建一个免费账户",[73,23258,23259],{},"在控制面板中导航到 API Keys 部分",[73,23261,23262],{},"生成一个新密钥并复制它",[11,23264,23265,23266,23268,23269,298],{},"你的密钥以 ",[28,23267,245],{}," 开头，看起来像这样：",[28,23270,23271],{},"sk-XpXn...Ms1N",[92,23273,23275],{"id":23274},"第-2-步安装依赖","第 2 步：安装依赖",[136,23277,23278],{"className":138,"code":318,"language":140,"meta":141,"style":141},[28,23279,23280],{"__ignoreMap":141},[145,23281,23282,23284,23286],{"class":147,"line":148},[145,23283,190],{"class":151},[145,23285,193],{"class":159},[145,23287,329],{"class":159},[11,23289,23290],{},"就是这样。无需安装 SDK，无需复杂的认证流程。该 API 使用标准 REST 和 Bearer Token 认证。",[92,23292,23294],{"id":23293},"第-3-步设置-python-环境","第 3 步：设置 Python 环境",[136,23296,23298],{"className":339,"code":23297,"language":341,"meta":141,"style":141},"import requests\nimport time\nimport json\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n",[28,23299,23300,23306,23312,23318,23322,23330,23338,23346,23362,23370],{"__ignoreMap":141},[145,23301,23302,23304],{"class":147,"line":148},[145,23303,348],{"class":259},[145,23305,329],{"class":263},[145,23307,23308,23310],{"class":147,"line":166},[145,23309,348],{"class":259},[145,23311,357],{"class":263},[145,23313,23314,23316],{"class":147,"line":178},[145,23315,348],{"class":259},[145,23317,371],{"class":263},[145,23319,23320],{"class":147,"line":187},[145,23321,377],{"emptyLinePlaceholder":58},[145,23323,23324,23326,23328],{"class":147,"line":374},[145,23325,389],{"class":155},[145,23327,392],{"class":259},[145,23329,17537],{"class":159},[145,23331,23332,23334,23336],{"class":147,"line":380},[145,23333,413],{"class":155},[145,23335,392],{"class":259},[145,23337,418],{"class":159},[145,23339,23340,23342,23344],{"class":147,"line":386},[145,23341,424],{"class":155},[145,23343,392],{"class":259},[145,23345,429],{"class":263},[145,23347,23348,23350,23352,23354,23356,23358,23360],{"class":147,"line":410},[145,23349,435],{"class":159},[145,23351,438],{"class":263},[145,23353,441],{"class":259},[145,23355,444],{"class":159},[145,23357,447],{"class":155},[145,23359,450],{"class":159},[145,23361,453],{"class":263},[145,23363,23364,23366,23368],{"class":147,"line":421},[145,23365,459],{"class":159},[145,23367,438],{"class":263},[145,23369,464],{"class":159},[145,23371,23372],{"class":147,"line":432},[145,23373,470],{"class":263},[11,23375,23376,23377,23380],{},"本指南中的每个代码示例都基于这三个变量。将 ",[28,23378,23379],{},"YOUR_API_KEY"," 替换为你的实际密钥即可开始生成。",[18,23382,23383],{},[11,23384,23385],{},[23,23386,23387],{},[37,23388,23390],{"href":211,"rel":23389},[41],"免费获取你的 EvoLink API 密钥 →",[92,23392,23393],{"id":23393},"轮询辅助函数",[11,23395,23396],{},"由于视频生成需要 60–180 秒，你需要一个函数来轮询完成状态。这个辅助函数适用于所有三种图像转视频模式：",[136,23398,23400],{"className":339,"code":23399,"language":341,"meta":141,"style":141},"def wait_for_video(task_id, interval=5, max_wait=300):\n    \"\"\"Poll the task endpoint until the video is ready.\"\"\"\n    url = f\"{BASE_URL}/tasks/{task_id}\"\n    elapsed = 0\n\n    while elapsed \u003C max_wait:\n        resp = requests.get(url, headers=HEADERS)\n        data = resp.json()\n        status = data[\"status\"]\n\n        if status == \"completed\":\n            video_url = data[\"output\"][\"video_url\"]\n            print(f\"Video ready: {video_url}\")\n            return data\n        elif status == \"failed\":\n            print(f\"Generation failed: {data.get('error', 'Unknown error')}\")\n            return data\n\n        print(f\"Status: {status} ({elapsed}s elapsed)\")\n        time.sleep(interval)\n        elapsed += interval\n\n    print(\"Timed out waiting for video\")\n    return None\n",[28,23401,23402,23423,23428,23451,23459,23463,23474,23490,23499,23512,23516,23528,23544,23564,23571,23583,23612,23618,23622,23650,23654,23662,23666,23677],{"__ignoreMap":141},[145,23403,23404,23406,23408,23410,23412,23414,23417,23419,23421],{"class":147,"line":148},[145,23405,526],{"class":259},[145,23407,529],{"class":151},[145,23409,11653],{"class":263},[145,23411,267],{"class":259},[145,23413,1353],{"class":155},[145,23415,23416],{"class":263},", max_wait",[145,23418,267],{"class":259},[145,23420,11664],{"class":155},[145,23422,548],{"class":263},[145,23424,23425],{"class":147,"line":166},[145,23426,23427],{"class":159},"    \"\"\"Poll the task endpoint until the video is ready.\"\"\"\n",[145,23429,23430,23433,23435,23437,23439,23441,23443,23445,23447,23449],{"class":147,"line":178},[145,23431,23432],{"class":263},"    url ",[145,23434,267],{"class":259},[145,23436,3353],{"class":259},[145,23438,450],{"class":159},[145,23440,679],{"class":155},[145,23442,682],{"class":159},[145,23444,685],{"class":155},[145,23446,688],{"class":263},[145,23448,691],{"class":155},[145,23450,951],{"class":159},[145,23452,23453,23455,23457],{"class":147,"line":187},[145,23454,631],{"class":263},[145,23456,267],{"class":259},[145,23458,636],{"class":155},[145,23460,23461],{"class":147,"line":374},[145,23462,377],{"emptyLinePlaceholder":58},[145,23464,23465,23467,23469,23471],{"class":147,"line":380},[145,23466,642],{"class":259},[145,23468,645],{"class":263},[145,23470,648],{"class":259},[145,23472,23473],{"class":263}," max_wait:\n",[145,23475,23476,23478,23480,23482,23484,23486,23488],{"class":147,"line":386},[145,23477,6908],{"class":263},[145,23479,267],{"class":259},[145,23481,1132],{"class":263},[145,23483,17766],{"class":701},[145,23485,267],{"class":259},[145,23487,424],{"class":155},[145,23489,407],{"class":263},[145,23491,23492,23495,23497],{"class":147,"line":410},[145,23493,23494],{"class":263},"        data ",[145,23496,267],{"class":259},[145,23498,11734],{"class":263},[145,23500,23501,23503,23505,23508,23510],{"class":147,"line":421},[145,23502,753],{"class":263},[145,23504,267],{"class":259},[145,23506,23507],{"class":263}," data[",[145,23509,761],{"class":159},[145,23511,764],{"class":263},[145,23513,23514],{"class":147,"line":432},[145,23515,377],{"emptyLinePlaceholder":58},[145,23517,23518,23520,23522,23524,23526],{"class":147,"line":456},[145,23519,848],{"class":259},[145,23521,851],{"class":263},[145,23523,854],{"class":259},[145,23525,857],{"class":159},[145,23527,860],{"class":263},[145,23529,23530,23532,23534,23536,23538,23540,23542],{"class":147,"line":467},[145,23531,7383],{"class":263},[145,23533,267],{"class":259},[145,23535,23507],{"class":263},[145,23537,21462],{"class":159},[145,23539,1563],{"class":263},[145,23541,14886],{"class":159},[145,23543,764],{"class":263},[145,23545,23546,23548,23550,23552,23554,23556,23558,23560,23562],{"class":147,"line":600},[145,23547,5558],{"class":155},[145,23549,794],{"class":263},[145,23551,441],{"class":259},[145,23553,11774],{"class":159},[145,23555,685],{"class":155},[145,23557,1679],{"class":263},[145,23559,691],{"class":155},[145,23561,450],{"class":159},[145,23563,407],{"class":263},[145,23565,23566,23568],{"class":147,"line":605},[145,23567,866],{"class":259},[145,23569,23570],{"class":263}," data\n",[145,23572,23573,23575,23577,23579,23581],{"class":147,"line":611},[145,23574,875],{"class":259},[145,23576,851],{"class":263},[145,23578,854],{"class":259},[145,23580,882],{"class":159},[145,23582,860],{"class":263},[145,23584,23585,23587,23589,23591,23593,23595,23598,23600,23602,23604,23606,23608,23610],{"class":147,"line":617},[145,23586,5558],{"class":155},[145,23588,794],{"class":263},[145,23590,441],{"class":259},[145,23592,11823],{"class":159},[145,23594,685],{"class":155},[145,23596,23597],{"class":263},"data.get(",[145,23599,11831],{"class":159},[145,23601,401],{"class":263},[145,23603,943],{"class":159},[145,23605,946],{"class":263},[145,23607,691],{"class":155},[145,23609,450],{"class":159},[145,23611,407],{"class":263},[145,23613,23614,23616],{"class":147,"line":623},[145,23615,866],{"class":259},[145,23617,23570],{"class":263},[145,23619,23620],{"class":147,"line":628},[145,23621,377],{"emptyLinePlaceholder":58},[145,23623,23624,23626,23628,23630,23632,23634,23636,23638,23640,23642,23644,23646,23648],{"class":147,"line":639},[145,23625,791],{"class":155},[145,23627,794],{"class":263},[145,23629,441],{"class":259},[145,23631,11860],{"class":159},[145,23633,685],{"class":155},[145,23635,814],{"class":263},[145,23637,691],{"class":155},[145,23639,1219],{"class":159},[145,23641,685],{"class":155},[145,23643,804],{"class":263},[145,23645,691],{"class":155},[145,23647,11877],{"class":159},[145,23649,407],{"class":263},[145,23651,23652],{"class":147,"line":654},[145,23653,11884],{"class":263},[145,23655,23656,23658,23660],{"class":147,"line":660},[145,23657,980],{"class":263},[145,23659,983],{"class":259},[145,23661,11893],{"class":263},[145,23663,23664],{"class":147,"line":671},[145,23665,377],{"emptyLinePlaceholder":58},[145,23667,23668,23670,23672,23675],{"class":147,"line":698},[145,23669,1103],{"class":155},[145,23671,794],{"class":263},[145,23673,23674],{"class":159},"\"Timed out waiting for video\"",[145,23676,407],{"class":263},[145,23678,23679,23681],{"class":147,"line":710},[145,23680,1704],{"class":259},[145,23682,11915],{"class":155},[11,23684,23685,23686,23688,23689,23688,23691,281,23693,23695],{},"任务状态遵循一个简单的生命周期：",[28,23687,2076],{}," → ",[28,23690,2080],{},[28,23692,2084],{},[28,23694,2087],{},"。响应中的视频 URL 在 24 小时后过期——请在此之前下载或使用它们。",[11,23697,23698,23699,298],{},"关于 API 基础知识（文本转视频、参数、错误处理）的完整演练，请参阅",[37,23700,17485],{"href":17484},[45,23702],{},[48,23704,23706],{"id":23705},"模式-1单图动画","模式 1：单图动画",[11,23708,23709],{},"单图动画是最常见的图像转视频工作流。你提供一张图片和一段描述所需运动的提示词。模型会保留你图片的视觉内容，同时添加逼真的运动、镜头运动和环境效果。",[92,23711,6420],{"id":6420},[11,23713,23714,23715,23717,23718,23721],{},"当你在 ",[28,23716,2891],{}," 中只传入一个 URL 时，Seedance 2.0 将其视为",[23,23719,23720],{},"主要视觉参考","。模型将第一帧锚定到你的图片，并根据提示词生成向前的运动。输出会保留：",[96,23723,23724,23730,23736,23742],{},[73,23725,23726,23727],{},"源图像的",[23,23728,23729],{},"色彩调性",[73,23731,23732,23735],{},[23,23733,23734],{},"构图","和画面布局",[73,23737,23738,23741],{},[23,23739,23740],{},"主体特征","（服装、形状、细节特征）",[73,23743,23744,23747],{},[23,23745,23746],{},"艺术风格","（插画、3D 渲染、摄影）",[11,23749,23750,23751,23754],{},"你的提示词控制",[2614,23752,23753],{},"变化的内容","：运动、镜头角度、光照变化和环境动态。",[92,23756,23758],{"id":23757},"完整代码单图转视频","完整代码：单图转视频",[136,23760,23762],{"className":339,"code":23761,"language":341,"meta":141,"style":141},"import requests\nimport time\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\ndef wait_for_video(task_id, interval=5, max_wait=300):\n    url = f\"{BASE_URL}/tasks/{task_id}\"\n    elapsed = 0\n    while elapsed \u003C max_wait:\n        resp = requests.get(url, headers=HEADERS)\n        data = resp.json()\n        status = data[\"status\"]\n        if status == \"completed\":\n            print(f\"Video ready: {data['output']['video_url']}\")\n            return data\n        elif status == \"failed\":\n            print(f\"Failed: {data.get('error', 'Unknown error')}\")\n            return data\n        print(f\"Status: {status} ({elapsed}s)\")\n        time.sleep(interval)\n        elapsed += interval\n    return None\n\n# --- Single Image Animation ---\npayload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": (\n        \"The woman in the painting slowly reaches for a coffee cup on the table, \"\n        \"lifts it to her lips, and takes a quiet sip. Soft morning light filters \"\n        \"through a nearby window. Gentle steam rises from the cup. \"\n        \"Painterly brushstroke texture preserved throughout.\"\n    ),\n    \"image_urls\": [\n        \"https://example.com/painting-woman.jpg\"\n    ],\n    \"duration\": 8,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\",\n    \"generate_audio\": True\n}\n\nresp = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json=payload\n)\nresult = resp.json()\nprint(f\"Task ID: {result['task_id']}\")\n\n# Poll until complete\nvideo_data = wait_for_video(result[\"task_id\"])\n",[28,23763,23764,23770,23776,23780,23788,23796,23804,23820,23828,23832,23836,23856,23878,23886,23896,23912,23920,23932,23944,23973,23979,23991,24020,24026,24054,24058,24066,24072,24076,24081,24089,24099,24105,24110,24115,24120,24125,24129,24135,24140,24144,24154,24164,24174,24182,24186,24190,24199,24211,24221,24229,24233,24241,24266,24270,24275],{"__ignoreMap":141},[145,23765,23766,23768],{"class":147,"line":148},[145,23767,348],{"class":259},[145,23769,329],{"class":263},[145,23771,23772,23774],{"class":147,"line":166},[145,23773,348],{"class":259},[145,23775,357],{"class":263},[145,23777,23778],{"class":147,"line":178},[145,23779,377],{"emptyLinePlaceholder":58},[145,23781,23782,23784,23786],{"class":147,"line":187},[145,23783,389],{"class":155},[145,23785,392],{"class":259},[145,23787,17537],{"class":159},[145,23789,23790,23792,23794],{"class":147,"line":374},[145,23791,413],{"class":155},[145,23793,392],{"class":259},[145,23795,418],{"class":159},[145,23797,23798,23800,23802],{"class":147,"line":380},[145,23799,424],{"class":155},[145,23801,392],{"class":259},[145,23803,429],{"class":263},[145,23805,23806,23808,23810,23812,23814,23816,23818],{"class":147,"line":386},[145,23807,435],{"class":159},[145,23809,438],{"class":263},[145,23811,441],{"class":259},[145,23813,444],{"class":159},[145,23815,447],{"class":155},[145,23817,450],{"class":159},[145,23819,453],{"class":263},[145,23821,23822,23824,23826],{"class":147,"line":410},[145,23823,459],{"class":159},[145,23825,438],{"class":263},[145,23827,464],{"class":159},[145,23829,23830],{"class":147,"line":421},[145,23831,470],{"class":263},[145,23833,23834],{"class":147,"line":432},[145,23835,377],{"emptyLinePlaceholder":58},[145,23837,23838,23840,23842,23844,23846,23848,23850,23852,23854],{"class":147,"line":456},[145,23839,526],{"class":259},[145,23841,529],{"class":151},[145,23843,11653],{"class":263},[145,23845,267],{"class":259},[145,23847,1353],{"class":155},[145,23849,23416],{"class":263},[145,23851,267],{"class":259},[145,23853,11664],{"class":155},[145,23855,548],{"class":263},[145,23857,23858,23860,23862,23864,23866,23868,23870,23872,23874,23876],{"class":147,"line":467},[145,23859,23432],{"class":263},[145,23861,267],{"class":259},[145,23863,3353],{"class":259},[145,23865,450],{"class":159},[145,23867,679],{"class":155},[145,23869,682],{"class":159},[145,23871,685],{"class":155},[145,23873,688],{"class":263},[145,23875,691],{"class":155},[145,23877,951],{"class":159},[145,23879,23880,23882,23884],{"class":147,"line":600},[145,23881,631],{"class":263},[145,23883,267],{"class":259},[145,23885,636],{"class":155},[145,23887,23888,23890,23892,23894],{"class":147,"line":605},[145,23889,642],{"class":259},[145,23891,645],{"class":263},[145,23893,648],{"class":259},[145,23895,23473],{"class":263},[145,23897,23898,23900,23902,23904,23906,23908,23910],{"class":147,"line":611},[145,23899,6908],{"class":263},[145,23901,267],{"class":259},[145,23903,1132],{"class":263},[145,23905,17766],{"class":701},[145,23907,267],{"class":259},[145,23909,424],{"class":155},[145,23911,407],{"class":263},[145,23913,23914,23916,23918],{"class":147,"line":617},[145,23915,23494],{"class":263},[145,23917,267],{"class":259},[145,23919,11734],{"class":263},[145,23921,23922,23924,23926,23928,23930],{"class":147,"line":623},[145,23923,753],{"class":263},[145,23925,267],{"class":259},[145,23927,23507],{"class":263},[145,23929,761],{"class":159},[145,23931,764],{"class":263},[145,23933,23934,23936,23938,23940,23942],{"class":147,"line":628},[145,23935,848],{"class":259},[145,23937,851],{"class":263},[145,23939,854],{"class":259},[145,23941,857],{"class":159},[145,23943,860],{"class":263},[145,23945,23946,23948,23950,23952,23954,23956,23959,23961,23963,23965,23967,23969,23971],{"class":147,"line":639},[145,23947,5558],{"class":155},[145,23949,794],{"class":263},[145,23951,441],{"class":259},[145,23953,11774],{"class":159},[145,23955,685],{"class":155},[145,23957,23958],{"class":263},"data[",[145,23960,17828],{"class":159},[145,23962,1563],{"class":263},[145,23964,17833],{"class":159},[145,23966,1536],{"class":263},[145,23968,691],{"class":155},[145,23970,450],{"class":159},[145,23972,407],{"class":263},[145,23974,23975,23977],{"class":147,"line":654},[145,23976,866],{"class":259},[145,23978,23570],{"class":263},[145,23980,23981,23983,23985,23987,23989],{"class":147,"line":660},[145,23982,875],{"class":259},[145,23984,851],{"class":263},[145,23986,854],{"class":259},[145,23988,882],{"class":159},[145,23990,860],{"class":263},[145,23992,23993,23995,23997,23999,24002,24004,24006,24008,24010,24012,24014,24016,24018],{"class":147,"line":671},[145,23994,5558],{"class":155},[145,23996,794],{"class":263},[145,23998,441],{"class":259},[145,24000,24001],{"class":159},"\"Failed: ",[145,24003,685],{"class":155},[145,24005,23597],{"class":263},[145,24007,11831],{"class":159},[145,24009,401],{"class":263},[145,24011,943],{"class":159},[145,24013,946],{"class":263},[145,24015,691],{"class":155},[145,24017,450],{"class":159},[145,24019,407],{"class":263},[145,24021,24022,24024],{"class":147,"line":698},[145,24023,866],{"class":259},[145,24025,23570],{"class":263},[145,24027,24028,24030,24032,24034,24036,24038,24040,24042,24044,24046,24048,24050,24052],{"class":147,"line":710},[145,24029,791],{"class":155},[145,24031,794],{"class":263},[145,24033,441],{"class":259},[145,24035,11860],{"class":159},[145,24037,685],{"class":155},[145,24039,814],{"class":263},[145,24041,691],{"class":155},[145,24043,1219],{"class":159},[145,24045,685],{"class":155},[145,24047,804],{"class":263},[145,24049,691],{"class":155},[145,24051,10693],{"class":159},[145,24053,407],{"class":263},[145,24055,24056],{"class":147,"line":716},[145,24057,11884],{"class":263},[145,24059,24060,24062,24064],{"class":147,"line":722},[145,24061,980],{"class":263},[145,24063,983],{"class":259},[145,24065,11893],{"class":263},[145,24067,24068,24070],{"class":147,"line":728},[145,24069,1704],{"class":259},[145,24071,11915],{"class":155},[145,24073,24074],{"class":147,"line":739},[145,24075,377],{"emptyLinePlaceholder":58},[145,24077,24078],{"class":147,"line":744},[145,24079,24080],{"class":174},"# --- Single Image Animation ---\n",[145,24082,24083,24085,24087],{"class":147,"line":750},[145,24084,3654],{"class":263},[145,24086,267],{"class":259},[145,24088,429],{"class":263},[145,24090,24091,24093,24095,24097],{"class":147,"line":767},[145,24092,3663],{"class":159},[145,24094,438],{"class":263},[145,24096,1309],{"class":159},[145,24098,453],{"class":263},[145,24100,24101,24103],{"class":147,"line":788},[145,24102,3674],{"class":159},[145,24104,1323],{"class":263},[145,24106,24107],{"class":147,"line":834},[145,24108,24109],{"class":159},"        \"The woman in the painting slowly reaches for a coffee cup on the table, \"\n",[145,24111,24112],{"class":147,"line":839},[145,24113,24114],{"class":159},"        \"lifts it to her lips, and takes a quiet sip. Soft morning light filters \"\n",[145,24116,24117],{"class":147,"line":845},[145,24118,24119],{"class":159},"        \"through a nearby window. Gentle steam rises from the cup. \"\n",[145,24121,24122],{"class":147,"line":863},[145,24123,24124],{"class":159},"        \"Painterly brushstroke texture preserved throughout.\"\n",[145,24126,24127],{"class":147,"line":872},[145,24128,3797],{"class":263},[145,24130,24131,24133],{"class":147,"line":887},[145,24132,15319],{"class":159},[145,24134,2686],{"class":263},[145,24136,24137],{"class":147,"line":903},[145,24138,24139],{"class":159},"        \"https://example.com/painting-woman.jpg\"\n",[145,24141,24142],{"class":147,"line":915},[145,24143,16301],{"class":263},[145,24145,24146,24148,24150,24152],{"class":147,"line":954},[145,24147,3686],{"class":159},[145,24149,438],{"class":263},[145,24151,3691],{"class":155},[145,24153,453],{"class":263},[145,24155,24156,24158,24160,24162],{"class":147,"line":960},[145,24157,3698],{"class":159},[145,24159,438],{"class":263},[145,24161,3703],{"class":159},[145,24163,453],{"class":263},[145,24165,24166,24168,24170,24172],{"class":147,"line":965},[145,24167,3710],{"class":159},[145,24169,438],{"class":263},[145,24171,1385],{"class":159},[145,24173,453],{"class":263},[145,24175,24176,24178,24180],{"class":147,"line":971},[145,24177,3726],{"class":159},[145,24179,438],{"class":263},[145,24181,3731],{"class":155},[145,24183,24184],{"class":147,"line":977},[145,24185,470],{"class":263},[145,24187,24188],{"class":147,"line":989},[145,24189,377],{"emptyLinePlaceholder":58},[145,24191,24192,24195,24197],{"class":147,"line":994},[145,24193,24194],{"class":263},"resp ",[145,24196,267],{"class":259},[145,24198,1433],{"class":263},[145,24200,24201,24203,24205,24207,24209],{"class":147,"line":5521},[145,24202,6517],{"class":259},[145,24204,450],{"class":159},[145,24206,679],{"class":155},[145,24208,1445],{"class":159},[145,24210,453],{"class":263},[145,24212,24213,24215,24217,24219],{"class":147,"line":5527},[145,24214,6530],{"class":701},[145,24216,267],{"class":259},[145,24218,424],{"class":155},[145,24220,453],{"class":263},[145,24222,24223,24225,24227],{"class":147,"line":5555},[145,24224,6541],{"class":701},[145,24226,267],{"class":259},[145,24228,2783],{"class":263},[145,24230,24231],{"class":147,"line":5586},[145,24232,407],{"class":263},[145,24234,24235,24237,24239],{"class":147,"line":5606},[145,24236,12197],{"class":263},[145,24238,267],{"class":259},[145,24240,11734],{"class":263},[145,24242,24243,24245,24247,24249,24252,24254,24256,24258,24260,24262,24264],{"class":147,"line":5612},[145,24244,6563],{"class":155},[145,24246,794],{"class":263},[145,24248,441],{"class":259},[145,24250,24251],{"class":159},"\"Task ID: ",[145,24253,685],{"class":155},[145,24255,11779],{"class":263},[145,24257,19814],{"class":159},[145,24259,1536],{"class":263},[145,24261,691],{"class":155},[145,24263,450],{"class":159},[145,24265,407],{"class":263},[145,24267,24268],{"class":147,"line":5618},[145,24269,377],{"emptyLinePlaceholder":58},[145,24271,24272],{"class":147,"line":5623},[145,24273,24274],{"class":174},"# Poll until complete\n",[145,24276,24277,24280,24282,24285,24287],{"class":147,"line":5636},[145,24278,24279],{"class":263},"video_data ",[145,24281,267],{"class":259},[145,24283,24284],{"class":263}," wait_for_video(result[",[145,24286,7673],{"class":159},[145,24288,1630],{"class":263},[18,24290,24291],{},[11,24292,24293,24296,24297,24299],{},[23,24294,24295],{},"用你自己的 API 密钥运行此代码。"," 将 ",[28,24298,2891],{}," 的值替换为任何公开可访问的图片 URL。",[92,24301,24303],{"id":24302},"演示画中人栩栩如生","演示：画中人栩栩如生",[56,24305,60,24306],{"controls":58,"playsInline":58,"style":59},[62,24307],{"src":18723,"type":65},[11,24309,24310,2423,24313],{},[23,24311,24312],{},"使用的提示词：",[2614,24314,24315],{},"\"The woman in the painting slowly reaches forward, picks up a coffee cup from the table, and takes a quiet sip. Soft indoor lighting. Painterly brushstroke style maintained. Subtle steam rises from the cup.\"",[11,24317,24318,24319,24321],{},"此演示使用单张油画肖像作为 ",[28,24320,2903],{},"（角色参考）。模型在生成自然的手臂运动和蒸汽物理效果的同时，保留了油画美学风格。",[92,24323,24325],{"id":24324},"演示风格迁移动画","演示：风格迁移动画",[56,24327,60,24328],{"controls":58,"playsInline":58,"style":59},[62,24329],{"src":24330,"type":65},"https://cdn.evolink.ai/seedance2api/%E6%A2%B5%E9%AB%98%E7%94%BB%E5%A5%B3%E5%AD%A9%E4%B8%8E%E6%9D%91%E5%BA%84.mp4",[11,24332,24333,2423,24335],{},[23,24334,24312],{},[2614,24336,24337],{},"\"A young girl walks along a winding path through a Van Gogh-style village. Swirling sky with thick brushstrokes. Vibrant yellows and blues. The girl's dress and hair flow in the wind. Camera slowly follows her from behind.\"",[11,24339,24340],{},"请注意输入图像中的梵高笔触风格如何贯穿每一帧——旋转的天空、建筑物上的厚涂质感、色彩关系。单图动画特别擅长在保持风格一致的前提下生成运动。",[92,24342,24343],{"id":24343},"单图模式的提示词最佳实践",[11,24345,24346],{},"你的提示词决定了动画的质量。静态描述产生静态视频。富含运动的提示词产生动态输出。",[11,24348,24349],{},[23,24350,24351],{},"弱提示词：",[136,24353,24356],{"className":24354,"code":24355,"language":2183},[2181],"A cat sitting on a windowsill\n",[28,24357,24355],{"__ignoreMap":141},[11,24359,24360],{},[23,24361,24362],{},"强提示词：",[136,24364,24367],{"className":24365,"code":24366,"language":2183},[2181],"The cat stretches lazily on the windowsill, yawns wide showing tiny teeth,\nthen curls back into a ball. Afternoon sunlight shifts slowly across the fur.\nDust motes float in the light beam. Camera holds steady, slight depth of field.\n",[28,24368,24366],{"__ignoreMap":141},[11,24370,24371,24372,24375,24376,24379,24380,24383],{},"差异在于：强提示词指定了",[23,24373,24374],{},"连续动作","（伸展 → 打哈欠 → 蜷缩）、",[23,24377,24378],{},"环境运动","（阳光变化、浮尘）和",[23,24381,24382],{},"镜头行为","（固定、浅景深）。",[11,24385,24386],{},"单图提示词的关键原则：",[2036,24388,24389,24398],{},[2039,24390,24391],{},[2042,24392,24393,24396],{},[2045,24394,24395],{},"原则",[2045,24397,11442],{},[2052,24399,24400,24408,24416,24424,24432],{},[2042,24401,24402,24405],{},[2057,24403,24404],{},"描述运动，而非外观",[2057,24406,24407],{},"\"walks forward\" 而非 \"a person standing\"",[2042,24409,24410,24413],{},[2057,24411,24412],{},"排列 2-3 个连续动作",[2057,24414,24415],{},"\"picks up → examines → sets down\"",[2042,24417,24418,24421],{},[2057,24419,24420],{},"添加环境动态",[2057,24422,24423],{},"\"wind rustles leaves\"、\"rain beads on glass\"",[2042,24425,24426,24429],{},[2057,24427,24428],{},"指定镜头运动",[2057,24430,24431],{},"\"slow pan left\"、\"camera pulls back to reveal\"",[2042,24433,24434,24437],{},[2057,24435,24436],{},"匹配图片的艺术风格",[2057,24438,24439],{},"\"painterly strokes preserved\"、\"3D render quality\"",[11,24441,24442,24443,24445,24446,298],{},"关于完整的提示词工程参考，请参阅 ",[37,24444,2209],{"href":1766},"。关于镜头运动的专门技巧，请参阅",[37,24447,19106],{"href":3849},[45,24449],{},[48,24451,24453],{"id":24452},"模式-2首尾帧控制","模式 2：首尾帧控制",[11,24455,24456,24457,24460],{},"单图模式锚定视频的开头。首尾帧模式则锚定",[23,24458,24459],{},"两端","。你提供两张图片——开始帧和结束帧——Seedance 2.0 会在两者之间生成平滑过渡。",[92,24462,6420],{"id":24463},"工作原理-1",[11,24465,24466,24467,24469],{},"当 ",[28,24468,2891],{}," 恰好包含两个 URL 时，模型会将它们解读为：",[96,24471,24472,24478],{},[73,24473,24474,24477],{},[23,24475,24476],{},"第一个 URL"," → 起始帧",[73,24479,24480,24483],{},[23,24481,24482],{},"第二个 URL"," → 结束帧",[11,24485,24486,24487,24490],{},"模型随后生成中间帧，创建自然、物理上合理的过渡。你的提示词引导过渡的",[2614,24488,24489],{},"风格","——无论是平滑变形、叙事旅程还是戏剧性变换。",[92,24492,24493],{"id":24493},"应用场景",[11,24495,24496],{},"首尾帧控制解决了单图模式无法处理的问题：",[96,24498,24499,24505,24511,24517,24523],{},[73,24500,24501,24504],{},[23,24502,24503],{},"前后对比展示","：翻新、改造、季节变化",[73,24506,24507,24510],{},[23,24508,24509],{},"延时模拟","：从黎明到黄昏、从空房间到陈设齐全的房间",[73,24512,24513,24516],{},[23,24514,24515],{},"场景过渡","：一个场景变形为另一个场景",[73,24518,24519,24522],{},[23,24520,24521],{},"产品变换","：从封闭包装到打开的产品展示",[73,24524,24525,24528],{},[23,24526,24527],{},"变形效果","：一个角色或风格变成另一个",[92,24530,24532],{"id":24531},"完整代码首尾帧插值","完整代码：首尾帧插值",[136,24534,24536],{"className":339,"code":24535,"language":341,"meta":141,"style":141},"import requests\nimport time\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\ndef wait_for_video(task_id, interval=5, max_wait=300):\n    url = f\"{BASE_URL}/tasks/{task_id}\"\n    elapsed = 0\n    while elapsed \u003C max_wait:\n        resp = requests.get(url, headers=HEADERS)\n        data = resp.json()\n        status = data[\"status\"]\n        if status == \"completed\":\n            print(f\"Video ready: {data['output']['video_url']}\")\n            return data\n        elif status == \"failed\":\n            print(f\"Failed: {data.get('error', 'Unknown error')}\")\n            return data\n        print(f\"Status: {status} ({elapsed}s)\")\n        time.sleep(interval)\n        elapsed += interval\n    return None\n\n# --- First-Last Frame Control ---\npayload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": (\n        \"Smooth cinematic transition. The real-world landscape gradually \"\n        \"transforms into a traditional Chinese ink wash painting. Mountains \"\n        \"dissolve from photorealistic to brushstroke. Water becomes flowing ink. \"\n        \"Sky shifts from blue to rice-paper white. Slow, meditative pace.\"\n    ),\n    \"image_urls\": [\n        \"https://example.com/real-landscape.jpg\",\n        \"https://example.com/ink-wash-painting.jpg\"\n    ],\n    \"duration\": 10,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\"\n}\n\nresp = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json=payload\n)\nresult = resp.json()\nprint(f\"Task ID: {result['task_id']}\")\n\nvideo_data = wait_for_video(result[\"task_id\"])\n",[28,24537,24538,24544,24550,24554,24562,24570,24578,24594,24602,24606,24610,24630,24652,24660,24670,24686,24694,24706,24718,24746,24752,24764,24792,24798,24826,24830,24838,24844,24848,24853,24861,24871,24877,24882,24887,24892,24897,24901,24907,24914,24919,24923,24933,24943,24951,24955,24959,24967,24979,24989,24997,25001,25009,25033,25037],{"__ignoreMap":141},[145,24539,24540,24542],{"class":147,"line":148},[145,24541,348],{"class":259},[145,24543,329],{"class":263},[145,24545,24546,24548],{"class":147,"line":166},[145,24547,348],{"class":259},[145,24549,357],{"class":263},[145,24551,24552],{"class":147,"line":178},[145,24553,377],{"emptyLinePlaceholder":58},[145,24555,24556,24558,24560],{"class":147,"line":187},[145,24557,389],{"class":155},[145,24559,392],{"class":259},[145,24561,17537],{"class":159},[145,24563,24564,24566,24568],{"class":147,"line":374},[145,24565,413],{"class":155},[145,24567,392],{"class":259},[145,24569,418],{"class":159},[145,24571,24572,24574,24576],{"class":147,"line":380},[145,24573,424],{"class":155},[145,24575,392],{"class":259},[145,24577,429],{"class":263},[145,24579,24580,24582,24584,24586,24588,24590,24592],{"class":147,"line":386},[145,24581,435],{"class":159},[145,24583,438],{"class":263},[145,24585,441],{"class":259},[145,24587,444],{"class":159},[145,24589,447],{"class":155},[145,24591,450],{"class":159},[145,24593,453],{"class":263},[145,24595,24596,24598,24600],{"class":147,"line":410},[145,24597,459],{"class":159},[145,24599,438],{"class":263},[145,24601,464],{"class":159},[145,24603,24604],{"class":147,"line":421},[145,24605,470],{"class":263},[145,24607,24608],{"class":147,"line":432},[145,24609,377],{"emptyLinePlaceholder":58},[145,24611,24612,24614,24616,24618,24620,24622,24624,24626,24628],{"class":147,"line":456},[145,24613,526],{"class":259},[145,24615,529],{"class":151},[145,24617,11653],{"class":263},[145,24619,267],{"class":259},[145,24621,1353],{"class":155},[145,24623,23416],{"class":263},[145,24625,267],{"class":259},[145,24627,11664],{"class":155},[145,24629,548],{"class":263},[145,24631,24632,24634,24636,24638,24640,24642,24644,24646,24648,24650],{"class":147,"line":467},[145,24633,23432],{"class":263},[145,24635,267],{"class":259},[145,24637,3353],{"class":259},[145,24639,450],{"class":159},[145,24641,679],{"class":155},[145,24643,682],{"class":159},[145,24645,685],{"class":155},[145,24647,688],{"class":263},[145,24649,691],{"class":155},[145,24651,951],{"class":159},[145,24653,24654,24656,24658],{"class":147,"line":600},[145,24655,631],{"class":263},[145,24657,267],{"class":259},[145,24659,636],{"class":155},[145,24661,24662,24664,24666,24668],{"class":147,"line":605},[145,24663,642],{"class":259},[145,24665,645],{"class":263},[145,24667,648],{"class":259},[145,24669,23473],{"class":263},[145,24671,24672,24674,24676,24678,24680,24682,24684],{"class":147,"line":611},[145,24673,6908],{"class":263},[145,24675,267],{"class":259},[145,24677,1132],{"class":263},[145,24679,17766],{"class":701},[145,24681,267],{"class":259},[145,24683,424],{"class":155},[145,24685,407],{"class":263},[145,24687,24688,24690,24692],{"class":147,"line":617},[145,24689,23494],{"class":263},[145,24691,267],{"class":259},[145,24693,11734],{"class":263},[145,24695,24696,24698,24700,24702,24704],{"class":147,"line":623},[145,24697,753],{"class":263},[145,24699,267],{"class":259},[145,24701,23507],{"class":263},[145,24703,761],{"class":159},[145,24705,764],{"class":263},[145,24707,24708,24710,24712,24714,24716],{"class":147,"line":628},[145,24709,848],{"class":259},[145,24711,851],{"class":263},[145,24713,854],{"class":259},[145,24715,857],{"class":159},[145,24717,860],{"class":263},[145,24719,24720,24722,24724,24726,24728,24730,24732,24734,24736,24738,24740,24742,24744],{"class":147,"line":639},[145,24721,5558],{"class":155},[145,24723,794],{"class":263},[145,24725,441],{"class":259},[145,24727,11774],{"class":159},[145,24729,685],{"class":155},[145,24731,23958],{"class":263},[145,24733,17828],{"class":159},[145,24735,1563],{"class":263},[145,24737,17833],{"class":159},[145,24739,1536],{"class":263},[145,24741,691],{"class":155},[145,24743,450],{"class":159},[145,24745,407],{"class":263},[145,24747,24748,24750],{"class":147,"line":654},[145,24749,866],{"class":259},[145,24751,23570],{"class":263},[145,24753,24754,24756,24758,24760,24762],{"class":147,"line":660},[145,24755,875],{"class":259},[145,24757,851],{"class":263},[145,24759,854],{"class":259},[145,24761,882],{"class":159},[145,24763,860],{"class":263},[145,24765,24766,24768,24770,24772,24774,24776,24778,24780,24782,24784,24786,24788,24790],{"class":147,"line":671},[145,24767,5558],{"class":155},[145,24769,794],{"class":263},[145,24771,441],{"class":259},[145,24773,24001],{"class":159},[145,24775,685],{"class":155},[145,24777,23597],{"class":263},[145,24779,11831],{"class":159},[145,24781,401],{"class":263},[145,24783,943],{"class":159},[145,24785,946],{"class":263},[145,24787,691],{"class":155},[145,24789,450],{"class":159},[145,24791,407],{"class":263},[145,24793,24794,24796],{"class":147,"line":698},[145,24795,866],{"class":259},[145,24797,23570],{"class":263},[145,24799,24800,24802,24804,24806,24808,24810,24812,24814,24816,24818,24820,24822,24824],{"class":147,"line":710},[145,24801,791],{"class":155},[145,24803,794],{"class":263},[145,24805,441],{"class":259},[145,24807,11860],{"class":159},[145,24809,685],{"class":155},[145,24811,814],{"class":263},[145,24813,691],{"class":155},[145,24815,1219],{"class":159},[145,24817,685],{"class":155},[145,24819,804],{"class":263},[145,24821,691],{"class":155},[145,24823,10693],{"class":159},[145,24825,407],{"class":263},[145,24827,24828],{"class":147,"line":716},[145,24829,11884],{"class":263},[145,24831,24832,24834,24836],{"class":147,"line":722},[145,24833,980],{"class":263},[145,24835,983],{"class":259},[145,24837,11893],{"class":263},[145,24839,24840,24842],{"class":147,"line":728},[145,24841,1704],{"class":259},[145,24843,11915],{"class":155},[145,24845,24846],{"class":147,"line":739},[145,24847,377],{"emptyLinePlaceholder":58},[145,24849,24850],{"class":147,"line":744},[145,24851,24852],{"class":174},"# --- First-Last Frame Control ---\n",[145,24854,24855,24857,24859],{"class":147,"line":750},[145,24856,3654],{"class":263},[145,24858,267],{"class":259},[145,24860,429],{"class":263},[145,24862,24863,24865,24867,24869],{"class":147,"line":767},[145,24864,3663],{"class":159},[145,24866,438],{"class":263},[145,24868,1309],{"class":159},[145,24870,453],{"class":263},[145,24872,24873,24875],{"class":147,"line":788},[145,24874,3674],{"class":159},[145,24876,1323],{"class":263},[145,24878,24879],{"class":147,"line":834},[145,24880,24881],{"class":159},"        \"Smooth cinematic transition. The real-world landscape gradually \"\n",[145,24883,24884],{"class":147,"line":839},[145,24885,24886],{"class":159},"        \"transforms into a traditional Chinese ink wash painting. Mountains \"\n",[145,24888,24889],{"class":147,"line":845},[145,24890,24891],{"class":159},"        \"dissolve from photorealistic to brushstroke. Water becomes flowing ink. \"\n",[145,24893,24894],{"class":147,"line":863},[145,24895,24896],{"class":159},"        \"Sky shifts from blue to rice-paper white. Slow, meditative pace.\"\n",[145,24898,24899],{"class":147,"line":872},[145,24900,3797],{"class":263},[145,24902,24903,24905],{"class":147,"line":887},[145,24904,15319],{"class":159},[145,24906,2686],{"class":263},[145,24908,24909,24912],{"class":147,"line":903},[145,24910,24911],{"class":159},"        \"https://example.com/real-landscape.jpg\"",[145,24913,453],{"class":263},[145,24915,24916],{"class":147,"line":915},[145,24917,24918],{"class":159},"        \"https://example.com/ink-wash-painting.jpg\"\n",[145,24920,24921],{"class":147,"line":954},[145,24922,16301],{"class":263},[145,24924,24925,24927,24929,24931],{"class":147,"line":960},[145,24926,3686],{"class":159},[145,24928,438],{"class":263},[145,24930,537],{"class":155},[145,24932,453],{"class":263},[145,24934,24935,24937,24939,24941],{"class":147,"line":965},[145,24936,3698],{"class":159},[145,24938,438],{"class":263},[145,24940,3703],{"class":159},[145,24942,453],{"class":263},[145,24944,24945,24947,24949],{"class":147,"line":971},[145,24946,3710],{"class":159},[145,24948,438],{"class":263},[145,24950,2725],{"class":159},[145,24952,24953],{"class":147,"line":977},[145,24954,470],{"class":263},[145,24956,24957],{"class":147,"line":989},[145,24958,377],{"emptyLinePlaceholder":58},[145,24960,24961,24963,24965],{"class":147,"line":994},[145,24962,24194],{"class":263},[145,24964,267],{"class":259},[145,24966,1433],{"class":263},[145,24968,24969,24971,24973,24975,24977],{"class":147,"line":5521},[145,24970,6517],{"class":259},[145,24972,450],{"class":159},[145,24974,679],{"class":155},[145,24976,1445],{"class":159},[145,24978,453],{"class":263},[145,24980,24981,24983,24985,24987],{"class":147,"line":5527},[145,24982,6530],{"class":701},[145,24984,267],{"class":259},[145,24986,424],{"class":155},[145,24988,453],{"class":263},[145,24990,24991,24993,24995],{"class":147,"line":5555},[145,24992,6541],{"class":701},[145,24994,267],{"class":259},[145,24996,2783],{"class":263},[145,24998,24999],{"class":147,"line":5586},[145,25000,407],{"class":263},[145,25002,25003,25005,25007],{"class":147,"line":5606},[145,25004,12197],{"class":263},[145,25006,267],{"class":259},[145,25008,11734],{"class":263},[145,25010,25011,25013,25015,25017,25019,25021,25023,25025,25027,25029,25031],{"class":147,"line":5612},[145,25012,6563],{"class":155},[145,25014,794],{"class":263},[145,25016,441],{"class":259},[145,25018,24251],{"class":159},[145,25020,685],{"class":155},[145,25022,11779],{"class":263},[145,25024,19814],{"class":159},[145,25026,1536],{"class":263},[145,25028,691],{"class":155},[145,25030,450],{"class":159},[145,25032,407],{"class":263},[145,25034,25035],{"class":147,"line":5618},[145,25036,377],{"emptyLinePlaceholder":58},[145,25038,25039,25041,25043,25045,25047],{"class":147,"line":5623},[145,25040,24279],{"class":263},[145,25042,267],{"class":259},[145,25044,24284],{"class":263},[145,25046,7673],{"class":159},[145,25048,1630],{"class":263},[92,25050,25052],{"id":25051},"演示从现实到水墨画","演示：从现实到水墨画",[56,25054,60,25055],{"controls":58,"playsInline":58,"style":59},[62,25056],{"src":25057,"type":65},"https://cdn.evolink.ai/seedance2api/%E7%8E%B0%E5%AE%9E%E5%9C%BA%E6%99%AF%E5%B1%B1%E6%B0%B4%E7%94%BB.mp4",[11,25059,25060,2423,25062],{},[23,25061,24312],{},[2614,25063,25064],{},"\"The real-world mountain landscape gradually transforms into a traditional Chinese ink wash (山水画) painting. Photorealistic textures dissolve into flowing brushstrokes. Colors fade from vivid to monochrome ink tones. Water surfaces become calligraphic ink flows. Slow, contemplative transition.\"",[11,25066,25067],{},"第一帧是一张照片级真实的山景。最后一帧是类似场景的传统水墨画。模型创建了一个无缝转换，照片质感逐渐溶解为笔触——这种效果在 After Effects 中手动制作需要花费数小时。",[92,25069,25070],{"id":25070},"首尾帧模式技巧",[11,25072,25073,25076],{},[23,25074,25075],{},"匹配两帧之间的构图。"," 如果你的第一帧左侧有一座山，你的最后一帧应该在相同位置有类似的结构元素。当两帧共享大致相同的布局时，模型能生成更好的过渡效果。",[11,25078,25079,25082,25083,25086],{},[23,25080,25081],{},"描述过渡过程，而非仅描述端点。"," 模型已经知道起点和终点的样子——它有图片。你的提示词应该描述",[2614,25084,25085],{},"如何","从 A 到 B。",[136,25088,25091],{"className":25089,"code":25090,"language":2183},[2181],"# Weak: just describes the endpoints\n\"A sunrise and a sunset\"\n\n# Strong: describes the journey\n\"The golden dawn light gradually warms to midday brightness,\nthen softens through amber afternoon hues into deep sunset oranges.\nShadows rotate clockwise. Cloud formations shift and reform.\"\n",[28,25092,25090],{"__ignoreMap":141},[11,25094,25095,25098],{},[23,25096,25097],{},"对复杂过渡使用更长的时长。"," 简单的色彩变化在 4 秒内就能完成。风格变换（写实 → 插画）需要 8–12 秒效果更好。在短时长内进行突变会显得生硬。",[2036,25100,25101,25111],{},[2039,25102,25103],{},[2042,25104,25105,25108],{},[2045,25106,25107],{},"过渡类型",[2045,25109,25110],{},"建议时长",[2052,25112,25113,25120,25127,25135],{},[2042,25114,25115,25118],{},[2057,25116,25117],{},"色彩/光照变化",[2057,25119,19435],{},[2042,25121,25122,25125],{},[2057,25123,25124],{},"镜头位置变化",[2057,25126,19358],{},[2042,25128,25129,25132],{},[2057,25130,25131],{},"风格变换",[2057,25133,25134],{},"8–12 秒",[2042,25136,25137,25140],{},[2057,25138,25139],{},"叙事场景切换",[2057,25141,25142],{},"10–15 秒",[45,25144],{},[48,25146,25148],{"id":25147},"模式-3使用-tags-的多图合成","模式 3：使用 @Tags 的多图合成",[11,25150,25151,25152,25154],{},"这是 Seedance 2.0 最强大的图像转视频模式——也是没有竞争对手 API 提供的模式。你提供最多 9 张图片，在提示词中使用 ",[28,25153,4136],{}," 标签为每张图片分配语义角色，模型会将它们合成为一个连贯的视频。",[92,25156,25158],{"id":25157},"tags-的工作原理","@Tags 的工作原理",[11,25160,23714,25161,25163],{},[28,25162,2891],{}," 中包含多个 URL 时，Seedance 2.0 会根据数组位置分配顺序标签：",[136,25165,25168],{"className":25166,"code":25167,"language":2183},[2181],"image_urls[0] → @Image1\nimage_urls[1] → @Image2\nimage_urls[2] → @Image3\n...\nimage_urls[8] → @Image9\n",[28,25169,25167],{"__ignoreMap":141},[11,25171,25172],{},"你在提示词中引用这些标签来告诉模型如何使用每张图片：",[136,25174,25177],{"className":25175,"code":25176,"language":2183},[2181],"@Image1 is the main character running through the city.\n@Image2 is the city skyline in the background.\n@Image3 defines the color grading and visual mood.\n",[28,25178,25176],{"__ignoreMap":141},[11,25180,25181],{},"如果没有标签，模型必须猜测哪张图片是角色、哪张是背景。有了标签就没有歧义。当你的图片在视觉上相似，或者你希望某张特定图片控制风格而非内容时，这一点尤为重要。",[92,25183,25185],{"id":25184},"完整代码多图合成","完整代码：多图合成",[136,25187,25189],{"className":339,"code":25188,"language":341,"meta":141,"style":141},"import requests\nimport time\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\ndef wait_for_video(task_id, interval=5, max_wait=300):\n    url = f\"{BASE_URL}/tasks/{task_id}\"\n    elapsed = 0\n    while elapsed \u003C max_wait:\n        resp = requests.get(url, headers=HEADERS)\n        data = resp.json()\n        status = data[\"status\"]\n        if status == \"completed\":\n            print(f\"Video ready: {data['output']['video_url']}\")\n            return data\n        elif status == \"failed\":\n            print(f\"Failed: {data.get('error', 'Unknown error')}\")\n            return data\n        print(f\"Status: {status} ({elapsed}s)\")\n        time.sleep(interval)\n        elapsed += interval\n    return None\n\n# --- Multi-Image Composition with @Tags ---\npayload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": (\n        \"@Image1 is a parkour runner in dark athletic gear. \"\n        \"@Image2 is a futuristic city rooftop at twilight. \"\n        \"@Image3 is a neon-lit alleyway. \"\n        \"@Image4 is a glass skyscraper facade. \"\n        \"@Image5 provides the cyberpunk color grading reference. \"\n        \"The runner (@Image1) sprints across the rooftop (@Image2), \"\n        \"leaps over the edge, flips through the alleyway (@Image3), \"\n        \"and wall-runs along the skyscraper (@Image4). \"\n        \"Dynamic handheld camera follows the action. \"\n        \"Cyberpunk neon color palette from @Image5 throughout.\"\n    ),\n    \"image_urls\": [\n        \"https://example.com/runner.jpg\",\n        \"https://example.com/rooftop.jpg\",\n        \"https://example.com/alley.jpg\",\n        \"https://example.com/skyscraper.jpg\",\n        \"https://example.com/cyberpunk-ref.jpg\"\n    ],\n    \"duration\": 10,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\",\n    \"generate_audio\": True\n}\n\nresp = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json=payload\n)\nresult = resp.json()\nprint(f\"Task ID: {result['task_id']}\")\n\nvideo_data = wait_for_video(result[\"task_id\"])\n",[28,25190,25191,25197,25203,25207,25215,25223,25231,25247,25255,25259,25263,25283,25305,25313,25323,25339,25347,25359,25371,25399,25405,25417,25445,25451,25479,25483,25491,25497,25501,25506,25514,25524,25530,25535,25540,25545,25550,25555,25560,25565,25570,25575,25580,25584,25590,25597,25604,25611,25618,25623,25627,25637,25647,25657,25665,25669,25673,25681,25693,25703,25711,25715,25723,25747,25751],{"__ignoreMap":141},[145,25192,25193,25195],{"class":147,"line":148},[145,25194,348],{"class":259},[145,25196,329],{"class":263},[145,25198,25199,25201],{"class":147,"line":166},[145,25200,348],{"class":259},[145,25202,357],{"class":263},[145,25204,25205],{"class":147,"line":178},[145,25206,377],{"emptyLinePlaceholder":58},[145,25208,25209,25211,25213],{"class":147,"line":187},[145,25210,389],{"class":155},[145,25212,392],{"class":259},[145,25214,17537],{"class":159},[145,25216,25217,25219,25221],{"class":147,"line":374},[145,25218,413],{"class":155},[145,25220,392],{"class":259},[145,25222,418],{"class":159},[145,25224,25225,25227,25229],{"class":147,"line":380},[145,25226,424],{"class":155},[145,25228,392],{"class":259},[145,25230,429],{"class":263},[145,25232,25233,25235,25237,25239,25241,25243,25245],{"class":147,"line":386},[145,25234,435],{"class":159},[145,25236,438],{"class":263},[145,25238,441],{"class":259},[145,25240,444],{"class":159},[145,25242,447],{"class":155},[145,25244,450],{"class":159},[145,25246,453],{"class":263},[145,25248,25249,25251,25253],{"class":147,"line":410},[145,25250,459],{"class":159},[145,25252,438],{"class":263},[145,25254,464],{"class":159},[145,25256,25257],{"class":147,"line":421},[145,25258,470],{"class":263},[145,25260,25261],{"class":147,"line":432},[145,25262,377],{"emptyLinePlaceholder":58},[145,25264,25265,25267,25269,25271,25273,25275,25277,25279,25281],{"class":147,"line":456},[145,25266,526],{"class":259},[145,25268,529],{"class":151},[145,25270,11653],{"class":263},[145,25272,267],{"class":259},[145,25274,1353],{"class":155},[145,25276,23416],{"class":263},[145,25278,267],{"class":259},[145,25280,11664],{"class":155},[145,25282,548],{"class":263},[145,25284,25285,25287,25289,25291,25293,25295,25297,25299,25301,25303],{"class":147,"line":467},[145,25286,23432],{"class":263},[145,25288,267],{"class":259},[145,25290,3353],{"class":259},[145,25292,450],{"class":159},[145,25294,679],{"class":155},[145,25296,682],{"class":159},[145,25298,685],{"class":155},[145,25300,688],{"class":263},[145,25302,691],{"class":155},[145,25304,951],{"class":159},[145,25306,25307,25309,25311],{"class":147,"line":600},[145,25308,631],{"class":263},[145,25310,267],{"class":259},[145,25312,636],{"class":155},[145,25314,25315,25317,25319,25321],{"class":147,"line":605},[145,25316,642],{"class":259},[145,25318,645],{"class":263},[145,25320,648],{"class":259},[145,25322,23473],{"class":263},[145,25324,25325,25327,25329,25331,25333,25335,25337],{"class":147,"line":611},[145,25326,6908],{"class":263},[145,25328,267],{"class":259},[145,25330,1132],{"class":263},[145,25332,17766],{"class":701},[145,25334,267],{"class":259},[145,25336,424],{"class":155},[145,25338,407],{"class":263},[145,25340,25341,25343,25345],{"class":147,"line":617},[145,25342,23494],{"class":263},[145,25344,267],{"class":259},[145,25346,11734],{"class":263},[145,25348,25349,25351,25353,25355,25357],{"class":147,"line":623},[145,25350,753],{"class":263},[145,25352,267],{"class":259},[145,25354,23507],{"class":263},[145,25356,761],{"class":159},[145,25358,764],{"class":263},[145,25360,25361,25363,25365,25367,25369],{"class":147,"line":628},[145,25362,848],{"class":259},[145,25364,851],{"class":263},[145,25366,854],{"class":259},[145,25368,857],{"class":159},[145,25370,860],{"class":263},[145,25372,25373,25375,25377,25379,25381,25383,25385,25387,25389,25391,25393,25395,25397],{"class":147,"line":639},[145,25374,5558],{"class":155},[145,25376,794],{"class":263},[145,25378,441],{"class":259},[145,25380,11774],{"class":159},[145,25382,685],{"class":155},[145,25384,23958],{"class":263},[145,25386,17828],{"class":159},[145,25388,1563],{"class":263},[145,25390,17833],{"class":159},[145,25392,1536],{"class":263},[145,25394,691],{"class":155},[145,25396,450],{"class":159},[145,25398,407],{"class":263},[145,25400,25401,25403],{"class":147,"line":654},[145,25402,866],{"class":259},[145,25404,23570],{"class":263},[145,25406,25407,25409,25411,25413,25415],{"class":147,"line":660},[145,25408,875],{"class":259},[145,25410,851],{"class":263},[145,25412,854],{"class":259},[145,25414,882],{"class":159},[145,25416,860],{"class":263},[145,25418,25419,25421,25423,25425,25427,25429,25431,25433,25435,25437,25439,25441,25443],{"class":147,"line":671},[145,25420,5558],{"class":155},[145,25422,794],{"class":263},[145,25424,441],{"class":259},[145,25426,24001],{"class":159},[145,25428,685],{"class":155},[145,25430,23597],{"class":263},[145,25432,11831],{"class":159},[145,25434,401],{"class":263},[145,25436,943],{"class":159},[145,25438,946],{"class":263},[145,25440,691],{"class":155},[145,25442,450],{"class":159},[145,25444,407],{"class":263},[145,25446,25447,25449],{"class":147,"line":698},[145,25448,866],{"class":259},[145,25450,23570],{"class":263},[145,25452,25453,25455,25457,25459,25461,25463,25465,25467,25469,25471,25473,25475,25477],{"class":147,"line":710},[145,25454,791],{"class":155},[145,25456,794],{"class":263},[145,25458,441],{"class":259},[145,25460,11860],{"class":159},[145,25462,685],{"class":155},[145,25464,814],{"class":263},[145,25466,691],{"class":155},[145,25468,1219],{"class":159},[145,25470,685],{"class":155},[145,25472,804],{"class":263},[145,25474,691],{"class":155},[145,25476,10693],{"class":159},[145,25478,407],{"class":263},[145,25480,25481],{"class":147,"line":716},[145,25482,11884],{"class":263},[145,25484,25485,25487,25489],{"class":147,"line":722},[145,25486,980],{"class":263},[145,25488,983],{"class":259},[145,25490,11893],{"class":263},[145,25492,25493,25495],{"class":147,"line":728},[145,25494,1704],{"class":259},[145,25496,11915],{"class":155},[145,25498,25499],{"class":147,"line":739},[145,25500,377],{"emptyLinePlaceholder":58},[145,25502,25503],{"class":147,"line":744},[145,25504,25505],{"class":174},"# --- Multi-Image Composition with @Tags ---\n",[145,25507,25508,25510,25512],{"class":147,"line":750},[145,25509,3654],{"class":263},[145,25511,267],{"class":259},[145,25513,429],{"class":263},[145,25515,25516,25518,25520,25522],{"class":147,"line":767},[145,25517,3663],{"class":159},[145,25519,438],{"class":263},[145,25521,1309],{"class":159},[145,25523,453],{"class":263},[145,25525,25526,25528],{"class":147,"line":788},[145,25527,3674],{"class":159},[145,25529,1323],{"class":263},[145,25531,25532],{"class":147,"line":834},[145,25533,25534],{"class":159},"        \"@Image1 is a parkour runner in dark athletic gear. \"\n",[145,25536,25537],{"class":147,"line":839},[145,25538,25539],{"class":159},"        \"@Image2 is a futuristic city rooftop at twilight. \"\n",[145,25541,25542],{"class":147,"line":845},[145,25543,25544],{"class":159},"        \"@Image3 is a neon-lit alleyway. \"\n",[145,25546,25547],{"class":147,"line":863},[145,25548,25549],{"class":159},"        \"@Image4 is a glass skyscraper facade. \"\n",[145,25551,25552],{"class":147,"line":872},[145,25553,25554],{"class":159},"        \"@Image5 provides the cyberpunk color grading reference. \"\n",[145,25556,25557],{"class":147,"line":887},[145,25558,25559],{"class":159},"        \"The runner (@Image1) sprints across the rooftop (@Image2), \"\n",[145,25561,25562],{"class":147,"line":903},[145,25563,25564],{"class":159},"        \"leaps over the edge, flips through the alleyway (@Image3), \"\n",[145,25566,25567],{"class":147,"line":915},[145,25568,25569],{"class":159},"        \"and wall-runs along the skyscraper (@Image4). \"\n",[145,25571,25572],{"class":147,"line":954},[145,25573,25574],{"class":159},"        \"Dynamic handheld camera follows the action. \"\n",[145,25576,25577],{"class":147,"line":960},[145,25578,25579],{"class":159},"        \"Cyberpunk neon color palette from @Image5 throughout.\"\n",[145,25581,25582],{"class":147,"line":965},[145,25583,3797],{"class":263},[145,25585,25586,25588],{"class":147,"line":971},[145,25587,15319],{"class":159},[145,25589,2686],{"class":263},[145,25591,25592,25595],{"class":147,"line":977},[145,25593,25594],{"class":159},"        \"https://example.com/runner.jpg\"",[145,25596,453],{"class":263},[145,25598,25599,25602],{"class":147,"line":989},[145,25600,25601],{"class":159},"        \"https://example.com/rooftop.jpg\"",[145,25603,453],{"class":263},[145,25605,25606,25609],{"class":147,"line":994},[145,25607,25608],{"class":159},"        \"https://example.com/alley.jpg\"",[145,25610,453],{"class":263},[145,25612,25613,25616],{"class":147,"line":5521},[145,25614,25615],{"class":159},"        \"https://example.com/skyscraper.jpg\"",[145,25617,453],{"class":263},[145,25619,25620],{"class":147,"line":5527},[145,25621,25622],{"class":159},"        \"https://example.com/cyberpunk-ref.jpg\"\n",[145,25624,25625],{"class":147,"line":5555},[145,25626,16301],{"class":263},[145,25628,25629,25631,25633,25635],{"class":147,"line":5586},[145,25630,3686],{"class":159},[145,25632,438],{"class":263},[145,25634,537],{"class":155},[145,25636,453],{"class":263},[145,25638,25639,25641,25643,25645],{"class":147,"line":5606},[145,25640,3698],{"class":159},[145,25642,438],{"class":263},[145,25644,3703],{"class":159},[145,25646,453],{"class":263},[145,25648,25649,25651,25653,25655],{"class":147,"line":5612},[145,25650,3710],{"class":159},[145,25652,438],{"class":263},[145,25654,1385],{"class":159},[145,25656,453],{"class":263},[145,25658,25659,25661,25663],{"class":147,"line":5618},[145,25660,3726],{"class":159},[145,25662,438],{"class":263},[145,25664,3731],{"class":155},[145,25666,25667],{"class":147,"line":5623},[145,25668,470],{"class":263},[145,25670,25671],{"class":147,"line":5636},[145,25672,377],{"emptyLinePlaceholder":58},[145,25674,25675,25677,25679],{"class":147,"line":5642},[145,25676,24194],{"class":263},[145,25678,267],{"class":259},[145,25680,1433],{"class":263},[145,25682,25683,25685,25687,25689,25691],{"class":147,"line":5669},[145,25684,6517],{"class":259},[145,25686,450],{"class":159},[145,25688,679],{"class":155},[145,25690,1445],{"class":159},[145,25692,453],{"class":263},[145,25694,25695,25697,25699,25701],{"class":147,"line":5709},[145,25696,6530],{"class":701},[145,25698,267],{"class":259},[145,25700,424],{"class":155},[145,25702,453],{"class":263},[145,25704,25705,25707,25709],{"class":147,"line":5728},[145,25706,6541],{"class":701},[145,25708,267],{"class":259},[145,25710,2783],{"class":263},[145,25712,25713],{"class":147,"line":5733},[145,25714,407],{"class":263},[145,25716,25717,25719,25721],{"class":147,"line":5738},[145,25718,12197],{"class":263},[145,25720,267],{"class":259},[145,25722,11734],{"class":263},[145,25724,25725,25727,25729,25731,25733,25735,25737,25739,25741,25743,25745],{"class":147,"line":5743},[145,25726,6563],{"class":155},[145,25728,794],{"class":263},[145,25730,441],{"class":259},[145,25732,24251],{"class":159},[145,25734,685],{"class":155},[145,25736,11779],{"class":263},[145,25738,19814],{"class":159},[145,25740,1536],{"class":263},[145,25742,691],{"class":155},[145,25744,450],{"class":159},[145,25746,407],{"class":263},[145,25748,25749],{"class":147,"line":7416},[145,25750,377],{"emptyLinePlaceholder":58},[145,25752,25753,25755,25757,25759,25761],{"class":147,"line":7422},[145,25754,24279],{"class":263},[145,25756,267],{"class":259},[145,25758,24284],{"class":263},[145,25760,7673],{"class":159},[145,25762,1630],{"class":263},[92,25764,25766],{"id":25765},"演示5-张图片参考的城市跑酷","演示：5 张图片参考的城市跑酷",[56,25768,60,25769],{"controls":58,"playsInline":58,"style":59},[62,25770],{"src":12216,"type":65},[11,25772,25773,2423,25775],{},[23,25774,24312],{},[2614,25776,25777],{},"\"@Image1 is the parkour runner. @Image2 is the rooftop environment. @Image3 is the neon alley. @Image4 is the glass building. @Image5 is the color palette reference. The runner (@Image1) sprints across the rooftop (@Image2), leaps, flips through the alley (@Image3), wall-runs along the building (@Image4). Dynamic tracking camera. Cyberpunk color grading from @Image5.\"",[11,25779,25780,25781,25783],{},"五张独立的图片——一个角色、三个环境和一个风格参考——合成为一个连续的动作序列。每个 ",[28,25782,4136],{}," 标签都为模型提供了精确的指令，说明哪个视觉元素控制场景的哪个部分。",[92,25785,25787],{"id":25786},"常见-tag-角色分配","常见 @Tag 角色分配",[11,25789,25790,25792],{},[28,25791,23039],{}," 系统非常灵活。以下是最有效的模式：",[2036,25794,25795,25808],{},[2039,25796,25797],{},[2042,25798,25799,25802,25805],{},[2045,25800,25801],{},"角色",[2045,25803,25804],{},"提示词中的标签用法",[2045,25806,25807],{},"用途",[2052,25809,25810,25822,25835,25848,25861,25873],{},[2042,25811,25812,25814,25819],{},[2057,25813,25801],{},[2057,25815,25816],{},[28,25817,25818],{},"@Image1 is the main character",[2057,25820,25821],{},"保留身份、服装、特征",[2042,25823,25824,25827,25832],{},[2057,25825,25826],{},"背景",[2057,25828,25829],{},[28,25830,25831],{},"@Image2 is the environment",[2057,25833,25834],{},"设定场景位置",[2042,25836,25837,25840,25845],{},[2057,25838,25839],{},"风格参考",[2057,25841,25842],{},[28,25843,25844],{},"@Image3 defines the art style",[2057,25846,25847],{},"控制渲染美学",[2042,25849,25850,25853,25858],{},[2057,25851,25852],{},"物体/道具",[2057,25854,25855],{},[28,25856,25857],{},"@Image4 is the product on the table",[2057,25859,25860],{},"在场景中放置特定物品",[2042,25862,25863,25865,25870],{},[2057,25864,23729],{},[2057,25866,25867],{},[28,25868,25869],{},"@Image5 is the color palette",[2057,25871,25872],{},"从参考中应用情绪/色调",[2042,25874,25875,25878,25883],{},[2057,25876,25877],{},"纹理参考",[2057,25879,25880],{},[28,25881,25882],{},"@Image6 provides surface textures",[2057,25884,25885],{},"材质/纹理迁移",[92,25887,25889],{"id":25888},"演示角色搭配风格参考","演示：角色搭配风格参考",[56,25891,60,25892],{"controls":58,"playsInline":58,"style":59},[62,25893],{"src":25894,"type":65},"https://cdn.evolink.ai/seedance2api/%E7%BA%A2%E8%89%B2%E5%A4%96%E5%A5%97%E7%9A%84%E7%A5%9E%E7%A7%98%E8%BA%AB%E5%BD%B1%E5%9C%A8%E5%9F%8E%E5%B8%82%E8%A1%97%E9%81%93%E5%A5%94%E8%B7%91.mp4",[11,25896,25897,2423,25899],{},[23,25898,24312],{},[2614,25900,25901],{},"\"@Image1 is the character — a mysterious figure in a red coat. The character runs through rain-soaked city streets at night. Neon reflections on wet pavement. Camera tracks alongside at medium distance. Cinematic atmosphere, shallow depth of field.\"",[11,25903,25904,25905,298],{},"单张角色参考图片控制身份，而提示词驱动环境和动作。红色外套、身体比例和运动风格都来自 ",[28,25906,2903],{},[11,25908,25909,25910,25912,25913,298],{},"关于完整的 ",[28,25911,23039],{}," 参考——包括视频和音频标签、混合媒体组合以及高级角色模式——请参阅",[37,25914,2963],{"href":2962},[45,25916],{},[48,25918,25919],{"id":25919},"跨镜头保持角色一致性",[11,25921,25922,25923,25926,25927,25929],{},"单个生成的片段很有用。而在不同场景中使用",[2614,25924,25925],{},"同一角色","的一系列片段就是一个故事。角色一致性是 AI 视频生成中最难的问题，而 Seedance 2.0 的 ",[28,25928,23039],{}," 系统提供了目前通过 API 可获得的最可靠解决方案。",[92,25931,25932],{"id":25932},"角色锁定模式",[11,25934,25935,25936,25938],{},"要在多个镜头中保持同一角色，请在每次生成请求中使用相同的角色参考图片作为 ",[28,25937,2903],{},"。只改变提示词和背景/环境图片。",[136,25940,25942],{"className":339,"code":25941,"language":341,"meta":141,"style":141},"CHARACTER_IMAGE = \"https://example.com/my-character.jpg\"\n\nshots = [\n    {\n        \"prompt\": (\n            \"@Image1 is the main character. She walks into a cozy library, \"\n            \"looks around with wonder, and reaches for a book on the top shelf. \"\n            \"Warm golden lighting. Camera at eye level, slow push in.\"\n        ),\n        \"extra_images\": [],\n        \"duration\": 8\n    },\n    {\n        \"prompt\": (\n            \"@Image1 is the main character. She sits at a wooden reading table, \"\n            \"opens the book, and pages start glowing with magical light. \"\n            \"Dust particles float in warm lamplight. Camera orbits slowly around her.\"\n        ),\n        \"extra_images\": [],\n        \"duration\": 10\n    },\n    {\n        \"prompt\": (\n            \"@Image1 is the main character. She steps out of the library into \"\n            \"a fantastical world that matches the book's illustrations. \"\n            \"Vibrant colors replace the muted library tones. \"\n            \"Camera pulls back to reveal the vast landscape. Wide shot.\"\n        ),\n        \"extra_images\": [],\n        \"duration\": 10\n    },\n]\n\ndef generate_shot(shot):\n    image_urls = [CHARACTER_IMAGE] + shot[\"extra_images\"]\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"prompt\": shot[\"prompt\"],\n        \"image_urls\": image_urls,\n        \"duration\": shot[\"duration\"],\n        \"quality\": \"1080p\",\n        \"aspect_ratio\": \"16:9\"\n    }\n    resp = requests.post(\n        f\"{BASE_URL}/videos/generations\",\n        headers=HEADERS,\n        json=payload\n    )\n    return resp.json()[\"task_id\"]\n\n# Generate all shots\ntask_ids = [generate_shot(shot) for shot in shots]\nprint(f\"Submitted {len(task_ids)} shots: {task_ids}\")\n\n# Poll each shot\nfor i, task_id in enumerate(task_ids):\n    print(f\"\\nWaiting for Shot {i+1}...\")\n    wait_for_video(task_id)\n",[28,25943,25944,25954,25958,25967,25972,25978,25983,25988,25993,25997,26005,26014,26018,26022,26028,26033,26038,26043,26047,26053,26062,26066,26070,26076,26081,26086,26091,26096,26100,26106,26114,26118,26122,26126,26136,26158,26166,26176,26187,26194,26204,26214,26222,26226,26234,26246,26256,26264,26268,26278,26282,26287,26307,26339,26343,26348,26362,26389],{"__ignoreMap":141},[145,25945,25946,25949,25951],{"class":147,"line":148},[145,25947,25948],{"class":155},"CHARACTER_IMAGE",[145,25950,392],{"class":259},[145,25952,25953],{"class":159}," \"https://example.com/my-character.jpg\"\n",[145,25955,25956],{"class":147,"line":166},[145,25957,377],{"emptyLinePlaceholder":58},[145,25959,25960,25963,25965],{"class":147,"line":178},[145,25961,25962],{"class":263},"shots ",[145,25964,267],{"class":259},[145,25966,8843],{"class":263},[145,25968,25969],{"class":147,"line":187},[145,25970,25971],{"class":263},"    {\n",[145,25973,25974,25976],{"class":147,"line":374},[145,25975,1320],{"class":159},[145,25977,1323],{"class":263},[145,25979,25980],{"class":147,"line":380},[145,25981,25982],{"class":159},"            \"@Image1 is the main character. She walks into a cozy library, \"\n",[145,25984,25985],{"class":147,"line":386},[145,25986,25987],{"class":159},"            \"looks around with wonder, and reaches for a book on the top shelf. \"\n",[145,25989,25990],{"class":147,"line":410},[145,25991,25992],{"class":159},"            \"Warm golden lighting. Camera at eye level, slow push in.\"\n",[145,25994,25995],{"class":147,"line":421},[145,25996,1343],{"class":263},[145,25998,25999,26002],{"class":147,"line":432},[145,26000,26001],{"class":159},"        \"extra_images\"",[145,26003,26004],{"class":263},": [],\n",[145,26006,26007,26009,26011],{"class":147,"line":456},[145,26008,1348],{"class":159},[145,26010,438],{"class":263},[145,26012,26013],{"class":155},"8\n",[145,26015,26016],{"class":147,"line":467},[145,26017,22124],{"class":263},[145,26019,26020],{"class":147,"line":600},[145,26021,25971],{"class":263},[145,26023,26024,26026],{"class":147,"line":605},[145,26025,1320],{"class":159},[145,26027,1323],{"class":263},[145,26029,26030],{"class":147,"line":611},[145,26031,26032],{"class":159},"            \"@Image1 is the main character. She sits at a wooden reading table, \"\n",[145,26034,26035],{"class":147,"line":617},[145,26036,26037],{"class":159},"            \"opens the book, and pages start glowing with magical light. \"\n",[145,26039,26040],{"class":147,"line":623},[145,26041,26042],{"class":159},"            \"Dust particles float in warm lamplight. Camera orbits slowly around her.\"\n",[145,26044,26045],{"class":147,"line":628},[145,26046,1343],{"class":263},[145,26048,26049,26051],{"class":147,"line":639},[145,26050,26001],{"class":159},[145,26052,26004],{"class":263},[145,26054,26055,26057,26059],{"class":147,"line":654},[145,26056,1348],{"class":159},[145,26058,438],{"class":263},[145,26060,26061],{"class":155},"10\n",[145,26063,26064],{"class":147,"line":660},[145,26065,22124],{"class":263},[145,26067,26068],{"class":147,"line":671},[145,26069,25971],{"class":263},[145,26071,26072,26074],{"class":147,"line":698},[145,26073,1320],{"class":159},[145,26075,1323],{"class":263},[145,26077,26078],{"class":147,"line":710},[145,26079,26080],{"class":159},"            \"@Image1 is the main character. She steps out of the library into \"\n",[145,26082,26083],{"class":147,"line":716},[145,26084,26085],{"class":159},"            \"a fantastical world that matches the book's illustrations. \"\n",[145,26087,26088],{"class":147,"line":722},[145,26089,26090],{"class":159},"            \"Vibrant colors replace the muted library tones. \"\n",[145,26092,26093],{"class":147,"line":728},[145,26094,26095],{"class":159},"            \"Camera pulls back to reveal the vast landscape. Wide shot.\"\n",[145,26097,26098],{"class":147,"line":739},[145,26099,1343],{"class":263},[145,26101,26102,26104],{"class":147,"line":744},[145,26103,26001],{"class":159},[145,26105,26004],{"class":263},[145,26107,26108,26110,26112],{"class":147,"line":750},[145,26109,1348],{"class":159},[145,26111,438],{"class":263},[145,26113,26061],{"class":155},[145,26115,26116],{"class":147,"line":767},[145,26117,22124],{"class":263},[145,26119,26120],{"class":147,"line":788},[145,26121,764],{"class":263},[145,26123,26124],{"class":147,"line":834},[145,26125,377],{"emptyLinePlaceholder":58},[145,26127,26128,26130,26133],{"class":147,"line":839},[145,26129,526],{"class":259},[145,26131,26132],{"class":151}," generate_shot",[145,26134,26135],{"class":263},"(shot):\n",[145,26137,26138,26140,26142,26144,26146,26148,26150,26153,26156],{"class":147,"line":845},[145,26139,6211],{"class":263},[145,26141,267],{"class":259},[145,26143,8170],{"class":263},[145,26145,25948],{"class":155},[145,26147,14864],{"class":263},[145,26149,5409],{"class":259},[145,26151,26152],{"class":263}," shot[",[145,26154,26155],{"class":159},"\"extra_images\"",[145,26157,764],{"class":263},[145,26159,26160,26162,26164],{"class":147,"line":863},[145,26161,1295],{"class":263},[145,26163,267],{"class":259},[145,26165,429],{"class":263},[145,26167,26168,26170,26172,26174],{"class":147,"line":872},[145,26169,1304],{"class":159},[145,26171,438],{"class":263},[145,26173,1309],{"class":159},[145,26175,453],{"class":263},[145,26177,26178,26180,26183,26185],{"class":147,"line":887},[145,26179,1320],{"class":159},[145,26181,26182],{"class":263},": shot[",[145,26184,5901],{"class":159},[145,26186,10815],{"class":263},[145,26188,26189,26191],{"class":147,"line":903},[145,26190,2683],{"class":159},[145,26192,26193],{"class":263},": image_urls,\n",[145,26195,26196,26198,26200,26202],{"class":147,"line":915},[145,26197,1348],{"class":159},[145,26199,26182],{"class":263},[145,26201,5946],{"class":159},[145,26203,10815],{"class":263},[145,26205,26206,26208,26210,26212],{"class":147,"line":954},[145,26207,1364],{"class":159},[145,26209,438],{"class":263},[145,26211,3703],{"class":159},[145,26213,453],{"class":263},[145,26215,26216,26218,26220],{"class":147,"line":960},[145,26217,1380],{"class":159},[145,26219,438],{"class":263},[145,26221,2725],{"class":159},[145,26223,26224],{"class":147,"line":965},[145,26225,1408],{"class":263},[145,26227,26228,26230,26232],{"class":147,"line":971},[145,26229,1127],{"class":263},[145,26231,267],{"class":259},[145,26233,1433],{"class":263},[145,26235,26236,26238,26240,26242,26244],{"class":147,"line":977},[145,26237,1438],{"class":259},[145,26239,450],{"class":159},[145,26241,679],{"class":155},[145,26243,1445],{"class":159},[145,26245,453],{"class":263},[145,26247,26248,26250,26252,26254],{"class":147,"line":989},[145,26249,1456],{"class":701},[145,26251,267],{"class":259},[145,26253,424],{"class":155},[145,26255,453],{"class":263},[145,26257,26258,26260,26262],{"class":147,"line":994},[145,26259,1471],{"class":701},[145,26261,267],{"class":259},[145,26263,2783],{"class":263},[145,26265,26266],{"class":147,"line":5521},[145,26267,1484],{"class":263},[145,26269,26270,26272,26274,26276],{"class":147,"line":5527},[145,26271,1704],{"class":259},[145,26273,20682],{"class":263},[145,26275,7673],{"class":159},[145,26277,764],{"class":263},[145,26279,26280],{"class":147,"line":5555},[145,26281,377],{"emptyLinePlaceholder":58},[145,26283,26284],{"class":147,"line":5586},[145,26285,26286],{"class":174},"# Generate all shots\n",[145,26288,26289,26292,26294,26297,26299,26302,26304],{"class":147,"line":5606},[145,26290,26291],{"class":263},"task_ids ",[145,26293,267],{"class":259},[145,26295,26296],{"class":263}," [generate_shot(shot) ",[145,26298,8207],{"class":259},[145,26300,26301],{"class":263}," shot ",[145,26303,1181],{"class":259},[145,26305,26306],{"class":263}," shots]\n",[145,26308,26309,26311,26313,26315,26318,26320,26323,26325,26328,26330,26333,26335,26337],{"class":147,"line":5612},[145,26310,6563],{"class":155},[145,26312,794],{"class":263},[145,26314,441],{"class":259},[145,26316,26317],{"class":159},"\"Submitted ",[145,26319,6250],{"class":155},[145,26321,26322],{"class":263},"(task_ids)",[145,26324,691],{"class":155},[145,26326,26327],{"class":159}," shots: ",[145,26329,685],{"class":155},[145,26331,26332],{"class":263},"task_ids",[145,26334,691],{"class":155},[145,26336,450],{"class":159},[145,26338,407],{"class":263},[145,26340,26341],{"class":147,"line":5618},[145,26342,377],{"emptyLinePlaceholder":58},[145,26344,26345],{"class":147,"line":5623},[145,26346,26347],{"class":174},"# Poll each shot\n",[145,26349,26350,26352,26355,26357,26359],{"class":147,"line":5636},[145,26351,8207],{"class":259},[145,26353,26354],{"class":263}," i, task_id ",[145,26356,1181],{"class":259},[145,26358,6271],{"class":155},[145,26360,26361],{"class":263},"(task_ids):\n",[145,26363,26364,26366,26368,26370,26372,26374,26377,26379,26381,26383,26385,26387],{"class":147,"line":5642},[145,26365,1103],{"class":155},[145,26367,794],{"class":263},[145,26369,441],{"class":259},[145,26371,450],{"class":159},[145,26373,1671],{"class":155},[145,26375,26376],{"class":159},"Waiting for Shot ",[145,26378,685],{"class":155},[145,26380,6309],{"class":263},[145,26382,5409],{"class":259},[145,26384,10004],{"class":155},[145,26386,1120],{"class":159},[145,26388,407],{"class":263},[145,26390,26391],{"class":147,"line":5669},[145,26392,26393],{"class":263},"    wait_for_video(task_id)\n",[92,26395,26397],{"id":26396},"演示图书馆故事序列","演示：图书馆故事序列",[56,26399,60,26400],{"controls":58,"playsInline":58,"style":59},[62,26401],{"src":64,"type":65},[11,26403,26404,2423,26406],{},[23,26405,24312],{},[2614,26407,26408],{},"\"@Image1 is a young girl with braids. She enters a grand old library, runs her fingers along the spines of ancient books, pulls one out, and opens it. Golden dust motes swirl in shaft of light from a high window. Warm, magical atmosphere. Camera follows her at child's eye level.\"",[11,26410,26411],{},"角色——一个扎着辫子的小女孩——保持了视觉一致性，因为每个镜头都由同一张参考图片锚定。模型在生成不同动作和环境的同时，保留了她的比例、服装和视觉特征。",[92,26413,26414],{"id":26414},"一致性技巧",[11,26416,26417,26420],{},[23,26418,26419],{},"使用清晰、光线充足的角色参考图。"," 模型从你的参考图片中提取身份特征。模糊、光线不足或严重遮挡的图片会让模型可参考的信息减少。正面、全身或上半身照片配合干净的背景能产生最佳的一致性效果。",[11,26422,26423,26426,26427,26429],{},[23,26424,26425],{},"在提示词中尽量简化角色描述。"," 如果 ",[28,26428,2903],{}," 已经展示了一个穿蓝色连衣裙的女孩，就不要在提示词中写\"一个穿红色连衣裙的女孩\"。冲突的描述会迫使模型在你的图片和文本之间做选择，降低一致性。",[11,26431,26432,26435],{},[23,26433,26434],{},"在所有镜头中保持相同的宽高比。"," 在序列中途从 16:9 切换到 9:16 会强制使用不同的画面构图，这可能改变角色的呈现方式。选择一个比例并始终使用它。",[11,26437,26438,26441,26442,26444],{},[23,26439,26440],{},"将环境图片作为独立的 @tags 添加。"," 与其完全用文本描述背景，不如提供一张背景参考图片作为 ",[28,26443,2914],{},"。这样你可以精确控制角色和环境，同时保持二者在视觉上的分离。",[136,26446,26448],{"className":339,"code":26447,"language":341,"meta":141,"style":141},"# Shot 1: Character in library\n\"image_urls\": [CHARACTER_IMAGE, \"https://example.com/library.jpg\"]\n# Prompt: \"@Image1 is the character. @Image2 is the library environment.\"\n\n# Shot 2: Character in forest\n\"image_urls\": [CHARACTER_IMAGE, \"https://example.com/forest.jpg\"]\n# Prompt: \"@Image1 is the character. @Image2 is the forest environment.\"\n",[28,26449,26450,26455,26470,26475,26479,26484,26499],{"__ignoreMap":141},[145,26451,26452],{"class":147,"line":148},[145,26453,26454],{"class":174},"# Shot 1: Character in library\n",[145,26456,26457,26459,26461,26463,26465,26468],{"class":147,"line":166},[145,26458,6218],{"class":159},[145,26460,10809],{"class":263},[145,26462,25948],{"class":155},[145,26464,401],{"class":263},[145,26466,26467],{"class":159},"\"https://example.com/library.jpg\"",[145,26469,764],{"class":263},[145,26471,26472],{"class":147,"line":178},[145,26473,26474],{"class":174},"# Prompt: \"@Image1 is the character. @Image2 is the library environment.\"\n",[145,26476,26477],{"class":147,"line":187},[145,26478,377],{"emptyLinePlaceholder":58},[145,26480,26481],{"class":147,"line":374},[145,26482,26483],{"class":174},"# Shot 2: Character in forest\n",[145,26485,26486,26488,26490,26492,26494,26497],{"class":147,"line":380},[145,26487,6218],{"class":159},[145,26489,10809],{"class":263},[145,26491,25948],{"class":155},[145,26493,401],{"class":263},[145,26495,26496],{"class":159},"\"https://example.com/forest.jpg\"",[145,26498,764],{"class":263},[145,26500,26501],{"class":147,"line":386},[145,26502,26503],{"class":174},"# Prompt: \"@Image1 is the character. @Image2 is the forest environment.\"\n",[11,26505,26506,26507,26509,26510,26512],{},"这种模式——固定 ",[28,26508,2903],{}," 作为角色，可变的 ",[28,26511,2914],{}," 作为环境——是目前任何 AI 视频 API 中最可靠的多镜头工作流。",[92,26514,26516],{"id":26515},"进阶多镜头叙事流水线","进阶：多镜头叙事流水线",[11,26518,26519],{},"对于较长的叙事（30 秒以上），你需要生成多个片段并将它们拼接在一起。以下是一种结构化的方法，管理完整的流水线——镜头列表定义、并行生成和有序输出：",[136,26521,26523],{"className":339,"code":26522,"language":341,"meta":141,"style":141},"import concurrent.futures\nimport requests\nimport time\nimport json\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\nCHARACTER_REF = \"https://example.com/story-character.jpg\"\n\nSHOT_LIST = [\n    {\n        \"shot_id\": \"01_entrance\",\n        \"prompt\": (\n            \"@Image1 is the main character. \"\n            \"She pushes open a heavy wooden door and steps into a dimly lit room. \"\n            \"Dust swirls in the doorway light. \"\n            \"Camera follows her from behind, over-the-shoulder angle.\"\n        ),\n        \"env_images\": [],\n        \"duration\": 6\n    },\n    {\n        \"shot_id\": \"02_discovery\",\n        \"prompt\": (\n            \"@Image1 is the main character. @Image2 is the room interior. \"\n            \"She walks to the center of the room and discovers a glowing object on a pedestal. \"\n            \"Her face shows surprise. Blue light illuminates her features. \"\n            \"Camera pushes in from medium shot to close-up on her expression.\"\n        ),\n        \"env_images\": [\"https://example.com/mysterious-room.jpg\"],\n        \"duration\": 8\n    },\n    {\n        \"shot_id\": \"03_transformation\",\n        \"prompt\": (\n            \"@Image1 is the main character. \"\n            \"She reaches out and touches the glowing object. \"\n            \"Light radiates outward from the point of contact. \"\n            \"The room transforms — walls dissolve into a starfield. \"\n            \"Camera rapidly pulls back to extreme wide shot.\"\n        ),\n        \"env_images\": [],\n        \"duration\": 10\n    },\n]\n\ndef submit_shot(shot):\n    \"\"\"Submit a single shot for generation.\"\"\"\n    image_urls = [CHARACTER_REF] + shot[\"env_images\"]\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"prompt\": shot[\"prompt\"],\n        \"image_urls\": image_urls,\n        \"duration\": shot[\"duration\"],\n        \"quality\": \"1080p\",\n        \"aspect_ratio\": \"16:9\",\n        \"generate_audio\": True\n    }\n    resp = requests.post(f\"{BASE_URL}/videos/generations\", headers=HEADERS, json=payload)\n    task_id = resp.json()[\"task_id\"]\n    return {\"shot_id\": shot[\"shot_id\"], \"task_id\": task_id}\n\ndef poll_until_done(task_id, max_wait=300):\n    \"\"\"Block until task completes or fails.\"\"\"\n    url = f\"{BASE_URL}/tasks/{task_id}\"\n    elapsed = 0\n    while elapsed \u003C max_wait:\n        data = requests.get(url, headers=HEADERS).json()\n        if data[\"status\"] in (\"completed\", \"failed\"):\n            return data\n        time.sleep(5)\n        elapsed += 5\n    return None\n\n# Submit all shots in parallel\nresults = []\nfor shot in SHOT_LIST:\n    result = submit_shot(shot)\n    results.append(result)\n    print(f\"Submitted {result['shot_id']} → {result['task_id']}\")\n    time.sleep(0.5)\n\n# Collect results in order\nfinal_videos = []\nfor r in results:\n    print(f\"\\nPolling {r['shot_id']}...\")\n    data = poll_until_done(r[\"task_id\"])\n    if data and data[\"status\"] == \"completed\":\n        video_url = data[\"output\"][\"video_url\"]\n        final_videos.append({\"shot_id\": r[\"shot_id\"], \"url\": video_url})\n        print(f\"  Done: {r['shot_id']}: {video_url}\")\n    else:\n        print(f\"  Failed: {r['shot_id']}: generation failed\")\n\n# Output the ordered shot list\nprint(\"\\n=== Final Shot List ===\")\nfor v in final_videos:\n    print(f\"{v['shot_id']}: {v['url']}\")\n",[28,26524,26525,26531,26537,26543,26549,26553,26561,26569,26577,26593,26601,26605,26609,26619,26623,26632,26636,26648,26654,26659,26664,26669,26674,26678,26685,26694,26698,26702,26713,26719,26724,26729,26734,26739,26743,26754,26762,26766,26770,26781,26787,26791,26796,26801,26806,26811,26815,26821,26829,26833,26837,26841,26850,26855,26876,26884,26894,26904,26910,26920,26930,26940,26948,26952,26986,26998,27018,27022,27038,27043,27065,27073,27083,27100,27124,27130,27138,27146,27152,27156,27161,27169,27182,27191,27196,27233,27242,27246,27251,27260,27270,27300,27314,27336,27353,27373,27406,27412,27438,27442,27447,27462,27474],{"__ignoreMap":141},[145,26526,26527,26529],{"class":147,"line":148},[145,26528,348],{"class":259},[145,26530,8346],{"class":263},[145,26532,26533,26535],{"class":147,"line":166},[145,26534,348],{"class":259},[145,26536,329],{"class":263},[145,26538,26539,26541],{"class":147,"line":178},[145,26540,348],{"class":259},[145,26542,357],{"class":263},[145,26544,26545,26547],{"class":147,"line":187},[145,26546,348],{"class":259},[145,26548,371],{"class":263},[145,26550,26551],{"class":147,"line":374},[145,26552,377],{"emptyLinePlaceholder":58},[145,26554,26555,26557,26559],{"class":147,"line":380},[145,26556,389],{"class":155},[145,26558,392],{"class":259},[145,26560,17537],{"class":159},[145,26562,26563,26565,26567],{"class":147,"line":386},[145,26564,413],{"class":155},[145,26566,392],{"class":259},[145,26568,418],{"class":159},[145,26570,26571,26573,26575],{"class":147,"line":410},[145,26572,424],{"class":155},[145,26574,392],{"class":259},[145,26576,429],{"class":263},[145,26578,26579,26581,26583,26585,26587,26589,26591],{"class":147,"line":421},[145,26580,435],{"class":159},[145,26582,438],{"class":263},[145,26584,441],{"class":259},[145,26586,444],{"class":159},[145,26588,447],{"class":155},[145,26590,450],{"class":159},[145,26592,453],{"class":263},[145,26594,26595,26597,26599],{"class":147,"line":432},[145,26596,459],{"class":159},[145,26598,438],{"class":263},[145,26600,464],{"class":159},[145,26602,26603],{"class":147,"line":456},[145,26604,470],{"class":263},[145,26606,26607],{"class":147,"line":467},[145,26608,377],{"emptyLinePlaceholder":58},[145,26610,26611,26614,26616],{"class":147,"line":600},[145,26612,26613],{"class":155},"CHARACTER_REF",[145,26615,392],{"class":259},[145,26617,26618],{"class":159}," \"https://example.com/story-character.jpg\"\n",[145,26620,26621],{"class":147,"line":605},[145,26622,377],{"emptyLinePlaceholder":58},[145,26624,26625,26628,26630],{"class":147,"line":611},[145,26626,26627],{"class":155},"SHOT_LIST",[145,26629,392],{"class":259},[145,26631,8843],{"class":263},[145,26633,26634],{"class":147,"line":617},[145,26635,25971],{"class":263},[145,26637,26638,26641,26643,26646],{"class":147,"line":623},[145,26639,26640],{"class":159},"        \"shot_id\"",[145,26642,438],{"class":263},[145,26644,26645],{"class":159},"\"01_entrance\"",[145,26647,453],{"class":263},[145,26649,26650,26652],{"class":147,"line":628},[145,26651,1320],{"class":159},[145,26653,1323],{"class":263},[145,26655,26656],{"class":147,"line":639},[145,26657,26658],{"class":159},"            \"@Image1 is the main character. \"\n",[145,26660,26661],{"class":147,"line":654},[145,26662,26663],{"class":159},"            \"She pushes open a heavy wooden door and steps into a dimly lit room. \"\n",[145,26665,26666],{"class":147,"line":660},[145,26667,26668],{"class":159},"            \"Dust swirls in the doorway light. \"\n",[145,26670,26671],{"class":147,"line":671},[145,26672,26673],{"class":159},"            \"Camera follows her from behind, over-the-shoulder angle.\"\n",[145,26675,26676],{"class":147,"line":698},[145,26677,1343],{"class":263},[145,26679,26680,26683],{"class":147,"line":710},[145,26681,26682],{"class":159},"        \"env_images\"",[145,26684,26004],{"class":263},[145,26686,26687,26689,26691],{"class":147,"line":716},[145,26688,1348],{"class":159},[145,26690,438],{"class":263},[145,26692,26693],{"class":155},"6\n",[145,26695,26696],{"class":147,"line":722},[145,26697,22124],{"class":263},[145,26699,26700],{"class":147,"line":728},[145,26701,25971],{"class":263},[145,26703,26704,26706,26708,26711],{"class":147,"line":739},[145,26705,26640],{"class":159},[145,26707,438],{"class":263},[145,26709,26710],{"class":159},"\"02_discovery\"",[145,26712,453],{"class":263},[145,26714,26715,26717],{"class":147,"line":744},[145,26716,1320],{"class":159},[145,26718,1323],{"class":263},[145,26720,26721],{"class":147,"line":750},[145,26722,26723],{"class":159},"            \"@Image1 is the main character. @Image2 is the room interior. \"\n",[145,26725,26726],{"class":147,"line":767},[145,26727,26728],{"class":159},"            \"She walks to the center of the room and discovers a glowing object on a pedestal. \"\n",[145,26730,26731],{"class":147,"line":788},[145,26732,26733],{"class":159},"            \"Her face shows surprise. Blue light illuminates her features. \"\n",[145,26735,26736],{"class":147,"line":834},[145,26737,26738],{"class":159},"            \"Camera pushes in from medium shot to close-up on her expression.\"\n",[145,26740,26741],{"class":147,"line":839},[145,26742,1343],{"class":263},[145,26744,26745,26747,26749,26752],{"class":147,"line":845},[145,26746,26682],{"class":159},[145,26748,10809],{"class":263},[145,26750,26751],{"class":159},"\"https://example.com/mysterious-room.jpg\"",[145,26753,10815],{"class":263},[145,26755,26756,26758,26760],{"class":147,"line":863},[145,26757,1348],{"class":159},[145,26759,438],{"class":263},[145,26761,26013],{"class":155},[145,26763,26764],{"class":147,"line":872},[145,26765,22124],{"class":263},[145,26767,26768],{"class":147,"line":887},[145,26769,25971],{"class":263},[145,26771,26772,26774,26776,26779],{"class":147,"line":903},[145,26773,26640],{"class":159},[145,26775,438],{"class":263},[145,26777,26778],{"class":159},"\"03_transformation\"",[145,26780,453],{"class":263},[145,26782,26783,26785],{"class":147,"line":915},[145,26784,1320],{"class":159},[145,26786,1323],{"class":263},[145,26788,26789],{"class":147,"line":954},[145,26790,26658],{"class":159},[145,26792,26793],{"class":147,"line":960},[145,26794,26795],{"class":159},"            \"She reaches out and touches the glowing object. \"\n",[145,26797,26798],{"class":147,"line":965},[145,26799,26800],{"class":159},"            \"Light radiates outward from the point of contact. \"\n",[145,26802,26803],{"class":147,"line":971},[145,26804,26805],{"class":159},"            \"The room transforms — walls dissolve into a starfield. \"\n",[145,26807,26808],{"class":147,"line":977},[145,26809,26810],{"class":159},"            \"Camera rapidly pulls back to extreme wide shot.\"\n",[145,26812,26813],{"class":147,"line":989},[145,26814,1343],{"class":263},[145,26816,26817,26819],{"class":147,"line":994},[145,26818,26682],{"class":159},[145,26820,26004],{"class":263},[145,26822,26823,26825,26827],{"class":147,"line":5521},[145,26824,1348],{"class":159},[145,26826,438],{"class":263},[145,26828,26061],{"class":155},[145,26830,26831],{"class":147,"line":5527},[145,26832,22124],{"class":263},[145,26834,26835],{"class":147,"line":5555},[145,26836,764],{"class":263},[145,26838,26839],{"class":147,"line":5586},[145,26840,377],{"emptyLinePlaceholder":58},[145,26842,26843,26845,26848],{"class":147,"line":5606},[145,26844,526],{"class":259},[145,26846,26847],{"class":151}," submit_shot",[145,26849,26135],{"class":263},[145,26851,26852],{"class":147,"line":5612},[145,26853,26854],{"class":159},"    \"\"\"Submit a single shot for generation.\"\"\"\n",[145,26856,26857,26859,26861,26863,26865,26867,26869,26871,26874],{"class":147,"line":5618},[145,26858,6211],{"class":263},[145,26860,267],{"class":259},[145,26862,8170],{"class":263},[145,26864,26613],{"class":155},[145,26866,14864],{"class":263},[145,26868,5409],{"class":259},[145,26870,26152],{"class":263},[145,26872,26873],{"class":159},"\"env_images\"",[145,26875,764],{"class":263},[145,26877,26878,26880,26882],{"class":147,"line":5623},[145,26879,1295],{"class":263},[145,26881,267],{"class":259},[145,26883,429],{"class":263},[145,26885,26886,26888,26890,26892],{"class":147,"line":5636},[145,26887,1304],{"class":159},[145,26889,438],{"class":263},[145,26891,1309],{"class":159},[145,26893,453],{"class":263},[145,26895,26896,26898,26900,26902],{"class":147,"line":5642},[145,26897,1320],{"class":159},[145,26899,26182],{"class":263},[145,26901,5901],{"class":159},[145,26903,10815],{"class":263},[145,26905,26906,26908],{"class":147,"line":5669},[145,26907,2683],{"class":159},[145,26909,26193],{"class":263},[145,26911,26912,26914,26916,26918],{"class":147,"line":5709},[145,26913,1348],{"class":159},[145,26915,26182],{"class":263},[145,26917,5946],{"class":159},[145,26919,10815],{"class":263},[145,26921,26922,26924,26926,26928],{"class":147,"line":5728},[145,26923,1364],{"class":159},[145,26925,438],{"class":263},[145,26927,3703],{"class":159},[145,26929,453],{"class":263},[145,26931,26932,26934,26936,26938],{"class":147,"line":5733},[145,26933,1380],{"class":159},[145,26935,438],{"class":263},[145,26937,1385],{"class":159},[145,26939,453],{"class":263},[145,26941,26942,26944,26946],{"class":147,"line":5738},[145,26943,1396],{"class":159},[145,26945,438],{"class":263},[145,26947,3731],{"class":155},[145,26949,26950],{"class":147,"line":5743},[145,26951,1408],{"class":263},[145,26953,26954,26956,26958,26961,26963,26965,26967,26969,26971,26973,26975,26977,26979,26981,26983],{"class":147,"line":7416},[145,26955,1127],{"class":263},[145,26957,267],{"class":259},[145,26959,26960],{"class":263}," requests.post(",[145,26962,441],{"class":259},[145,26964,450],{"class":159},[145,26966,679],{"class":155},[145,26968,1445],{"class":159},[145,26970,401],{"class":263},[145,26972,17766],{"class":701},[145,26974,267],{"class":259},[145,26976,424],{"class":155},[145,26978,401],{"class":263},[145,26980,1858],{"class":701},[145,26982,267],{"class":259},[145,26984,26985],{"class":263},"payload)\n",[145,26987,26988,26990,26992,26994,26996],{"class":147,"line":7422},[145,26989,7197],{"class":263},[145,26991,267],{"class":259},[145,26993,20682],{"class":263},[145,26995,7673],{"class":159},[145,26997,764],{"class":263},[145,26999,27000,27002,27004,27007,27009,27011,27013,27015],{"class":147,"line":7428},[145,27001,1704],{"class":259},[145,27003,6015],{"class":263},[145,27005,27006],{"class":159},"\"shot_id\"",[145,27008,26182],{"class":263},[145,27010,27006],{"class":159},[145,27012,10723],{"class":263},[145,27014,7673],{"class":159},[145,27016,27017],{"class":263},": task_id}\n",[145,27019,27020],{"class":147,"line":7439},[145,27021,377],{"emptyLinePlaceholder":58},[145,27023,27024,27026,27029,27032,27034,27036],{"class":147,"line":7450},[145,27025,526],{"class":259},[145,27027,27028],{"class":151}," poll_until_done",[145,27030,27031],{"class":263},"(task_id, max_wait",[145,27033,267],{"class":259},[145,27035,11664],{"class":155},[145,27037,548],{"class":263},[145,27039,27040],{"class":147,"line":7461},[145,27041,27042],{"class":159},"    \"\"\"Block until task completes or fails.\"\"\"\n",[145,27044,27045,27047,27049,27051,27053,27055,27057,27059,27061,27063],{"class":147,"line":7466},[145,27046,23432],{"class":263},[145,27048,267],{"class":259},[145,27050,3353],{"class":259},[145,27052,450],{"class":159},[145,27054,679],{"class":155},[145,27056,682],{"class":159},[145,27058,685],{"class":155},[145,27060,688],{"class":263},[145,27062,691],{"class":155},[145,27064,951],{"class":159},[145,27066,27067,27069,27071],{"class":147,"line":7472},[145,27068,631],{"class":263},[145,27070,267],{"class":259},[145,27072,636],{"class":155},[145,27074,27075,27077,27079,27081],{"class":147,"line":7480},[145,27076,642],{"class":259},[145,27078,645],{"class":263},[145,27080,648],{"class":259},[145,27082,23473],{"class":263},[145,27084,27085,27087,27089,27091,27093,27095,27097],{"class":147,"line":7494},[145,27086,23494],{"class":263},[145,27088,267],{"class":259},[145,27090,1132],{"class":263},[145,27092,17766],{"class":701},[145,27094,267],{"class":259},[145,27096,424],{"class":155},[145,27098,27099],{"class":263},").json()\n",[145,27101,27102,27104,27106,27108,27110,27112,27114,27117,27119,27122],{"class":147,"line":7499},[145,27103,848],{"class":259},[145,27105,23507],{"class":263},[145,27107,761],{"class":159},[145,27109,14864],{"class":263},[145,27111,1181],{"class":259},[145,27113,1219],{"class":263},[145,27115,27116],{"class":159},"\"completed\"",[145,27118,401],{"class":263},[145,27120,27121],{"class":159},"\"failed\"",[145,27123,548],{"class":263},[145,27125,27126,27128],{"class":147,"line":7513},[145,27127,866],{"class":259},[145,27129,23570],{"class":263},[145,27131,27132,27134,27136],{"class":147,"line":7527},[145,27133,15001],{"class":263},[145,27135,1353],{"class":155},[145,27137,407],{"class":263},[145,27139,27140,27142,27144],{"class":147,"line":7559},[145,27141,980],{"class":263},[145,27143,983],{"class":259},[145,27145,20882],{"class":155},[145,27147,27148,27150],{"class":147,"line":7571},[145,27149,1704],{"class":259},[145,27151,11915],{"class":155},[145,27153,27154],{"class":147,"line":7581},[145,27155,377],{"emptyLinePlaceholder":58},[145,27157,27158],{"class":147,"line":7586},[145,27159,27160],{"class":174},"# Submit all shots in parallel\n",[145,27162,27163,27165,27167],{"class":147,"line":7593},[145,27164,21826],{"class":263},[145,27166,267],{"class":259},[145,27168,5856],{"class":263},[145,27170,27171,27173,27175,27177,27180],{"class":147,"line":7615},[145,27172,8207],{"class":259},[145,27174,26301],{"class":263},[145,27176,1181],{"class":259},[145,27178,27179],{"class":155}," SHOT_LIST",[145,27181,860],{"class":263},[145,27183,27184,27186,27188],{"class":147,"line":7646},[145,27185,1619],{"class":263},[145,27187,267],{"class":259},[145,27189,27190],{"class":263}," submit_shot(shot)\n",[145,27192,27193],{"class":147,"line":7651},[145,27194,27195],{"class":263},"    results.append(result)\n",[145,27197,27198,27200,27202,27204,27206,27208,27210,27213,27215,27217,27219,27221,27223,27225,27227,27229,27231],{"class":147,"line":7657},[145,27199,1103],{"class":155},[145,27201,794],{"class":263},[145,27203,441],{"class":259},[145,27205,26317],{"class":159},[145,27207,685],{"class":155},[145,27209,11779],{"class":263},[145,27211,27212],{"class":159},"'shot_id'",[145,27214,1536],{"class":263},[145,27216,691],{"class":155},[145,27218,23688],{"class":159},[145,27220,685],{"class":155},[145,27222,11779],{"class":263},[145,27224,19814],{"class":159},[145,27226,1536],{"class":263},[145,27228,691],{"class":155},[145,27230,450],{"class":159},[145,27232,407],{"class":263},[145,27234,27235,27237,27240],{"class":147,"line":7682},[145,27236,19827],{"class":263},[145,27238,27239],{"class":155},"0.5",[145,27241,407],{"class":263},[145,27243,27244],{"class":147,"line":7687},[145,27245,377],{"emptyLinePlaceholder":58},[145,27247,27248],{"class":147,"line":7692},[145,27249,27250],{"class":174},"# Collect results in order\n",[145,27252,27253,27256,27258],{"class":147,"line":7715},[145,27254,27255],{"class":263},"final_videos ",[145,27257,267],{"class":259},[145,27259,5856],{"class":263},[145,27261,27262,27264,27266,27268],{"class":147,"line":7725},[145,27263,8207],{"class":259},[145,27265,21746],{"class":263},[145,27267,1181],{"class":259},[145,27269,7378],{"class":263},[145,27271,27272,27274,27276,27278,27280,27282,27285,27287,27290,27292,27294,27296,27298],{"class":147,"line":7731},[145,27273,1103],{"class":155},[145,27275,794],{"class":263},[145,27277,441],{"class":259},[145,27279,450],{"class":159},[145,27281,1671],{"class":155},[145,27283,27284],{"class":159},"Polling ",[145,27286,685],{"class":155},[145,27288,27289],{"class":263},"r[",[145,27291,27212],{"class":159},[145,27293,1536],{"class":263},[145,27295,691],{"class":155},[145,27297,1120],{"class":159},[145,27299,407],{"class":263},[145,27301,27302,27305,27307,27310,27312],{"class":147,"line":7749},[145,27303,27304],{"class":263},"    data ",[145,27306,267],{"class":259},[145,27308,27309],{"class":263}," poll_until_done(r[",[145,27311,7673],{"class":159},[145,27313,1630],{"class":263},[145,27315,27316,27318,27321,27324,27326,27328,27330,27332,27334],{"class":147,"line":7754},[145,27317,2501],{"class":259},[145,27319,27320],{"class":263}," data ",[145,27322,27323],{"class":259},"and",[145,27325,23507],{"class":263},[145,27327,761],{"class":159},[145,27329,14864],{"class":263},[145,27331,854],{"class":259},[145,27333,857],{"class":159},[145,27335,860],{"class":263},[145,27337,27338,27341,27343,27345,27347,27349,27351],{"class":147,"line":7759},[145,27339,27340],{"class":263},"        video_url ",[145,27342,267],{"class":259},[145,27344,23507],{"class":263},[145,27346,21462],{"class":159},[145,27348,1563],{"class":263},[145,27350,14886],{"class":159},[145,27352,764],{"class":263},[145,27354,27355,27358,27360,27363,27365,27367,27370],{"class":147,"line":7772},[145,27356,27357],{"class":263},"        final_videos.append({",[145,27359,27006],{"class":159},[145,27361,27362],{"class":263},": r[",[145,27364,27006],{"class":159},[145,27366,10723],{"class":263},[145,27368,27369],{"class":159},"\"url\"",[145,27371,27372],{"class":263},": video_url})\n",[145,27374,27375,27377,27379,27381,27384,27386,27388,27390,27392,27394,27396,27398,27400,27402,27404],{"class":147,"line":7786},[145,27376,791],{"class":155},[145,27378,794],{"class":263},[145,27380,441],{"class":259},[145,27382,27383],{"class":159},"\"  Done: ",[145,27385,685],{"class":155},[145,27387,27289],{"class":263},[145,27389,27212],{"class":159},[145,27391,1536],{"class":263},[145,27393,691],{"class":155},[145,27395,438],{"class":159},[145,27397,685],{"class":155},[145,27399,1679],{"class":263},[145,27401,691],{"class":155},[145,27403,450],{"class":159},[145,27405,407],{"class":263},[145,27407,27408,27410],{"class":147,"line":7813},[145,27409,2537],{"class":259},[145,27411,860],{"class":263},[145,27413,27414,27416,27418,27420,27423,27425,27427,27429,27431,27433,27436],{"class":147,"line":7827},[145,27415,791],{"class":155},[145,27417,794],{"class":263},[145,27419,441],{"class":259},[145,27421,27422],{"class":159},"\"  Failed: ",[145,27424,685],{"class":155},[145,27426,27289],{"class":263},[145,27428,27212],{"class":159},[145,27430,1536],{"class":263},[145,27432,691],{"class":155},[145,27434,27435],{"class":159},": generation failed\"",[145,27437,407],{"class":263},[145,27439,27440],{"class":147,"line":10335},[145,27441,377],{"emptyLinePlaceholder":58},[145,27443,27444],{"class":147,"line":10342},[145,27445,27446],{"class":174},"# Output the ordered shot list\n",[145,27448,27449,27451,27453,27455,27457,27460],{"class":147,"line":10388},[145,27450,6563],{"class":155},[145,27452,794],{"class":263},[145,27454,450],{"class":159},[145,27456,1671],{"class":155},[145,27458,27459],{"class":159},"=== Final Shot List ===\"",[145,27461,407],{"class":263},[145,27463,27464,27466,27469,27471],{"class":147,"line":10393},[145,27465,8207],{"class":259},[145,27467,27468],{"class":263}," v ",[145,27470,1181],{"class":259},[145,27472,27473],{"class":263}," final_videos:\n",[145,27475,27476,27478,27480,27482,27484,27486,27489,27491,27493,27495,27497,27499,27501,27504,27506,27508,27510],{"class":147,"line":10398},[145,27477,1103],{"class":155},[145,27479,794],{"class":263},[145,27481,441],{"class":259},[145,27483,450],{"class":159},[145,27485,685],{"class":155},[145,27487,27488],{"class":263},"v[",[145,27490,27212],{"class":159},[145,27492,1536],{"class":263},[145,27494,691],{"class":155},[145,27496,438],{"class":159},[145,27498,685],{"class":155},[145,27500,27488],{"class":263},[145,27502,27503],{"class":159},"'url'",[145,27505,1536],{"class":263},[145,27507,691],{"class":155},[145,27509,450],{"class":159},[145,27511,407],{"class":263},[11,27513,27514,27515,27517,27518,298],{},"此流水线生成一个有序的视频 URL 列表，你可以将其输入任何视频编辑器或自动化拼接工具（FFmpeg、MoviePy 等）来组装最终的叙事序列。角色在所有镜头中保持一致，因为每个请求都使用相同的 ",[28,27516,26613],{}," 作为 ",[28,27519,2903],{},[92,27521,27522],{"id":27522},"处理一致性边缘情况",[11,27524,27525],{},"即使使用相同的参考图片，跨镜头也可能出现轻微变化——角色的服装颜色可能偏移几个色度，或者在极端远景镜头中比例可能略有变化。以下是减少这些变化的策略：",[11,27527,27528,27531],{},[23,27529,27530],{},"在每个提示词中重新陈述角色细节。"," 如果你的角色穿着特定服装，简要提及：\"@Image1 is the main character wearing a blue denim jacket.\" 这会强化来自参考图片的视觉锚点。",[11,27533,27534,27537],{},[23,27535,27536],{},"避免在镜头之间进行极端角度变化。"," 正面中景紧接着俯瞰极远景会引入最大的变化。逐步过渡：中景 → 稍微更宽的镜头 → 远景。",[11,27539,27540,27543,27544,2955,27546,27548],{},[23,27541,27542],{},"使用相同的画质和宽高比。"," 在不同镜头间混用 ",[28,27545,1786],{},[28,27547,1794],{}," 会引入细微的渲染差异。在你的镜头列表中统一所有参数。",[45,27550],{},[48,27552,27554],{"id":27553},"电商产品视频端到端工作流","电商产品视频：端到端工作流",[11,27556,27557,27558,27561],{},"产品拍照成本高昂。产品",[2614,27559,27560],{},"录像","更加昂贵——影棚、旋转台、适当的灯光、摄影师、剪辑时间。Seedance 2.0 的图像转视频 API 用单次 API 调用替代了大部分流程。",[92,27563,27564],{"id":27564},"产品视频的难题",[11,27566,27567],{},"电商平台越来越青睐视频内容。亚马逊报告称，带视频的产品列表有更高的转化率。Instagram 和 TikTok 是视频优先的平台。但制作一段简单的 10 秒产品旋转视频传统上需要：",[70,27569,27570,27573,27576,27579,27582],{},[73,27571,27572],{},"物理旋转台装置",[73,27574,27575],{},"适当的灯光设备",[73,27577,27578],{},"摄影师（或精心的 DIY）",[73,27580,27581],{},"剪辑和调色",[73,27583,27584],{},"导出和上传",[11,27586,27587],{},"使用 Seedance 2.0，流程变成：",[70,27589,27590,27593,27596],{},[73,27591,27592],{},"拍一张产品照片（你已经有了）",[73,27594,27595],{},"发起一次 API 调用",[73,27597,27598],{},"下载视频",[92,27600,27602],{"id":27601},"单品展示手表广告","单品展示：手表广告",[11,27604,27605],{},"以下是从单张产品图片生成产品展示视频的完整工作流：",[136,27607,27609],{"className":339,"code":27608,"language":341,"meta":141,"style":141},"import requests\nimport time\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\ndef wait_for_video(task_id, interval=5, max_wait=300):\n    url = f\"{BASE_URL}/tasks/{task_id}\"\n    elapsed = 0\n    while elapsed \u003C max_wait:\n        resp = requests.get(url, headers=HEADERS)\n        data = resp.json()\n        status = data[\"status\"]\n        if status == \"completed\":\n            print(f\"Video ready: {data['output']['video_url']}\")\n            return data\n        elif status == \"failed\":\n            print(f\"Failed: {data.get('error', 'Unknown error')}\")\n            return data\n        print(f\"Status: {status} ({elapsed}s)\")\n        time.sleep(interval)\n        elapsed += interval\n    return None\n\n# --- Product Video: Luxury Watch ---\npayload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": (\n        \"@Image1 is a luxury wristwatch. \"\n        \"The watch rotates slowly on a dark marble surface. \"\n        \"Dramatic side lighting highlights the metal bracelet and crystal face. \"\n        \"Light reflections move across the polished surfaces as the watch turns. \"\n        \"Subtle lens flare. Extreme close-up with shallow depth of field. \"\n        \"Premium product advertisement aesthetic.\"\n    ),\n    \"image_urls\": [\n        \"https://example.com/watch-product.jpg\"\n    ],\n    \"duration\": 8,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\",\n    \"generate_audio\": False\n}\n\nresp = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json=payload\n)\nresult = resp.json()\nprint(f\"Task ID: {result['task_id']}\")\n\nvideo_data = wait_for_video(result[\"task_id\"])\n",[28,27610,27611,27617,27623,27627,27635,27643,27651,27667,27675,27679,27683,27703,27725,27733,27743,27759,27767,27779,27791,27819,27825,27837,27865,27871,27899,27903,27911,27917,27921,27926,27934,27944,27950,27955,27960,27965,27970,27975,27980,27984,27990,27995,27999,28009,28019,28029,28037,28041,28045,28053,28065,28075,28083,28087,28095,28119,28123],{"__ignoreMap":141},[145,27612,27613,27615],{"class":147,"line":148},[145,27614,348],{"class":259},[145,27616,329],{"class":263},[145,27618,27619,27621],{"class":147,"line":166},[145,27620,348],{"class":259},[145,27622,357],{"class":263},[145,27624,27625],{"class":147,"line":178},[145,27626,377],{"emptyLinePlaceholder":58},[145,27628,27629,27631,27633],{"class":147,"line":187},[145,27630,389],{"class":155},[145,27632,392],{"class":259},[145,27634,17537],{"class":159},[145,27636,27637,27639,27641],{"class":147,"line":374},[145,27638,413],{"class":155},[145,27640,392],{"class":259},[145,27642,418],{"class":159},[145,27644,27645,27647,27649],{"class":147,"line":380},[145,27646,424],{"class":155},[145,27648,392],{"class":259},[145,27650,429],{"class":263},[145,27652,27653,27655,27657,27659,27661,27663,27665],{"class":147,"line":386},[145,27654,435],{"class":159},[145,27656,438],{"class":263},[145,27658,441],{"class":259},[145,27660,444],{"class":159},[145,27662,447],{"class":155},[145,27664,450],{"class":159},[145,27666,453],{"class":263},[145,27668,27669,27671,27673],{"class":147,"line":410},[145,27670,459],{"class":159},[145,27672,438],{"class":263},[145,27674,464],{"class":159},[145,27676,27677],{"class":147,"line":421},[145,27678,470],{"class":263},[145,27680,27681],{"class":147,"line":432},[145,27682,377],{"emptyLinePlaceholder":58},[145,27684,27685,27687,27689,27691,27693,27695,27697,27699,27701],{"class":147,"line":456},[145,27686,526],{"class":259},[145,27688,529],{"class":151},[145,27690,11653],{"class":263},[145,27692,267],{"class":259},[145,27694,1353],{"class":155},[145,27696,23416],{"class":263},[145,27698,267],{"class":259},[145,27700,11664],{"class":155},[145,27702,548],{"class":263},[145,27704,27705,27707,27709,27711,27713,27715,27717,27719,27721,27723],{"class":147,"line":467},[145,27706,23432],{"class":263},[145,27708,267],{"class":259},[145,27710,3353],{"class":259},[145,27712,450],{"class":159},[145,27714,679],{"class":155},[145,27716,682],{"class":159},[145,27718,685],{"class":155},[145,27720,688],{"class":263},[145,27722,691],{"class":155},[145,27724,951],{"class":159},[145,27726,27727,27729,27731],{"class":147,"line":600},[145,27728,631],{"class":263},[145,27730,267],{"class":259},[145,27732,636],{"class":155},[145,27734,27735,27737,27739,27741],{"class":147,"line":605},[145,27736,642],{"class":259},[145,27738,645],{"class":263},[145,27740,648],{"class":259},[145,27742,23473],{"class":263},[145,27744,27745,27747,27749,27751,27753,27755,27757],{"class":147,"line":611},[145,27746,6908],{"class":263},[145,27748,267],{"class":259},[145,27750,1132],{"class":263},[145,27752,17766],{"class":701},[145,27754,267],{"class":259},[145,27756,424],{"class":155},[145,27758,407],{"class":263},[145,27760,27761,27763,27765],{"class":147,"line":617},[145,27762,23494],{"class":263},[145,27764,267],{"class":259},[145,27766,11734],{"class":263},[145,27768,27769,27771,27773,27775,27777],{"class":147,"line":623},[145,27770,753],{"class":263},[145,27772,267],{"class":259},[145,27774,23507],{"class":263},[145,27776,761],{"class":159},[145,27778,764],{"class":263},[145,27780,27781,27783,27785,27787,27789],{"class":147,"line":628},[145,27782,848],{"class":259},[145,27784,851],{"class":263},[145,27786,854],{"class":259},[145,27788,857],{"class":159},[145,27790,860],{"class":263},[145,27792,27793,27795,27797,27799,27801,27803,27805,27807,27809,27811,27813,27815,27817],{"class":147,"line":639},[145,27794,5558],{"class":155},[145,27796,794],{"class":263},[145,27798,441],{"class":259},[145,27800,11774],{"class":159},[145,27802,685],{"class":155},[145,27804,23958],{"class":263},[145,27806,17828],{"class":159},[145,27808,1563],{"class":263},[145,27810,17833],{"class":159},[145,27812,1536],{"class":263},[145,27814,691],{"class":155},[145,27816,450],{"class":159},[145,27818,407],{"class":263},[145,27820,27821,27823],{"class":147,"line":654},[145,27822,866],{"class":259},[145,27824,23570],{"class":263},[145,27826,27827,27829,27831,27833,27835],{"class":147,"line":660},[145,27828,875],{"class":259},[145,27830,851],{"class":263},[145,27832,854],{"class":259},[145,27834,882],{"class":159},[145,27836,860],{"class":263},[145,27838,27839,27841,27843,27845,27847,27849,27851,27853,27855,27857,27859,27861,27863],{"class":147,"line":671},[145,27840,5558],{"class":155},[145,27842,794],{"class":263},[145,27844,441],{"class":259},[145,27846,24001],{"class":159},[145,27848,685],{"class":155},[145,27850,23597],{"class":263},[145,27852,11831],{"class":159},[145,27854,401],{"class":263},[145,27856,943],{"class":159},[145,27858,946],{"class":263},[145,27860,691],{"class":155},[145,27862,450],{"class":159},[145,27864,407],{"class":263},[145,27866,27867,27869],{"class":147,"line":698},[145,27868,866],{"class":259},[145,27870,23570],{"class":263},[145,27872,27873,27875,27877,27879,27881,27883,27885,27887,27889,27891,27893,27895,27897],{"class":147,"line":710},[145,27874,791],{"class":155},[145,27876,794],{"class":263},[145,27878,441],{"class":259},[145,27880,11860],{"class":159},[145,27882,685],{"class":155},[145,27884,814],{"class":263},[145,27886,691],{"class":155},[145,27888,1219],{"class":159},[145,27890,685],{"class":155},[145,27892,804],{"class":263},[145,27894,691],{"class":155},[145,27896,10693],{"class":159},[145,27898,407],{"class":263},[145,27900,27901],{"class":147,"line":716},[145,27902,11884],{"class":263},[145,27904,27905,27907,27909],{"class":147,"line":722},[145,27906,980],{"class":263},[145,27908,983],{"class":259},[145,27910,11893],{"class":263},[145,27912,27913,27915],{"class":147,"line":728},[145,27914,1704],{"class":259},[145,27916,11915],{"class":155},[145,27918,27919],{"class":147,"line":739},[145,27920,377],{"emptyLinePlaceholder":58},[145,27922,27923],{"class":147,"line":744},[145,27924,27925],{"class":174},"# --- Product Video: Luxury Watch ---\n",[145,27927,27928,27930,27932],{"class":147,"line":750},[145,27929,3654],{"class":263},[145,27931,267],{"class":259},[145,27933,429],{"class":263},[145,27935,27936,27938,27940,27942],{"class":147,"line":767},[145,27937,3663],{"class":159},[145,27939,438],{"class":263},[145,27941,1309],{"class":159},[145,27943,453],{"class":263},[145,27945,27946,27948],{"class":147,"line":788},[145,27947,3674],{"class":159},[145,27949,1323],{"class":263},[145,27951,27952],{"class":147,"line":834},[145,27953,27954],{"class":159},"        \"@Image1 is a luxury wristwatch. \"\n",[145,27956,27957],{"class":147,"line":839},[145,27958,27959],{"class":159},"        \"The watch rotates slowly on a dark marble surface. \"\n",[145,27961,27962],{"class":147,"line":845},[145,27963,27964],{"class":159},"        \"Dramatic side lighting highlights the metal bracelet and crystal face. \"\n",[145,27966,27967],{"class":147,"line":863},[145,27968,27969],{"class":159},"        \"Light reflections move across the polished surfaces as the watch turns. \"\n",[145,27971,27972],{"class":147,"line":872},[145,27973,27974],{"class":159},"        \"Subtle lens flare. Extreme close-up with shallow depth of field. \"\n",[145,27976,27977],{"class":147,"line":887},[145,27978,27979],{"class":159},"        \"Premium product advertisement aesthetic.\"\n",[145,27981,27982],{"class":147,"line":903},[145,27983,3797],{"class":263},[145,27985,27986,27988],{"class":147,"line":915},[145,27987,15319],{"class":159},[145,27989,2686],{"class":263},[145,27991,27992],{"class":147,"line":954},[145,27993,27994],{"class":159},"        \"https://example.com/watch-product.jpg\"\n",[145,27996,27997],{"class":147,"line":960},[145,27998,16301],{"class":263},[145,28000,28001,28003,28005,28007],{"class":147,"line":965},[145,28002,3686],{"class":159},[145,28004,438],{"class":263},[145,28006,3691],{"class":155},[145,28008,453],{"class":263},[145,28010,28011,28013,28015,28017],{"class":147,"line":971},[145,28012,3698],{"class":159},[145,28014,438],{"class":263},[145,28016,3703],{"class":159},[145,28018,453],{"class":263},[145,28020,28021,28023,28025,28027],{"class":147,"line":977},[145,28022,3710],{"class":159},[145,28024,438],{"class":263},[145,28026,1385],{"class":159},[145,28028,453],{"class":263},[145,28030,28031,28033,28035],{"class":147,"line":989},[145,28032,3726],{"class":159},[145,28034,438],{"class":263},[145,28036,15365],{"class":155},[145,28038,28039],{"class":147,"line":994},[145,28040,470],{"class":263},[145,28042,28043],{"class":147,"line":5521},[145,28044,377],{"emptyLinePlaceholder":58},[145,28046,28047,28049,28051],{"class":147,"line":5527},[145,28048,24194],{"class":263},[145,28050,267],{"class":259},[145,28052,1433],{"class":263},[145,28054,28055,28057,28059,28061,28063],{"class":147,"line":5555},[145,28056,6517],{"class":259},[145,28058,450],{"class":159},[145,28060,679],{"class":155},[145,28062,1445],{"class":159},[145,28064,453],{"class":263},[145,28066,28067,28069,28071,28073],{"class":147,"line":5586},[145,28068,6530],{"class":701},[145,28070,267],{"class":259},[145,28072,424],{"class":155},[145,28074,453],{"class":263},[145,28076,28077,28079,28081],{"class":147,"line":5606},[145,28078,6541],{"class":701},[145,28080,267],{"class":259},[145,28082,2783],{"class":263},[145,28084,28085],{"class":147,"line":5612},[145,28086,407],{"class":263},[145,28088,28089,28091,28093],{"class":147,"line":5618},[145,28090,12197],{"class":263},[145,28092,267],{"class":259},[145,28094,11734],{"class":263},[145,28096,28097,28099,28101,28103,28105,28107,28109,28111,28113,28115,28117],{"class":147,"line":5623},[145,28098,6563],{"class":155},[145,28100,794],{"class":263},[145,28102,441],{"class":259},[145,28104,24251],{"class":159},[145,28106,685],{"class":155},[145,28108,11779],{"class":263},[145,28110,19814],{"class":159},[145,28112,1536],{"class":263},[145,28114,691],{"class":155},[145,28116,450],{"class":159},[145,28118,407],{"class":263},[145,28120,28121],{"class":147,"line":5636},[145,28122,377],{"emptyLinePlaceholder":58},[145,28124,28125,28127,28129,28131,28133],{"class":147,"line":5642},[145,28126,24279],{"class":263},[145,28128,267],{"class":259},[145,28130,24284],{"class":263},[145,28132,7673],{"class":159},[145,28134,1630],{"class":263},[92,28136,28138],{"id":28137},"演示手表产品视频","演示：手表产品视频",[56,28140,60,28141],{"controls":58,"playsInline":58,"style":59},[62,28142],{"src":18098,"type":65},[11,28144,28145,2423,28147],{},[23,28146,24312],{},[2614,28148,28149],{},"\"@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.\"",[11,28151,28152],{},"从单张产品照片，API 生成了具有影棚品质灯光的旋转产品展示。手表的设计细节——表盘刻度、表链链节、表壳形状——全部来自参考图片。",[92,28154,28155],{"id":28155},"多色产品变体",[11,28157,28158,28159,28161],{},"许多产品有多种配色。与其单独拍摄每种变体，你可以使用 ",[28,28160,23039],{}," 系统在单个视频中展示所有变体：",[136,28163,28165],{"className":339,"code":28164,"language":341,"meta":141,"style":141},"# --- Multi-Color Product: Headphones ---\npayload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": (\n        \"@Image1 shows premium over-ear headphones in four different colors \"\n        \"arranged on a clean surface. The camera slowly pans across all four \"\n        \"variants. Each headphone catches the studio light differently. \"\n        \"Smooth dolly movement from left to right. \"\n        \"Clean white background with subtle shadows. \"\n        \"Product catalog video style.\"\n    ),\n    \"image_urls\": [\n        \"https://example.com/headphones-all-colors.jpg\"\n    ],\n    \"duration\": 10,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\"\n}\n\nresp = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json=payload\n)\nresult = resp.json()\nprint(f\"Task ID: {result['task_id']}\")\nvideo_data = wait_for_video(result[\"task_id\"])\n",[28,28166,28167,28172,28180,28190,28196,28201,28206,28211,28216,28221,28226,28230,28236,28241,28245,28255,28265,28273,28277,28281,28289,28301,28311,28319,28323,28331,28355],{"__ignoreMap":141},[145,28168,28169],{"class":147,"line":148},[145,28170,28171],{"class":174},"# --- Multi-Color Product: Headphones ---\n",[145,28173,28174,28176,28178],{"class":147,"line":166},[145,28175,3654],{"class":263},[145,28177,267],{"class":259},[145,28179,429],{"class":263},[145,28181,28182,28184,28186,28188],{"class":147,"line":178},[145,28183,3663],{"class":159},[145,28185,438],{"class":263},[145,28187,1309],{"class":159},[145,28189,453],{"class":263},[145,28191,28192,28194],{"class":147,"line":187},[145,28193,3674],{"class":159},[145,28195,1323],{"class":263},[145,28197,28198],{"class":147,"line":374},[145,28199,28200],{"class":159},"        \"@Image1 shows premium over-ear headphones in four different colors \"\n",[145,28202,28203],{"class":147,"line":380},[145,28204,28205],{"class":159},"        \"arranged on a clean surface. The camera slowly pans across all four \"\n",[145,28207,28208],{"class":147,"line":386},[145,28209,28210],{"class":159},"        \"variants. Each headphone catches the studio light differently. \"\n",[145,28212,28213],{"class":147,"line":410},[145,28214,28215],{"class":159},"        \"Smooth dolly movement from left to right. \"\n",[145,28217,28218],{"class":147,"line":421},[145,28219,28220],{"class":159},"        \"Clean white background with subtle shadows. \"\n",[145,28222,28223],{"class":147,"line":432},[145,28224,28225],{"class":159},"        \"Product catalog video style.\"\n",[145,28227,28228],{"class":147,"line":456},[145,28229,3797],{"class":263},[145,28231,28232,28234],{"class":147,"line":467},[145,28233,15319],{"class":159},[145,28235,2686],{"class":263},[145,28237,28238],{"class":147,"line":600},[145,28239,28240],{"class":159},"        \"https://example.com/headphones-all-colors.jpg\"\n",[145,28242,28243],{"class":147,"line":605},[145,28244,16301],{"class":263},[145,28246,28247,28249,28251,28253],{"class":147,"line":611},[145,28248,3686],{"class":159},[145,28250,438],{"class":263},[145,28252,537],{"class":155},[145,28254,453],{"class":263},[145,28256,28257,28259,28261,28263],{"class":147,"line":617},[145,28258,3698],{"class":159},[145,28260,438],{"class":263},[145,28262,3703],{"class":159},[145,28264,453],{"class":263},[145,28266,28267,28269,28271],{"class":147,"line":623},[145,28268,3710],{"class":159},[145,28270,438],{"class":263},[145,28272,2725],{"class":159},[145,28274,28275],{"class":147,"line":628},[145,28276,470],{"class":263},[145,28278,28279],{"class":147,"line":639},[145,28280,377],{"emptyLinePlaceholder":58},[145,28282,28283,28285,28287],{"class":147,"line":654},[145,28284,24194],{"class":263},[145,28286,267],{"class":259},[145,28288,1433],{"class":263},[145,28290,28291,28293,28295,28297,28299],{"class":147,"line":660},[145,28292,6517],{"class":259},[145,28294,450],{"class":159},[145,28296,679],{"class":155},[145,28298,1445],{"class":159},[145,28300,453],{"class":263},[145,28302,28303,28305,28307,28309],{"class":147,"line":671},[145,28304,6530],{"class":701},[145,28306,267],{"class":259},[145,28308,424],{"class":155},[145,28310,453],{"class":263},[145,28312,28313,28315,28317],{"class":147,"line":698},[145,28314,6541],{"class":701},[145,28316,267],{"class":259},[145,28318,2783],{"class":263},[145,28320,28321],{"class":147,"line":710},[145,28322,407],{"class":263},[145,28324,28325,28327,28329],{"class":147,"line":716},[145,28326,12197],{"class":263},[145,28328,267],{"class":259},[145,28330,11734],{"class":263},[145,28332,28333,28335,28337,28339,28341,28343,28345,28347,28349,28351,28353],{"class":147,"line":722},[145,28334,6563],{"class":155},[145,28336,794],{"class":263},[145,28338,441],{"class":259},[145,28340,24251],{"class":159},[145,28342,685],{"class":155},[145,28344,11779],{"class":263},[145,28346,19814],{"class":159},[145,28348,1536],{"class":263},[145,28350,691],{"class":155},[145,28352,450],{"class":159},[145,28354,407],{"class":263},[145,28356,28357,28359,28361,28363,28365],{"class":147,"line":728},[145,28358,24279],{"class":263},[145,28360,267],{"class":259},[145,28362,24284],{"class":263},[145,28364,7673],{"class":159},[145,28366,1630],{"class":263},[92,28368,28370],{"id":28369},"演示耳机颜色变体","演示：耳机颜色变体",[56,28372,60,28373],{"controls":58,"playsInline":58,"style":59},[62,28374],{"src":18365,"type":65},[11,28376,28377,2423,28379],{},[23,28378,24312],{},[2614,28380,28381],{},"\"@Image1 shows over-ear headphones in four color variants. The camera pans smoothly across each variant under clean studio lighting. Soft reflections on the ear cups. Minimal white background. Product showcase cinematography.\"",[11,28383,28384],{},"一张产品阵列照片变成一段流畅的平移展示视频。每种配色都有充分的展示时间，影棚灯光美学与专业产品录像相匹配。",[92,28386,28387],{"id":28387},"产品目录批量生成",[11,28389,28390],{},"如果你有数十或数百个产品，可以将生成逻辑封装在批处理器中：",[136,28392,28394],{"className":339,"code":28393,"language":341,"meta":141,"style":141},"import csv\nimport time\nimport requests\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\ndef generate_product_video(product_name, image_url, style=\"premium\"):\n    \"\"\"Generate a product video from a single product image.\"\"\"\n    style_prompts = {\n        \"premium\": (\n            f\"@Image1 is a {product_name}. \"\n            \"The product rotates slowly under dramatic studio lighting \"\n            \"on a dark reflective surface. Cinematic close-up. \"\n            \"Light reveals surface details and textures. \"\n            \"Premium advertisement quality.\"\n        ),\n        \"lifestyle\": (\n            f\"@Image1 is a {product_name}. \"\n            \"The product is shown in a lifestyle setting — \"\n            \"a modern living space with natural light. \"\n            \"Camera slowly pushes in to reveal product details. \"\n            \"Warm, inviting atmosphere.\"\n        ),\n        \"minimal\": (\n            f\"@Image1 is a {product_name}. \"\n            \"Clean white background. The product rotates 360 degrees. \"\n            \"Even, shadowless lighting. E-commerce product spin.\"\n        ),\n    }\n\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"prompt\": style_prompts[style],\n        \"image_urls\": [image_url],\n        \"duration\": 8,\n        \"quality\": \"1080p\",\n        \"aspect_ratio\": \"1:1\"\n    }\n\n    resp = requests.post(\n        f\"{BASE_URL}/videos/generations\",\n        headers=HEADERS,\n        json=payload\n    )\n    data = resp.json()\n    return data[\"task_id\"]\n\n\n# Example: process a CSV product catalog\n# CSV format: product_name, image_url, style\nproducts = [\n    (\"Wireless Earbuds\", \"https://example.com/earbuds.jpg\", \"premium\"),\n    (\"Leather Wallet\", \"https://example.com/wallet.jpg\", \"lifestyle\"),\n    (\"Running Shoes\", \"https://example.com/shoes.jpg\", \"minimal\"),\n]\n\ntasks = []\nfor name, url, style in products:\n    task_id = generate_product_video(name, url, style)\n    tasks.append((name, task_id))\n    print(f\"Submitted: {name} → {task_id}\")\n    time.sleep(1)  # Rate limiting courtesy\n\nprint(f\"\\nSubmitted {len(tasks)} product videos\")\nprint(\"Poll each task_id to retrieve the completed video URLs\")\n",[28,28395,28396,28402,28408,28414,28418,28426,28434,28442,28458,28466,28470,28474,28491,28496,28505,28512,28529,28534,28539,28544,28549,28553,28560,28574,28579,28584,28589,28594,28598,28605,28619,28624,28629,28633,28637,28641,28649,28659,28666,28672,28682,28692,28701,28705,28709,28717,28729,28739,28747,28751,28759,28769,28773,28777,28782,28787,28796,28816,28835,28854,28858,28862,28870,28882,28891,28896,28925,28936,28940,28967],{"__ignoreMap":141},[145,28397,28398,28400],{"class":147,"line":148},[145,28399,348],{"class":259},[145,28401,20034],{"class":263},[145,28403,28404,28406],{"class":147,"line":166},[145,28405,348],{"class":259},[145,28407,357],{"class":263},[145,28409,28410,28412],{"class":147,"line":178},[145,28411,348],{"class":259},[145,28413,329],{"class":263},[145,28415,28416],{"class":147,"line":187},[145,28417,377],{"emptyLinePlaceholder":58},[145,28419,28420,28422,28424],{"class":147,"line":374},[145,28421,389],{"class":155},[145,28423,392],{"class":259},[145,28425,17537],{"class":159},[145,28427,28428,28430,28432],{"class":147,"line":380},[145,28429,413],{"class":155},[145,28431,392],{"class":259},[145,28433,418],{"class":159},[145,28435,28436,28438,28440],{"class":147,"line":386},[145,28437,424],{"class":155},[145,28439,392],{"class":259},[145,28441,429],{"class":263},[145,28443,28444,28446,28448,28450,28452,28454,28456],{"class":147,"line":410},[145,28445,435],{"class":159},[145,28447,438],{"class":263},[145,28449,441],{"class":259},[145,28451,444],{"class":159},[145,28453,447],{"class":155},[145,28455,450],{"class":159},[145,28457,453],{"class":263},[145,28459,28460,28462,28464],{"class":147,"line":421},[145,28461,459],{"class":159},[145,28463,438],{"class":263},[145,28465,464],{"class":159},[145,28467,28468],{"class":147,"line":432},[145,28469,470],{"class":263},[145,28471,28472],{"class":147,"line":456},[145,28473,377],{"emptyLinePlaceholder":58},[145,28475,28476,28478,28481,28484,28486,28489],{"class":147,"line":467},[145,28477,526],{"class":259},[145,28479,28480],{"class":151}," generate_product_video",[145,28482,28483],{"class":263},"(product_name, image_url, style",[145,28485,267],{"class":259},[145,28487,28488],{"class":159},"\"premium\"",[145,28490,548],{"class":263},[145,28492,28493],{"class":147,"line":600},[145,28494,28495],{"class":159},"    \"\"\"Generate a product video from a single product image.\"\"\"\n",[145,28497,28498,28501,28503],{"class":147,"line":605},[145,28499,28500],{"class":263},"    style_prompts ",[145,28502,267],{"class":259},[145,28504,429],{"class":263},[145,28506,28507,28510],{"class":147,"line":611},[145,28508,28509],{"class":159},"        \"premium\"",[145,28511,1323],{"class":263},[145,28513,28514,28516,28519,28521,28524,28526],{"class":147,"line":617},[145,28515,674],{"class":259},[145,28517,28518],{"class":159},"\"@Image1 is a ",[145,28520,685],{"class":155},[145,28522,28523],{"class":263},"product_name",[145,28525,691],{"class":155},[145,28527,28528],{"class":159},". \"\n",[145,28530,28531],{"class":147,"line":623},[145,28532,28533],{"class":159},"            \"The product rotates slowly under dramatic studio lighting \"\n",[145,28535,28536],{"class":147,"line":628},[145,28537,28538],{"class":159},"            \"on a dark reflective surface. Cinematic close-up. \"\n",[145,28540,28541],{"class":147,"line":639},[145,28542,28543],{"class":159},"            \"Light reveals surface details and textures. \"\n",[145,28545,28546],{"class":147,"line":654},[145,28547,28548],{"class":159},"            \"Premium advertisement quality.\"\n",[145,28550,28551],{"class":147,"line":660},[145,28552,1343],{"class":263},[145,28554,28555,28558],{"class":147,"line":671},[145,28556,28557],{"class":159},"        \"lifestyle\"",[145,28559,1323],{"class":263},[145,28561,28562,28564,28566,28568,28570,28572],{"class":147,"line":698},[145,28563,674],{"class":259},[145,28565,28518],{"class":159},[145,28567,685],{"class":155},[145,28569,28523],{"class":263},[145,28571,691],{"class":155},[145,28573,28528],{"class":159},[145,28575,28576],{"class":147,"line":710},[145,28577,28578],{"class":159},"            \"The product is shown in a lifestyle setting — \"\n",[145,28580,28581],{"class":147,"line":716},[145,28582,28583],{"class":159},"            \"a modern living space with natural light. \"\n",[145,28585,28586],{"class":147,"line":722},[145,28587,28588],{"class":159},"            \"Camera slowly pushes in to reveal product details. \"\n",[145,28590,28591],{"class":147,"line":728},[145,28592,28593],{"class":159},"            \"Warm, inviting atmosphere.\"\n",[145,28595,28596],{"class":147,"line":739},[145,28597,1343],{"class":263},[145,28599,28600,28603],{"class":147,"line":744},[145,28601,28602],{"class":159},"        \"minimal\"",[145,28604,1323],{"class":263},[145,28606,28607,28609,28611,28613,28615,28617],{"class":147,"line":750},[145,28608,674],{"class":259},[145,28610,28518],{"class":159},[145,28612,685],{"class":155},[145,28614,28523],{"class":263},[145,28616,691],{"class":155},[145,28618,28528],{"class":159},[145,28620,28621],{"class":147,"line":767},[145,28622,28623],{"class":159},"            \"Clean white background. The product rotates 360 degrees. \"\n",[145,28625,28626],{"class":147,"line":788},[145,28627,28628],{"class":159},"            \"Even, shadowless lighting. E-commerce product spin.\"\n",[145,28630,28631],{"class":147,"line":834},[145,28632,1343],{"class":263},[145,28634,28635],{"class":147,"line":839},[145,28636,1408],{"class":263},[145,28638,28639],{"class":147,"line":845},[145,28640,377],{"emptyLinePlaceholder":58},[145,28642,28643,28645,28647],{"class":147,"line":863},[145,28644,1295],{"class":263},[145,28646,267],{"class":259},[145,28648,429],{"class":263},[145,28650,28651,28653,28655,28657],{"class":147,"line":872},[145,28652,1304],{"class":159},[145,28654,438],{"class":263},[145,28656,1309],{"class":159},[145,28658,453],{"class":263},[145,28660,28661,28663],{"class":147,"line":887},[145,28662,1320],{"class":159},[145,28664,28665],{"class":263},": style_prompts[style],\n",[145,28667,28668,28670],{"class":147,"line":903},[145,28669,2683],{"class":159},[145,28671,20580],{"class":263},[145,28673,28674,28676,28678,28680],{"class":147,"line":915},[145,28675,1348],{"class":159},[145,28677,438],{"class":263},[145,28679,3691],{"class":155},[145,28681,453],{"class":263},[145,28683,28684,28686,28688,28690],{"class":147,"line":954},[145,28685,1364],{"class":159},[145,28687,438],{"class":263},[145,28689,3703],{"class":159},[145,28691,453],{"class":263},[145,28693,28694,28696,28698],{"class":147,"line":960},[145,28695,1380],{"class":159},[145,28697,438],{"class":263},[145,28699,28700],{"class":159},"\"1:1\"\n",[145,28702,28703],{"class":147,"line":965},[145,28704,1408],{"class":263},[145,28706,28707],{"class":147,"line":971},[145,28708,377],{"emptyLinePlaceholder":58},[145,28710,28711,28713,28715],{"class":147,"line":977},[145,28712,1127],{"class":263},[145,28714,267],{"class":259},[145,28716,1433],{"class":263},[145,28718,28719,28721,28723,28725,28727],{"class":147,"line":989},[145,28720,1438],{"class":259},[145,28722,450],{"class":159},[145,28724,679],{"class":155},[145,28726,1445],{"class":159},[145,28728,453],{"class":263},[145,28730,28731,28733,28735,28737],{"class":147,"line":994},[145,28732,1456],{"class":701},[145,28734,267],{"class":259},[145,28736,424],{"class":155},[145,28738,453],{"class":263},[145,28740,28741,28743,28745],{"class":147,"line":5521},[145,28742,1471],{"class":701},[145,28744,267],{"class":259},[145,28746,2783],{"class":263},[145,28748,28749],{"class":147,"line":5527},[145,28750,1484],{"class":263},[145,28752,28753,28755,28757],{"class":147,"line":5555},[145,28754,27304],{"class":263},[145,28756,267],{"class":259},[145,28758,11734],{"class":263},[145,28760,28761,28763,28765,28767],{"class":147,"line":5586},[145,28762,1704],{"class":259},[145,28764,23507],{"class":263},[145,28766,7673],{"class":159},[145,28768,764],{"class":263},[145,28770,28771],{"class":147,"line":5606},[145,28772,377],{"emptyLinePlaceholder":58},[145,28774,28775],{"class":147,"line":5612},[145,28776,377],{"emptyLinePlaceholder":58},[145,28778,28779],{"class":147,"line":5618},[145,28780,28781],{"class":174},"# Example: process a CSV product catalog\n",[145,28783,28784],{"class":147,"line":5623},[145,28785,28786],{"class":174},"# CSV format: product_name, image_url, style\n",[145,28788,28789,28792,28794],{"class":147,"line":5636},[145,28790,28791],{"class":263},"products ",[145,28793,267],{"class":259},[145,28795,8843],{"class":263},[145,28797,28798,28801,28804,28806,28809,28811,28813],{"class":147,"line":5642},[145,28799,28800],{"class":263},"    (",[145,28802,28803],{"class":159},"\"Wireless Earbuds\"",[145,28805,401],{"class":263},[145,28807,28808],{"class":159},"\"https://example.com/earbuds.jpg\"",[145,28810,401],{"class":263},[145,28812,28488],{"class":159},[145,28814,28815],{"class":263},"),\n",[145,28817,28818,28820,28823,28825,28828,28830,28833],{"class":147,"line":5669},[145,28819,28800],{"class":263},[145,28821,28822],{"class":159},"\"Leather Wallet\"",[145,28824,401],{"class":263},[145,28826,28827],{"class":159},"\"https://example.com/wallet.jpg\"",[145,28829,401],{"class":263},[145,28831,28832],{"class":159},"\"lifestyle\"",[145,28834,28815],{"class":263},[145,28836,28837,28839,28842,28844,28847,28849,28852],{"class":147,"line":5709},[145,28838,28800],{"class":263},[145,28840,28841],{"class":159},"\"Running Shoes\"",[145,28843,401],{"class":263},[145,28845,28846],{"class":159},"\"https://example.com/shoes.jpg\"",[145,28848,401],{"class":263},[145,28850,28851],{"class":159},"\"minimal\"",[145,28853,28815],{"class":263},[145,28855,28856],{"class":147,"line":5728},[145,28857,764],{"class":263},[145,28859,28860],{"class":147,"line":5733},[145,28861,377],{"emptyLinePlaceholder":58},[145,28863,28864,28866,28868],{"class":147,"line":5738},[145,28865,19649],{"class":263},[145,28867,267],{"class":259},[145,28869,5856],{"class":263},[145,28871,28872,28874,28877,28879],{"class":147,"line":5743},[145,28873,8207],{"class":259},[145,28875,28876],{"class":263}," name, url, style ",[145,28878,1181],{"class":259},[145,28880,28881],{"class":263}," products:\n",[145,28883,28884,28886,28888],{"class":147,"line":7416},[145,28885,7197],{"class":263},[145,28887,267],{"class":259},[145,28889,28890],{"class":263}," generate_product_video(name, url, style)\n",[145,28892,28893],{"class":147,"line":7422},[145,28894,28895],{"class":263},"    tasks.append((name, task_id))\n",[145,28897,28898,28900,28902,28904,28907,28909,28911,28913,28915,28917,28919,28921,28923],{"class":147,"line":7428},[145,28899,1103],{"class":155},[145,28901,794],{"class":263},[145,28903,441],{"class":259},[145,28905,28906],{"class":159},"\"Submitted: ",[145,28908,685],{"class":155},[145,28910,20590],{"class":263},[145,28912,691],{"class":155},[145,28914,23688],{"class":159},[145,28916,685],{"class":155},[145,28918,688],{"class":263},[145,28920,691],{"class":155},[145,28922,450],{"class":159},[145,28924,407],{"class":263},[145,28926,28927,28929,28931,28933],{"class":147,"line":7439},[145,28928,19827],{"class":263},[145,28930,5419],{"class":155},[145,28932,19832],{"class":263},[145,28934,28935],{"class":174},"# Rate limiting courtesy\n",[145,28937,28938],{"class":147,"line":7450},[145,28939,377],{"emptyLinePlaceholder":58},[145,28941,28942,28944,28946,28948,28950,28952,28955,28957,28960,28962,28965],{"class":147,"line":7461},[145,28943,6563],{"class":155},[145,28945,794],{"class":263},[145,28947,441],{"class":259},[145,28949,450],{"class":159},[145,28951,1671],{"class":155},[145,28953,28954],{"class":159},"Submitted ",[145,28956,6250],{"class":155},[145,28958,28959],{"class":263},"(tasks)",[145,28961,691],{"class":155},[145,28963,28964],{"class":159}," product videos\"",[145,28966,407],{"class":263},[145,28968,28969,28971,28973,28976],{"class":147,"line":7466},[145,28970,6563],{"class":155},[145,28972,794],{"class":263},[145,28974,28975],{"class":159},"\"Poll each task_id to retrieve the completed video URLs\"",[145,28977,407],{"class":263},[11,28979,28980,28981,28983],{},"这种批处理模式可扩展到任何目录规模。你可以用回调 URL（",[28,28982,3595],{}," 参数）代替轮询来扩展它，这对于大批量处理更高效——当每个视频完成时，API 会向你的端点发送一个 POST 请求。",[92,28985,28986],{"id":28986},"产品视频提示词模板",[11,28988,28989],{},"以下是经过实战检验的常见电商视频需求提示词模板：",[136,28991,28993],{"className":339,"code":28992,"language":341,"meta":141,"style":141},"PRODUCT_TEMPLATES = {\n    \"rotation_360\": (\n        \"@Image1 is the product. \"\n        \"Full 360-degree rotation on a clean background. \"\n        \"Consistent studio lighting throughout the rotation. \"\n        \"Smooth, steady turntable motion. \"\n        \"Product catalog photography style.\"\n    ),\n    \"unboxing_reveal\": (\n        \"@Image1 is the product. \"\n        \"The product emerges from soft tissue paper inside a premium box. \"\n        \"Hands carefully lift it into view. \"\n        \"Camera slowly pushes in as the product is revealed. \"\n        \"Luxury unboxing experience. Warm lighting.\"\n    ),\n    \"hero_shot\": (\n        \"@Image1 is the product. \"\n        \"Dramatic hero shot. The product rises into frame against a dark background. \"\n        \"Volumetric light beams hit the product from the side. \"\n        \"Slow motion. Particles float in the light. \"\n        \"Epic product launch trailer aesthetic.\"\n    ),\n    \"in_use\": (\n        \"@Image1 is the product. \"\n        \"Someone picks up the product and uses it naturally. \"\n        \"Lifestyle setting with soft natural window light. \"\n        \"Medium close-up. The camera follows the interaction. \"\n        \"Authentic, relatable product usage.\"\n    ),\n}\n",[28,28994,28995,29004,29011,29016,29021,29026,29031,29036,29040,29047,29051,29056,29061,29066,29071,29075,29082,29086,29091,29096,29101,29106,29110,29117,29121,29126,29131,29136,29141,29145],{"__ignoreMap":141},[145,28996,28997,29000,29002],{"class":147,"line":148},[145,28998,28999],{"class":155},"PRODUCT_TEMPLATES",[145,29001,392],{"class":259},[145,29003,429],{"class":263},[145,29005,29006,29009],{"class":147,"line":166},[145,29007,29008],{"class":159},"    \"rotation_360\"",[145,29010,1323],{"class":263},[145,29012,29013],{"class":147,"line":178},[145,29014,29015],{"class":159},"        \"@Image1 is the product. \"\n",[145,29017,29018],{"class":147,"line":187},[145,29019,29020],{"class":159},"        \"Full 360-degree rotation on a clean background. \"\n",[145,29022,29023],{"class":147,"line":374},[145,29024,29025],{"class":159},"        \"Consistent studio lighting throughout the rotation. \"\n",[145,29027,29028],{"class":147,"line":380},[145,29029,29030],{"class":159},"        \"Smooth, steady turntable motion. \"\n",[145,29032,29033],{"class":147,"line":386},[145,29034,29035],{"class":159},"        \"Product catalog photography style.\"\n",[145,29037,29038],{"class":147,"line":410},[145,29039,3797],{"class":263},[145,29041,29042,29045],{"class":147,"line":421},[145,29043,29044],{"class":159},"    \"unboxing_reveal\"",[145,29046,1323],{"class":263},[145,29048,29049],{"class":147,"line":432},[145,29050,29015],{"class":159},[145,29052,29053],{"class":147,"line":456},[145,29054,29055],{"class":159},"        \"The product emerges from soft tissue paper inside a premium box. \"\n",[145,29057,29058],{"class":147,"line":467},[145,29059,29060],{"class":159},"        \"Hands carefully lift it into view. \"\n",[145,29062,29063],{"class":147,"line":600},[145,29064,29065],{"class":159},"        \"Camera slowly pushes in as the product is revealed. \"\n",[145,29067,29068],{"class":147,"line":605},[145,29069,29070],{"class":159},"        \"Luxury unboxing experience. Warm lighting.\"\n",[145,29072,29073],{"class":147,"line":611},[145,29074,3797],{"class":263},[145,29076,29077,29080],{"class":147,"line":617},[145,29078,29079],{"class":159},"    \"hero_shot\"",[145,29081,1323],{"class":263},[145,29083,29084],{"class":147,"line":623},[145,29085,29015],{"class":159},[145,29087,29088],{"class":147,"line":628},[145,29089,29090],{"class":159},"        \"Dramatic hero shot. The product rises into frame against a dark background. \"\n",[145,29092,29093],{"class":147,"line":639},[145,29094,29095],{"class":159},"        \"Volumetric light beams hit the product from the side. \"\n",[145,29097,29098],{"class":147,"line":654},[145,29099,29100],{"class":159},"        \"Slow motion. Particles float in the light. \"\n",[145,29102,29103],{"class":147,"line":660},[145,29104,29105],{"class":159},"        \"Epic product launch trailer aesthetic.\"\n",[145,29107,29108],{"class":147,"line":671},[145,29109,3797],{"class":263},[145,29111,29112,29115],{"class":147,"line":698},[145,29113,29114],{"class":159},"    \"in_use\"",[145,29116,1323],{"class":263},[145,29118,29119],{"class":147,"line":710},[145,29120,29015],{"class":159},[145,29122,29123],{"class":147,"line":716},[145,29124,29125],{"class":159},"        \"Someone picks up the product and uses it naturally. \"\n",[145,29127,29128],{"class":147,"line":722},[145,29129,29130],{"class":159},"        \"Lifestyle setting with soft natural window light. \"\n",[145,29132,29133],{"class":147,"line":728},[145,29134,29135],{"class":159},"        \"Medium close-up. The camera follows the interaction. \"\n",[145,29137,29138],{"class":147,"line":739},[145,29139,29140],{"class":159},"        \"Authentic, relatable product usage.\"\n",[145,29142,29143],{"class":147,"line":744},[145,29144,3797],{"class":263},[145,29146,29147],{"class":147,"line":750},[145,29148,470],{"class":263},[45,29150],{},[48,29152,13143],{"id":13143},[11,29154,29155],{},"经过数百次 API 调用后，什么有效、什么不行已经有了清晰的规律。以下是最常见的错误及其修复方法。",[92,29157,29159],{"id":29158},"错误-1使用真实人脸照片","错误 1：使用真实人脸照片",[11,29161,29162,29165,29166,29168,29169,29171],{},[23,29163,29164],{},"表现："," API 返回 ",[28,29167,3631],{}," 错误或 ",[28,29170,2087],{}," 任务状态。",[11,29173,29174,29177],{},[23,29175,29176],{},"原因："," Seedance 2.0 阻止从照片级真实人脸图像进行图像转视频生成。这是一项安全策略，不是 bug。",[11,29179,29180,29182],{},[23,29181,13187],{}," 改用插画、风格化或卡通风格的角色图片。动漫角色、油画肖像、3D 渲染角色和剪影都可以完美使用。如果你的工作流需要人物角色，请先使用文本转图像模型以非写实风格生成它们。",[136,29184,29186],{"className":339,"code":29185,"language":341,"meta":141,"style":141},"# Will be rejected\n\"image_urls\": [\"https://example.com/real-person-photo.jpg\"]\n\n# Works fine\n\"image_urls\": [\"https://example.com/illustrated-character.png\"]\n\"image_urls\": [\"https://example.com/3d-rendered-character.jpg\"]\n\"image_urls\": [\"https://example.com/anime-character.png\"]\n",[28,29187,29188,29193,29204,29208,29213,29224,29235],{"__ignoreMap":141},[145,29189,29190],{"class":147,"line":148},[145,29191,29192],{"class":174},"# Will be rejected\n",[145,29194,29195,29197,29199,29202],{"class":147,"line":166},[145,29196,6218],{"class":159},[145,29198,10809],{"class":263},[145,29200,29201],{"class":159},"\"https://example.com/real-person-photo.jpg\"",[145,29203,764],{"class":263},[145,29205,29206],{"class":147,"line":178},[145,29207,377],{"emptyLinePlaceholder":58},[145,29209,29210],{"class":147,"line":187},[145,29211,29212],{"class":174},"# Works fine\n",[145,29214,29215,29217,29219,29222],{"class":147,"line":374},[145,29216,6218],{"class":159},[145,29218,10809],{"class":263},[145,29220,29221],{"class":159},"\"https://example.com/illustrated-character.png\"",[145,29223,764],{"class":263},[145,29225,29226,29228,29230,29233],{"class":147,"line":380},[145,29227,6218],{"class":159},[145,29229,10809],{"class":263},[145,29231,29232],{"class":159},"\"https://example.com/3d-rendered-character.jpg\"",[145,29234,764],{"class":263},[145,29236,29237,29239,29241,29244],{"class":147,"line":386},[145,29238,6218],{"class":159},[145,29240,10809],{"class":263},[145,29242,29243],{"class":159},"\"https://example.com/anime-character.png\"",[145,29245,764],{"class":263},[92,29247,29249],{"id":29248},"错误-2仅描述外观的静态提示词","错误 2：仅描述外观的静态提示词",[11,29251,29252,29254],{},[23,29253,29164],{}," 生成的视频几乎没有或完全没有运动。主体静止不动，或者只有轻微的镜头漂移。",[11,29256,29257,29259],{},[23,29258,29176],{}," 模型会按字面意思理解你的提示词。如果你描述的是一个静态场景（\"a cat on a windowsill\"），你就会得到一个几乎静止的视频。",[11,29261,29262,29264],{},[23,29263,13187],{}," 始终包含动作动词、连续动作和环境动态。",[136,29266,29268],{"className":339,"code":29267,"language":341,"meta":141,"style":141},"# Static: produces near-still video\n\"prompt\": \"A beautiful sunset over the ocean with golden light\"\n\n# Dynamic: produces engaging video\n\"prompt\": (\n    \"Waves crash against rocky coastline during golden sunset. \"\n    \"Water sprays upward, catching the warm light. \"\n    \"Camera slowly descends from sky level to water level. \"\n    \"Seabirds glide across the frame. \"\n    \"Light shifts from golden to deep amber.\"\n)\n",[28,29269,29270,29275,29284,29288,29293,29299,29304,29309,29314,29319,29324],{"__ignoreMap":141},[145,29271,29272],{"class":147,"line":148},[145,29273,29274],{"class":174},"# Static: produces near-still video\n",[145,29276,29277,29279,29281],{"class":147,"line":166},[145,29278,5901],{"class":159},[145,29280,438],{"class":263},[145,29282,29283],{"class":159},"\"A beautiful sunset over the ocean with golden light\"\n",[145,29285,29286],{"class":147,"line":178},[145,29287,377],{"emptyLinePlaceholder":58},[145,29289,29290],{"class":147,"line":187},[145,29291,29292],{"class":174},"# Dynamic: produces engaging video\n",[145,29294,29295,29297],{"class":147,"line":374},[145,29296,5901],{"class":159},[145,29298,1323],{"class":263},[145,29300,29301],{"class":147,"line":380},[145,29302,29303],{"class":159},"    \"Waves crash against rocky coastline during golden sunset. \"\n",[145,29305,29306],{"class":147,"line":386},[145,29307,29308],{"class":159},"    \"Water sprays upward, catching the warm light. \"\n",[145,29310,29311],{"class":147,"line":410},[145,29312,29313],{"class":159},"    \"Camera slowly descends from sky level to water level. \"\n",[145,29315,29316],{"class":147,"line":421},[145,29317,29318],{"class":159},"    \"Seabirds glide across the frame. \"\n",[145,29320,29321],{"class":147,"line":432},[145,29322,29323],{"class":159},"    \"Light shifts from golden to deep amber.\"\n",[145,29325,29326],{"class":147,"line":456},[145,29327,407],{"class":263},[92,29329,29331],{"id":29330},"错误-3时长与内容不匹配","错误 3：时长与内容不匹配",[11,29333,29334,29336],{},[23,29335,29164],{}," 简单动作感觉被拉长、很尴尬，或者复杂序列感觉仓促、不连贯。",[11,29338,29339,29341],{},[23,29340,29176],{}," 时长必须与提示词的复杂度匹配。简单的产品旋转不需要 15 秒。多动作的角色序列在 4 秒内完成不了。",[11,29343,29344,29346],{},[23,29345,13187],{}," 将时长与提示词复杂度匹配：",[2036,29348,29349,29361],{},[2039,29350,29351],{},[2042,29352,29353,29356,29359],{},[2045,29354,29355],{},"提示词复杂度",[2045,29357,29358],{},"描述的动作",[2045,29360,25110],{},[2052,29362,29363,29373,29383],{},[2042,29364,29365,29368,29371],{},[2057,29366,29367],{},"简单（单一动作）",[2057,29369,29370],{},"1 个动作",[2057,29372,19435],{},[2042,29374,29375,29378,29381],{},[2057,29376,29377],{},"中等（2-3 个动作）",[2057,29379,29380],{},"2–3 个连续动作",[2057,29382,18275],{},[2042,29384,29385,29388,29391],{},[2057,29386,29387],{},"复杂（叙事性）",[2057,29389,29390],{},"4 个以上动作、场景切换",[2057,29392,25142],{},[92,29394,29396],{"id":29395},"错误-4图片-url-问题","错误 4：图片 URL 问题",[11,29398,29399,29401],{},[23,29400,29164],{}," API 返回关于无效图片的错误，或者任务在处理过程中失败。",[11,29403,29404,29406],{},[23,29405,29176],{}," 几个常见的 URL 问题：",[96,29408,29409,29412,29415,29418,29421],{},[73,29410,29411],{},"URL 需要认证（非公开可访问）",[73,29413,29414],{},"URL 指向网页，而非直接的图片文件",[73,29416,29417],{},"图片格式不受支持（WebP 有时会失败）",[73,29419,29420],{},"图片太大（超高分辨率文件可能超时）",[73,29422,29423],{},"URL 已过期（带时间限制的预签名 URL）",[11,29425,29426,29428],{},[23,29427,13187],{}," 确保你的图片 URL 满足：",[70,29430,29431,29437,29450,29456,29462],{},[73,29432,29433,29436],{},[23,29434,29435],{},"公开可访问"," —— 无需认证头即可下载",[73,29438,29439,29442,29443,2911,29446,29449],{},[23,29440,29441],{},"直接图片链接"," —— 以 ",[28,29444,29445],{},".jpg",[28,29447,29448],{},".png"," 或类似扩展名结尾（不是 HTML 页面）",[73,29451,29452,29455],{},[23,29453,29454],{},"标准格式"," —— JPEG 和 PNG 最可靠",[73,29457,29458,29461],{},[23,29459,29460],{},"合理大小"," —— 每张图片不超过 10MB",[73,29463,29464,29467],{},[23,29465,29466],{},"持久有效"," —— 在处理期间不会过期",[136,29469,29471],{"className":339,"code":29470,"language":341,"meta":141,"style":141},"# Problem URLs\n\"https://drive.google.com/file/d/abc123/view\"  # Requires auth\n\"https://example.com/product-page\"              # HTML page, not image\n\"https://storage.com/image.jpg?token=abc&exp=1h\" # Might expire\n\n# Good URLs\n\"https://cdn.example.com/images/product.jpg\"     # Direct CDN link\n\"https://i.imgur.com/abc123.png\"                  # Public image host\n",[28,29472,29473,29478,29486,29494,29502,29506,29511,29519],{"__ignoreMap":141},[145,29474,29475],{"class":147,"line":148},[145,29476,29477],{"class":174},"# Problem URLs\n",[145,29479,29480,29483],{"class":147,"line":166},[145,29481,29482],{"class":159},"\"https://drive.google.com/file/d/abc123/view\"",[145,29484,29485],{"class":174},"  # Requires auth\n",[145,29487,29488,29491],{"class":147,"line":178},[145,29489,29490],{"class":159},"\"https://example.com/product-page\"",[145,29492,29493],{"class":174},"              # HTML page, not image\n",[145,29495,29496,29499],{"class":147,"line":187},[145,29497,29498],{"class":159},"\"https://storage.com/image.jpg?token=abc&exp=1h\"",[145,29500,29501],{"class":174}," # Might expire\n",[145,29503,29504],{"class":147,"line":374},[145,29505,377],{"emptyLinePlaceholder":58},[145,29507,29508],{"class":147,"line":380},[145,29509,29510],{"class":174},"# Good URLs\n",[145,29512,29513,29516],{"class":147,"line":386},[145,29514,29515],{"class":159},"\"https://cdn.example.com/images/product.jpg\"",[145,29517,29518],{"class":174},"     # Direct CDN link\n",[145,29520,29521,29524],{"class":147,"line":410},[145,29522,29523],{"class":159},"\"https://i.imgur.com/abc123.png\"",[145,29525,29526],{"class":174},"                  # Public image host\n",[92,29528,29530],{"id":29529},"错误-5多图时未使用-tags","错误 5：多图时未使用 @Tags",[11,29532,29533,29535,29536,29538],{},[23,29534,29164],{}," 当你传入 3 张以上图片但在提示词中未使用 ",[28,29537,4136],{}," 标签时，模型会猜测每张图片的用途。结果不可预测——有时背景图被当作角色使用，或者风格参考被当作场景元素处理。",[11,29540,29541,29543,29544,29546],{},[23,29542,13187],{}," 传入多张图片时始终使用 ",[28,29545,4136],{}," 标签。明确说明每张图片的角色。",[136,29548,29550],{"className":339,"code":29549,"language":341,"meta":141,"style":141},"# Ambiguous: model guesses roles\n\"prompt\": \"A character walks through a forest in watercolor style\"\n\"image_urls\": [character.jpg, forest.jpg, watercolor_ref.jpg]\n\n# Explicit: model knows each role\n\"prompt\": (\n    \"@Image1 is the character. @Image2 is the forest environment. \"\n    \"@Image3 defines the watercolor art style. \"\n    \"The character (@Image1) walks through the forest (@Image2) \"\n    \"rendered in the watercolor style of @Image3.\"\n)\n\"image_urls\": [character.jpg, forest.jpg, watercolor_ref.jpg]\n",[28,29551,29552,29557,29566,29573,29577,29582,29588,29593,29598,29603,29608,29612],{"__ignoreMap":141},[145,29553,29554],{"class":147,"line":148},[145,29555,29556],{"class":174},"# Ambiguous: model guesses roles\n",[145,29558,29559,29561,29563],{"class":147,"line":166},[145,29560,5901],{"class":159},[145,29562,438],{"class":263},[145,29564,29565],{"class":159},"\"A character walks through a forest in watercolor style\"\n",[145,29567,29568,29570],{"class":147,"line":178},[145,29569,6218],{"class":159},[145,29571,29572],{"class":263},": [character.jpg, forest.jpg, watercolor_ref.jpg]\n",[145,29574,29575],{"class":147,"line":187},[145,29576,377],{"emptyLinePlaceholder":58},[145,29578,29579],{"class":147,"line":374},[145,29580,29581],{"class":174},"# Explicit: model knows each role\n",[145,29583,29584,29586],{"class":147,"line":380},[145,29585,5901],{"class":159},[145,29587,1323],{"class":263},[145,29589,29590],{"class":147,"line":386},[145,29591,29592],{"class":159},"    \"@Image1 is the character. @Image2 is the forest environment. \"\n",[145,29594,29595],{"class":147,"line":410},[145,29596,29597],{"class":159},"    \"@Image3 defines the watercolor art style. \"\n",[145,29599,29600],{"class":147,"line":421},[145,29601,29602],{"class":159},"    \"The character (@Image1) walks through the forest (@Image2) \"\n",[145,29604,29605],{"class":147,"line":432},[145,29606,29607],{"class":159},"    \"rendered in the watercolor style of @Image3.\"\n",[145,29609,29610],{"class":147,"line":456},[145,29611,407],{"class":263},[145,29613,29614,29616],{"class":147,"line":467},[145,29615,6218],{"class":159},[145,29617,29572],{"class":263},[92,29619,29621],{"id":29620},"错误-6忘记视频-url-过期","错误 6：忘记视频 URL 过期",[11,29623,29624,29626],{},[23,29625,29164],{}," 你生成了一个视频，保存了 URL，第二天尝试访问时收到 403 或 404。",[11,29628,29629,29631],{},[23,29630,29176],{}," 生成的视频 URL 在 24 小时后过期。",[11,29633,29634,29636],{},[23,29635,13187],{}," 在生成完成后立即下载视频文件。在你的轮询函数中添加下载步骤：",[136,29638,29640],{"className":339,"code":29639,"language":341,"meta":141,"style":141},"import os\n\ndef download_video(video_url, output_path):\n    \"\"\"Download a video before the URL expires.\"\"\"\n    resp = requests.get(video_url, stream=True)\n    resp.raise_for_status()\n    with open(output_path, \"wb\") as f:\n        for chunk in resp.iter_content(chunk_size=8192):\n            f.write(chunk)\n    print(f\"Saved to {output_path}\")\n\n# After generation completes:\nvideo_url = video_data[\"output\"][\"video_url\"]\ndownload_video(video_url, \"output/my-product-video.mp4\")\n",[28,29641,29642,29648,29652,29661,29666,29683,29687,29704,29722,29726,29748,29752,29757,29775],{"__ignoreMap":141},[145,29643,29644,29646],{"class":147,"line":148},[145,29645,348],{"class":259},[145,29647,364],{"class":263},[145,29649,29650],{"class":147,"line":166},[145,29651,377],{"emptyLinePlaceholder":58},[145,29653,29654,29656,29658],{"class":147,"line":178},[145,29655,526],{"class":259},[145,29657,1083],{"class":151},[145,29659,29660],{"class":263},"(video_url, output_path):\n",[145,29662,29663],{"class":147,"line":187},[145,29664,29665],{"class":159},"    \"\"\"Download a video before the URL expires.\"\"\"\n",[145,29667,29668,29670,29672,29675,29677,29679,29681],{"class":147,"line":374},[145,29669,1127],{"class":263},[145,29671,267],{"class":259},[145,29673,29674],{"class":263}," requests.get(video_url, ",[145,29676,1135],{"class":701},[145,29678,267],{"class":259},[145,29680,1140],{"class":155},[145,29682,407],{"class":263},[145,29684,29685],{"class":147,"line":380},[145,29686,1147],{"class":263},[145,29688,29689,29691,29693,29696,29698,29700,29702],{"class":147,"line":386},[145,29690,1152],{"class":259},[145,29692,1155],{"class":155},[145,29694,29695],{"class":263},"(output_path, ",[145,29697,1161],{"class":159},[145,29699,1164],{"class":263},[145,29701,1167],{"class":259},[145,29703,1170],{"class":263},[145,29705,29706,29708,29710,29712,29714,29716,29718,29720],{"class":147,"line":410},[145,29707,1175],{"class":259},[145,29709,1178],{"class":263},[145,29711,1181],{"class":259},[145,29713,1184],{"class":263},[145,29715,1187],{"class":701},[145,29717,267],{"class":259},[145,29719,1192],{"class":155},[145,29721,548],{"class":263},[145,29723,29724],{"class":147,"line":421},[145,29725,1199],{"class":263},[145,29727,29728,29730,29732,29734,29737,29739,29742,29744,29746],{"class":147,"line":432},[145,29729,1103],{"class":155},[145,29731,794],{"class":263},[145,29733,441],{"class":259},[145,29735,29736],{"class":159},"\"Saved to ",[145,29738,685],{"class":155},[145,29740,29741],{"class":263},"output_path",[145,29743,691],{"class":155},[145,29745,450],{"class":159},[145,29747,407],{"class":263},[145,29749,29750],{"class":147,"line":456},[145,29751,377],{"emptyLinePlaceholder":58},[145,29753,29754],{"class":147,"line":467},[145,29755,29756],{"class":174},"# After generation completes:\n",[145,29758,29759,29762,29764,29767,29769,29771,29773],{"class":147,"line":600},[145,29760,29761],{"class":263},"video_url ",[145,29763,267],{"class":259},[145,29765,29766],{"class":263}," video_data[",[145,29768,21462],{"class":159},[145,29770,1563],{"class":263},[145,29772,14886],{"class":159},[145,29774,764],{"class":263},[145,29776,29777,29780,29783],{"class":147,"line":605},[145,29778,29779],{"class":263},"download_video(video_url, ",[145,29781,29782],{"class":159},"\"output/my-product-video.mp4\"",[145,29784,407],{"class":263},[45,29786],{},[92,29788,29790],{"id":29789},"错误-7提示词与图片内容冲突","错误 7：提示词与图片内容冲突",[11,29792,29793,29795],{},[23,29794,29164],{}," 输出视频看起来混乱——图片中的元素和提示词中的元素争夺主导地位，产生视觉伪影或不连贯的场景。",[11,29797,29798,29800],{},[23,29799,29176],{}," 你在提示词中描述的内容直接与参考图片矛盾。例如，你的图片显示的是一辆红色汽车，但提示词写的是\"a blue sports car races down the highway\"。",[11,29802,29803,29805,29806,29809],{},[23,29804,13187],{}," 你的提示词应该",[2614,29807,29808],{},"补充","图片，而非与之矛盾。描述动作、镜头运动和环境变化——而非参考图片已经定义的元素外观。",[136,29811,29813],{"className":339,"code":29812,"language":341,"meta":141,"style":141},"# Contradicts image (image shows red car)\n\"prompt\": \"A blue sports car races down the highway at sunset\"\n\n# Complements image (lets the image define appearance)\n\"prompt\": (\n    \"@Image1 is the car. The car accelerates down an open highway. \"\n    \"Camera tracks alongside at speed. Sunset light reflects off the hood. \"\n    \"Road stretches to the horizon. Motion blur on the asphalt.\"\n)\n",[28,29814,29815,29820,29829,29833,29838,29844,29849,29854,29859],{"__ignoreMap":141},[145,29816,29817],{"class":147,"line":148},[145,29818,29819],{"class":174},"# Contradicts image (image shows red car)\n",[145,29821,29822,29824,29826],{"class":147,"line":166},[145,29823,5901],{"class":159},[145,29825,438],{"class":263},[145,29827,29828],{"class":159},"\"A blue sports car races down the highway at sunset\"\n",[145,29830,29831],{"class":147,"line":178},[145,29832,377],{"emptyLinePlaceholder":58},[145,29834,29835],{"class":147,"line":187},[145,29836,29837],{"class":174},"# Complements image (lets the image define appearance)\n",[145,29839,29840,29842],{"class":147,"line":374},[145,29841,5901],{"class":159},[145,29843,1323],{"class":263},[145,29845,29846],{"class":147,"line":380},[145,29847,29848],{"class":159},"    \"@Image1 is the car. The car accelerates down an open highway. \"\n",[145,29850,29851],{"class":147,"line":386},[145,29852,29853],{"class":159},"    \"Camera tracks alongside at speed. Sunset light reflects off the hood. \"\n",[145,29855,29856],{"class":147,"line":410},[145,29857,29858],{"class":159},"    \"Road stretches to the horizon. Motion blur on the asphalt.\"\n",[145,29860,29861],{"class":147,"line":421},[145,29862,407],{"class":263},[45,29864],{},[48,29866,29868],{"id":29867},"api-参数参考","API 参数参考",[11,29870,29871],{},"以下是图像转视频生成相关的所有参数汇总：",[2036,29873,29874,29889],{},[2039,29875,29876],{},[2042,29877,29878,29880,29882,29884,29886],{},[2045,29879,3394],{},[2045,29881,3397],{},[2045,29883,16429],{},[2045,29885,3400],{},[2045,29887,29888],{},"描述",[2052,29890,29891,29908,29926,29945,29960,29983,30010,30027,30044,30061],{},[2042,29892,29893,29897,29899,29901,29903],{},[2057,29894,29895],{},[28,29896,1748],{},[2057,29898,3417],{},[2057,29900,4939],{},[2057,29902,3420],{},[2057,29904,29905,29906],{},"必须为 ",[28,29907,1309],{},[2042,29909,29910,29914,29916,29918,29920],{},[2057,29911,29912],{},[28,29913,1762],{},[2057,29915,3417],{},[2057,29917,4939],{},[2057,29919,3420],{},[2057,29921,29922,29923,29925],{},"运动描述，可选 ",[28,29924,4136],{}," 标签",[2042,29927,29928,29932,29934,29937,29942],{},[2057,29929,29930],{},[28,29931,2891],{},[2057,29933,3546],{},[2057,29935,29936],{},"是（图转视频时）",[2057,29938,29939],{},[28,29940,29941],{},"[]",[2057,29943,29944],{},"1–9 个公开可访问的图片 URL",[2042,29946,29947,29951,29953,29955,29957],{},[2057,29948,29949],{},[28,29950,1774],{},[2057,29952,3452],{},[2057,29954,4828],{},[2057,29956,1353],{},[2057,29958,29959],{},"视频时长，单位秒（4–15）",[2042,29961,29962,29966,29968,29970,29974],{},[2057,29963,29964],{},[28,29965,1782],{},[2057,29967,3417],{},[2057,29969,4828],{},[2057,29971,29972],{},[28,29973,1369],{},[2057,29975,29976,29977,2911,29979,2911,29981],{},"输出分辨率：",[28,29978,4006],{},[28,29980,1369],{},[28,29982,3703],{},[2042,29984,29985,29989,29991,29993,29997],{},[2057,29986,29987],{},[28,29988,1802],{},[2057,29990,3417],{},[2057,29992,4828],{},[2057,29994,29995],{},[28,29996,1385],{},[2057,29998,29999,30000,2911,30002,2911,30004,2911,30006,2911,30008],{},"输出比例：",[28,30001,1385],{},[28,30003,3715],{},[28,30005,6120],{},[28,30007,6125],{},[28,30009,6130],{},[2042,30011,30012,30016,30018,30020,30024],{},[2057,30013,30014],{},[28,30015,1822],{},[2057,30017,3524],{},[2057,30019,4828],{},[2057,30021,30022],{},[28,30023,2931],{},[2057,30025,30026],{},"生成同步音频轨道",[2042,30028,30029,30033,30035,30037,30041],{},[2057,30030,30031],{},[28,30032,3561],{},[2057,30034,3546],{},[2057,30036,4828],{},[2057,30038,30039],{},[28,30040,29941],{},[2057,30042,30043],{},"0–3 个视频参考 URL（用于混合媒体）",[2042,30045,30046,30050,30052,30054,30058],{},[2057,30047,30048],{},[28,30049,3578],{},[2057,30051,3546],{},[2057,30053,4828],{},[2057,30055,30056],{},[28,30057,29941],{},[2057,30059,30060],{},"0–3 个音频参考 URL（用于混合媒体）",[2042,30062,30063,30067,30069,30071,30073],{},[2057,30064,30065],{},[28,30066,3595],{},[2057,30068,3417],{},[2057,30070,4828],{},[2057,30072,3420],{},[2057,30074,30075],{},"完成通知的 Webhook URL",[11,30077,30078,30080,30081,23688,30084,30086,30087,23688,30090,30086,30092,23688,30095,298],{},[23,30079,3283],{}," 每个请求最多 9 张图片 + 3 个视频 + 3 个音频文件。所有媒体类型的总数不能超过 12。标签按数组位置分配：",[28,30082,30083],{},"image_urls[0]",[28,30085,2903],{},"，",[28,30088,30089],{},"video_urls[0]",[28,30091,11391],{},[28,30093,30094],{},"audio_urls[0]",[28,30096,16467],{},[45,30098],{},[48,30100,9036],{"id":9036},[92,30102,30104],{"id":30103},"seedance-20-图像转视频-api-支持哪些图片格式","Seedance 2.0 图像转视频 API 支持哪些图片格式？",[11,30106,30107],{},"JPEG 和 PNG 完全支持且推荐使用。GIF（仅第一帧）、BMP 和 TIFF 通常可以使用但测试较少。WebP 支持不稳定——转换为 JPEG 或 PNG 可获得可靠的结果。所有图片必须通过无需认证的公开 URL 访问。",[92,30109,30111],{"id":30110},"图像转视频生成需要多长时间","图像转视频生成需要多长时间？",[11,30113,30114,30115,30117,30118,30120],{},"典型的生成时间为 60 到 180 秒，取决于时长、画质设置和当前服务器负载。480p 的 4 秒片段比 1080p 的 15 秒片段生成更快。使用轮询端点（",[28,30116,9141],{},"）或设置 ",[28,30119,3595],{}," 来接收处理完成的通知。",[92,30122,30124],{"id":30123},"单次请求最多可以使用多少张图片","单次请求最多可以使用多少张图片？",[11,30126,30127,30128,30130],{},"你可以在 ",[28,30129,2891],{}," 中包含最多 9 张图片。所有媒体类型（图片 + 视频 + 音频）的总文件数上限为每个请求 12 个。因此如果你使用了 9 张图片，仍然可以添加最多 3 个视频或音频参考。",[92,30132,30134],{"id":30133},"可以将图像转视频与音频生成结合使用吗","可以将图像转视频与音频生成结合使用吗？",[11,30136,30137,30138,2955,30140,30142,30143,30145,30146,30148],{},"可以。在请求参数中同时设置 ",[28,30139,23224],{},[28,30141,2891],{},"。模型会生成与视觉内容匹配的同步音频——行走场景的脚步声、自然场景的环境音、产品旋转的机械声。你也可以通过 ",[28,30144,3578],{}," 提供自己的音频，并在提示词中用 ",[28,30147,16467],{}," 引用它。",[92,30150,30152],{"id":30151},"在生产环境中如何处理视频-url-过期","在生产环境中如何处理视频 URL 过期？",[11,30154,30155,30156,30158,30159,30161],{},"生成的视频 URL 在 24 小时后过期。对于生产系统，请在你的流水线中实现即时下载步骤。在任务状态变为 ",[28,30157,2084],{}," 后，将视频文件下载到你自己的存储（S3、GCS 或本地磁盘），然后再将 URL 返回给你的应用。永远不要将 API 生成的 URL 作为永久引用存储。如果你使用 ",[28,30160,3595],{},"，你的 webhook 处理程序应将下载步骤作为其处理逻辑的一部分。",[92,30163,30165],{"id":30164},"可以使用-seedance-20-图像转视频制作动态-logo-或品牌片头吗","可以使用 Seedance 2.0 图像转视频制作动态 Logo 或品牌片头吗？",[11,30167,30168,30169,30171,30172,30174],{},"可以，这是最适合的用例之一。将你的 Logo 或品牌标识作为 ",[28,30170,2903],{}," 上传，并在提示词中描述你想要的动画风格——粒子组装、液体揭示、3D 旋转等。由于 Logo 是图形元素（非照片级真实人脸），它们与图像转视频流水线完美兼容。设置 ",[28,30173,23224],{}," 可为揭示动画添加同步音效。",[92,30176,30178],{"id":30177},"为什么我的图像转视频请求被拒绝了","为什么我的图像转视频请求被拒绝了？",[11,30180,30181,30182,30184],{},"最常见的拒绝原因是输入图像中包含照片级真实的人脸。Seedance 2.0 出于安全原因自动检测并阻止真实人脸图像。其他拒绝原因包括：图片 URL 无法访问、不支持的文件格式、超过 9 张图片的限制或总媒体文件数超过 12。查看 ",[28,30183,2087],{}," 任务响应中的错误消息以获取具体详情。",[45,30186],{},[48,30188,30189],{"id":30189},"开始为你的图片制作动画",[11,30191,30192,30193,30196],{},"你现在拥有三种不同的方法通过 Seedance 2.0 API 将静态图片转换为视频：单图动画用于快速的角色或场景运动，首尾帧控制用于精确的首尾过渡，以及使用 ",[28,30194,30195],{},"@tags"," 的多图合成用于复杂的角色分配场景。",[11,30198,30199],{},"本指南中的代码示例都是完整且可运行的。复制其中任何一个，插入你的 API 密钥，指向你自己的图片，几分钟内就能获得生成的视频。",[11,30201,30202,30203,30205],{},"对于产品团队，批量生成工作流可以在无需影棚的情况下将整个产品目录转化为视频素材。对于创意团队，角色一致性模式可以从单张角色参考实现多镜头叙事。对于开发者，",[28,30204,23039],{}," 系统提供了目前任何其他 AI 视频 API 都无法匹敌的组合式控制能力。",[11,30207,30208],{},[23,30209,30210],{},[37,30211,30213],{"href":211,"rel":30212},[41],"开始为你的图片制作动画。免费注册 EvoLink →",[45,30215],{},[11,30217,30218],{},[2614,30219,30220,30221,2911,30223,2911,30225,30227,30228,298],{},"本指南是 Seedance 2.0 教程系列的一部分。此前发布：",[37,30222,2209],{"href":1766},[37,30224,17485],{"href":17484},[37,30226,2963],{"href":2962}," 和",[37,30229,19106],{"href":3849},[11186,30231,13391],{},{"title":141,"searchDepth":166,"depth":166,"links":30233},[30234,30240,30246,30253,30260,30267,30274,30283,30292,30293,30302],{"id":23045,"depth":166,"text":23046,"children":30235},[30236,30237,30238,30239],{"id":23059,"depth":178,"text":23059},{"id":23199,"depth":178,"text":23200},{"id":23218,"depth":178,"text":23218},{"id":23228,"depth":178,"text":23228},{"id":23236,"depth":166,"text":23237,"children":30241},[30242,30243,30244,30245],{"id":23246,"depth":178,"text":23247},{"id":23274,"depth":178,"text":23275},{"id":23293,"depth":178,"text":23294},{"id":23393,"depth":178,"text":23393},{"id":23705,"depth":166,"text":23706,"children":30247},[30248,30249,30250,30251,30252],{"id":6420,"depth":178,"text":6420},{"id":23757,"depth":178,"text":23758},{"id":24302,"depth":178,"text":24303},{"id":24324,"depth":178,"text":24325},{"id":24343,"depth":178,"text":24343},{"id":24452,"depth":166,"text":24453,"children":30254},[30255,30256,30257,30258,30259],{"id":24463,"depth":178,"text":6420},{"id":24493,"depth":178,"text":24493},{"id":24531,"depth":178,"text":24532},{"id":25051,"depth":178,"text":25052},{"id":25070,"depth":178,"text":25070},{"id":25147,"depth":166,"text":25148,"children":30261},[30262,30263,30264,30265,30266],{"id":25157,"depth":178,"text":25158},{"id":25184,"depth":178,"text":25185},{"id":25765,"depth":178,"text":25766},{"id":25786,"depth":178,"text":25787},{"id":25888,"depth":178,"text":25889},{"id":25919,"depth":166,"text":25919,"children":30268},[30269,30270,30271,30272,30273],{"id":25932,"depth":178,"text":25932},{"id":26396,"depth":178,"text":26397},{"id":26414,"depth":178,"text":26414},{"id":26515,"depth":178,"text":26516},{"id":27522,"depth":178,"text":27522},{"id":27553,"depth":166,"text":27554,"children":30275},[30276,30277,30278,30279,30280,30281,30282],{"id":27564,"depth":178,"text":27564},{"id":27601,"depth":178,"text":27602},{"id":28137,"depth":178,"text":28138},{"id":28155,"depth":178,"text":28155},{"id":28369,"depth":178,"text":28370},{"id":28387,"depth":178,"text":28387},{"id":28986,"depth":178,"text":28986},{"id":13143,"depth":166,"text":13143,"children":30284},[30285,30286,30287,30288,30289,30290,30291],{"id":29158,"depth":178,"text":29159},{"id":29248,"depth":178,"text":29249},{"id":29330,"depth":178,"text":29331},{"id":29395,"depth":178,"text":29396},{"id":29529,"depth":178,"text":29530},{"id":29620,"depth":178,"text":29621},{"id":29789,"depth":178,"text":29790},{"id":29867,"depth":166,"text":29868},{"id":9036,"depth":166,"text":9036,"children":30294},[30295,30296,30297,30298,30299,30300,30301],{"id":30103,"depth":178,"text":30104},{"id":30110,"depth":178,"text":30111},{"id":30123,"depth":178,"text":30124},{"id":30133,"depth":178,"text":30134},{"id":30151,"depth":178,"text":30152},{"id":30164,"depth":178,"text":30165},{"id":30177,"depth":178,"text":30178},{"id":30189,"depth":166,"text":30189},"学习使用 Seedance 2.0 API 将图像动画化——单图、首尾帧、多图工作流。完整 Python 代码、@tag 语法和电商演示。",{"date":23015,"image":30305,"seoTitle":30306},"/s5-hero-image-to-video.webp","Seedance 2.0 图像转视频 API：任意图像动画化 (2026)","/zh/blog/seedance-2-image-to-video-api",{"title":23024,"description":30303},"zh/blog/seedance-2-image-to-video-api","Ja4ndb5PigffTdNcQWF4cpHzcn97Xv_vHS9u6Sfl6xk",{"id":30312,"title":13377,"body":30313,"description":32059,"extension":11248,"meta":32060,"navigation":58,"path":32063,"seo":32064,"stem":32065,"__hash__":32066},"content/zh/blog/seedance-2-multimodal-tags-guide.md",{"type":8,"value":30314,"toc":32010},[30315,30321,30324,30331,30333,30337,30344,30347,30395,30398,30418,30425,30427,30431,30434,30440,30446,30449,30455,30479,30482,30571,30574,30577,30591,30597,30599,30603,30606,30609,30724,30728,30732,30738,30744,30750,30754,30759,30763,30767,30773,30778,30783,30786,30789,30795,30798,30800,30804,30811,30814,30903,30907,30911,30917,30922,30927,30930,30933,30978,30987,30991,30995,31000,31002,31006,31009,31012,31086,31090,31096,31100,31106,31111,31114,31117,31123,31126,31130,31135,31140,31143,31145,31149,31152,31156,31162,31167,31181,31185,31191,31197,31201,31206,31210,31224,31228,31234,31239,31243,31248,31252,31266,31270,31276,31281,31285,31288,31379,31385,31389,31392,31602,31605,31797,31804,31806,31808,31812,31820,31828,31831,31834,31837,31848,31852,31855,31858,31864,31867,31870,31878,31888,31891,31894,31896,31898,31902,31905,31909,31919,31923,31931,31935,31942,31946,31949,31951,31955,31958,31960,31980,31988,31993,32000,32002,32007],[11,30316,30317,30318,30320],{},"大多数 AI 视频生成器接受一段文本提示词，输出什么全凭模型自由发挥。Seedance 2.0 的工作方式完全不同。你上传图像、视频和音频文件，然后使用 ",[23,30319,30195],{}," 精确指定每个文件的作用——比如用作首帧、定义镜头运动、设定音乐节奏，或者作为角色参考。",[11,30322,30323],{},"这套 @tag 引用系统正是 Seedance 2.0 区别于 Sora 2、Kling 3.0 和 Veo 3.1 的关键。这些竞品都做不到这种级别的多模态控制。",[11,30325,30326,30327,30330],{},"本指南涵盖每种 @tag 类型、语法规则、文件限制，以及可以直接套用的真实提示词示例。如果你想边看边动手调用 API，",[37,30328,9030],{"href":211,"rel":30329},[41],"——只需 30 秒。",[45,30332],{},[48,30334,30336],{"id":30335},"什么是-tag-引用系统","什么是 @Tag 引用系统？",[11,30338,30339,30340,30343],{},"传统的文本生成视频是一个单输入、单输出的过程：你写一段提示词，模型按自己的方式去理解。Seedance 2.0 将其升级为 ",[23,30341,30342],{},"多输入、定向输出"," 的流程。",[11,30345,30346],{},"对比如下：",[2036,30348,30349,30365],{},[2039,30350,30351],{},[2042,30352,30353,30356,30359,30362],{},[2045,30354,30355],{},"方式",[2045,30357,30358],{},"输入",[2045,30360,30361],{},"控制程度",[2045,30363,30364],{},"结果",[2052,30366,30367,30381],{},[2042,30368,30369,30372,30375,30378],{},[2057,30370,30371],{},"纯文本",[2057,30373,30374],{},"\"一个女人在舞台上跳舞\"",[2057,30376,30377],{},"低——模型决定一切",[2057,30379,30380],{},"女人、舞蹈、舞台全看模型心情",[2042,30382,30383,30386,30389,30392],{},[2057,30384,30385],{},"使用 @tags",[2057,30387,30388],{},"@Image1（角色）+ @Video1（舞蹈参考）+ 提示词",[2057,30390,30391],{},"高——你掌控每个元素",[2057,30393,30394],{},"你指定的角色表演你参考的那段舞蹈",[11,30396,30397],{},"@tag 系统就像电影导演的分镜表。每个上传的文件通过提示词中的自然语言获得角色分配：",[96,30399,30400,30406,30412],{},[73,30401,30402,30405],{},[28,30403,30404],{},"@Image1 as the first frame"," — 锁定开场画面",[73,30407,30408,30411],{},[28,30409,30410],{},"@Video1 for camera movement reference"," — 复制镜头运动",[73,30413,30414,30417],{},[28,30415,30416],{},"@Audio1 as background music"," — 设定配乐和节奏",[11,30419,30420,30421,30424],{},"单次生成最多可组合 ",[23,30422,30423],{},"12 个文件","（9 张图像 + 3 个视频 + 3 个音频），每个文件都通过标签明确用途。",[45,30426],{},[48,30428,30430],{"id":30429},"tag-语法规则完整参考","@Tag 语法规则——完整参考",[92,30432,30433],{"id":30433},"基本语法",[11,30435,30436,30437,30439],{},"格式非常简单：",[28,30438,11514],{}," + 素材类型 + 编号。",[136,30441,30444],{"className":30442,"code":30443,"language":2183},[2181],"@Image1, @Image2, @Image3 ... @Image9\n@Video1, @Video2, @Video3\n@Audio1, @Audio2, @Audio3\n",[28,30445,30443],{"__ignoreMap":141},[11,30447,30448],{},"在提示词中引用这些标签，并用自然语言描述它们的作用：",[136,30450,30453],{"className":30451,"code":30452,"language":2183},[2181],"@Image1 as the first frame, @Image2 as character reference,\nreference @Video1's camera movement and tracking shots,\nuse @Audio1 for background music tempo.\n",[28,30454,30452],{"__ignoreMap":141},[18,30456,30457],{},[11,30458,30459,30462,30463,2911,30466,2911,30469,30472,30473,2911,30475,2911,30477,298],{},[23,30460,30461],{},"注意："," 在即梦平台上，标签使用中文格式：",[28,30464,30465],{},"@图片1",[28,30467,30468],{},"@视频1",[28,30470,30471],{},"@音频1","。通过 API 调用时，统一使用 ",[28,30474,2903],{},[28,30476,11391],{},[28,30478,16467],{},[92,30480,30481],{"id":30481},"文件限制与格式",[2036,30483,30484,30501],{},[2039,30485,30486],{},[2042,30487,30488,30491,30494,30496,30499],{},[2045,30489,30490],{},"素材类型",[2045,30492,30493],{},"最大数量",[2045,30495,3247],{},[2045,30497,30498],{},"大小限制",[2045,30500,19346],{},[2052,30502,30503,30520,30536,30552],{},[2042,30504,30505,30508,30511,30514,30517],{},[2057,30506,30507],{},"图像",[2057,30509,30510],{},"9",[2057,30512,30513],{},"JPEG, PNG, WebP, BMP, TIFF, GIF",[2057,30515,30516],{},"每个 30 MB",[2057,30518,30519],{},"分辨率越高，输出效果越好",[2042,30521,30522,30525,30527,30530,30533],{},[2057,30523,30524],{},"视频",[2057,30526,5043],{},[2057,30528,30529],{},"MP4, MOV",[2057,30531,30532],{},"每个 50 MB",[2057,30534,30535],{},"总时长：2-15 秒，分辨率：480p-720p",[2042,30537,30538,30541,30543,30546,30549],{},[2057,30539,30540],{},"音频",[2057,30542,5043],{},[2057,30544,30545],{},"MP3, WAV",[2057,30547,30548],{},"每个 15 MB",[2057,30550,30551],{},"总时长不超过 15 秒",[2042,30553,30554,30559,30564,30566,30568],{},[2057,30555,30556],{},[23,30557,30558],{},"合计",[2057,30560,30561],{},[23,30562,30563],{},"12 个",[2057,30565,3420],{},[2057,30567,3420],{},[2057,30569,30570],{},"可在限制范围内任意组合",[92,30572,30573],{"id":30573},"两种输入模式",[11,30575,30576],{},"Seedance 2.0 有两种生成模式。你的输入决定使用哪一种：",[70,30578,30579,30585],{},[73,30580,30581,30584],{},[23,30582,30583],{},"首帧/末帧模式"," — 仅上传一张起始图像（可选添加结束图像）配合文本提示词。简单快速。",[73,30586,30587,30590],{},[23,30588,30589],{},"全方位引用模式"," — 上传图像、视频和音频的任意组合，并通过 @tag 分配角色。真正的强大之处就在这里。",[11,30592,30593,30596],{},[23,30594,30595],{},"规则："," 如果你上传了任何视频或音频引用，或超过 2 张图像，就必须使用全方位引用模式。",[45,30598],{},[48,30600,30602],{"id":30601},"图像-tags掌控视觉呈现","图像 @Tags——掌控视觉呈现",[11,30604,30605],{},"图像引用是最灵活的 @tag 类型。同一张图像可以根据你在提示词中的描述方式发挥完全不同的作用。",[92,30607,30608],{"id":30608},"图像引用类型",[2036,30610,30611,30621],{},[2039,30612,30613],{},[2042,30614,30615,30617,30619],{},[2045,30616,25807],{},[2045,30618,2975],{},[2045,30620,11442],{},[2052,30622,30623,30637,30652,30666,30680,30695,30710],{},[2042,30624,30625,30630,30634],{},[2057,30626,30627],{},[23,30628,30629],{},"首帧",[2057,30631,30632],{},[28,30633,30404],{},[2057,30635,30636],{},"锁定视频的精确开场画面",[2042,30638,30639,30644,30649],{},[2057,30640,30641],{},[23,30642,30643],{},"末帧",[2057,30645,30646],{},[28,30647,30648],{},"@Image2 as the last frame",[2057,30650,30651],{},"定义过渡的结束画面",[2042,30653,30654,30659,30663],{},[2057,30655,30656],{},[23,30657,30658],{},"角色身份",[2057,30660,30661],{},[28,30662,25818],{},[2057,30664,30665],{},"全程保持面部/身体的一致性",[2042,30667,30668,30672,30677],{},[2057,30669,30670],{},[23,30671,25839],{},[2057,30673,30674],{},[28,30675,30676],{},"reference @Image1's art style",[2057,30678,30679],{},"应用绘画风格、色彩方案或视觉美学",[2042,30681,30682,30687,30692],{},[2057,30683,30684],{},[23,30685,30686],{},"场景/环境",[2057,30688,30689],{},[28,30690,30691],{},"scene references @Image3",[2057,30693,30694],{},"设定地点、背景、建筑",[2042,30696,30697,30702,30707],{},[2057,30698,30699],{},[23,30700,30701],{},"物体参考",[2057,30703,30704],{},[28,30705,30706],{},"the product in @Image1",[2057,30708,30709],{},"保持广告中产品的细节一致",[2042,30711,30712,30716,30721],{},[2057,30713,30714],{},[23,30715,23734],{},[2057,30717,30718],{},[28,30719,30720],{},"framing references @Image1",[2057,30722,30723],{},"复制镜头角度和画面布局",[92,30725,30727],{"id":30726},"示例梵高风格迁移","示例：梵高风格迁移",[11,30729,30730],{},[23,30731,11955],{},[136,30733,30736],{"className":30734,"code":30735,"language":2183},[2181],"A young woman with long blonde hair in a blue dress stands on a hilltop,\ngazing at a Provençal village at sunset. Entirely rendered in @Image1's\npost-impressionist art style — thick impasto brushstrokes, swirling textures,\nrich yellows and blues.\n",[28,30737,30735],{"__ignoreMap":141},[11,30739,30740,30743],{},[23,30741,30742],{},"输入："," 一张梵高画作作为 @Image1",[11,30745,30746,30749],{},[23,30747,30748],{},"效果："," 模型以梵高标志性的风格渲染整个场景——不是简单的滤镜叠加，而是真正的风格迁移，在整段视频中保持笔触纹理。",[56,30751,60,30752],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,30753],{"src":24330,"type":65},[11,30755,30756],{},[2614,30757,30758],{},"视频：使用 @Image 引用进行风格迁移——梵高后印象主义渲染",[92,30760,30762],{"id":30761},"示例产品广告","示例：产品广告",[11,30764,30765],{},[23,30766,11955],{},[136,30768,30771],{"className":30769,"code":30770,"language":2183},[2181],"Commercial showcase of the handbag in @Image2.\nSide profile references @Image1.\nSurface material texture references @Image3.\nDisplay all product details with cinematic camera movement.\nGrand orchestral background music.\n",[28,30772,30770],{"__ignoreMap":141},[11,30774,30775,30777],{},[23,30776,30742],{}," 3 张图像——侧面视图、产品主图、材质特写",[11,30779,30780,30782],{},[23,30781,30748],{}," 一段精美的产品视频，精确保持参考图像中的材质纹理和比例——不会出现 AI 对产品细节的幻觉。",[92,30784,30785],{"id":30785},"多图角色一致性",[11,30787,30788],{},"当你需要同一角色在多个镜头中保持一致时，上传多个不同角度的参考图像：",[136,30790,30793],{"className":30791,"code":30792,"language":2183},[2181],"@Image1 and @Image2 define the main character's appearance.\nThe character walks through @Image3's environment,\nwearing the outfit from @Image4.\n",[28,30794,30792],{"__ignoreMap":141},[11,30796,30797],{},"为角色提供的参考图像越多，输出的一致性就越高。这解决了单图生成中常见的\"面部变形\"问题。",[45,30799],{},[48,30801,30803],{"id":30802},"视频-tags复制镜头与运动","视频 @Tags——复制镜头与运动",[11,30805,30806,30807,30810],{},"视频引用释放了 Seedance 2.0 最强大的能力：",[23,30808,30809],{},"精确复制镜头运动和物理动作","。上传一个参考视频，模型就能复制其中的精确镜头语言、动作编排或视觉特效。",[92,30812,30813],{"id":30813},"视频引用类型",[2036,30815,30816,30827],{},[2039,30817,30818],{},[2042,30819,30820,30822,30824],{},[2045,30821,25807],{},[2045,30823,2975],{},[2045,30825,30826],{},"复制内容",[2052,30828,30829,30843,30858,30873,30888],{},[2042,30830,30831,30835,30840],{},[2057,30832,30833],{},[23,30834,4144],{},[2057,30836,30837],{},[28,30838,30839],{},"reference @Video1's camera movement",[2057,30841,30842],{},"平移、俯仰、推轨、跟踪、变焦模式",[2042,30844,30845,30850,30855],{},[2057,30846,30847],{},[23,30848,30849],{},"动作/编排",[2057,30851,30852],{},[28,30853,30854],{},"perform the actions from @Video1",[2057,30856,30857],{},"肢体动作、舞步、打斗编排",[2042,30859,30860,30865,30870],{},[2057,30861,30862],{},[23,30863,30864],{},"视觉特效",[2057,30866,30867],{},[28,30868,30869],{},"reference @Video1's transition effects",[2057,30871,30872],{},"粒子特效、风格转场、VFX",[2042,30874,30875,30880,30885],{},[2057,30876,30877],{},[23,30878,30879],{},"节奏/节拍",[2057,30881,30882],{},[28,30883,30884],{},"match @Video1's editing rhythm",[2057,30886,30887],{},"剪辑节奏、节拍同步、速度",[2042,30889,30890,30895,30900],{},[2057,30891,30892],{},[23,30893,30894],{},"完整复制",[2057,30896,30897],{},[28,30898,30899],{},"completely reference @Video1",[2057,30901,30902],{},"一切——镜头、动作、特效、节奏",[92,30904,30906],{"id":30905},"示例电影级镜头复制","示例：电影级镜头复制",[11,30908,30909],{},[23,30910,11955],{},[136,30912,30915],{"className":30913,"code":30914,"language":2183},[2181],"Reference @Image1's character. He is in @Image2's elevator.\nCompletely reference @Video1's camera movements and the protagonist's\nfacial expressions. Hitchcock zoom when the character is frightened,\nthen several orbiting shots inside the elevator.\nThe elevator door opens, tracking shot follows him out.\nExterior scene references @Image3.\n",[28,30916,30914],{"__ignoreMap":141},[11,30918,30919,30921],{},[23,30920,30742],{}," 3 张图像（角色、电梯内景、外景）+ 1 个参考视频（包含所需镜头运动）",[11,30923,30924,30926],{},[23,30925,30748],{}," 模型精确复制参考视频中的希区柯克变焦、环绕镜头运动和跟踪镜头——并将其应用到完全不同的角色和场景中。",[92,30928,30929],{"id":30929},"可复制的镜头技术",[11,30931,30932],{},"Seedance 2.0 能够从参考视频中复制以下镜头运动：",[96,30934,30935,30941,30947,30953,30958,30963,30968,30973],{},[73,30936,30937,30940],{},[23,30938,30939],{},"希区柯克变焦","（推轨变焦/眩晕效果）",[73,30942,30943,30946],{},[23,30944,30945],{},"360 度环绕","拍摄",[73,30948,30949,30952],{},[23,30950,30951],{},"一镜到底","连续长镜头（无剪辑）",[73,30954,30955],{},[23,30956,30957],{},"机械臂多角度跟踪",[73,30959,30960],{},[23,30961,30962],{},"低角度英雄镜头",[73,30964,30965],{},[23,30966,30967],{},"手持追逐镜头",[73,30969,30970],{},[23,30971,30972],{},"鱼眼镜头畸变",[73,30974,30975],{},[23,30976,30977],{},"推拉节奏运动",[11,30979,30980,30983,30984,298],{},[23,30981,30982],{},"提示词技巧："," 具体说明要从参考视频中复制哪个方面。\"Reference @Video1's camera movement\" 比单纯的 \"reference @Video1\" 更好——它告诉模型聚焦于镜头语言，而不是试图复制所有内容。更多镜头引用示例和完整 Python 代码，请查看我们的",[37,30985,30986],{"href":3849},"镜头运动专题教程",[92,30988,30990],{"id":30989},"示例跑酷动作","示例：跑酷动作",[56,30992,60,30993],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,30994],{"src":12216,"type":65},[11,30996,30997],{},[2614,30998,30999],{},"视频：动态跑酷配合电影级跟踪镜头——使用镜头运动参考生成",[45,31001],{},[48,31003,31005],{"id":31004},"音频-tags基于引用的声音设计","音频 @Tags——基于引用的声音设计",[11,31007,31008],{},"Seedance 2.0 为每段视频生成原生音频——音效、环境音、音乐甚至对白。音频 @tags 让你控制最终的声音效果。",[92,31010,31011],{"id":31011},"音频引用类型",[2036,31013,31014,31024],{},[2039,31015,31016],{},[2042,31017,31018,31020,31022],{},[2045,31019,25807],{},[2045,31021,2975],{},[2045,31023,30826],{},[2052,31025,31026,31041,31056,31071],{},[2042,31027,31028,31033,31038],{},[2057,31029,31030],{},[23,31031,31032],{},"背景音乐",[2057,31034,31035],{},[28,31036,31037],{},"use @Audio1 for background music",[2057,31039,31040],{},"音乐风格、节奏、乐器",[2042,31042,31043,31048,31053],{},[2057,31044,31045],{},[23,31046,31047],{},"音效",[2057,31049,31050],{},[28,31051,31052],{},"sound effects reference @Audio1",[2057,31054,31055],{},"特定的声音纹理和时机",[2042,31057,31058,31063,31068],{},[2057,31059,31060],{},[23,31061,31062],{},"旁白/解说风格",[2057,31064,31065],{},[28,31066,31067],{},"narration voice references @Video1",[2057,31069,31070],{},"声调、语速、口音",[2042,31072,31073,31078,31083],{},[2057,31074,31075],{},[23,31076,31077],{},"节拍同步",[2057,31079,31080],{},[28,31081,31082],{},"match @Audio1's rhythm for editing cuts",[2057,31084,31085],{},"音乐节拍驱动视觉转场",[92,31087,31089],{"id":31088},"节拍同步mv-模式","节拍同步（MV 模式）",[11,31091,31092,31093,298],{},"音频功能中最强大的特性之一：上传一段音乐，模型会",[23,31094,31095],{},"将视觉剪辑和转场同步到节拍上",[11,31097,31098],{},[23,31099,11955],{},[136,31101,31104],{"className":31102,"code":31103,"language":2183},[2181],"@Image1 through @Image7 as scene references.\nMatch @Video1's visual rhythm and beat synchronization.\nEach image appears on a music beat with dynamic transitions.\nEnhance visual impact with dramatic lighting changes on each cut.\n",[28,31105,31103],{"__ignoreMap":141},[11,31107,31108,31110],{},[23,31109,30748],{}," 模型创建 MV 风格的剪辑，场景转换、镜头运动和灯光变化都精确地在参考音频的节拍上发生。",[92,31112,31113],{"id":31113},"使用视频中的音频作为引用",[11,31115,31116],{},"你不需要单独的音频文件——可以直接引用已上传视频中的音轨：",[136,31118,31121],{"className":31119,"code":31120,"language":2183},[2181],"Background music references @Video1's audio.\n",[28,31122,31120],{"__ignoreMap":141},[11,31124,31125],{},"当你想复制现有视频的声音设计，同时改变画面内容时，这非常实用。",[92,31127,31129],{"id":31128},"示例角色对话","示例：角色对话",[56,31131,60,31132],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,31133],{"src":31134,"type":65},"https://cdn.evolink.ai/seedance2api/%E7%8C%AB%E7%8B%97%E8%B0%88%E5%BF%83.mp4",[11,31136,31137],{},[2614,31138,31139],{},"视频：AI 生成的角色对话，包含自然语音演技和咖啡馆环境音",[11,31141,31142],{},"Seedance 2.0 支持多语言对话生成，包括英语、中文、西班牙语、韩语等。直接在提示词中写入对白，模型会生成匹配的口型同步和语音演绎。",[45,31144],{},[48,31146,31148],{"id":31147},"进阶组合多模态实战配方","进阶组合——多模态实战配方",[11,31150,31151],{},"@tags 的真正威力在于组合多种模态。以下是三种经过验证的常见制作场景配方。",[92,31153,31155],{"id":31154},"配方-1电影短片","配方 1：电影短片",[11,31157,31158,31161],{},[23,31159,31160],{},"目标："," 具有特定角色、镜头运动和配乐的电影级场景",[11,31163,31164],{},[23,31165,31166],{},"文件：",[96,31168,31169,31172,31175,31178],{},[73,31170,31171],{},"@Image1：角色面部/身体参考",[73,31173,31174],{},"@Image2：环境/场景参考",[73,31176,31177],{},"@Video1：镜头运动参考（如电影中的跟踪镜头）",[73,31179,31180],{},"@Audio1：背景音乐",[11,31182,31183],{},[23,31184,11955],{},[136,31186,31189],{"className":31187,"code":31188,"language":2183},[2181],"@Image1's character walks through @Image2's environment.\nCamera movement follows @Video1's tracking shot pattern.\nBackground music uses @Audio1.\nCinematic lighting, shallow depth of field, 24fps film grain.\n",[28,31190,31188],{"__ignoreMap":141},[11,31192,31193,31196],{},[23,31194,31195],{},"文件分配："," 2 张图像 + 1 个视频 + 1 个音频 = 已使用 4/12 个文件",[92,31198,31200],{"id":31199},"配方-2电商产品视频","配方 2：电商产品视频",[11,31202,31203,31205],{},[23,31204,31160],{}," 从静态产品照片生成专业产品展示",[11,31207,31208],{},[23,31209,31166],{},[96,31211,31212,31215,31218,31221],{},[73,31213,31214],{},"@Image1：产品主图",[73,31216,31217],{},"@Image2：产品侧视图",[73,31219,31220],{},"@Image3：材质/纹理特写",[73,31222,31223],{},"@Video1：镜头运动参考（环绕产品拍摄）",[11,31225,31226],{},[23,31227,11955],{},[136,31229,31232],{"className":31230,"code":31231,"language":2183},[2181],"Commercial showcase of the product in @Image2.\nSide profile references @Image1.\nSurface material and texture reference @Image3.\nCamera movement references @Video1's orbiting rotation.\nStudio lighting, reflective dark surface, premium aesthetic.\n",[28,31233,31231],{"__ignoreMap":141},[11,31235,31236,31238],{},[23,31237,31195],{}," 3 张图像 + 1 个视频 = 已使用 4/12 个文件",[92,31240,31242],{"id":31241},"配方-3多角色动画","配方 3：多角色动画",[11,31244,31245,31247],{},[23,31246,31160],{}," 两个角色互动并带有编排好的动作",[11,31249,31250],{},[23,31251,31166],{},[96,31253,31254,31257,31260,31263],{},[73,31255,31256],{},"@Image1、@Image2：角色 A（正面 + 侧面参考）",[73,31258,31259],{},"@Image3、@Image4：角色 B（正面 + 侧面参考）",[73,31261,31262],{},"@Image5：背景/场景参考",[73,31264,31265],{},"@Video1：动作编排参考",[11,31267,31268],{},[23,31269,11955],{},[136,31271,31274],{"className":31272,"code":31273,"language":2183},[2181],"@Image1 and @Image2 define Character A (spear wielder).\n@Image3 and @Image4 define Character B (dual swords).\nThey fight in @Image5's autumn forest, mimicking @Video1's\ncombat choreography. White dust rises on impact.\nDramatic star-filled night sky.\n",[28,31275,31273],{"__ignoreMap":141},[11,31277,31278,31280],{},[23,31279,31195],{}," 5 张图像 + 1 个视频 = 已使用 6/12 个文件",[92,31282,31284],{"id":31283},"_12-个文件的分配策略","12 个文件的分配策略",[11,31286,31287],{},"你有 12 个插槽。以下是如何分配以获得最佳效果：",[2036,31289,31290,31302],{},[2039,31291,31292],{},[2042,31293,31294,31297,31300],{},[2045,31295,31296],{},"优先级",[2045,31298,31299],{},"分配方案",[2045,31301,8250],{},[2052,31303,31304,31316,31329,31341,31354,31366],{},[2042,31305,31306,31310,31313],{},[2057,31307,31308],{},[23,31309,30658],{},[2057,31311,31312],{},"每个角色 2-3 张图像",[2057,31314,31315],{},"角度越多，一致性越好",[2042,31317,31318,31323,31326],{},[2057,31319,31320],{},[23,31321,31322],{},"镜头/运动参考",[2057,31324,31325],{},"1 个视频",[2057,31327,31328],{},"一个好的参考就够了",[2042,31330,31331,31335,31338],{},[2057,31332,31333],{},[23,31334,30686],{},[2057,31336,31337],{},"1-2 张图像",[2057,31339,31340],{},"构建世界观",[2042,31342,31343,31348,31351],{},[2057,31344,31345],{},[23,31346,31347],{},"音频/音乐",[2057,31349,31350],{},"1 个音频或视频（取其音轨）",[2057,31352,31353],{},"设定氛围",[2042,31355,31356,31360,31363],{},[2057,31357,31358],{},[23,31359,25839],{},[2057,31361,31362],{},"1 张图像（如需要）",[2057,31364,31365],{},"仅在需要非写实风格时使用",[2042,31367,31368,31373,31376],{},[2057,31369,31370],{},[23,31371,31372],{},"预留",[2057,31374,31375],{},"保留 2-3 个插槽",[2057,31377,31378],{},"用于迭代和补充细节",[11,31380,31381,31384],{},[23,31382,31383],{},"进阶技巧："," 不要用满 12 个插槽。先从 4-6 个文件开始，只在输出需要更高精度时才添加更多。引用文件过多反而会让模型无所适从。",[92,31386,31388],{"id":31387},"api-调用示例","API 调用示例",[11,31390,31391],{},"以下是通过 API 进行多模态生成的完整示例：",[136,31393,31395],{"className":339,"code":31394,"language":341,"meta":141,"style":141},"import requests\n\nresponse = requests.post(\n    \"https://api.evolink.ai/v1/videos/generations\",\n    headers={\"Authorization\": \"Bearer YOUR_EVOLINK_API_KEY\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"@Image1 as the main character. \"\n            \"@Image2 as the environment. \"\n            \"Reference @Video1's tracking shot and camera movement. \"\n            \"The character walks through a misty forest at dawn. \"\n            \"Cinematic lighting, shallow depth of field.\"\n        ),\n        \"image_urls\": [\n            \"https://your-cdn.com/character.jpg\",\n            \"https://your-cdn.com/forest.jpg\"\n        ],\n        \"video_urls\": [\n            \"https://your-cdn.com/tracking-shot.mp4\"\n        ],\n        \"duration\": 10,\n        \"quality\": \"1080p\",\n        \"generate_audio\": true\n    }\n)\n\ntask_id = response.json()[\"id\"]\nprint(f\"Generation started: {task_id}\")\n",[28,31396,31397,31403,31407,31415,31422,31440,31448,31458,31464,31469,31474,31479,31484,31489,31493,31499,31506,31511,31515,31521,31526,31530,31540,31550,31557,31561,31565,31569,31581],{"__ignoreMap":141},[145,31398,31399,31401],{"class":147,"line":148},[145,31400,348],{"class":259},[145,31402,329],{"class":263},[145,31404,31405],{"class":147,"line":166},[145,31406,377],{"emptyLinePlaceholder":58},[145,31408,31409,31411,31413],{"class":147,"line":178},[145,31410,6508],{"class":263},[145,31412,267],{"class":259},[145,31414,1433],{"class":263},[145,31416,31417,31420],{"class":147,"line":187},[145,31418,31419],{"class":159},"    \"https://api.evolink.ai/v1/videos/generations\"",[145,31421,453],{"class":263},[145,31423,31424,31426,31428,31430,31433,31435,31438],{"class":147,"line":374},[145,31425,6530],{"class":701},[145,31427,267],{"class":259},[145,31429,685],{"class":263},[145,31431,31432],{"class":159},"\"Authorization\"",[145,31434,438],{"class":263},[145,31436,31437],{"class":159},"\"Bearer YOUR_EVOLINK_API_KEY\"",[145,31439,19515],{"class":263},[145,31441,31442,31444,31446],{"class":147,"line":380},[145,31443,6541],{"class":701},[145,31445,267],{"class":259},[145,31447,1865],{"class":263},[145,31449,31450,31452,31454,31456],{"class":147,"line":386},[145,31451,1304],{"class":159},[145,31453,438],{"class":263},[145,31455,1309],{"class":159},[145,31457,453],{"class":263},[145,31459,31460,31462],{"class":147,"line":410},[145,31461,1320],{"class":159},[145,31463,1323],{"class":263},[145,31465,31466],{"class":147,"line":421},[145,31467,31468],{"class":159},"            \"@Image1 as the main character. \"\n",[145,31470,31471],{"class":147,"line":432},[145,31472,31473],{"class":159},"            \"@Image2 as the environment. \"\n",[145,31475,31476],{"class":147,"line":456},[145,31477,31478],{"class":159},"            \"Reference @Video1's tracking shot and camera movement. \"\n",[145,31480,31481],{"class":147,"line":467},[145,31482,31483],{"class":159},"            \"The character walks through a misty forest at dawn. \"\n",[145,31485,31486],{"class":147,"line":600},[145,31487,31488],{"class":159},"            \"Cinematic lighting, shallow depth of field.\"\n",[145,31490,31491],{"class":147,"line":605},[145,31492,1343],{"class":263},[145,31494,31495,31497],{"class":147,"line":611},[145,31496,2683],{"class":159},[145,31498,2686],{"class":263},[145,31500,31501,31504],{"class":147,"line":617},[145,31502,31503],{"class":159},"            \"https://your-cdn.com/character.jpg\"",[145,31505,453],{"class":263},[145,31507,31508],{"class":147,"line":623},[145,31509,31510],{"class":159},"            \"https://your-cdn.com/forest.jpg\"\n",[145,31512,31513],{"class":147,"line":628},[145,31514,2696],{"class":263},[145,31516,31517,31519],{"class":147,"line":639},[145,31518,12121],{"class":159},[145,31520,2686],{"class":263},[145,31522,31523],{"class":147,"line":654},[145,31524,31525],{"class":159},"            \"https://your-cdn.com/tracking-shot.mp4\"\n",[145,31527,31528],{"class":147,"line":660},[145,31529,2696],{"class":263},[145,31531,31532,31534,31536,31538],{"class":147,"line":671},[145,31533,1348],{"class":159},[145,31535,438],{"class":263},[145,31537,537],{"class":155},[145,31539,453],{"class":263},[145,31541,31542,31544,31546,31548],{"class":147,"line":698},[145,31543,1364],{"class":159},[145,31545,438],{"class":263},[145,31547,3703],{"class":159},[145,31549,453],{"class":263},[145,31551,31552,31554],{"class":147,"line":710},[145,31553,1396],{"class":159},[145,31555,31556],{"class":263},": true\n",[145,31558,31559],{"class":147,"line":716},[145,31560,1408],{"class":263},[145,31562,31563],{"class":147,"line":722},[145,31564,407],{"class":263},[145,31566,31567],{"class":147,"line":728},[145,31568,377],{"emptyLinePlaceholder":58},[145,31570,31571,31573,31575,31577,31579],{"class":147,"line":739},[145,31572,12163],{"class":263},[145,31574,267],{"class":259},[145,31576,12168],{"class":263},[145,31578,1627],{"class":159},[145,31580,764],{"class":263},[145,31582,31583,31585,31587,31589,31592,31594,31596,31598,31600],{"class":147,"line":744},[145,31584,6563],{"class":155},[145,31586,794],{"class":263},[145,31588,441],{"class":259},[145,31590,31591],{"class":159},"\"Generation started: ",[145,31593,685],{"class":155},[145,31595,688],{"class":263},[145,31597,691],{"class":155},[145,31599,450],{"class":159},[145,31601,407],{"class":263},[11,31603,31604],{},"轮询获取结果：",[136,31606,31608],{"className":339,"code":31607,"language":341,"meta":141,"style":141},"import time\n\nwhile True:\n    status = requests.get(\n        f\"https://api.evolink.ai/v1/tasks/{task_id}\",\n        headers={\"Authorization\": \"Bearer YOUR_EVOLINK_API_KEY\"}\n    )\n    result = status.json()\n\n    if result[\"status\"] == \"completed\":\n        print(f\"Video ready: {result['results'][0]}\")\n        break\n    elif result[\"status\"] == \"failed\":\n        print(f\"Error: {result.get('error', 'Unknown error')}\")\n        break\n\n    time.sleep(5)\n",[28,31609,31610,31616,31620,31629,31637,31654,31670,31674,31683,31687,31703,31731,31736,31752,31781,31785,31789],{"__ignoreMap":141},[145,31611,31612,31614],{"class":147,"line":148},[145,31613,348],{"class":259},[145,31615,357],{"class":263},[145,31617,31618],{"class":147,"line":166},[145,31619,377],{"emptyLinePlaceholder":58},[145,31621,31622,31625,31627],{"class":147,"line":178},[145,31623,31624],{"class":259},"while",[145,31626,14792],{"class":155},[145,31628,860],{"class":263},[145,31630,31631,31633,31635],{"class":147,"line":187},[145,31632,7215],{"class":263},[145,31634,267],{"class":259},[145,31636,668],{"class":263},[145,31638,31639,31641,31644,31646,31648,31650,31652],{"class":147,"line":374},[145,31640,1438],{"class":259},[145,31642,31643],{"class":159},"\"https://api.evolink.ai/v1/tasks/",[145,31645,685],{"class":155},[145,31647,688],{"class":263},[145,31649,691],{"class":155},[145,31651,450],{"class":159},[145,31653,453],{"class":263},[145,31655,31656,31658,31660,31662,31664,31666,31668],{"class":147,"line":380},[145,31657,1456],{"class":701},[145,31659,267],{"class":259},[145,31661,685],{"class":263},[145,31663,31432],{"class":159},[145,31665,438],{"class":263},[145,31667,31437],{"class":159},[145,31669,470],{"class":263},[145,31671,31672],{"class":147,"line":386},[145,31673,1484],{"class":263},[145,31675,31676,31678,31680],{"class":147,"line":410},[145,31677,1619],{"class":263},[145,31679,267],{"class":259},[145,31681,31682],{"class":263}," status.json()\n",[145,31684,31685],{"class":147,"line":421},[145,31686,377],{"emptyLinePlaceholder":58},[145,31688,31689,31691,31693,31695,31697,31699,31701],{"class":147,"line":432},[145,31690,2501],{"class":259},[145,31692,1649],{"class":263},[145,31694,761],{"class":159},[145,31696,14864],{"class":263},[145,31698,854],{"class":259},[145,31700,857],{"class":159},[145,31702,860],{"class":263},[145,31704,31705,31707,31709,31711,31713,31715,31717,31719,31721,31723,31725,31727,31729],{"class":147,"line":456},[145,31706,791],{"class":155},[145,31708,794],{"class":263},[145,31710,441],{"class":259},[145,31712,11774],{"class":159},[145,31714,685],{"class":155},[145,31716,11779],{"class":263},[145,31718,11782],{"class":159},[145,31720,1563],{"class":263},[145,31722,783],{"class":155},[145,31724,1536],{"class":263},[145,31726,691],{"class":155},[145,31728,450],{"class":159},[145,31730,407],{"class":263},[145,31732,31733],{"class":147,"line":467},[145,31734,31735],{"class":259},"        break\n",[145,31737,31738,31740,31742,31744,31746,31748,31750],{"class":147,"line":600},[145,31739,7502],{"class":259},[145,31741,1649],{"class":263},[145,31743,761],{"class":159},[145,31745,14864],{"class":263},[145,31747,854],{"class":259},[145,31749,882],{"class":159},[145,31751,860],{"class":263},[145,31753,31754,31756,31758,31760,31763,31765,31767,31769,31771,31773,31775,31777,31779],{"class":147,"line":605},[145,31755,791],{"class":155},[145,31757,794],{"class":263},[145,31759,441],{"class":259},[145,31761,31762],{"class":159},"\"Error: ",[145,31764,685],{"class":155},[145,31766,11828],{"class":263},[145,31768,11831],{"class":159},[145,31770,401],{"class":263},[145,31772,943],{"class":159},[145,31774,946],{"class":263},[145,31776,691],{"class":155},[145,31778,450],{"class":159},[145,31780,407],{"class":263},[145,31782,31783],{"class":147,"line":611},[145,31784,31735],{"class":259},[145,31786,31787],{"class":147,"line":617},[145,31788,377],{"emptyLinePlaceholder":58},[145,31790,31791,31793,31795],{"class":147,"line":623},[145,31792,19827],{"class":263},[145,31794,1353],{"class":155},[145,31796,407],{"class":263},[11,31798,31799,31800,31803],{},"使用你的 ",[37,31801,11318],{"href":211,"rel":31802},[41]," 运行此代码。注册免费，无需信用卡。",[45,31805],{},[48,31807,13143],{"id":13143},[92,31809,31811],{"id":31810},"未指定-tag-的用途","未指定 @tag 的用途",[11,31813,31814,2423,31817],{},[23,31815,31816],{},"错误示范：",[28,31818,31819],{},"@Image1 @Video1 generate a video of a dancer",[11,31821,31822,2423,31825],{},[23,31823,31824],{},"正确示范：",[28,31826,31827],{},"@Image1 as the dancer's appearance reference. @Video1 for dance choreography and camera movement. Generate the dancer performing on a stage.",[11,31829,31830],{},"模型需要明确的角色分配。没有角色分配时，它只能靠猜——而且经常猜错。",[92,31832,31833],{"id":31833},"输入文件分辨率过低",[11,31835,31836],{},"如果你的 @Image1 只有 480p，输出就会显得模糊。务必使用：",[96,31838,31839,31842,31845],{},[73,31840,31841],{},"图像：2K 或更高分辨率",[73,31843,31844],{},"视频：720p，干净的画面，无压缩伪影",[73,31846,31847],{},"音频：128kbps 以上的 MP3 或无损 WAV",[92,31849,31851],{"id":31850},"试图用满-12-个文件插槽","试图用满 12 个文件插槽",[11,31853,31854],{},"更多引用不等于更好的输出。从 3-5 个文件开始，只在必要时添加更多。过多的冲突引用反而会让模型无所适从。",[92,31856,31857],{"id":31857},"上传真实人脸照片",[11,31859,31860,31863],{},[23,31861,31862],{},"平台限制："," Seedance 2.0 目前不支持上传包含真实人脸的图像或视频。系统会自动拦截这类上传。请改用插画、动漫风格或其他风格化的角色参考。",[92,31865,31866],{"id":31866},"素材编号混淆",[11,31868,31869],{},"当你上传 3 张图像和 2 个视频时，它们是独立编号的：",[96,31871,31872,31875],{},[73,31873,31874],{},"图像：@Image1、@Image2、@Image3",[73,31876,31877],{},"视频：@Video1、@Video2",[11,31879,31880,31881,281,31884,31887],{},"不要写 ",[28,31882,31883],{},"@File3",[28,31885,31886],{},"@Asset5","——使用按类型的独立编号。",[92,31889,31890],{"id":31890},"视频延伸时设置了错误的时长",[11,31892,31893],{},"当你要将现有视频延伸 5 秒时，生成时长应设为 5 秒（新增部分），而不是总时长。延伸内容会拼接到原片之后。",[45,31895],{},[48,31897,9036],{"id":9036},[92,31899,31901],{"id":31900},"单次生成最多能上传多少个文件","单次生成最多能上传多少个文件？",[11,31903,31904],{},"最多 12 个文件：最多 9 张图像、3 个视频和 3 个音频片段。视频的总时长必须在 2 到 15 秒之间。音频片段的总时长不超过 15 秒。",[92,31906,31908],{"id":31907},"能通过-api-使用-tags-吗","能通过 API 使用 @tags 吗？",[11,31910,31911,31912,2911,31914,2955,31916,31918],{},"可以。调用 API 时，在 JSON 请求体中传入 ",[28,31913,2891],{},[28,31915,3561],{},[28,31917,3578],{}," 数组。每个数组包含引用文件的直接 URL。@tag 编号（@Image1、@Image2...）对应每个数组中 URL 的顺序。提示词文本使用与界面相同的 @tag 语法。",[92,31920,31922],{"id":31921},"如果不给-tag-分配角色会怎样","如果不给 @tag 分配角色会怎样？",[11,31924,31925,31926,31928,31929,298],{},"模型会根据文件内容和提示词上下文尝试推断用途。但这种推断并不可靠。务必明确说明每个标签的角色——例如使用 ",[28,31927,30404],{},"，而不是在没有上下文的情况下仅提及 ",[28,31930,2903],{},[92,31932,31934],{"id":31933},"能引用已上传视频中的音频吗","能引用已上传视频中的音频吗？",[11,31936,31937,31938,31941],{},"可以。在提示词中使用 ",[28,31939,31940],{},"background music references @Video1's audio","。模型会从视频中提取音轨作为声音参考，无需单独上传音频文件。",[92,31943,31945],{"id":31944},"支持哪些图像和视频格式","支持哪些图像和视频格式？",[11,31947,31948],{},"图像：JPEG、PNG、WebP、BMP、TIFF、GIF（每个最大 30 MB）。视频：MP4、MOV（每个最大 50 MB，480p-720p 分辨率）。音频：MP3、WAV（每个最大 15 MB）。",[45,31950],{},[48,31952,31954],{"id":31953},"开始用-tags-创作","开始用 @Tags 创作",[11,31956,31957],{},"@tag 引用系统是 Seedance 2.0 成为当前最可控 AI 视频生成器的关键。你不再需要描述你想要的效果然后碰运气，而是直接向模型展示你的意图——然后像指挥摄制组一样导演它。",[11,31959,11504],{},[70,31961,31962,31968,31974],{},[73,31963,31964,31967],{},[23,31965,31966],{},"每个 @tag 都需要一个角色。"," 不要只上传文件——告诉模型每个文件的具体作用。",[73,31969,31970,31973],{},[23,31971,31972],{},"从少量开始，逐步增加精度。"," 先用 3-4 个引用文件。只在输出需要时才添加更多。",[73,31975,31976,31979],{},[23,31977,31978],{},"具体说明要复制什么。"," \"Reference @Video1's camera movement\" 比 \"reference @Video1\" 效果更好。",[11,31981,31982,31983,31987],{},"准备好导演你自己的 AI 视频了吗？",[37,31984,31986],{"href":211,"rel":31985},[41],"在 EvoLink 免费开始","——一个 API Key 即可使用 Seedance 2.0 和所有主流 AI 视频模型，智能路由为你节省 20-70% 的费用。",[11,31989,31990],{},[23,31991,31992],{},"继续学习：",[96,31994,31995],{},[73,31996,31997,31999],{},[37,31998,2209],{"href":1766}," — 掌握提示词写作基础",[45,32001],{},[11,32003,32004],{},[2614,32005,32006],{},"最后更新：2026 年 2 月 20 日 | Written by J, Growth Lead at EvoLink",[11186,32008,32009],{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":141,"searchDepth":166,"depth":166,"links":32011},[32012,32013,32018,32024,32030,32036,32043,32051,32058],{"id":30335,"depth":166,"text":30336},{"id":30429,"depth":166,"text":30430,"children":32014},[32015,32016,32017],{"id":30433,"depth":178,"text":30433},{"id":30481,"depth":178,"text":30481},{"id":30573,"depth":178,"text":30573},{"id":30601,"depth":166,"text":30602,"children":32019},[32020,32021,32022,32023],{"id":30608,"depth":178,"text":30608},{"id":30726,"depth":178,"text":30727},{"id":30761,"depth":178,"text":30762},{"id":30785,"depth":178,"text":30785},{"id":30802,"depth":166,"text":30803,"children":32025},[32026,32027,32028,32029],{"id":30813,"depth":178,"text":30813},{"id":30905,"depth":178,"text":30906},{"id":30929,"depth":178,"text":30929},{"id":30989,"depth":178,"text":30990},{"id":31004,"depth":166,"text":31005,"children":32031},[32032,32033,32034,32035],{"id":31011,"depth":178,"text":31011},{"id":31088,"depth":178,"text":31089},{"id":31113,"depth":178,"text":31113},{"id":31128,"depth":178,"text":31129},{"id":31147,"depth":166,"text":31148,"children":32037},[32038,32039,32040,32041,32042],{"id":31154,"depth":178,"text":31155},{"id":31199,"depth":178,"text":31200},{"id":31241,"depth":178,"text":31242},{"id":31283,"depth":178,"text":31284},{"id":31387,"depth":178,"text":31388},{"id":13143,"depth":166,"text":13143,"children":32044},[32045,32046,32047,32048,32049,32050],{"id":31810,"depth":178,"text":31811},{"id":31833,"depth":178,"text":31833},{"id":31850,"depth":178,"text":31851},{"id":31857,"depth":178,"text":31857},{"id":31866,"depth":178,"text":31866},{"id":31890,"depth":178,"text":31890},{"id":9036,"depth":166,"text":9036,"children":32052},[32053,32054,32055,32056,32057],{"id":31900,"depth":178,"text":31901},{"id":31907,"depth":178,"text":31908},{"id":31921,"depth":178,"text":31922},{"id":31933,"depth":178,"text":31934},{"id":31944,"depth":178,"text":31945},{"id":31953,"depth":166,"text":31954},"掌握 Seedance 2.0 的 @Tag 引用系统。学习图像、视频和音频标签语法，附带真实示例和提示词模板。免费开始使用。",{"date":13443,"image":32061,"seoTitle":32062},"/screenshot-20260220-193326.png","Seedance 2.0 @Tags 指南：多模态引用系统详解","/zh/blog/seedance-2-multimodal-tags-guide",{"title":13377,"description":32059},"zh/blog/seedance-2-multimodal-tags-guide","pQHVpD5JsDRhN0TrQwLeVf8clJVl1i_BkBF1ZAuGEyI",{"id":32068,"title":13367,"body":32069,"description":38434,"extension":11248,"meta":38435,"navigation":58,"path":38438,"seo":38439,"stem":38440,"__hash__":38441},"content/zh/blog/seedance-2-prompt-guide.md",{"type":8,"value":32070,"toc":38385},[32071,32078,32086,32101,32113,32115,32118,32121,32126,32203,32206,32215,32218,32223,32227,32233,32236,32260,32263,32269,32274,32277,32282,32288,32293,32299,32302,32322,32330,32337,32341,32347,32353,32359,32365,32368,32372,32375,32380,32859,32862,32869,32883,32885,32889,32894,32897,32945,32948,32954,32958,33043,33047,33121,33125,33182,33185,33188,33285,33292,33294,33298,33301,33305,33311,33315,33548,33552,33557,33561,33797,33801,33806,33811,34042,34045,34049,34059,34063,34292,34296,34304,34308,34582,34586,34594,34598,34839,34843,34852,34856,35188,35192,35196,35205,35210,35498,35502,35507,35512,35779,35783,35788,35792,36048,36052,36057,36062,36304,36307,36311,36316,36489,36493,36498,36671,36679,36681,36685,36874,36880,36882,36886,36889,36892,37180,37183,37186,37189,37229,37232,37235,37259,37265,37268,37271,37290,37301,37304,37307,37416,37419,37422,37425,37596,37599,37619,37621,37625,37628,37631,37758,37761,37764,37904,37907,37910,38066,38074,38076,38078,38082,38085,38089,38092,38121,38125,38139,38143,38146,38149,38160,38165,38169,38172,38183,38187,38201,38205,38208,38233,38237,38254,38258,38265,38269,38301,38305,38308,38325,38327,38330,38333,38336,38339,38350,38360,38375,38377,38382],[11,32072,32073,32074,32077],{},"Seedance 2.0 在单个提示词中即可接受文本、图像、视频片段和音频文件。要获得电影级效果，关键在于如何构建提示词结构，以及如何使用 ",[28,32075,32076],{},"@Tags"," 引用已上传的媒体文件。",[11,32079,32080,32081,32085],{},"基于字节跳动的 ",[37,32082,32084],{"href":17333,"rel":32083},[41],"Seed 视频基础模型","，Seedance 2.0 是目前通过 API 可用的最强大的多模态视频生成模型。",[11,32087,32088,32089,32092,32093,32096,32097,32100],{},"本指南详细拆解 ",[23,32090,32091],{},"Seedance 2.0 提示词公式","，解释 ",[28,32094,32095],{},"@Tag"," 引用系统，并提供 ",[23,32098,32099],{},"15+ 可直接复制使用的提示词模板","，附带可运行的 Python API 代码。",[18,32102,32103],{},[11,32104,32105,2423,32108,32112],{},[23,32106,32107],{},"跟着代码示例操作：",[37,32109,32111],{"href":211,"rel":32110},[41],"在 EvoLink 获取免费 API Key","，即可运行下方所有代码片段。",[45,32114],{},[48,32116,32091],{"id":32117},"seedance-20-提示词公式",[11,32119,32120],{},"每一条有效的 Seedance 提示词都遵循五段式结构：",[11,32122,32123],{},[23,32124,32125],{},"主体 + 动作 + 镜头 + 风格 + 约束",[2036,32127,32128,32140],{},[2039,32129,32130],{},[2042,32131,32132,32135,32138],{},[2045,32133,32134],{},"组成部分",[2045,32136,32137],{},"控制内容",[2045,32139,11442],{},[2052,32141,32142,32154,32167,32179,32191],{},[2042,32143,32144,32148,32151],{},[2057,32145,32146],{},[23,32147,13202],{},[2057,32149,32150],{},"画面中是谁或什么",[2057,32152,32153],{},"\"穿着白色宇航服站在火星上的宇航员\"",[2042,32155,32156,32161,32164],{},[2057,32157,32158],{},[23,32159,32160],{},"动作",[2057,32162,32163],{},"运动与事件",[2057,32165,32166],{},"\"向前迈步走下陨石坑边缘\"",[2042,32168,32169,32173,32176],{},[2057,32170,32171],{},[23,32172,13198],{},[2057,32174,32175],{},"角度、运动、镜头焦距",[2057,32177,32178],{},"\"极宽广角，缓慢推入至特写\"",[2042,32180,32181,32185,32188],{},[2057,32182,32183],{},[23,32184,24489],{},[2057,32186,32187],{},"视觉美学",[2057,32189,32190],{},"\"科幻史诗，IMAX 70mm，去饱和青橙色调\"",[2042,32192,32193,32197,32200],{},[2057,32194,32195],{},[23,32196,3221],{},[2057,32198,32199],{},"时长、分辨率、氛围",[2057,32201,32202],{},"\"10 秒，逼真扬尘物理效果，宇航服设计保持一致\"",[92,32204,32205],{"id":32205},"这套公式为何有效",[11,32207,32208,32209,32214],{},"Seedance 2.0 采用双分支 ",[37,32210,32213],{"href":32211,"rel":32212},"https://arxiv.org/abs/2212.09748",[41],"Diffusion Transformer"," 架构。一个分支处理空间信息（物体外观），另一个分支处理时序信息（物体如何随时间运动）。结构清晰的提示词能够为两个分支提供明确的输入。",[11,32216,32217],{},"模糊提示词（例如\"一辆酷炫汽车的视频\"）会迫使模型猜测空间与时序细节。结构化提示词则消除了这种猜测。",[11,32219,32220,32221,298],{},"完整的 API 参数说明请参阅",[37,32222,1261],{"href":14322},[92,32224,32226],{"id":32225},"进阶分镜脚本格式","进阶：分镜脚本格式",[11,32228,32229,32230,298],{},"五段式公式是很好的起点，但 Seedance 2.0 效果最佳的输出——那些在社交媒体上广泛传播的内容——使用的是更强大的格式：",[23,32231,32232],{},"分镜脚本",[11,32234,32235],{},"分镜脚本在基础公式之上新增三个层次：",[70,32237,32238,32248,32254],{},[73,32239,32240,32243,32244,32247],{},[23,32241,32242],{},"时间码"," — 将视频拆分为 3-5 秒片段，并加入明确的 ",[28,32245,32246],{},"[00:00-00:05]"," 标记",[73,32249,32250,32253],{},[23,32251,32252],{},"镜头语言"," — 为每个镜头命名并说明其功能：\"镜头 1：规模感（超广角）\"",[73,32255,32256,32259],{},[23,32257,32258],{},"风格锚点 + 物理细节"," — 锚定至特定导演或电影风格，并描述物理反应而非抽象概念",[11,32261,32262],{},"基本结构如下：",[136,32264,32267],{"className":32265,"code":32266,"language":2183},[2181],"【风格】特定风格锚点（导演姓名 / 电影风格 / 艺术流派）\n【时长】总时长\n\n[00:00-00:04] 镜头 1：镜头名称（镜头类型）。\n场景描述，包含物理细节。\n角色动作，包含具体肢体语言。\n音效提示。\n\n[00:04-00:07] 镜头 2：镜头名称（镜头类型）。\n...\n\n[00:07-00:10] 镜头 3：镜头名称（镜头类型）。\n...\n\n一致性约束。物理要求。色调说明。\n",[28,32268,32266],{"__ignoreMap":141},[32270,32271,32273],"h4",{"id":32272},"基础公式-vs-分镜脚本对比示例","基础公式 vs. 分镜脚本：对比示例",[11,32275,32276],{},"同样是\"火星宇航员\"这一概念，两种写法对比如下：",[11,32278,32279],{},[23,32280,32281],{},"基础公式（适合新手）：",[136,32283,32286],{"className":32284,"code":32285,"language":2183},[2181],"An astronaut in a white spacesuit stands at the edge of a Mars crater.\nRed dust blows across the visor. Camera slowly pushes in to reveal\nEarth reflected in the helmet. Sci-fi epic style, desaturated\nteal-orange palette. 10 seconds.\n",[28,32287,32285],{"__ignoreMap":141},[11,32289,32290],{},[23,32291,32292],{},"分镜脚本（顶级创作者常用）：",[136,32294,32297],{"className":32295,"code":32296,"language":2183},[2181],"【Style】Denis Villeneuve Sci-Fi Epic, IMAX 70mm, desaturated teal-orange palette.\n【Duration】10 seconds\n\n[00:00-00:04] Shot 1: The Scale (Extreme Wide Shot).\nA lone astronaut in a white spacesuit stands at the edge of an enormous\ncrater on Mars. Red dust blows across the visor in gusts. The crater\nstretches to the horizon — the scale of nature dwarfs the human figure\ncompletely. Deep rumbling bass audio.\n\n[00:04-00:07] Shot 2: The Discovery (Push-in to Close-up).\nCamera slowly pushes from the wide shot into a tight close-up of the\nastronaut's helmet visor. In the curved reflection, we see Earth — tiny,\nblue, impossibly far away. The astronaut's breathing is audible.\nAnamorphic lens flare streaks across the frame.\n\n[00:07-00:10] Shot 3: The Decision (Low Angle, Static).\nFrom below, the astronaut steps forward off the crater edge — a leap of\nfaith into the unknown. Dust particles float in slow motion around the\nboots. Camera holds steady as the figure descends. Cut to black.\n\nConsistent spacesuit design. Realistic Mars dust physics. Epic\norchestral audio swell on final shot.\n",[28,32298,32296],{"__ignoreMap":141},[32270,32300,32301],{"id":32301},"分镜脚本效果更好的三大原因",[70,32303,32304,32310,32316],{},[73,32305,32306,32309],{},[23,32307,32308],{},"时序精准。"," 时间码告诉 Seedance 每个动作发生的确切时刻。没有时间码，模型会随机分配动作的发生时间。",[73,32311,32312,32315],{},[23,32313,32314],{},"叙事弧线。"," 命名镜头迫使你建立故事结构：铺垫 → 发现 → 高潮。当模型理解情感递进时，生成的运动更具感染力。",[73,32317,32318,32321],{},[23,32319,32320],{},"物理锚定。"," \"靴子周围灰尘颗粒以慢动作漂浮\"这样的细节，为物理引擎提供了具体约束，而非模糊的美学描述。",[11,32323,32324,32329],{},[37,32325,32328],{"href":32326,"rel":32327},"https://github.com/EvoLinkAI/awesome-seedance-2-guide",[41],"awesome-seedance"," 社区中的顶级创作者，在其最佳作品中一贯使用分镜脚本格式——从赛车场景到艺术风格转换皆如此。规律显而易见：结构化时间码 + 具体风格锚点 = 电影级输出。",[11,32331,32332,32333,32336],{},"我们在",[37,32334,32335],{"href":3849},"镜头运动复现指南","中逐步拆解了这些镜头技巧。",[92,32338,32340],{"id":32339},"纯文本-vs-多模态提示词","纯文本 vs. 多模态提示词",[11,32342,32343,32346],{},[23,32344,32345],{},"纯文本提示词","完全依靠语言描述场景：",[136,32348,32351],{"className":32349,"code":32350,"language":2183},[2181],"A red sports car drifts around a mountain curve, tires smoking,\ndrone shot tracking from above, cinematic color grading, 10 seconds\n",[28,32352,32350],{"__ignoreMap":141},[11,32354,32355,32358],{},[23,32356,32357],{},"多模态提示词","将文本与上传的参考文件相结合：",[136,32360,32363],{"className":32361,"code":32362,"language":2183},[2181],"@Image1 as first frame, car drifts around the curve following\n@Video1 camera path, @Audio1 as engine sound, cinematic grading, 10 seconds\n",[28,32364,32362],{"__ignoreMap":141},[11,32366,32367],{},"多模态版本为 Seedance 2.0 提供了精确的视觉锚点，而不是依靠模型对\"红色跑车\"的自行理解。",[92,32369,32371],{"id":32370},"你的第一个-seedance-20-提示词api-示例","你的第一个 Seedance 2.0 提示词——API 示例",[11,32373,32374],{},"以下是一个使用分镜脚本格式的完整文本生成视频 API 调用：",[56,32376,60,32377],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,32378],{"src":32379,"type":65},"https://cdn.evolink.ai/seedance2api/%E8%B5%9B%E8%BD%A6%E7%94%B5%E5%BD%B1%E6%84%9F.mp4",[136,32381,32383],{"className":339,"code":32382,"language":341,"meta":141,"style":141},"import requests\nimport os\nimport time\n\nAPI_KEY = os.environ.get(\"SEEDANCE_API_KEY\")\nBASE_URL = \"https://api.evolink.ai/v1\"\n\n# Submit generation task\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"【Style】Hollywood Professional Racing Movie, Cinematic Night, Rain.\\n\"\n            \"【Duration】10 seconds\\n\\n\"\n            \"[00:00-00:03] Shot 1: The Veteran (Interior/Close-up).\\n\"\n            \"Rain hammers the windshield of a high-tech race car on a night track. \"\n            \"Inside the cockpit, the veteran driver in a black helmet looks sideways \"\n            \"at his rival. Dashboard instruments glow green on his visor.\\n\"\n            \"Dialogue Cue: He gives a subtle nod and mouths 'Let's go.'\\n\\n\"\n            \"[00:03-00:06] Shot 2: The Challenger (Interior/Close-up).\\n\"\n            \"Cut to the rival car. A younger driver grips the steering wheel with \"\n            \"white knuckles. Raindrops streak across the side window. Eyes wide with \"\n            \"adrenaline through the visor slit.\\n\"\n            \"Dialogue Cue: He whispers 'Focus' to himself.\\n\\n\"\n            \"[00:06-00:10] Shot 3: The Green Light (Wide Action Shot).\\n\"\n            \"Starting lights turn GREEN. Both cars launch forward in sync on gleaming \"\n            \"wet asphalt. Massive water rooster tails spray behind them. Rain hits \"\n            \"the camera lens. Motion blur turns stadium lights into long golden streaks.\\n\\n\"\n            \"Consistent car designs. Realistic rain physics, water reflections. \"\n            \"Tension-building audio.\"\n        ),\n        \"duration\": 10,\n        \"quality\": \"1080p\"\n    }\n)\ntask = response.json()\ntask_id = task[\"id\"]\n\n# Poll for result\nwhile True:\n    status = requests.get(\n        f\"{BASE_URL}/tasks/{task_id}\",\n        headers={\"Authorization\": f\"Bearer {API_KEY}\"}\n    ).json()\n    if status[\"status\"] == \"completed\":\n        print(f\"Video ready: {status['results'][0]}\")\n        break\n    elif status[\"status\"] == \"failed\":\n        print(f\"Error: {status['error']}\")\n        break\n    time.sleep(5)\n",[28,32384,32385,32391,32397,32403,32407,32421,32429,32433,32438,32446,32458,32480,32488,32498,32504,32513,32522,32531,32536,32541,32550,32559,32568,32573,32578,32587,32596,32605,32610,32615,32624,32629,32634,32638,32648,32657,32661,32665,32673,32685,32689,32694,32702,32710,32730,32752,32757,32774,32803,32807,32823,32847,32851],{"__ignoreMap":141},[145,32386,32387,32389],{"class":147,"line":148},[145,32388,348],{"class":259},[145,32390,329],{"class":263},[145,32392,32393,32395],{"class":147,"line":166},[145,32394,348],{"class":259},[145,32396,364],{"class":263},[145,32398,32399,32401],{"class":147,"line":178},[145,32400,348],{"class":259},[145,32402,357],{"class":263},[145,32404,32405],{"class":147,"line":187},[145,32406,377],{"emptyLinePlaceholder":58},[145,32408,32409,32411,32413,32416,32419],{"class":147,"line":374},[145,32410,389],{"class":155},[145,32412,392],{"class":259},[145,32414,32415],{"class":263}," os.environ.get(",[145,32417,32418],{"class":159},"\"SEEDANCE_API_KEY\"",[145,32420,407],{"class":263},[145,32422,32423,32425,32427],{"class":147,"line":380},[145,32424,413],{"class":155},[145,32426,392],{"class":259},[145,32428,418],{"class":159},[145,32430,32431],{"class":147,"line":386},[145,32432,377],{"emptyLinePlaceholder":58},[145,32434,32435],{"class":147,"line":410},[145,32436,32437],{"class":174},"# Submit generation task\n",[145,32439,32440,32442,32444],{"class":147,"line":421},[145,32441,6508],{"class":263},[145,32443,267],{"class":259},[145,32445,1433],{"class":263},[145,32447,32448,32450,32452,32454,32456],{"class":147,"line":432},[145,32449,6517],{"class":259},[145,32451,450],{"class":159},[145,32453,679],{"class":155},[145,32455,1445],{"class":159},[145,32457,453],{"class":263},[145,32459,32460,32462,32464,32466,32468,32470,32472,32474,32476,32478],{"class":147,"line":456},[145,32461,6530],{"class":701},[145,32463,267],{"class":259},[145,32465,685],{"class":263},[145,32467,31432],{"class":159},[145,32469,438],{"class":263},[145,32471,441],{"class":259},[145,32473,444],{"class":159},[145,32475,447],{"class":155},[145,32477,450],{"class":159},[145,32479,19515],{"class":263},[145,32481,32482,32484,32486],{"class":147,"line":467},[145,32483,6541],{"class":701},[145,32485,267],{"class":259},[145,32487,1865],{"class":263},[145,32489,32490,32492,32494,32496],{"class":147,"line":600},[145,32491,1304],{"class":159},[145,32493,438],{"class":263},[145,32495,1309],{"class":159},[145,32497,453],{"class":263},[145,32499,32500,32502],{"class":147,"line":605},[145,32501,1320],{"class":159},[145,32503,1323],{"class":263},[145,32505,32506,32509,32511],{"class":147,"line":611},[145,32507,32508],{"class":159},"            \"【Style】Hollywood Professional Racing Movie, Cinematic Night, Rain.",[145,32510,1671],{"class":155},[145,32512,951],{"class":159},[145,32514,32515,32518,32520],{"class":147,"line":617},[145,32516,32517],{"class":159},"            \"【Duration】10 seconds",[145,32519,12085],{"class":155},[145,32521,951],{"class":159},[145,32523,32524,32527,32529],{"class":147,"line":623},[145,32525,32526],{"class":159},"            \"[00:00-00:03] Shot 1: The Veteran (Interior/Close-up).",[145,32528,1671],{"class":155},[145,32530,951],{"class":159},[145,32532,32533],{"class":147,"line":628},[145,32534,32535],{"class":159},"            \"Rain hammers the windshield of a high-tech race car on a night track. \"\n",[145,32537,32538],{"class":147,"line":639},[145,32539,32540],{"class":159},"            \"Inside the cockpit, the veteran driver in a black helmet looks sideways \"\n",[145,32542,32543,32546,32548],{"class":147,"line":654},[145,32544,32545],{"class":159},"            \"at his rival. Dashboard instruments glow green on his visor.",[145,32547,1671],{"class":155},[145,32549,951],{"class":159},[145,32551,32552,32555,32557],{"class":147,"line":660},[145,32553,32554],{"class":159},"            \"Dialogue Cue: He gives a subtle nod and mouths 'Let's go.'",[145,32556,12085],{"class":155},[145,32558,951],{"class":159},[145,32560,32561,32564,32566],{"class":147,"line":671},[145,32562,32563],{"class":159},"            \"[00:03-00:06] Shot 2: The Challenger (Interior/Close-up).",[145,32565,1671],{"class":155},[145,32567,951],{"class":159},[145,32569,32570],{"class":147,"line":698},[145,32571,32572],{"class":159},"            \"Cut to the rival car. A younger driver grips the steering wheel with \"\n",[145,32574,32575],{"class":147,"line":710},[145,32576,32577],{"class":159},"            \"white knuckles. Raindrops streak across the side window. Eyes wide with \"\n",[145,32579,32580,32583,32585],{"class":147,"line":716},[145,32581,32582],{"class":159},"            \"adrenaline through the visor slit.",[145,32584,1671],{"class":155},[145,32586,951],{"class":159},[145,32588,32589,32592,32594],{"class":147,"line":722},[145,32590,32591],{"class":159},"            \"Dialogue Cue: He whispers 'Focus' to himself.",[145,32593,12085],{"class":155},[145,32595,951],{"class":159},[145,32597,32598,32601,32603],{"class":147,"line":728},[145,32599,32600],{"class":159},"            \"[00:06-00:10] Shot 3: The Green Light (Wide Action Shot).",[145,32602,1671],{"class":155},[145,32604,951],{"class":159},[145,32606,32607],{"class":147,"line":739},[145,32608,32609],{"class":159},"            \"Starting lights turn GREEN. Both cars launch forward in sync on gleaming \"\n",[145,32611,32612],{"class":147,"line":744},[145,32613,32614],{"class":159},"            \"wet asphalt. Massive water rooster tails spray behind them. Rain hits \"\n",[145,32616,32617,32620,32622],{"class":147,"line":750},[145,32618,32619],{"class":159},"            \"the camera lens. Motion blur turns stadium lights into long golden streaks.",[145,32621,12085],{"class":155},[145,32623,951],{"class":159},[145,32625,32626],{"class":147,"line":767},[145,32627,32628],{"class":159},"            \"Consistent car designs. Realistic rain physics, water reflections. \"\n",[145,32630,32631],{"class":147,"line":788},[145,32632,32633],{"class":159},"            \"Tension-building audio.\"\n",[145,32635,32636],{"class":147,"line":834},[145,32637,1343],{"class":263},[145,32639,32640,32642,32644,32646],{"class":147,"line":839},[145,32641,1348],{"class":159},[145,32643,438],{"class":263},[145,32645,537],{"class":155},[145,32647,453],{"class":263},[145,32649,32650,32652,32654],{"class":147,"line":845},[145,32651,1364],{"class":159},[145,32653,438],{"class":263},[145,32655,32656],{"class":159},"\"1080p\"\n",[145,32658,32659],{"class":147,"line":863},[145,32660,1408],{"class":263},[145,32662,32663],{"class":147,"line":872},[145,32664,407],{"class":263},[145,32666,32667,32669,32671],{"class":147,"line":887},[145,32668,6554],{"class":263},[145,32670,267],{"class":259},[145,32672,736],{"class":263},[145,32674,32675,32677,32679,32681,32683],{"class":147,"line":903},[145,32676,12163],{"class":263},[145,32678,267],{"class":259},[145,32680,758],{"class":263},[145,32682,1627],{"class":159},[145,32684,764],{"class":263},[145,32686,32687],{"class":147,"line":915},[145,32688,377],{"emptyLinePlaceholder":58},[145,32690,32691],{"class":147,"line":954},[145,32692,32693],{"class":174},"# Poll for result\n",[145,32695,32696,32698,32700],{"class":147,"line":960},[145,32697,31624],{"class":259},[145,32699,14792],{"class":155},[145,32701,860],{"class":263},[145,32703,32704,32706,32708],{"class":147,"line":965},[145,32705,7215],{"class":263},[145,32707,267],{"class":259},[145,32709,668],{"class":263},[145,32711,32712,32714,32716,32718,32720,32722,32724,32726,32728],{"class":147,"line":971},[145,32713,1438],{"class":259},[145,32715,450],{"class":159},[145,32717,679],{"class":155},[145,32719,682],{"class":159},[145,32721,685],{"class":155},[145,32723,688],{"class":263},[145,32725,691],{"class":155},[145,32727,450],{"class":159},[145,32729,453],{"class":263},[145,32731,32732,32734,32736,32738,32740,32742,32744,32746,32748,32750],{"class":147,"line":977},[145,32733,1456],{"class":701},[145,32735,267],{"class":259},[145,32737,685],{"class":263},[145,32739,31432],{"class":159},[145,32741,438],{"class":263},[145,32743,441],{"class":259},[145,32745,444],{"class":159},[145,32747,447],{"class":155},[145,32749,450],{"class":159},[145,32751,470],{"class":263},[145,32753,32754],{"class":147,"line":989},[145,32755,32756],{"class":263},"    ).json()\n",[145,32758,32759,32761,32764,32766,32768,32770,32772],{"class":147,"line":994},[145,32760,2501],{"class":259},[145,32762,32763],{"class":263}," status[",[145,32765,761],{"class":159},[145,32767,14864],{"class":263},[145,32769,854],{"class":259},[145,32771,857],{"class":159},[145,32773,860],{"class":263},[145,32775,32776,32778,32780,32782,32784,32786,32789,32791,32793,32795,32797,32799,32801],{"class":147,"line":5521},[145,32777,791],{"class":155},[145,32779,794],{"class":263},[145,32781,441],{"class":259},[145,32783,11774],{"class":159},[145,32785,685],{"class":155},[145,32787,32788],{"class":263},"status[",[145,32790,11782],{"class":159},[145,32792,1563],{"class":263},[145,32794,783],{"class":155},[145,32796,1536],{"class":263},[145,32798,691],{"class":155},[145,32800,450],{"class":159},[145,32802,407],{"class":263},[145,32804,32805],{"class":147,"line":5527},[145,32806,31735],{"class":259},[145,32808,32809,32811,32813,32815,32817,32819,32821],{"class":147,"line":5555},[145,32810,7502],{"class":259},[145,32812,32763],{"class":263},[145,32814,761],{"class":159},[145,32816,14864],{"class":263},[145,32818,854],{"class":259},[145,32820,882],{"class":159},[145,32822,860],{"class":263},[145,32824,32825,32827,32829,32831,32833,32835,32837,32839,32841,32843,32845],{"class":147,"line":5586},[145,32826,791],{"class":155},[145,32828,794],{"class":263},[145,32830,441],{"class":259},[145,32832,31762],{"class":159},[145,32834,685],{"class":155},[145,32836,32788],{"class":263},[145,32838,11831],{"class":159},[145,32840,1536],{"class":263},[145,32842,691],{"class":155},[145,32844,450],{"class":159},[145,32846,407],{"class":263},[145,32848,32849],{"class":147,"line":5606},[145,32850,31735],{"class":259},[145,32852,32853,32855,32857],{"class":147,"line":5612},[145,32854,19827],{"class":263},[145,32856,1353],{"class":155},[145,32858,407],{"class":263},[11,32860,32861],{},"这段代码生成一个 10 秒、1080p、带原生音频的视频。分镜脚本为 Seedance 提供了清晰的时间码、镜头方向和物理细节，仅凭单个文本提示词就能生成一段电影级的三幕赛车序列。",[11,32863,32864,32865,32868],{},"初次使用 API？请先阅读",[37,32866,32867],{"href":17484},"快速入门指南","了解配置与认证。",[18,32870,32871],{},[11,32872,32873,32875,32876,2911,32878,2911,32880,32882],{},[23,32874,30461],{}," 以下所有代码示例使用相同的初始化设置。请从上方示例中复制 ",[28,32877,348],{},[28,32879,389],{},[28,32881,413],{}," 和轮询逻辑。我们仅展示包含独特提示词和参数的 API 调用部分。",[45,32884],{},[48,32886,32888],{"id":32887},"tag-引用系统详解","@Tag 引用系统详解",[11,32890,32891,32893],{},[28,32892,32095],{}," 系统是 Seedance 2.0 提示词实现真正多模态的核心。上传文件后，每个文件会根据其类型和上传顺序自动获得一个标签。",[92,32895,32896],{"id":32896},"语法规则",[96,32898,32899,32912,32925,32939],{},[73,32900,32901,2423,32904,2911,32906,32908,32909,32911],{},[23,32902,32903],{},"图像：",[28,32905,2903],{},[28,32907,2914],{},"……",[28,32910,2950],{},"（最多 9 张图像）",[73,32913,32914,2423,32917,2911,32919,2911,32921,32924],{},[23,32915,32916],{},"视频：",[28,32918,11391],{},[28,32920,13271],{},[28,32922,32923],{},"@Video3","（最多 3 个片段）",[73,32926,32927,2423,32930,2911,32932,2911,32935,32938],{},[23,32928,32929],{},"音频：",[28,32931,16467],{},[28,32933,32934],{},"@Audio2",[28,32936,32937],{},"@Audio3","（最多 3 个文件）",[73,32940,32941,32944],{},[23,32942,32943],{},"文件总数限制："," 每次请求最多 12 个文件",[11,32946,32947],{},"标签按各类型的上传顺序依次分配。提示词文本告诉 Seedance 如何使用每个引用。",[11,32949,32950,32951,298],{},"如需深入了解每种 @tag 模式及 8+ 实际案例，请参阅",[37,32952,32953],{"href":2962},"完整 @Tags 指南",[92,32955,32957],{"id":32956},"图像引用的-5-种用法","图像引用的 5 种用法",[2036,32959,32960,32972],{},[2039,32961,32962],{},[2042,32963,32964,32967,32970],{},[2045,32965,32966],{},"用法",[2045,32968,32969],{},"提示词语法",[2045,32971,2978],{},[2052,32973,32974,32987,33000,33014,33029],{},[2042,32975,32976,32980,32984],{},[2057,32977,32978],{},[23,32979,30629],{},[2057,32981,32982],{},[28,32983,2990],{},[2057,32985,32986],{},"视频从该图像开始",[2042,32988,32989,32993,32997],{},[2057,32990,32991],{},[23,32992,30643],{},[2057,32994,32995],{},[28,32996,3003],{},[2057,32998,32999],{},"视频以该图像结束",[2042,33001,33002,33007,33011],{},[2057,33003,33004],{},[23,33005,33006],{},"角色外观",[2057,33008,33009],{},[28,33010,3016],{},[2057,33012,33013],{},"在全程保持角色形象一致",[2042,33015,33016,33021,33026],{},[2057,33017,33018],{},[23,33019,33020],{},"场景环境",[2057,33022,33023],{},[28,33024,33025],{},"@Image1 as background environment",[2057,33027,33028],{},"将图像用作场景背景",[2042,33030,33031,33036,33040],{},[2057,33032,33033],{},[23,33034,33035],{},"风格 / 美学",[2057,33037,33038],{},[28,33039,3029],{},[2057,33041,33042],{},"匹配色调、质感、氛围",[92,33044,33046],{"id":33045},"视频引用的-4-种用法","视频引用的 4 种用法",[2036,33048,33049,33059],{},[2039,33050,33051],{},[2042,33052,33053,33055,33057],{},[2045,33054,32966],{},[2045,33056,32969],{},[2045,33058,2978],{},[2052,33060,33061,33076,33091,33106],{},[2042,33062,33063,33068,33073],{},[2057,33064,33065],{},[23,33066,33067],{},"镜头复现",[2057,33069,33070],{},[28,33071,33072],{},"follow @Video1 camera movement",[2057,33074,33075],{},"复制平移、俯仰、缩放方式",[2042,33077,33078,33083,33088],{},[2057,33079,33080],{},[23,33081,33082],{},"动作模仿",[2057,33084,33085],{},[28,33086,33087],{},"character moves like @Video1",[2057,33089,33090],{},"迁移肢体动作或舞蹈编排",[2042,33092,33093,33098,33103],{},[2057,33094,33095],{},[23,33096,33097],{},"特效复现",[2057,33099,33100],{},[28,33101,33102],{},"apply @Video1 transition effects",[2057,33104,33105],{},"匹配视觉特效与转场",[2042,33107,33108,33113,33118],{},[2057,33109,33110],{},[23,33111,33112],{},"节奏参考",[2057,33114,33115],{},[28,33116,33117],{},"match @Video1 pacing and cuts",[2057,33119,33120],{},"同步时序与场景节奏",[92,33122,33124],{"id":33123},"音频引用的-3-种用法","音频引用的 3 种用法",[2036,33126,33127,33137],{},[2039,33128,33129],{},[2042,33130,33131,33133,33135],{},[2045,33132,32966],{},[2045,33134,32969],{},[2045,33136,2978],{},[2052,33138,33139,33153,33167],{},[2042,33140,33141,33145,33150],{},[2057,33142,33143],{},[23,33144,31032],{},[2057,33146,33147],{},[28,33148,33149],{},"@Audio1 as background soundtrack",[2057,33151,33152],{},"以上传音乐渲染整体氛围",[2042,33154,33155,33159,33164],{},[2057,33156,33157],{},[23,33158,31047],{},[2057,33160,33161],{},[28,33162,33163],{},"@Audio1 as ambient sound",[2057,33165,33166],{},"添加特定音效",[2042,33168,33169,33174,33179],{},[2057,33170,33171],{},[23,33172,33173],{},"声音风格",[2057,33175,33176],{},[28,33177,33178],{},"@Audio1 as voice style reference",[2057,33180,33181],{},"匹配音色与语调节奏",[92,33183,33184],{"id":33184},"最优文件分配策略",[11,33186,33187],{},"在 12 个文件的限制内，以下是不同使用场景的参考分配方式：",[2036,33189,33190,33205],{},[2039,33191,33192],{},[2042,33193,33194,33197,33199,33201,33203],{},[2045,33195,33196],{},"使用场景",[2045,33198,30507],{},[2045,33200,30524],{},[2045,33202,30540],{},[2045,33204,30558],{},[2052,33206,33207,33223,33238,33255,33270],{},[2042,33208,33209,33212,33215,33218,33220],{},[2057,33210,33211],{},"产品广告",[2057,33213,33214],{},"4（产品各角度）",[2057,33216,33217],{},"1（镜头参考）",[2057,33219,13127],{},[2057,33221,33222],{},"6",[2042,33224,33225,33228,33231,33234,33236],{},[2057,33226,33227],{},"角色动画",[2057,33229,33230],{},"3（角色 + 场景）",[2057,33232,33233],{},"2（动作参考）",[2057,33235,13127],{},[2057,33237,33222],{},[2042,33239,33240,33243,33246,33249,33252],{},[2057,33241,33242],{},"MV 制作",[2057,33244,33245],{},"2（风格 + 角色）",[2057,33247,33248],{},"2（舞蹈参考）",[2057,33250,33251],{},"3（音轨）",[2057,33253,33254],{},"7",[2042,33256,33257,33260,33263,33266,33268],{},[2057,33258,33259],{},"多镜头叙事",[2057,33261,33262],{},"6（场景关键帧）",[2057,33264,33265],{},"1（风格参考）",[2057,33267,13127],{},[2057,33269,3691],{},[2042,33271,33272,33275,33278,33280,33283],{},[2057,33273,33274],{},"极致单镜头",[2057,33276,33277],{},"9（全角度）",[2057,33279,783],{},[2057,33281,33282],{},"3（音频层）",[2057,33284,16342],{},[18,33286,33287],{},[11,33288,33289,33291],{},[23,33290,11168],{}," 你很少需要用满 12 个插槽。更少但质量更高的参考文件，通常效果优于大量低质量参考。",[45,33293],{},[48,33295,33297],{"id":33296},"_15-即用-seedance-提示词模板","15+ 即用 Seedance 提示词模板",[92,33299,33300],{"id":33300},"文本生成视频模板",[32270,33302,33304],{"id":33303},"t1多角色对话短片","T1：多角色对话短片",[11,33306,33307,33310],{},[23,33308,33309],{},"描述："," 两个具有鲜明声音个性的动画角色进行生动对话，展示语音演技能力——以分镜脚本格式呈现。",[56,33312,60,33313],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,33314],{"src":31134,"type":65},[136,33316,33318],{"className":339,"code":33317,"language":341,"meta":141,"style":141},"# T1: 多角色对话 — 使用上方第一个示例的初始化设置\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"【Style】Pixar-quality 3D animation, warm color palette, expressive character acting.\\n\"\n            \"【Duration】12 seconds\\n\\n\"\n            \"[00:00-00:04] Shot 1: The Philosopher (Medium Close-up).\\n\"\n            \"A wise old cat in round spectacles sits at a cozy cafe table, paws wrapped \"\n            \"around a tiny porcelain cup. Steam curls upward. The cat speaks in a calm, \"\n            \"measured tone: 'Experience teaches patience, young friend.' Warm afternoon \"\n            \"light through the cafe window. Subtle ear twitch.\\n\\n\"\n            \"[00:04-00:08] Shot 2: The Adventurer (Medium Close-up, Reverse Shot).\\n\"\n            \"Cut to the opposite side of the table. An energetic young golden retriever \"\n            \"bounces in his seat, tail wagging visibly behind the chair. He leans forward \"\n            \"with wide eyes and responds: 'But adventure awaits right now!' His paws \"\n            \"gesture wildly, nearly knocking over a pastry plate.\\n\\n\"\n            \"[00:08-00:12] Shot 3: The Punchline (Wide Two-Shot).\\n\"\n            \"Camera pulls back to show both at the table. The cat calmly catches the \"\n            \"falling pastry with one paw without looking — places it back. The dog's jaw \"\n            \"drops in amazement. Beat of silence. Both burst into laughter.\\n\\n\"\n            \"Consistent character designs throughout. Distinct vocal timbres per character. \"\n            \"Warm cafe lighting with bokeh background.\"\n        ),\n        \"duration\": 12,\n        \"quality\": \"1080p\"\n    }\n)\n# 使用上方第一个示例中的轮询循环\n",[28,33319,33320,33325,33333,33345,33367,33375,33385,33391,33400,33409,33418,33423,33428,33433,33442,33451,33456,33461,33466,33475,33484,33489,33494,33503,33508,33513,33517,33527,33535,33539,33543],{"__ignoreMap":141},[145,33321,33322],{"class":147,"line":148},[145,33323,33324],{"class":174},"# T1: 多角色对话 — 使用上方第一个示例的初始化设置\n",[145,33326,33327,33329,33331],{"class":147,"line":166},[145,33328,6508],{"class":263},[145,33330,267],{"class":259},[145,33332,1433],{"class":263},[145,33334,33335,33337,33339,33341,33343],{"class":147,"line":178},[145,33336,6517],{"class":259},[145,33338,450],{"class":159},[145,33340,679],{"class":155},[145,33342,1445],{"class":159},[145,33344,453],{"class":263},[145,33346,33347,33349,33351,33353,33355,33357,33359,33361,33363,33365],{"class":147,"line":187},[145,33348,6530],{"class":701},[145,33350,267],{"class":259},[145,33352,685],{"class":263},[145,33354,31432],{"class":159},[145,33356,438],{"class":263},[145,33358,441],{"class":259},[145,33360,444],{"class":159},[145,33362,447],{"class":155},[145,33364,450],{"class":159},[145,33366,19515],{"class":263},[145,33368,33369,33371,33373],{"class":147,"line":374},[145,33370,6541],{"class":701},[145,33372,267],{"class":259},[145,33374,1865],{"class":263},[145,33376,33377,33379,33381,33383],{"class":147,"line":380},[145,33378,1304],{"class":159},[145,33380,438],{"class":263},[145,33382,1309],{"class":159},[145,33384,453],{"class":263},[145,33386,33387,33389],{"class":147,"line":386},[145,33388,1320],{"class":159},[145,33390,1323],{"class":263},[145,33392,33393,33396,33398],{"class":147,"line":410},[145,33394,33395],{"class":159},"            \"【Style】Pixar-quality 3D animation, warm color palette, expressive character acting.",[145,33397,1671],{"class":155},[145,33399,951],{"class":159},[145,33401,33402,33405,33407],{"class":147,"line":421},[145,33403,33404],{"class":159},"            \"【Duration】12 seconds",[145,33406,12085],{"class":155},[145,33408,951],{"class":159},[145,33410,33411,33414,33416],{"class":147,"line":432},[145,33412,33413],{"class":159},"            \"[00:00-00:04] Shot 1: The Philosopher (Medium Close-up).",[145,33415,1671],{"class":155},[145,33417,951],{"class":159},[145,33419,33420],{"class":147,"line":456},[145,33421,33422],{"class":159},"            \"A wise old cat in round spectacles sits at a cozy cafe table, paws wrapped \"\n",[145,33424,33425],{"class":147,"line":467},[145,33426,33427],{"class":159},"            \"around a tiny porcelain cup. Steam curls upward. The cat speaks in a calm, \"\n",[145,33429,33430],{"class":147,"line":600},[145,33431,33432],{"class":159},"            \"measured tone: 'Experience teaches patience, young friend.' Warm afternoon \"\n",[145,33434,33435,33438,33440],{"class":147,"line":605},[145,33436,33437],{"class":159},"            \"light through the cafe window. Subtle ear twitch.",[145,33439,12085],{"class":155},[145,33441,951],{"class":159},[145,33443,33444,33447,33449],{"class":147,"line":611},[145,33445,33446],{"class":159},"            \"[00:04-00:08] Shot 2: The Adventurer (Medium Close-up, Reverse Shot).",[145,33448,1671],{"class":155},[145,33450,951],{"class":159},[145,33452,33453],{"class":147,"line":617},[145,33454,33455],{"class":159},"            \"Cut to the opposite side of the table. An energetic young golden retriever \"\n",[145,33457,33458],{"class":147,"line":623},[145,33459,33460],{"class":159},"            \"bounces in his seat, tail wagging visibly behind the chair. He leans forward \"\n",[145,33462,33463],{"class":147,"line":628},[145,33464,33465],{"class":159},"            \"with wide eyes and responds: 'But adventure awaits right now!' His paws \"\n",[145,33467,33468,33471,33473],{"class":147,"line":639},[145,33469,33470],{"class":159},"            \"gesture wildly, nearly knocking over a pastry plate.",[145,33472,12085],{"class":155},[145,33474,951],{"class":159},[145,33476,33477,33480,33482],{"class":147,"line":654},[145,33478,33479],{"class":159},"            \"[00:08-00:12] Shot 3: The Punchline (Wide Two-Shot).",[145,33481,1671],{"class":155},[145,33483,951],{"class":159},[145,33485,33486],{"class":147,"line":660},[145,33487,33488],{"class":159},"            \"Camera pulls back to show both at the table. The cat calmly catches the \"\n",[145,33490,33491],{"class":147,"line":671},[145,33492,33493],{"class":159},"            \"falling pastry with one paw without looking — places it back. The dog's jaw \"\n",[145,33495,33496,33499,33501],{"class":147,"line":698},[145,33497,33498],{"class":159},"            \"drops in amazement. Beat of silence. Both burst into laughter.",[145,33500,12085],{"class":155},[145,33502,951],{"class":159},[145,33504,33505],{"class":147,"line":710},[145,33506,33507],{"class":159},"            \"Consistent character designs throughout. Distinct vocal timbres per character. \"\n",[145,33509,33510],{"class":147,"line":716},[145,33511,33512],{"class":159},"            \"Warm cafe lighting with bokeh background.\"\n",[145,33514,33515],{"class":147,"line":722},[145,33516,1343],{"class":263},[145,33518,33519,33521,33523,33525],{"class":147,"line":728},[145,33520,1348],{"class":159},[145,33522,438],{"class":263},[145,33524,16342],{"class":155},[145,33526,453],{"class":263},[145,33528,33529,33531,33533],{"class":147,"line":739},[145,33530,1364],{"class":159},[145,33532,438],{"class":263},[145,33534,32656],{"class":159},[145,33536,33537],{"class":147,"line":744},[145,33538,1408],{"class":263},[145,33540,33541],{"class":147,"line":750},[145,33542,407],{"class":263},[145,33544,33545],{"class":147,"line":767},[145,33546,33547],{"class":174},"# 使用上方第一个示例中的轮询循环\n",[32270,33549,33551],{"id":33550},"t2风格转换梵高名画复活","T2：风格转换——梵高名画复活",[11,33553,33554,33556],{},[23,33555,33309],{}," 将经典后印象派场景转化为呼吸运动的鲜活世界，展示通过提示词工程实现精准艺术风格控制的能力。",[56,33558,60,33559],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,33560],{"src":24330,"type":65},[136,33562,33564],{"className":339,"code":33563,"language":341,"meta":141,"style":141},"# T2: 风格转换——梵高名画复活 — 使用上方第一个示例的初始化设置\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"【Style】Van Gogh Post-Impressionism, thick impasto oil paint texture, \"\n            \"swirling brushstrokes, dreamy high-saturation.\\n\"\n            \"【Duration】10 seconds\\n\\n\"\n            \"[00:00-00:04] Shot 1: The Living Sky (Wide Shot, Slow Pan Up).\\n\"\n            \"A young woman in a flowing blue dress stands in a sunlit village square. \"\n            \"Behind her, cobblestone streets and rustic cottages are painted with thick, \"\n            \"visible brushstrokes. The entire sky swirls with golden celestial bodies \"\n            \"and flowing paint. Everything moves — the sky itself breathes.\\n\\n\"\n            \"[00:04-00:07] Shot 2: The Portrait Focus (Medium Shot, Slow Pan Down).\\n\"\n            \"Camera pushes in closer to the woman's face. Her features are rendered \"\n            \"in Van Gogh's distinctive style — bold brushstrokes define her cheekbones \"\n            \"and flowing hair. The village behind her shifts with painted texture, \"\n            \"windows glowing with warm yellow-orange light.\\n\\n\"\n            \"[00:07-00:10] Shot 3: The Immersion (Tracking Shot, Moving Into the Painting).\\n\"\n            \"Camera slowly pushes forward deeper into the painted world. We move past \"\n            \"the woman, through the village streets. Paint texture becomes visible at \"\n            \"close range. The entire world is alive with flowing brushstrokes.\\n\\n\"\n            \"Pure Van Gogh aesthetic throughout. No photorealism. Every surface is visible \"\n            \"oil paint. Blue-yellow-orange palette dominant.\"\n        ),\n        \"duration\": 10,\n        \"quality\": \"1080p\"\n    }\n)\n# 使用上方第一个示例中的轮询循环\n",[28,33565,33566,33571,33579,33591,33613,33621,33631,33637,33642,33651,33659,33668,33673,33678,33683,33692,33701,33706,33711,33716,33725,33734,33739,33744,33753,33758,33763,33767,33777,33785,33789,33793],{"__ignoreMap":141},[145,33567,33568],{"class":147,"line":148},[145,33569,33570],{"class":174},"# T2: 风格转换——梵高名画复活 — 使用上方第一个示例的初始化设置\n",[145,33572,33573,33575,33577],{"class":147,"line":166},[145,33574,6508],{"class":263},[145,33576,267],{"class":259},[145,33578,1433],{"class":263},[145,33580,33581,33583,33585,33587,33589],{"class":147,"line":178},[145,33582,6517],{"class":259},[145,33584,450],{"class":159},[145,33586,679],{"class":155},[145,33588,1445],{"class":159},[145,33590,453],{"class":263},[145,33592,33593,33595,33597,33599,33601,33603,33605,33607,33609,33611],{"class":147,"line":187},[145,33594,6530],{"class":701},[145,33596,267],{"class":259},[145,33598,685],{"class":263},[145,33600,31432],{"class":159},[145,33602,438],{"class":263},[145,33604,441],{"class":259},[145,33606,444],{"class":159},[145,33608,447],{"class":155},[145,33610,450],{"class":159},[145,33612,19515],{"class":263},[145,33614,33615,33617,33619],{"class":147,"line":374},[145,33616,6541],{"class":701},[145,33618,267],{"class":259},[145,33620,1865],{"class":263},[145,33622,33623,33625,33627,33629],{"class":147,"line":380},[145,33624,1304],{"class":159},[145,33626,438],{"class":263},[145,33628,1309],{"class":159},[145,33630,453],{"class":263},[145,33632,33633,33635],{"class":147,"line":386},[145,33634,1320],{"class":159},[145,33636,1323],{"class":263},[145,33638,33639],{"class":147,"line":410},[145,33640,33641],{"class":159},"            \"【Style】Van Gogh Post-Impressionism, thick impasto oil paint texture, \"\n",[145,33643,33644,33647,33649],{"class":147,"line":421},[145,33645,33646],{"class":159},"            \"swirling brushstrokes, dreamy high-saturation.",[145,33648,1671],{"class":155},[145,33650,951],{"class":159},[145,33652,33653,33655,33657],{"class":147,"line":432},[145,33654,32517],{"class":159},[145,33656,12085],{"class":155},[145,33658,951],{"class":159},[145,33660,33661,33664,33666],{"class":147,"line":456},[145,33662,33663],{"class":159},"            \"[00:00-00:04] Shot 1: The Living Sky (Wide Shot, Slow Pan Up).",[145,33665,1671],{"class":155},[145,33667,951],{"class":159},[145,33669,33670],{"class":147,"line":467},[145,33671,33672],{"class":159},"            \"A young woman in a flowing blue dress stands in a sunlit village square. \"\n",[145,33674,33675],{"class":147,"line":600},[145,33676,33677],{"class":159},"            \"Behind her, cobblestone streets and rustic cottages are painted with thick, \"\n",[145,33679,33680],{"class":147,"line":605},[145,33681,33682],{"class":159},"            \"visible brushstrokes. The entire sky swirls with golden celestial bodies \"\n",[145,33684,33685,33688,33690],{"class":147,"line":611},[145,33686,33687],{"class":159},"            \"and flowing paint. Everything moves — the sky itself breathes.",[145,33689,12085],{"class":155},[145,33691,951],{"class":159},[145,33693,33694,33697,33699],{"class":147,"line":617},[145,33695,33696],{"class":159},"            \"[00:04-00:07] Shot 2: The Portrait Focus (Medium Shot, Slow Pan Down).",[145,33698,1671],{"class":155},[145,33700,951],{"class":159},[145,33702,33703],{"class":147,"line":623},[145,33704,33705],{"class":159},"            \"Camera pushes in closer to the woman's face. Her features are rendered \"\n",[145,33707,33708],{"class":147,"line":628},[145,33709,33710],{"class":159},"            \"in Van Gogh's distinctive style — bold brushstrokes define her cheekbones \"\n",[145,33712,33713],{"class":147,"line":639},[145,33714,33715],{"class":159},"            \"and flowing hair. The village behind her shifts with painted texture, \"\n",[145,33717,33718,33721,33723],{"class":147,"line":654},[145,33719,33720],{"class":159},"            \"windows glowing with warm yellow-orange light.",[145,33722,12085],{"class":155},[145,33724,951],{"class":159},[145,33726,33727,33730,33732],{"class":147,"line":660},[145,33728,33729],{"class":159},"            \"[00:07-00:10] Shot 3: The Immersion (Tracking Shot, Moving Into the Painting).",[145,33731,1671],{"class":155},[145,33733,951],{"class":159},[145,33735,33736],{"class":147,"line":671},[145,33737,33738],{"class":159},"            \"Camera slowly pushes forward deeper into the painted world. We move past \"\n",[145,33740,33741],{"class":147,"line":698},[145,33742,33743],{"class":159},"            \"the woman, through the village streets. Paint texture becomes visible at \"\n",[145,33745,33746,33749,33751],{"class":147,"line":710},[145,33747,33748],{"class":159},"            \"close range. The entire world is alive with flowing brushstrokes.",[145,33750,12085],{"class":155},[145,33752,951],{"class":159},[145,33754,33755],{"class":147,"line":716},[145,33756,33757],{"class":159},"            \"Pure Van Gogh aesthetic throughout. No photorealism. Every surface is visible \"\n",[145,33759,33760],{"class":147,"line":722},[145,33761,33762],{"class":159},"            \"oil paint. Blue-yellow-orange palette dominant.\"\n",[145,33764,33765],{"class":147,"line":728},[145,33766,1343],{"class":263},[145,33768,33769,33771,33773,33775],{"class":147,"line":739},[145,33770,1348],{"class":159},[145,33772,438],{"class":263},[145,33774,537],{"class":155},[145,33776,453],{"class":263},[145,33778,33779,33781,33783],{"class":147,"line":744},[145,33780,1364],{"class":159},[145,33782,438],{"class":263},[145,33784,32656],{"class":159},[145,33786,33787],{"class":147,"line":750},[145,33788,1408],{"class":263},[145,33790,33791],{"class":147,"line":767},[145,33792,407],{"class":263},[145,33794,33795],{"class":147,"line":788},[145,33796,33547],{"class":174},[32270,33798,33800],{"id":33799},"t3情感表达动漫角色表演","T3：情感表达——动漫角色表演",[11,33802,33803,33805],{},[23,33804,33309],{}," 一个动漫风格角色阅读信件，伴随细腻的表情变化，展示纯文本提示词如何创作出层次丰富的角色表演。",[56,33807,60,33808],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,33809],{"src":33810,"type":65},"https://cdn.evolink.ai/seedance2api/%E5%8A%A8%E6%BC%AB%E4%BA%BA%E7%89%A9%E8%AF%BB%E4%BF%A1%E8%A1%A8%E6%83%85.mp4",[136,33812,33814],{"className":339,"code":33813,"language":341,"meta":141,"style":141},"# T3: 情感表达——动漫角色表演 — 使用上方第一个示例的初始化设置\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"【Style】High-quality anime, Studio Ghibli-inspired character animation, \"\n            \"detailed facial expressions.\\n\"\n            \"【Duration】12 seconds\\n\\n\"\n            \"[00:00-00:04] Shot 1: The Letter Arrives (Medium Close-up).\\n\"\n            \"A young anime girl with long black hair sits by a sunlit window. She holds \"\n            \"an unopened envelope with both hands, turning it over carefully. Her eyes \"\n            \"show curiosity mixed with anticipation. Soft morning light illuminates her face.\\n\\n\"\n            \"[00:04-00:08] Shot 2: The Reading (Close-up on Face).\\n\"\n            \"Camera pushes closer as she opens the letter and begins reading. Her \"\n            \"expression changes dramatically — eyes widening with surprise, then a slow \"\n            \"smile spreading across her face. Her lips part slightly as if to gasp. \"\n            \"Every micro-expression is clearly animated.\\n\\n\"\n            \"[00:08-00:12] Shot 3: The Joy (Medium Shot, Slight Pull Back).\\n\"\n            \"She clutches the letter to her chest and closes her eyes with pure happiness. \"\n            \"A single tear of joy rolls down her cheek. Cherry blossom petals drift past \"\n            \"the window behind her. Camera holds on her peaceful, radiant expression.\\n\\n\"\n            \"Consistent anime character design. Detailed emotional facial animation. \"\n            \"Natural lighting transitions.\"\n        ),\n        \"duration\": 12,\n        \"quality\": \"1080p\"\n    }\n)\n# 使用上方第一个示例中的轮询循环\n",[28,33815,33816,33821,33829,33841,33863,33871,33881,33887,33892,33901,33909,33918,33923,33928,33937,33946,33951,33956,33961,33970,33979,33984,33989,33998,34003,34008,34012,34022,34030,34034,34038],{"__ignoreMap":141},[145,33817,33818],{"class":147,"line":148},[145,33819,33820],{"class":174},"# T3: 情感表达——动漫角色表演 — 使用上方第一个示例的初始化设置\n",[145,33822,33823,33825,33827],{"class":147,"line":166},[145,33824,6508],{"class":263},[145,33826,267],{"class":259},[145,33828,1433],{"class":263},[145,33830,33831,33833,33835,33837,33839],{"class":147,"line":178},[145,33832,6517],{"class":259},[145,33834,450],{"class":159},[145,33836,679],{"class":155},[145,33838,1445],{"class":159},[145,33840,453],{"class":263},[145,33842,33843,33845,33847,33849,33851,33853,33855,33857,33859,33861],{"class":147,"line":187},[145,33844,6530],{"class":701},[145,33846,267],{"class":259},[145,33848,685],{"class":263},[145,33850,31432],{"class":159},[145,33852,438],{"class":263},[145,33854,441],{"class":259},[145,33856,444],{"class":159},[145,33858,447],{"class":155},[145,33860,450],{"class":159},[145,33862,19515],{"class":263},[145,33864,33865,33867,33869],{"class":147,"line":374},[145,33866,6541],{"class":701},[145,33868,267],{"class":259},[145,33870,1865],{"class":263},[145,33872,33873,33875,33877,33879],{"class":147,"line":380},[145,33874,1304],{"class":159},[145,33876,438],{"class":263},[145,33878,1309],{"class":159},[145,33880,453],{"class":263},[145,33882,33883,33885],{"class":147,"line":386},[145,33884,1320],{"class":159},[145,33886,1323],{"class":263},[145,33888,33889],{"class":147,"line":410},[145,33890,33891],{"class":159},"            \"【Style】High-quality anime, Studio Ghibli-inspired character animation, \"\n",[145,33893,33894,33897,33899],{"class":147,"line":421},[145,33895,33896],{"class":159},"            \"detailed facial expressions.",[145,33898,1671],{"class":155},[145,33900,951],{"class":159},[145,33902,33903,33905,33907],{"class":147,"line":432},[145,33904,33404],{"class":159},[145,33906,12085],{"class":155},[145,33908,951],{"class":159},[145,33910,33911,33914,33916],{"class":147,"line":456},[145,33912,33913],{"class":159},"            \"[00:00-00:04] Shot 1: The Letter Arrives (Medium Close-up).",[145,33915,1671],{"class":155},[145,33917,951],{"class":159},[145,33919,33920],{"class":147,"line":467},[145,33921,33922],{"class":159},"            \"A young anime girl with long black hair sits by a sunlit window. She holds \"\n",[145,33924,33925],{"class":147,"line":600},[145,33926,33927],{"class":159},"            \"an unopened envelope with both hands, turning it over carefully. Her eyes \"\n",[145,33929,33930,33933,33935],{"class":147,"line":605},[145,33931,33932],{"class":159},"            \"show curiosity mixed with anticipation. Soft morning light illuminates her face.",[145,33934,12085],{"class":155},[145,33936,951],{"class":159},[145,33938,33939,33942,33944],{"class":147,"line":611},[145,33940,33941],{"class":159},"            \"[00:04-00:08] Shot 2: The Reading (Close-up on Face).",[145,33943,1671],{"class":155},[145,33945,951],{"class":159},[145,33947,33948],{"class":147,"line":617},[145,33949,33950],{"class":159},"            \"Camera pushes closer as she opens the letter and begins reading. Her \"\n",[145,33952,33953],{"class":147,"line":623},[145,33954,33955],{"class":159},"            \"expression changes dramatically — eyes widening with surprise, then a slow \"\n",[145,33957,33958],{"class":147,"line":628},[145,33959,33960],{"class":159},"            \"smile spreading across her face. Her lips part slightly as if to gasp. \"\n",[145,33962,33963,33966,33968],{"class":147,"line":639},[145,33964,33965],{"class":159},"            \"Every micro-expression is clearly animated.",[145,33967,12085],{"class":155},[145,33969,951],{"class":159},[145,33971,33972,33975,33977],{"class":147,"line":654},[145,33973,33974],{"class":159},"            \"[00:08-00:12] Shot 3: The Joy (Medium Shot, Slight Pull Back).",[145,33976,1671],{"class":155},[145,33978,951],{"class":159},[145,33980,33981],{"class":147,"line":660},[145,33982,33983],{"class":159},"            \"She clutches the letter to her chest and closes her eyes with pure happiness. \"\n",[145,33985,33986],{"class":147,"line":671},[145,33987,33988],{"class":159},"            \"A single tear of joy rolls down her cheek. Cherry blossom petals drift past \"\n",[145,33990,33991,33994,33996],{"class":147,"line":698},[145,33992,33993],{"class":159},"            \"the window behind her. Camera holds on her peaceful, radiant expression.",[145,33995,12085],{"class":155},[145,33997,951],{"class":159},[145,33999,34000],{"class":147,"line":710},[145,34001,34002],{"class":159},"            \"Consistent anime character design. Detailed emotional facial animation. \"\n",[145,34004,34005],{"class":147,"line":716},[145,34006,34007],{"class":159},"            \"Natural lighting transitions.\"\n",[145,34009,34010],{"class":147,"line":722},[145,34011,1343],{"class":263},[145,34013,34014,34016,34018,34020],{"class":147,"line":728},[145,34015,1348],{"class":159},[145,34017,438],{"class":263},[145,34019,16342],{"class":155},[145,34021,453],{"class":263},[145,34023,34024,34026,34028],{"class":147,"line":739},[145,34025,1364],{"class":159},[145,34027,438],{"class":263},[145,34029,32656],{"class":159},[145,34031,34032],{"class":147,"line":744},[145,34033,1408],{"class":263},[145,34035,34036],{"class":147,"line":750},[145,34037,407],{"class":263},[145,34039,34040],{"class":147,"line":767},[145,34041,33547],{"class":174},[92,34043,34044],{"id":34044},"图像生成视频模板",[32270,34046,34048],{"id":34047},"i1产品广告高端耳机","I1：产品广告——高端耳机",[11,34050,34051,34053,34054,34056,34057,298],{},[23,34052,33309],{}," 将产品照片转化为具有动态色彩展示和棚拍级灯光效果的高端广告，使用 ",[28,34055,2903],{}," 作为首帧。更多产品视频工作流（包括批量生成），请参阅我们的",[37,34058,22959],{"href":3376},[56,34060,60,34061],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,34062],{"src":18365,"type":65},[136,34064,34066],{"className":339,"code":34065,"language":341,"meta":141,"style":141},"# I1: 产品广告——高端耳机 — 使用上方第一个示例的初始化设置\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"@Image1 as first frame.\\n\"\n            \"【Style】Premium product keynote, clean minimal aesthetic, commercial photography.\\n\"\n            \"【Duration】15 seconds\\n\\n\"\n            \"[00:00-00:02] Rapid four-frame flash cuts — black, blue, white, rose gold \"\n            \"headphones appear one by one in stylized freeze frames. Close-up on metallic \"\n            \"texture and premium finish. Voiceover: 'Sound that moves you.'\\n\\n\"\n            \"[00:02-00:06] Extreme close-up of the headphone hinge mechanism unfolding. \"\n            \"Precision engineering visible in slow motion. Studio lighting creates elegant \"\n            \"highlights on the metal surface.\\n\\n\"\n            \"[00:06-00:12] Quick-cut lifestyle montage. Urban professional commuting, \"\n            \"artist in creative studio, athlete training — each wearing different colored \"\n            \"headphones that match their aesthetic.\\n\\n\"\n            \"[00:12-00:15] All four headphones lined up on minimal white pedestal. Brand \"\n            \"text 'SoundPro Hear Everything' elegantly fades in at the bottom.\\n\\n\"\n            \"Maintain exact product proportions and details from @Image1. Commercial-grade \"\n            \"lighting. Clean, premium aesthetic throughout.\"\n        ),\n        \"image_urls\": [\"https://example.com/premium_headphones.jpg\"],\n        \"duration\": 15,\n        \"quality\": \"1080p\"\n    }\n)\n# 使用上方第一个示例中的轮询循环\n",[28,34067,34068,34073,34081,34093,34115,34123,34133,34139,34148,34157,34166,34171,34176,34185,34190,34195,34204,34209,34214,34223,34228,34237,34242,34247,34251,34262,34272,34280,34284,34288],{"__ignoreMap":141},[145,34069,34070],{"class":147,"line":148},[145,34071,34072],{"class":174},"# I1: 产品广告——高端耳机 — 使用上方第一个示例的初始化设置\n",[145,34074,34075,34077,34079],{"class":147,"line":166},[145,34076,6508],{"class":263},[145,34078,267],{"class":259},[145,34080,1433],{"class":263},[145,34082,34083,34085,34087,34089,34091],{"class":147,"line":178},[145,34084,6517],{"class":259},[145,34086,450],{"class":159},[145,34088,679],{"class":155},[145,34090,1445],{"class":159},[145,34092,453],{"class":263},[145,34094,34095,34097,34099,34101,34103,34105,34107,34109,34111,34113],{"class":147,"line":187},[145,34096,6530],{"class":701},[145,34098,267],{"class":259},[145,34100,685],{"class":263},[145,34102,31432],{"class":159},[145,34104,438],{"class":263},[145,34106,441],{"class":259},[145,34108,444],{"class":159},[145,34110,447],{"class":155},[145,34112,450],{"class":159},[145,34114,19515],{"class":263},[145,34116,34117,34119,34121],{"class":147,"line":374},[145,34118,6541],{"class":701},[145,34120,267],{"class":259},[145,34122,1865],{"class":263},[145,34124,34125,34127,34129,34131],{"class":147,"line":380},[145,34126,1304],{"class":159},[145,34128,438],{"class":263},[145,34130,1309],{"class":159},[145,34132,453],{"class":263},[145,34134,34135,34137],{"class":147,"line":386},[145,34136,1320],{"class":159},[145,34138,1323],{"class":263},[145,34140,34141,34144,34146],{"class":147,"line":410},[145,34142,34143],{"class":159},"            \"@Image1 as first frame.",[145,34145,1671],{"class":155},[145,34147,951],{"class":159},[145,34149,34150,34153,34155],{"class":147,"line":421},[145,34151,34152],{"class":159},"            \"【Style】Premium product keynote, clean minimal aesthetic, commercial photography.",[145,34154,1671],{"class":155},[145,34156,951],{"class":159},[145,34158,34159,34162,34164],{"class":147,"line":432},[145,34160,34161],{"class":159},"            \"【Duration】15 seconds",[145,34163,12085],{"class":155},[145,34165,951],{"class":159},[145,34167,34168],{"class":147,"line":456},[145,34169,34170],{"class":159},"            \"[00:00-00:02] Rapid four-frame flash cuts — black, blue, white, rose gold \"\n",[145,34172,34173],{"class":147,"line":467},[145,34174,34175],{"class":159},"            \"headphones appear one by one in stylized freeze frames. Close-up on metallic \"\n",[145,34177,34178,34181,34183],{"class":147,"line":600},[145,34179,34180],{"class":159},"            \"texture and premium finish. Voiceover: 'Sound that moves you.'",[145,34182,12085],{"class":155},[145,34184,951],{"class":159},[145,34186,34187],{"class":147,"line":605},[145,34188,34189],{"class":159},"            \"[00:02-00:06] Extreme close-up of the headphone hinge mechanism unfolding. \"\n",[145,34191,34192],{"class":147,"line":611},[145,34193,34194],{"class":159},"            \"Precision engineering visible in slow motion. Studio lighting creates elegant \"\n",[145,34196,34197,34200,34202],{"class":147,"line":617},[145,34198,34199],{"class":159},"            \"highlights on the metal surface.",[145,34201,12085],{"class":155},[145,34203,951],{"class":159},[145,34205,34206],{"class":147,"line":623},[145,34207,34208],{"class":159},"            \"[00:06-00:12] Quick-cut lifestyle montage. Urban professional commuting, \"\n",[145,34210,34211],{"class":147,"line":628},[145,34212,34213],{"class":159},"            \"artist in creative studio, athlete training — each wearing different colored \"\n",[145,34215,34216,34219,34221],{"class":147,"line":639},[145,34217,34218],{"class":159},"            \"headphones that match their aesthetic.",[145,34220,12085],{"class":155},[145,34222,951],{"class":159},[145,34224,34225],{"class":147,"line":654},[145,34226,34227],{"class":159},"            \"[00:12-00:15] All four headphones lined up on minimal white pedestal. Brand \"\n",[145,34229,34230,34233,34235],{"class":147,"line":660},[145,34231,34232],{"class":159},"            \"text 'SoundPro Hear Everything' elegantly fades in at the bottom.",[145,34234,12085],{"class":155},[145,34236,951],{"class":159},[145,34238,34239],{"class":147,"line":671},[145,34240,34241],{"class":159},"            \"Maintain exact product proportions and details from @Image1. Commercial-grade \"\n",[145,34243,34244],{"class":147,"line":698},[145,34245,34246],{"class":159},"            \"lighting. Clean, premium aesthetic throughout.\"\n",[145,34248,34249],{"class":147,"line":710},[145,34250,1343],{"class":263},[145,34252,34253,34255,34257,34260],{"class":147,"line":716},[145,34254,2683],{"class":159},[145,34256,10809],{"class":263},[145,34258,34259],{"class":159},"\"https://example.com/premium_headphones.jpg\"",[145,34261,10815],{"class":263},[145,34263,34264,34266,34268,34270],{"class":147,"line":722},[145,34265,1348],{"class":159},[145,34267,438],{"class":263},[145,34269,3898],{"class":155},[145,34271,453],{"class":263},[145,34273,34274,34276,34278],{"class":147,"line":728},[145,34275,1364],{"class":159},[145,34277,438],{"class":263},[145,34279,32656],{"class":159},[145,34281,34282],{"class":147,"line":739},[145,34283,1408],{"class":263},[145,34285,34286],{"class":147,"line":744},[145,34287,407],{"class":263},[145,34289,34290],{"class":147,"line":750},[145,34291,33547],{"class":174},[32270,34293,34295],{"id":34294},"i2角色动画画中贵妇的咖啡奇遇","I2：角色动画——画中贵妇的咖啡奇遇",[11,34297,34298,34300,34301,34303],{},[23,34299,33309],{}," 将画中角色带入迷人的偷喝咖啡场景，展示 ",[28,34302,2903],{}," 如何在魔幻叙事中保持角色外观的一致性。",[56,34305,60,34306],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,34307],{"src":18723,"type":65},[136,34309,34311],{"className":339,"code":34310,"language":341,"meta":141,"style":141},"# I2: 角色动画——画中贵妇的咖啡奇遇 — 使用上方第一个示例的初始化设置\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"@Image1 as character reference.\\n\"\n            \"【Style】Cinematic realism with magical elements, warm practical lighting.\\n\"\n            \"【Duration】15 seconds\\n\\n\"\n            \"[00:00-00:04] Shot 1: The Awakening (Medium Shot on Canvas).\\n\"\n            \"The painted noblewoman suddenly comes alive inside the canvas. Her eyes dart \"\n            \"left and right nervously. Her painted hand animates and pushes forward through \"\n            \"the surface of the painting, reaching out from inside the canvas to grab a coffee \"\n            \"cup sitting on the table in front of the frame.\\n\\n\"\n            \"[00:04-00:08] Shot 2: The Secret Sip (Close-up on Face and Hands).\\n\"\n            \"She takes a quick sip and shows a deeply satisfied expression. Her eyes close \"\n            \"with pleasure as she savors the taste. Steam from the hot coffee catches the \"\n            \"gallery lighting.\\n\\n\"\n            \"[00:08-00:12] Shot 3: The Panic (Wide Shot, Quick Action).\\n\"\n            \"Suddenly footsteps approach — she panics and quickly puts the coffee back. \"\n            \"A butler-like figure walks in, picks up the coffee from the table, and leaves. \"\n            \"The woman freezes back into painting pose.\\n\\n\"\n            \"[00:12-00:15] Shot 4: The Finale (Push-in to Product Shot).\\n\"\n            \"Camera pushes forward as the scene fades to a pure black background with a \"\n            \"single spotlight illuminating the coffee cup. Elegant text appears at the \"\n            \"bottom: 'Good coffee is worth the wait.'\\n\\n\"\n            \"Maintain @Image1 character appearance exactly. Seamless transitions between \"\n            \"painted and living states. Realistic coffee physics.\"\n        ),\n        \"image_urls\": [\"https://example.com/painted_noblewoman.jpg\"],\n        \"duration\": 15,\n        \"quality\": \"1080p\"\n    }\n)\n# 使用上方第一个示例中的轮询循环\n",[28,34312,34313,34318,34326,34338,34360,34368,34378,34384,34393,34402,34410,34419,34424,34429,34434,34443,34452,34457,34462,34471,34480,34485,34490,34499,34508,34513,34518,34527,34532,34537,34541,34552,34562,34570,34574,34578],{"__ignoreMap":141},[145,34314,34315],{"class":147,"line":148},[145,34316,34317],{"class":174},"# I2: 角色动画——画中贵妇的咖啡奇遇 — 使用上方第一个示例的初始化设置\n",[145,34319,34320,34322,34324],{"class":147,"line":166},[145,34321,6508],{"class":263},[145,34323,267],{"class":259},[145,34325,1433],{"class":263},[145,34327,34328,34330,34332,34334,34336],{"class":147,"line":178},[145,34329,6517],{"class":259},[145,34331,450],{"class":159},[145,34333,679],{"class":155},[145,34335,1445],{"class":159},[145,34337,453],{"class":263},[145,34339,34340,34342,34344,34346,34348,34350,34352,34354,34356,34358],{"class":147,"line":187},[145,34341,6530],{"class":701},[145,34343,267],{"class":259},[145,34345,685],{"class":263},[145,34347,31432],{"class":159},[145,34349,438],{"class":263},[145,34351,441],{"class":259},[145,34353,444],{"class":159},[145,34355,447],{"class":155},[145,34357,450],{"class":159},[145,34359,19515],{"class":263},[145,34361,34362,34364,34366],{"class":147,"line":374},[145,34363,6541],{"class":701},[145,34365,267],{"class":259},[145,34367,1865],{"class":263},[145,34369,34370,34372,34374,34376],{"class":147,"line":380},[145,34371,1304],{"class":159},[145,34373,438],{"class":263},[145,34375,1309],{"class":159},[145,34377,453],{"class":263},[145,34379,34380,34382],{"class":147,"line":386},[145,34381,1320],{"class":159},[145,34383,1323],{"class":263},[145,34385,34386,34389,34391],{"class":147,"line":410},[145,34387,34388],{"class":159},"            \"@Image1 as character reference.",[145,34390,1671],{"class":155},[145,34392,951],{"class":159},[145,34394,34395,34398,34400],{"class":147,"line":421},[145,34396,34397],{"class":159},"            \"【Style】Cinematic realism with magical elements, warm practical lighting.",[145,34399,1671],{"class":155},[145,34401,951],{"class":159},[145,34403,34404,34406,34408],{"class":147,"line":432},[145,34405,34161],{"class":159},[145,34407,12085],{"class":155},[145,34409,951],{"class":159},[145,34411,34412,34415,34417],{"class":147,"line":456},[145,34413,34414],{"class":159},"            \"[00:00-00:04] Shot 1: The Awakening (Medium Shot on Canvas).",[145,34416,1671],{"class":155},[145,34418,951],{"class":159},[145,34420,34421],{"class":147,"line":467},[145,34422,34423],{"class":159},"            \"The painted noblewoman suddenly comes alive inside the canvas. Her eyes dart \"\n",[145,34425,34426],{"class":147,"line":600},[145,34427,34428],{"class":159},"            \"left and right nervously. Her painted hand animates and pushes forward through \"\n",[145,34430,34431],{"class":147,"line":605},[145,34432,34433],{"class":159},"            \"the surface of the painting, reaching out from inside the canvas to grab a coffee \"\n",[145,34435,34436,34439,34441],{"class":147,"line":611},[145,34437,34438],{"class":159},"            \"cup sitting on the table in front of the frame.",[145,34440,12085],{"class":155},[145,34442,951],{"class":159},[145,34444,34445,34448,34450],{"class":147,"line":617},[145,34446,34447],{"class":159},"            \"[00:04-00:08] Shot 2: The Secret Sip (Close-up on Face and Hands).",[145,34449,1671],{"class":155},[145,34451,951],{"class":159},[145,34453,34454],{"class":147,"line":623},[145,34455,34456],{"class":159},"            \"She takes a quick sip and shows a deeply satisfied expression. Her eyes close \"\n",[145,34458,34459],{"class":147,"line":628},[145,34460,34461],{"class":159},"            \"with pleasure as she savors the taste. Steam from the hot coffee catches the \"\n",[145,34463,34464,34467,34469],{"class":147,"line":639},[145,34465,34466],{"class":159},"            \"gallery lighting.",[145,34468,12085],{"class":155},[145,34470,951],{"class":159},[145,34472,34473,34476,34478],{"class":147,"line":654},[145,34474,34475],{"class":159},"            \"[00:08-00:12] Shot 3: The Panic (Wide Shot, Quick Action).",[145,34477,1671],{"class":155},[145,34479,951],{"class":159},[145,34481,34482],{"class":147,"line":660},[145,34483,34484],{"class":159},"            \"Suddenly footsteps approach — she panics and quickly puts the coffee back. \"\n",[145,34486,34487],{"class":147,"line":671},[145,34488,34489],{"class":159},"            \"A butler-like figure walks in, picks up the coffee from the table, and leaves. \"\n",[145,34491,34492,34495,34497],{"class":147,"line":698},[145,34493,34494],{"class":159},"            \"The woman freezes back into painting pose.",[145,34496,12085],{"class":155},[145,34498,951],{"class":159},[145,34500,34501,34504,34506],{"class":147,"line":710},[145,34502,34503],{"class":159},"            \"[00:12-00:15] Shot 4: The Finale (Push-in to Product Shot).",[145,34505,1671],{"class":155},[145,34507,951],{"class":159},[145,34509,34510],{"class":147,"line":716},[145,34511,34512],{"class":159},"            \"Camera pushes forward as the scene fades to a pure black background with a \"\n",[145,34514,34515],{"class":147,"line":722},[145,34516,34517],{"class":159},"            \"single spotlight illuminating the coffee cup. Elegant text appears at the \"\n",[145,34519,34520,34523,34525],{"class":147,"line":728},[145,34521,34522],{"class":159},"            \"bottom: 'Good coffee is worth the wait.'",[145,34524,12085],{"class":155},[145,34526,951],{"class":159},[145,34528,34529],{"class":147,"line":739},[145,34530,34531],{"class":159},"            \"Maintain @Image1 character appearance exactly. Seamless transitions between \"\n",[145,34533,34534],{"class":147,"line":744},[145,34535,34536],{"class":159},"            \"painted and living states. Realistic coffee physics.\"\n",[145,34538,34539],{"class":147,"line":750},[145,34540,1343],{"class":263},[145,34542,34543,34545,34547,34550],{"class":147,"line":767},[145,34544,2683],{"class":159},[145,34546,10809],{"class":263},[145,34548,34549],{"class":159},"\"https://example.com/painted_noblewoman.jpg\"",[145,34551,10815],{"class":263},[145,34553,34554,34556,34558,34560],{"class":147,"line":788},[145,34555,1348],{"class":159},[145,34557,438],{"class":263},[145,34559,3898],{"class":155},[145,34561,453],{"class":263},[145,34563,34564,34566,34568],{"class":147,"line":834},[145,34565,1364],{"class":159},[145,34567,438],{"class":263},[145,34569,32656],{"class":159},[145,34571,34572],{"class":147,"line":839},[145,34573,1408],{"class":263},[145,34575,34576],{"class":147,"line":845},[145,34577,407],{"class":263},[145,34579,34580],{"class":147,"line":863},[145,34581,33547],{"class":174},[32270,34583,34585],{"id":34584},"i3风格迁移写实照片转水墨画","I3：风格迁移——写实照片转水墨画",[11,34587,34588,34590,34591,34593],{},[23,34589,33309],{}," 将写实风景照片转化为流动的传统中国水墨画，展示以 ",[28,34592,2903],{}," 作为场景构图参考的风格迁移能力。",[56,34595,60,34596],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,34597],{"src":25057,"type":65},[136,34599,34601],{"className":339,"code":34600,"language":341,"meta":141,"style":141},"# I3: 风格迁移——写实照片转水墨画 — 使用上方第一个示例的初始化设置\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"@Image1 as scene composition reference.\\n\"\n            \"【Style】Traditional Chinese ink wash painting (水墨画), monochrome with faint indigo, meditative.\\n\"\n            \"【Duration】12 seconds\\n\\n\"\n            \"[00:00-00:04] Shot 1: The Transformation Begins (Wide, Static).\\n\"\n            \"The photorealistic landscape slowly dissolves into flowing black ink. Mountain \"\n            \"peaks render as bold wet brushstrokes on rice paper texture. Realistic details \"\n            \"fade as traditional ink wash aesthetics take over.\\n\\n\"\n            \"[00:04-00:08] Shot 2: Life Emerges in Ink (Medium Shot, Slow Pan Right).\\n\"\n            \"Mist begins drifting between the valleys — visible as diluted ink wash spreading \"\n            \"on wet paper. A crane takes flight from behind a mountain, leaving elegant ink \"\n            \"trails across the sky. Water effects spread ink at mountain bases.\\n\\n\"\n            \"[00:08-00:12] Shot 3: Completion (Wide, Slow Zoom Out).\\n\"\n            \"Camera slowly pulls back to reveal the entire scene as a traditional scroll \"\n            \"painting being unrolled on a wooden desk. An unseen hand dips a brush in ink \"\n            \"at the edge of frame. The painting breathes — clouds still drift, crane still flies.\\n\\n\"\n            \"Visible rice paper texture and authentic brushstroke quality throughout. \"\n            \"No photorealism. Pure traditional ink wash aesthetic.\"\n        ),\n        \"image_urls\": [\"https://example.com/realistic_landscape.jpg\"],\n        \"duration\": 12,\n        \"quality\": \"1080p\"\n    }\n)\n# 使用上方第一个示例中的轮询循环\n",[28,34602,34603,34608,34616,34628,34650,34658,34668,34674,34683,34692,34700,34709,34714,34719,34728,34737,34742,34747,34756,34765,34770,34775,34784,34789,34794,34798,34809,34819,34827,34831,34835],{"__ignoreMap":141},[145,34604,34605],{"class":147,"line":148},[145,34606,34607],{"class":174},"# I3: 风格迁移——写实照片转水墨画 — 使用上方第一个示例的初始化设置\n",[145,34609,34610,34612,34614],{"class":147,"line":166},[145,34611,6508],{"class":263},[145,34613,267],{"class":259},[145,34615,1433],{"class":263},[145,34617,34618,34620,34622,34624,34626],{"class":147,"line":178},[145,34619,6517],{"class":259},[145,34621,450],{"class":159},[145,34623,679],{"class":155},[145,34625,1445],{"class":159},[145,34627,453],{"class":263},[145,34629,34630,34632,34634,34636,34638,34640,34642,34644,34646,34648],{"class":147,"line":187},[145,34631,6530],{"class":701},[145,34633,267],{"class":259},[145,34635,685],{"class":263},[145,34637,31432],{"class":159},[145,34639,438],{"class":263},[145,34641,441],{"class":259},[145,34643,444],{"class":159},[145,34645,447],{"class":155},[145,34647,450],{"class":159},[145,34649,19515],{"class":263},[145,34651,34652,34654,34656],{"class":147,"line":374},[145,34653,6541],{"class":701},[145,34655,267],{"class":259},[145,34657,1865],{"class":263},[145,34659,34660,34662,34664,34666],{"class":147,"line":380},[145,34661,1304],{"class":159},[145,34663,438],{"class":263},[145,34665,1309],{"class":159},[145,34667,453],{"class":263},[145,34669,34670,34672],{"class":147,"line":386},[145,34671,1320],{"class":159},[145,34673,1323],{"class":263},[145,34675,34676,34679,34681],{"class":147,"line":410},[145,34677,34678],{"class":159},"            \"@Image1 as scene composition reference.",[145,34680,1671],{"class":155},[145,34682,951],{"class":159},[145,34684,34685,34688,34690],{"class":147,"line":421},[145,34686,34687],{"class":159},"            \"【Style】Traditional Chinese ink wash painting (水墨画), monochrome with faint indigo, meditative.",[145,34689,1671],{"class":155},[145,34691,951],{"class":159},[145,34693,34694,34696,34698],{"class":147,"line":432},[145,34695,33404],{"class":159},[145,34697,12085],{"class":155},[145,34699,951],{"class":159},[145,34701,34702,34705,34707],{"class":147,"line":456},[145,34703,34704],{"class":159},"            \"[00:00-00:04] Shot 1: The Transformation Begins (Wide, Static).",[145,34706,1671],{"class":155},[145,34708,951],{"class":159},[145,34710,34711],{"class":147,"line":467},[145,34712,34713],{"class":159},"            \"The photorealistic landscape slowly dissolves into flowing black ink. Mountain \"\n",[145,34715,34716],{"class":147,"line":600},[145,34717,34718],{"class":159},"            \"peaks render as bold wet brushstrokes on rice paper texture. Realistic details \"\n",[145,34720,34721,34724,34726],{"class":147,"line":605},[145,34722,34723],{"class":159},"            \"fade as traditional ink wash aesthetics take over.",[145,34725,12085],{"class":155},[145,34727,951],{"class":159},[145,34729,34730,34733,34735],{"class":147,"line":611},[145,34731,34732],{"class":159},"            \"[00:04-00:08] Shot 2: Life Emerges in Ink (Medium Shot, Slow Pan Right).",[145,34734,1671],{"class":155},[145,34736,951],{"class":159},[145,34738,34739],{"class":147,"line":617},[145,34740,34741],{"class":159},"            \"Mist begins drifting between the valleys — visible as diluted ink wash spreading \"\n",[145,34743,34744],{"class":147,"line":623},[145,34745,34746],{"class":159},"            \"on wet paper. A crane takes flight from behind a mountain, leaving elegant ink \"\n",[145,34748,34749,34752,34754],{"class":147,"line":628},[145,34750,34751],{"class":159},"            \"trails across the sky. Water effects spread ink at mountain bases.",[145,34753,12085],{"class":155},[145,34755,951],{"class":159},[145,34757,34758,34761,34763],{"class":147,"line":639},[145,34759,34760],{"class":159},"            \"[00:08-00:12] Shot 3: Completion (Wide, Slow Zoom Out).",[145,34762,1671],{"class":155},[145,34764,951],{"class":159},[145,34766,34767],{"class":147,"line":654},[145,34768,34769],{"class":159},"            \"Camera slowly pulls back to reveal the entire scene as a traditional scroll \"\n",[145,34771,34772],{"class":147,"line":660},[145,34773,34774],{"class":159},"            \"painting being unrolled on a wooden desk. An unseen hand dips a brush in ink \"\n",[145,34776,34777,34780,34782],{"class":147,"line":671},[145,34778,34779],{"class":159},"            \"at the edge of frame. The painting breathes — clouds still drift, crane still flies.",[145,34781,12085],{"class":155},[145,34783,951],{"class":159},[145,34785,34786],{"class":147,"line":698},[145,34787,34788],{"class":159},"            \"Visible rice paper texture and authentic brushstroke quality throughout. \"\n",[145,34790,34791],{"class":147,"line":710},[145,34792,34793],{"class":159},"            \"No photorealism. Pure traditional ink wash aesthetic.\"\n",[145,34795,34796],{"class":147,"line":716},[145,34797,1343],{"class":263},[145,34799,34800,34802,34804,34807],{"class":147,"line":722},[145,34801,2683],{"class":159},[145,34803,10809],{"class":263},[145,34805,34806],{"class":159},"\"https://example.com/realistic_landscape.jpg\"",[145,34808,10815],{"class":263},[145,34810,34811,34813,34815,34817],{"class":147,"line":728},[145,34812,1348],{"class":159},[145,34814,438],{"class":263},[145,34816,16342],{"class":155},[145,34818,453],{"class":263},[145,34820,34821,34823,34825],{"class":147,"line":739},[145,34822,1364],{"class":159},[145,34824,438],{"class":263},[145,34826,32656],{"class":159},[145,34828,34829],{"class":147,"line":744},[145,34830,1408],{"class":263},[145,34832,34833],{"class":147,"line":750},[145,34834,407],{"class":263},[145,34836,34837],{"class":147,"line":767},[145,34838,33547],{"class":174},[32270,34840,34842],{"id":34841},"i4多图单镜头叙事城市跑酷","I4：多图单镜头叙事——城市跑酷",[11,34844,34845,34847,34848,34851],{},[23,34846,33309],{}," 将多张地点图像无缝串联为一个跑酷者的连续追踪镜头，使用分镜脚本格式精确控制时序，创造史诗级城市旅程。该技术基于",[37,34849,34850],{"href":3849},"镜头运动复现","模式。",[56,34853,60,34854],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,34855],{"src":12216,"type":65},[136,34857,34859],{"className":339,"code":34858,"language":341,"meta":141,"style":141},"# I4: 多图单镜头叙事——城市跑酷 — 使用上方第一个示例的初始化设置\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"@Image1 @Image2 @Image3 @Image4 @Image5 seamless one-shot tracking camera \"\n            \"following a parkour runner sprinting through city streets leaping up staircases \"\n            \"crossing a pedestrian bridge vaulting onto rooftops finally standing at the \"\n            \"rooftop edge overlooking the entire city skyline. Golden sunset light fills \"\n            \"the frame. Dynamic powerful full of freedom and energy.\\n\"\n            \"【Style】Cinematic action sports, dynamic tracking shot, golden hour lighting.\\n\"\n            \"【Duration】15 seconds\\n\\n\"\n            \"[00:00-00:03] Urban Sprint (@Image1 as environment).\\n\"\n            \"Tracking camera follows a parkour athlete in athletic gear sprinting at full \"\n            \"speed through busy city streets. Low angle emphasizes power and speed. \"\n            \"Pedestrians blur past. Urban architecture creates dynamic leading lines.\\n\\n\"\n            \"[00:03-00:06] Staircase Vault (@Image2 as environment).\\n\"\n            \"Runner leaps up a concrete staircase in a single fluid motion — camera follows \"\n            \"the arc of movement. Each step is a launching pad. Concrete textures and \"\n            \"architectural details sharp in focus.\\n\\n\"\n            \"[00:06-00:09] Bridge Crossing (@Image3 as environment).\\n\"\n            \"Athlete vaults over the pedestrian bridge railing and lands on the walkway. \"\n            \"Camera maintains tracking speed. City traffic flows below. Wind catches \"\n            \"the runner's clothing.\\n\\n\"\n            \"[00:09-00:12] Rooftop Ascent (@Image4 as environment).\\n\"\n            \"A powerful jump and climb sequence onto building rooftops. Camera cranes up \"\n            \"to follow the vertical movement. Urban landscape spreads out below.\\n\\n\"\n            \"[00:12-00:15] Victory Moment (@Image5 as environment).\\n\"\n            \"Runner stands at the rooftop edge overlooking the entire city skyline. \"\n            \"Golden sunset light silhouettes the figure. Camera slowly pulls back to \"\n            \"reveal the epic scale of the journey completed.\\n\\n\"\n            \"Consistent runner character (same outfit, build, movement style) across all scenes. \"\n            \"Realistic parkour physics. Golden hour lighting throughout.\"\n        ),\n        \"image_urls\": [\"https://example.com/city_street.jpg\", \"https://example.com/staircase.jpg\", \"https://example.com/pedestrian_bridge.jpg\", \"https://example.com/rooftop_building.jpg\", \"https://example.com/city_skyline.jpg\"],\n        \"duration\": 15,\n        \"quality\": \"1080p\"\n    }\n)\n# 使用上方第一个示例中的轮询循环\n",[28,34860,34861,34866,34874,34886,34908,34916,34926,34932,34937,34942,34947,34952,34961,34970,34978,34987,34992,34997,35006,35015,35020,35025,35034,35043,35048,35053,35062,35071,35076,35085,35094,35099,35104,35113,35118,35123,35127,35158,35168,35176,35180,35184],{"__ignoreMap":141},[145,34862,34863],{"class":147,"line":148},[145,34864,34865],{"class":174},"# I4: 多图单镜头叙事——城市跑酷 — 使用上方第一个示例的初始化设置\n",[145,34867,34868,34870,34872],{"class":147,"line":166},[145,34869,6508],{"class":263},[145,34871,267],{"class":259},[145,34873,1433],{"class":263},[145,34875,34876,34878,34880,34882,34884],{"class":147,"line":178},[145,34877,6517],{"class":259},[145,34879,450],{"class":159},[145,34881,679],{"class":155},[145,34883,1445],{"class":159},[145,34885,453],{"class":263},[145,34887,34888,34890,34892,34894,34896,34898,34900,34902,34904,34906],{"class":147,"line":187},[145,34889,6530],{"class":701},[145,34891,267],{"class":259},[145,34893,685],{"class":263},[145,34895,31432],{"class":159},[145,34897,438],{"class":263},[145,34899,441],{"class":259},[145,34901,444],{"class":159},[145,34903,447],{"class":155},[145,34905,450],{"class":159},[145,34907,19515],{"class":263},[145,34909,34910,34912,34914],{"class":147,"line":374},[145,34911,6541],{"class":701},[145,34913,267],{"class":259},[145,34915,1865],{"class":263},[145,34917,34918,34920,34922,34924],{"class":147,"line":380},[145,34919,1304],{"class":159},[145,34921,438],{"class":263},[145,34923,1309],{"class":159},[145,34925,453],{"class":263},[145,34927,34928,34930],{"class":147,"line":386},[145,34929,1320],{"class":159},[145,34931,1323],{"class":263},[145,34933,34934],{"class":147,"line":410},[145,34935,34936],{"class":159},"            \"@Image1 @Image2 @Image3 @Image4 @Image5 seamless one-shot tracking camera \"\n",[145,34938,34939],{"class":147,"line":421},[145,34940,34941],{"class":159},"            \"following a parkour runner sprinting through city streets leaping up staircases \"\n",[145,34943,34944],{"class":147,"line":432},[145,34945,34946],{"class":159},"            \"crossing a pedestrian bridge vaulting onto rooftops finally standing at the \"\n",[145,34948,34949],{"class":147,"line":456},[145,34950,34951],{"class":159},"            \"rooftop edge overlooking the entire city skyline. Golden sunset light fills \"\n",[145,34953,34954,34957,34959],{"class":147,"line":467},[145,34955,34956],{"class":159},"            \"the frame. Dynamic powerful full of freedom and energy.",[145,34958,1671],{"class":155},[145,34960,951],{"class":159},[145,34962,34963,34966,34968],{"class":147,"line":600},[145,34964,34965],{"class":159},"            \"【Style】Cinematic action sports, dynamic tracking shot, golden hour lighting.",[145,34967,1671],{"class":155},[145,34969,951],{"class":159},[145,34971,34972,34974,34976],{"class":147,"line":605},[145,34973,34161],{"class":159},[145,34975,12085],{"class":155},[145,34977,951],{"class":159},[145,34979,34980,34983,34985],{"class":147,"line":611},[145,34981,34982],{"class":159},"            \"[00:00-00:03] Urban Sprint (@Image1 as environment).",[145,34984,1671],{"class":155},[145,34986,951],{"class":159},[145,34988,34989],{"class":147,"line":617},[145,34990,34991],{"class":159},"            \"Tracking camera follows a parkour athlete in athletic gear sprinting at full \"\n",[145,34993,34994],{"class":147,"line":623},[145,34995,34996],{"class":159},"            \"speed through busy city streets. Low angle emphasizes power and speed. \"\n",[145,34998,34999,35002,35004],{"class":147,"line":628},[145,35000,35001],{"class":159},"            \"Pedestrians blur past. Urban architecture creates dynamic leading lines.",[145,35003,12085],{"class":155},[145,35005,951],{"class":159},[145,35007,35008,35011,35013],{"class":147,"line":639},[145,35009,35010],{"class":159},"            \"[00:03-00:06] Staircase Vault (@Image2 as environment).",[145,35012,1671],{"class":155},[145,35014,951],{"class":159},[145,35016,35017],{"class":147,"line":654},[145,35018,35019],{"class":159},"            \"Runner leaps up a concrete staircase in a single fluid motion — camera follows \"\n",[145,35021,35022],{"class":147,"line":660},[145,35023,35024],{"class":159},"            \"the arc of movement. Each step is a launching pad. Concrete textures and \"\n",[145,35026,35027,35030,35032],{"class":147,"line":671},[145,35028,35029],{"class":159},"            \"architectural details sharp in focus.",[145,35031,12085],{"class":155},[145,35033,951],{"class":159},[145,35035,35036,35039,35041],{"class":147,"line":698},[145,35037,35038],{"class":159},"            \"[00:06-00:09] Bridge Crossing (@Image3 as environment).",[145,35040,1671],{"class":155},[145,35042,951],{"class":159},[145,35044,35045],{"class":147,"line":710},[145,35046,35047],{"class":159},"            \"Athlete vaults over the pedestrian bridge railing and lands on the walkway. \"\n",[145,35049,35050],{"class":147,"line":716},[145,35051,35052],{"class":159},"            \"Camera maintains tracking speed. City traffic flows below. Wind catches \"\n",[145,35054,35055,35058,35060],{"class":147,"line":722},[145,35056,35057],{"class":159},"            \"the runner's clothing.",[145,35059,12085],{"class":155},[145,35061,951],{"class":159},[145,35063,35064,35067,35069],{"class":147,"line":728},[145,35065,35066],{"class":159},"            \"[00:09-00:12] Rooftop Ascent (@Image4 as environment).",[145,35068,1671],{"class":155},[145,35070,951],{"class":159},[145,35072,35073],{"class":147,"line":739},[145,35074,35075],{"class":159},"            \"A powerful jump and climb sequence onto building rooftops. Camera cranes up \"\n",[145,35077,35078,35081,35083],{"class":147,"line":744},[145,35079,35080],{"class":159},"            \"to follow the vertical movement. Urban landscape spreads out below.",[145,35082,12085],{"class":155},[145,35084,951],{"class":159},[145,35086,35087,35090,35092],{"class":147,"line":750},[145,35088,35089],{"class":159},"            \"[00:12-00:15] Victory Moment (@Image5 as environment).",[145,35091,1671],{"class":155},[145,35093,951],{"class":159},[145,35095,35096],{"class":147,"line":767},[145,35097,35098],{"class":159},"            \"Runner stands at the rooftop edge overlooking the entire city skyline. \"\n",[145,35100,35101],{"class":147,"line":788},[145,35102,35103],{"class":159},"            \"Golden sunset light silhouettes the figure. Camera slowly pulls back to \"\n",[145,35105,35106,35109,35111],{"class":147,"line":834},[145,35107,35108],{"class":159},"            \"reveal the epic scale of the journey completed.",[145,35110,12085],{"class":155},[145,35112,951],{"class":159},[145,35114,35115],{"class":147,"line":839},[145,35116,35117],{"class":159},"            \"Consistent runner character (same outfit, build, movement style) across all scenes. \"\n",[145,35119,35120],{"class":147,"line":845},[145,35121,35122],{"class":159},"            \"Realistic parkour physics. Golden hour lighting throughout.\"\n",[145,35124,35125],{"class":147,"line":863},[145,35126,1343],{"class":263},[145,35128,35129,35131,35133,35136,35138,35141,35143,35146,35148,35151,35153,35156],{"class":147,"line":872},[145,35130,2683],{"class":159},[145,35132,10809],{"class":263},[145,35134,35135],{"class":159},"\"https://example.com/city_street.jpg\"",[145,35137,401],{"class":263},[145,35139,35140],{"class":159},"\"https://example.com/staircase.jpg\"",[145,35142,401],{"class":263},[145,35144,35145],{"class":159},"\"https://example.com/pedestrian_bridge.jpg\"",[145,35147,401],{"class":263},[145,35149,35150],{"class":159},"\"https://example.com/rooftop_building.jpg\"",[145,35152,401],{"class":263},[145,35154,35155],{"class":159},"\"https://example.com/city_skyline.jpg\"",[145,35157,10815],{"class":263},[145,35159,35160,35162,35164,35166],{"class":147,"line":887},[145,35161,1348],{"class":159},[145,35163,438],{"class":263},[145,35165,3898],{"class":155},[145,35167,453],{"class":263},[145,35169,35170,35172,35174],{"class":147,"line":903},[145,35171,1364],{"class":159},[145,35173,438],{"class":263},[145,35175,32656],{"class":159},[145,35177,35178],{"class":147,"line":915},[145,35179,1408],{"class":263},[145,35181,35182],{"class":147,"line":954},[145,35183,407],{"class":263},[145,35185,35186],{"class":147,"line":960},[145,35187,33547],{"class":174},[92,35189,35191],{"id":35190},"多模态-tag-模板","多模态 @Tag 模板",[32270,35193,35195],{"id":35194},"m1进阶镜头运动复现水晶地牢探险","M1：进阶镜头运动复现——水晶地牢探险",[11,35197,35198,35200,35201,35204],{},[23,35199,33309],{}," 从参考视频中精确复现复杂镜头运动，并将其应用于全新奇幻内容，同时使用多张图像参考。在我们的",[37,35202,35203],{"href":3849},"专属镜头运动指南","中了解完整的镜头复现工作流。",[56,35206,60,35207],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,35208],{"src":35209,"type":65},"https://cdn.evolink.ai/seedance2api/%E6%B0%B4%E6%99%B6%E6%8E%A2%E9%99%A9.mp4",[136,35211,35213],{"className":339,"code":35212,"language":341,"meta":141,"style":141},"# M1: 进阶镜头运动复现——水晶地牢探险 — 使用上方第一个示例的初始化设置\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"Use @Image1 as the opening first frame. First-person POV perspective. \"\n            \"Reference @Video1 camera movement style exactly. The scene above references \"\n            \"@Image2, the left scene references @Image3, the right scene references @Image4. \"\n            \"A hand holds a glowing magic lantern, exploring an ancient dungeon. Firelight \"\n            \"flickers across stone walls, casting dancing shadows.\\n\"\n            \"【Style】Fantasy adventure, realistic lighting, atmospheric.\\n\"\n            \"【Duration】9 seconds\\n\\n\"\n            \"[00:00-00:03] Entrance Discovery.\\n\"\n            \"First-person view entering the dungeon. The magical lantern illuminates ancient \"\n            \"stone architecture. Camera follows @Video1 movement pattern — smooth forward \"\n            \"motion with subtle tilts to examine details.\\n\\n\"\n            \"[00:03-00:06] Chamber Exploration.\\n\"\n            \"Camera pans upward to reveal @Image2 crystal formations on the ceiling, \"\n            \"then tilts left toward @Image3 dark passage, creating suspense. Lantern \"\n            \"light creates dynamic shadows on dungeon walls.\\n\\n\"\n            \"[00:06-00:09] Final Discovery.\\n\"\n            \"Camera turns right to reveal @Image4 hidden chamber with treasure. \"\n            \"Replicate @Video1 final movement — slow push-in with slight upward tilt. \"\n            \"Golden light from treasures mingles with lantern glow.\\n\\n\"\n            \"Maintain exact @Video1 camera timing and movement speed. Realistic fire physics \"\n            \"and shadow casting. Atmospheric dungeon ambiance.\"\n        ),\n        \"image_urls\": [\"https://example.com/dungeon_entrance.png\", \"https://example.com/crystal_ceiling.png\", \"https://example.com/left_passage.png\", \"https://example.com/right_chamber.png\"],\n        \"video_urls\": [\"https://example.com/camera_movement_ref.mp4\"],\n        \"duration\": 9,\n        \"quality\": \"1080p\"\n    }\n)\n# 使用上方第一个示例中的轮询循环\n",[28,35214,35215,35220,35228,35240,35262,35270,35280,35286,35291,35296,35301,35306,35315,35324,35333,35342,35347,35352,35361,35370,35375,35380,35389,35398,35403,35408,35417,35422,35427,35431,35457,35468,35478,35486,35490,35494],{"__ignoreMap":141},[145,35216,35217],{"class":147,"line":148},[145,35218,35219],{"class":174},"# M1: 进阶镜头运动复现——水晶地牢探险 — 使用上方第一个示例的初始化设置\n",[145,35221,35222,35224,35226],{"class":147,"line":166},[145,35223,6508],{"class":263},[145,35225,267],{"class":259},[145,35227,1433],{"class":263},[145,35229,35230,35232,35234,35236,35238],{"class":147,"line":178},[145,35231,6517],{"class":259},[145,35233,450],{"class":159},[145,35235,679],{"class":155},[145,35237,1445],{"class":159},[145,35239,453],{"class":263},[145,35241,35242,35244,35246,35248,35250,35252,35254,35256,35258,35260],{"class":147,"line":187},[145,35243,6530],{"class":701},[145,35245,267],{"class":259},[145,35247,685],{"class":263},[145,35249,31432],{"class":159},[145,35251,438],{"class":263},[145,35253,441],{"class":259},[145,35255,444],{"class":159},[145,35257,447],{"class":155},[145,35259,450],{"class":159},[145,35261,19515],{"class":263},[145,35263,35264,35266,35268],{"class":147,"line":374},[145,35265,6541],{"class":701},[145,35267,267],{"class":259},[145,35269,1865],{"class":263},[145,35271,35272,35274,35276,35278],{"class":147,"line":380},[145,35273,1304],{"class":159},[145,35275,438],{"class":263},[145,35277,1309],{"class":159},[145,35279,453],{"class":263},[145,35281,35282,35284],{"class":147,"line":386},[145,35283,1320],{"class":159},[145,35285,1323],{"class":263},[145,35287,35288],{"class":147,"line":410},[145,35289,35290],{"class":159},"            \"Use @Image1 as the opening first frame. First-person POV perspective. \"\n",[145,35292,35293],{"class":147,"line":421},[145,35294,35295],{"class":159},"            \"Reference @Video1 camera movement style exactly. The scene above references \"\n",[145,35297,35298],{"class":147,"line":432},[145,35299,35300],{"class":159},"            \"@Image2, the left scene references @Image3, the right scene references @Image4. \"\n",[145,35302,35303],{"class":147,"line":456},[145,35304,35305],{"class":159},"            \"A hand holds a glowing magic lantern, exploring an ancient dungeon. Firelight \"\n",[145,35307,35308,35311,35313],{"class":147,"line":467},[145,35309,35310],{"class":159},"            \"flickers across stone walls, casting dancing shadows.",[145,35312,1671],{"class":155},[145,35314,951],{"class":159},[145,35316,35317,35320,35322],{"class":147,"line":600},[145,35318,35319],{"class":159},"            \"【Style】Fantasy adventure, realistic lighting, atmospheric.",[145,35321,1671],{"class":155},[145,35323,951],{"class":159},[145,35325,35326,35329,35331],{"class":147,"line":605},[145,35327,35328],{"class":159},"            \"【Duration】9 seconds",[145,35330,12085],{"class":155},[145,35332,951],{"class":159},[145,35334,35335,35338,35340],{"class":147,"line":611},[145,35336,35337],{"class":159},"            \"[00:00-00:03] Entrance Discovery.",[145,35339,1671],{"class":155},[145,35341,951],{"class":159},[145,35343,35344],{"class":147,"line":617},[145,35345,35346],{"class":159},"            \"First-person view entering the dungeon. The magical lantern illuminates ancient \"\n",[145,35348,35349],{"class":147,"line":623},[145,35350,35351],{"class":159},"            \"stone architecture. Camera follows @Video1 movement pattern — smooth forward \"\n",[145,35353,35354,35357,35359],{"class":147,"line":628},[145,35355,35356],{"class":159},"            \"motion with subtle tilts to examine details.",[145,35358,12085],{"class":155},[145,35360,951],{"class":159},[145,35362,35363,35366,35368],{"class":147,"line":639},[145,35364,35365],{"class":159},"            \"[00:03-00:06] Chamber Exploration.",[145,35367,1671],{"class":155},[145,35369,951],{"class":159},[145,35371,35372],{"class":147,"line":654},[145,35373,35374],{"class":159},"            \"Camera pans upward to reveal @Image2 crystal formations on the ceiling, \"\n",[145,35376,35377],{"class":147,"line":660},[145,35378,35379],{"class":159},"            \"then tilts left toward @Image3 dark passage, creating suspense. Lantern \"\n",[145,35381,35382,35385,35387],{"class":147,"line":671},[145,35383,35384],{"class":159},"            \"light creates dynamic shadows on dungeon walls.",[145,35386,12085],{"class":155},[145,35388,951],{"class":159},[145,35390,35391,35394,35396],{"class":147,"line":698},[145,35392,35393],{"class":159},"            \"[00:06-00:09] Final Discovery.",[145,35395,1671],{"class":155},[145,35397,951],{"class":159},[145,35399,35400],{"class":147,"line":710},[145,35401,35402],{"class":159},"            \"Camera turns right to reveal @Image4 hidden chamber with treasure. \"\n",[145,35404,35405],{"class":147,"line":716},[145,35406,35407],{"class":159},"            \"Replicate @Video1 final movement — slow push-in with slight upward tilt. \"\n",[145,35409,35410,35413,35415],{"class":147,"line":722},[145,35411,35412],{"class":159},"            \"Golden light from treasures mingles with lantern glow.",[145,35414,12085],{"class":155},[145,35416,951],{"class":159},[145,35418,35419],{"class":147,"line":728},[145,35420,35421],{"class":159},"            \"Maintain exact @Video1 camera timing and movement speed. Realistic fire physics \"\n",[145,35423,35424],{"class":147,"line":739},[145,35425,35426],{"class":159},"            \"and shadow casting. Atmospheric dungeon ambiance.\"\n",[145,35428,35429],{"class":147,"line":744},[145,35430,1343],{"class":263},[145,35432,35433,35435,35437,35440,35442,35445,35447,35450,35452,35455],{"class":147,"line":750},[145,35434,2683],{"class":159},[145,35436,10809],{"class":263},[145,35438,35439],{"class":159},"\"https://example.com/dungeon_entrance.png\"",[145,35441,401],{"class":263},[145,35443,35444],{"class":159},"\"https://example.com/crystal_ceiling.png\"",[145,35446,401],{"class":263},[145,35448,35449],{"class":159},"\"https://example.com/left_passage.png\"",[145,35451,401],{"class":263},[145,35453,35454],{"class":159},"\"https://example.com/right_chamber.png\"",[145,35456,10815],{"class":263},[145,35458,35459,35461,35463,35466],{"class":147,"line":767},[145,35460,12121],{"class":159},[145,35462,10809],{"class":263},[145,35464,35465],{"class":159},"\"https://example.com/camera_movement_ref.mp4\"",[145,35467,10815],{"class":263},[145,35469,35470,35472,35474,35476],{"class":147,"line":788},[145,35471,1348],{"class":159},[145,35473,438],{"class":263},[145,35475,30510],{"class":155},[145,35477,453],{"class":263},[145,35479,35480,35482,35484],{"class":147,"line":834},[145,35481,1364],{"class":159},[145,35483,438],{"class":263},[145,35485,32656],{"class":159},[145,35487,35488],{"class":147,"line":839},[145,35489,1408],{"class":263},[145,35491,35492],{"class":147,"line":845},[145,35493,407],{"class":263},[145,35495,35496],{"class":147,"line":863},[145,35497,33547],{"class":174},[32270,35499,35501],{"id":35500},"m2角色与镜头运动同步舞台舞蹈表演","M2：角色与镜头运动同步——舞台舞蹈表演",[11,35503,35504,35506],{},[23,35505,33309],{}," 将图像中的角色参考与视频中的镜头运动及舞蹈编排相结合，创造同步的舞台表演艺术。",[56,35508,60,35509],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,35510],{"src":35511,"type":65},"https://cdn.evolink.ai/seedance2api/%E5%A5%B3%E7%94%9F%E8%B7%B3%E8%88%9E.mp4",[136,35513,35515],{"className":339,"code":35514,"language":341,"meta":141,"style":141},"# M2: 角色与镜头运动同步——舞台舞蹈表演 — 使用上方第一个示例的初始化设置\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"@Image1 dancer as the main subject. Reference @Video1 camera movement style \"\n            \"rhythmic push-pull pan and tilt movements. The dancer choreography also \"\n            \"references @Video1 dance moves. Performing energetically on a colorful \"\n            \"LED-lit stage. Spotlights shift colors in sync with the rhythm.\\n\"\n            \"【Style】Concert performance, dynamic stage lighting, high energy.\\n\"\n            \"【Duration】12 seconds\\n\\n\"\n            \"[00:00-00:04] Opening Sequence.\\n\"\n            \"Camera starts wide showing @Image1 dancer center stage. LED lights pulse \"\n            \"in blue and purple. Dancer begins with @Video1 opening choreography — \"\n            \"fluid arm movements and spins. Camera matches @Video1 initial push-in timing.\\n\\n\"\n            \"[00:04-00:08] Dynamic Performance.\\n\"\n            \"Camera follows @Video1 rhythmic push-pull pattern as dancer performs high-energy \"\n            \"moves. Stage lights shift to warm orange and pink. Smoke effects catch the \"\n            \"colored lighting, creating atmospheric depth.\\n\\n\"\n            \"[00:08-00:12] Finale Moment.\\n\"\n            \"Camera matches @Video1 final tilt movement as dancer strikes a powerful \"\n            \"finishing pose. All stage lights converge into a brilliant white spotlight. \"\n            \"Sparkle effects cascade down around the performer.\\n\\n\"\n            \"Maintain @Image1 character appearance exactly. Synchronized camera and \"\n            \"choreography timing from @Video1. Professional stage lighting effects.\"\n        ),\n        \"image_urls\": [\"https://example.com/stage_dancer.png\"],\n        \"video_urls\": [\"https://example.com/dance_movement_ref.mp4\"],\n        \"duration\": 12,\n        \"quality\": \"1080p\"\n    }\n)\n# 使用上方第一个示例中的轮询循环\n",[28,35516,35517,35522,35530,35542,35564,35572,35582,35588,35593,35598,35603,35612,35621,35629,35638,35643,35648,35657,35666,35671,35676,35685,35694,35699,35704,35713,35718,35723,35727,35738,35749,35759,35767,35771,35775],{"__ignoreMap":141},[145,35518,35519],{"class":147,"line":148},[145,35520,35521],{"class":174},"# M2: 角色与镜头运动同步——舞台舞蹈表演 — 使用上方第一个示例的初始化设置\n",[145,35523,35524,35526,35528],{"class":147,"line":166},[145,35525,6508],{"class":263},[145,35527,267],{"class":259},[145,35529,1433],{"class":263},[145,35531,35532,35534,35536,35538,35540],{"class":147,"line":178},[145,35533,6517],{"class":259},[145,35535,450],{"class":159},[145,35537,679],{"class":155},[145,35539,1445],{"class":159},[145,35541,453],{"class":263},[145,35543,35544,35546,35548,35550,35552,35554,35556,35558,35560,35562],{"class":147,"line":187},[145,35545,6530],{"class":701},[145,35547,267],{"class":259},[145,35549,685],{"class":263},[145,35551,31432],{"class":159},[145,35553,438],{"class":263},[145,35555,441],{"class":259},[145,35557,444],{"class":159},[145,35559,447],{"class":155},[145,35561,450],{"class":159},[145,35563,19515],{"class":263},[145,35565,35566,35568,35570],{"class":147,"line":374},[145,35567,6541],{"class":701},[145,35569,267],{"class":259},[145,35571,1865],{"class":263},[145,35573,35574,35576,35578,35580],{"class":147,"line":380},[145,35575,1304],{"class":159},[145,35577,438],{"class":263},[145,35579,1309],{"class":159},[145,35581,453],{"class":263},[145,35583,35584,35586],{"class":147,"line":386},[145,35585,1320],{"class":159},[145,35587,1323],{"class":263},[145,35589,35590],{"class":147,"line":410},[145,35591,35592],{"class":159},"            \"@Image1 dancer as the main subject. Reference @Video1 camera movement style \"\n",[145,35594,35595],{"class":147,"line":421},[145,35596,35597],{"class":159},"            \"rhythmic push-pull pan and tilt movements. The dancer choreography also \"\n",[145,35599,35600],{"class":147,"line":432},[145,35601,35602],{"class":159},"            \"references @Video1 dance moves. Performing energetically on a colorful \"\n",[145,35604,35605,35608,35610],{"class":147,"line":456},[145,35606,35607],{"class":159},"            \"LED-lit stage. Spotlights shift colors in sync with the rhythm.",[145,35609,1671],{"class":155},[145,35611,951],{"class":159},[145,35613,35614,35617,35619],{"class":147,"line":467},[145,35615,35616],{"class":159},"            \"【Style】Concert performance, dynamic stage lighting, high energy.",[145,35618,1671],{"class":155},[145,35620,951],{"class":159},[145,35622,35623,35625,35627],{"class":147,"line":600},[145,35624,33404],{"class":159},[145,35626,12085],{"class":155},[145,35628,951],{"class":159},[145,35630,35631,35634,35636],{"class":147,"line":605},[145,35632,35633],{"class":159},"            \"[00:00-00:04] Opening Sequence.",[145,35635,1671],{"class":155},[145,35637,951],{"class":159},[145,35639,35640],{"class":147,"line":611},[145,35641,35642],{"class":159},"            \"Camera starts wide showing @Image1 dancer center stage. LED lights pulse \"\n",[145,35644,35645],{"class":147,"line":617},[145,35646,35647],{"class":159},"            \"in blue and purple. Dancer begins with @Video1 opening choreography — \"\n",[145,35649,35650,35653,35655],{"class":147,"line":623},[145,35651,35652],{"class":159},"            \"fluid arm movements and spins. Camera matches @Video1 initial push-in timing.",[145,35654,12085],{"class":155},[145,35656,951],{"class":159},[145,35658,35659,35662,35664],{"class":147,"line":628},[145,35660,35661],{"class":159},"            \"[00:04-00:08] Dynamic Performance.",[145,35663,1671],{"class":155},[145,35665,951],{"class":159},[145,35667,35668],{"class":147,"line":639},[145,35669,35670],{"class":159},"            \"Camera follows @Video1 rhythmic push-pull pattern as dancer performs high-energy \"\n",[145,35672,35673],{"class":147,"line":654},[145,35674,35675],{"class":159},"            \"moves. Stage lights shift to warm orange and pink. Smoke effects catch the \"\n",[145,35677,35678,35681,35683],{"class":147,"line":660},[145,35679,35680],{"class":159},"            \"colored lighting, creating atmospheric depth.",[145,35682,12085],{"class":155},[145,35684,951],{"class":159},[145,35686,35687,35690,35692],{"class":147,"line":671},[145,35688,35689],{"class":159},"            \"[00:08-00:12] Finale Moment.",[145,35691,1671],{"class":155},[145,35693,951],{"class":159},[145,35695,35696],{"class":147,"line":698},[145,35697,35698],{"class":159},"            \"Camera matches @Video1 final tilt movement as dancer strikes a powerful \"\n",[145,35700,35701],{"class":147,"line":710},[145,35702,35703],{"class":159},"            \"finishing pose. All stage lights converge into a brilliant white spotlight. \"\n",[145,35705,35706,35709,35711],{"class":147,"line":716},[145,35707,35708],{"class":159},"            \"Sparkle effects cascade down around the performer.",[145,35710,12085],{"class":155},[145,35712,951],{"class":159},[145,35714,35715],{"class":147,"line":722},[145,35716,35717],{"class":159},"            \"Maintain @Image1 character appearance exactly. Synchronized camera and \"\n",[145,35719,35720],{"class":147,"line":728},[145,35721,35722],{"class":159},"            \"choreography timing from @Video1. Professional stage lighting effects.\"\n",[145,35724,35725],{"class":147,"line":739},[145,35726,1343],{"class":263},[145,35728,35729,35731,35733,35736],{"class":147,"line":744},[145,35730,2683],{"class":159},[145,35732,10809],{"class":263},[145,35734,35735],{"class":159},"\"https://example.com/stage_dancer.png\"",[145,35737,10815],{"class":263},[145,35739,35740,35742,35744,35747],{"class":147,"line":750},[145,35741,12121],{"class":159},[145,35743,10809],{"class":263},[145,35745,35746],{"class":159},"\"https://example.com/dance_movement_ref.mp4\"",[145,35748,10815],{"class":263},[145,35750,35751,35753,35755,35757],{"class":147,"line":767},[145,35752,1348],{"class":159},[145,35754,438],{"class":263},[145,35756,16342],{"class":155},[145,35758,453],{"class":263},[145,35760,35761,35763,35765],{"class":147,"line":788},[145,35762,1364],{"class":159},[145,35764,438],{"class":263},[145,35766,32656],{"class":159},[145,35768,35769],{"class":147,"line":834},[145,35770,1408],{"class":263},[145,35772,35773],{"class":147,"line":839},[145,35774,407],{"class":263},[145,35776,35777],{"class":147,"line":845},[145,35778,33547],{"class":174},[32270,35780,35782],{"id":35781},"m3追逐场景神秘红衣人","M3：追逐场景——神秘红衣人",[11,35784,35785,35787],{},[23,35786,33309],{}," 在城市街道上创作一段紧张的追逐序列，主角是一个身穿红色外套的神秘人物，展示惊悚电影摄影与戏剧性张力构建。",[56,35789,60,35790],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,35791],{"src":25894,"type":65},[136,35793,35795],{"className":339,"code":35794,"language":341,"meta":141,"style":141},"# M3: 追逐场景——神秘红衣人 — 使用上方第一个示例的初始化设置\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"@Image1 as character reference — mysterious figure in distinctive red coat.\\n\"\n            \"【Style】Thriller cinematography, urban chase scene, dramatic shadows, high contrast.\\n\"\n            \"【Duration】12 seconds\\n\\n\"\n            \"[00:00-00:04] Shot 1: The Pursuit Begins (Wide Shot, Tracking).\\n\"\n            \"The red-coated figure sprints through narrow city alleyways at night. \"\n            \"Streetlights cast long dramatic shadows. Camera tracks from behind — we \"\n            \"see only the billowing red coat and rapid footsteps on wet pavement. \"\n            \"Tension-building audio undertones.\\n\\n\"\n            \"[00:04-00:08] Shot 2: Urban Obstacles (Medium Shot, Side Tracking).\\n\"\n            \"Figure vaults over parked cars and dodges between concrete pillars. Camera \"\n            \"follows from the side, maintaining speed. Red coat stands out against the \"\n            \"monochrome urban environment. Breathing is audible and labored.\\n\\n\"\n            \"[00:08-00:12] Shot 3: The Escape (Low Angle, Wide Shot).\\n\"\n            \"Figure reaches a fire escape and begins climbing rapidly upward. Camera \"\n            \"tilts up from below — dramatic low angle emphasizes the vertical escape. \"\n            \"Red coat flutters in the wind. City lights twinkle in the background as \"\n            \"the figure disappears into the night.\\n\\n\"\n            \"Maintain @Image1 character appearance — especially the distinctive red coat. \"\n            \"Realistic chase physics. High-contrast noir lighting. Mysterious identity \"\n            \"preserved throughout.\"\n        ),\n        \"image_urls\": [\"https://example.com/red_coat_figure.jpg\"],\n        \"duration\": 12,\n        \"quality\": \"1080p\"\n    }\n)\n# 使用上方第一个示例中的轮询循环\n",[28,35796,35797,35802,35810,35822,35844,35852,35862,35868,35877,35886,35894,35903,35908,35913,35918,35927,35936,35941,35946,35955,35964,35969,35974,35979,35988,35993,35998,36003,36007,36018,36028,36036,36040,36044],{"__ignoreMap":141},[145,35798,35799],{"class":147,"line":148},[145,35800,35801],{"class":174},"# M3: 追逐场景——神秘红衣人 — 使用上方第一个示例的初始化设置\n",[145,35803,35804,35806,35808],{"class":147,"line":166},[145,35805,6508],{"class":263},[145,35807,267],{"class":259},[145,35809,1433],{"class":263},[145,35811,35812,35814,35816,35818,35820],{"class":147,"line":178},[145,35813,6517],{"class":259},[145,35815,450],{"class":159},[145,35817,679],{"class":155},[145,35819,1445],{"class":159},[145,35821,453],{"class":263},[145,35823,35824,35826,35828,35830,35832,35834,35836,35838,35840,35842],{"class":147,"line":187},[145,35825,6530],{"class":701},[145,35827,267],{"class":259},[145,35829,685],{"class":263},[145,35831,31432],{"class":159},[145,35833,438],{"class":263},[145,35835,441],{"class":259},[145,35837,444],{"class":159},[145,35839,447],{"class":155},[145,35841,450],{"class":159},[145,35843,19515],{"class":263},[145,35845,35846,35848,35850],{"class":147,"line":374},[145,35847,6541],{"class":701},[145,35849,267],{"class":259},[145,35851,1865],{"class":263},[145,35853,35854,35856,35858,35860],{"class":147,"line":380},[145,35855,1304],{"class":159},[145,35857,438],{"class":263},[145,35859,1309],{"class":159},[145,35861,453],{"class":263},[145,35863,35864,35866],{"class":147,"line":386},[145,35865,1320],{"class":159},[145,35867,1323],{"class":263},[145,35869,35870,35873,35875],{"class":147,"line":410},[145,35871,35872],{"class":159},"            \"@Image1 as character reference — mysterious figure in distinctive red coat.",[145,35874,1671],{"class":155},[145,35876,951],{"class":159},[145,35878,35879,35882,35884],{"class":147,"line":421},[145,35880,35881],{"class":159},"            \"【Style】Thriller cinematography, urban chase scene, dramatic shadows, high contrast.",[145,35883,1671],{"class":155},[145,35885,951],{"class":159},[145,35887,35888,35890,35892],{"class":147,"line":432},[145,35889,33404],{"class":159},[145,35891,12085],{"class":155},[145,35893,951],{"class":159},[145,35895,35896,35899,35901],{"class":147,"line":456},[145,35897,35898],{"class":159},"            \"[00:00-00:04] Shot 1: The Pursuit Begins (Wide Shot, Tracking).",[145,35900,1671],{"class":155},[145,35902,951],{"class":159},[145,35904,35905],{"class":147,"line":467},[145,35906,35907],{"class":159},"            \"The red-coated figure sprints through narrow city alleyways at night. \"\n",[145,35909,35910],{"class":147,"line":600},[145,35911,35912],{"class":159},"            \"Streetlights cast long dramatic shadows. Camera tracks from behind — we \"\n",[145,35914,35915],{"class":147,"line":605},[145,35916,35917],{"class":159},"            \"see only the billowing red coat and rapid footsteps on wet pavement. \"\n",[145,35919,35920,35923,35925],{"class":147,"line":611},[145,35921,35922],{"class":159},"            \"Tension-building audio undertones.",[145,35924,12085],{"class":155},[145,35926,951],{"class":159},[145,35928,35929,35932,35934],{"class":147,"line":617},[145,35930,35931],{"class":159},"            \"[00:04-00:08] Shot 2: Urban Obstacles (Medium Shot, Side Tracking).",[145,35933,1671],{"class":155},[145,35935,951],{"class":159},[145,35937,35938],{"class":147,"line":623},[145,35939,35940],{"class":159},"            \"Figure vaults over parked cars and dodges between concrete pillars. Camera \"\n",[145,35942,35943],{"class":147,"line":628},[145,35944,35945],{"class":159},"            \"follows from the side, maintaining speed. Red coat stands out against the \"\n",[145,35947,35948,35951,35953],{"class":147,"line":639},[145,35949,35950],{"class":159},"            \"monochrome urban environment. Breathing is audible and labored.",[145,35952,12085],{"class":155},[145,35954,951],{"class":159},[145,35956,35957,35960,35962],{"class":147,"line":654},[145,35958,35959],{"class":159},"            \"[00:08-00:12] Shot 3: The Escape (Low Angle, Wide Shot).",[145,35961,1671],{"class":155},[145,35963,951],{"class":159},[145,35965,35966],{"class":147,"line":660},[145,35967,35968],{"class":159},"            \"Figure reaches a fire escape and begins climbing rapidly upward. Camera \"\n",[145,35970,35971],{"class":147,"line":671},[145,35972,35973],{"class":159},"            \"tilts up from below — dramatic low angle emphasizes the vertical escape. \"\n",[145,35975,35976],{"class":147,"line":698},[145,35977,35978],{"class":159},"            \"Red coat flutters in the wind. City lights twinkle in the background as \"\n",[145,35980,35981,35984,35986],{"class":147,"line":710},[145,35982,35983],{"class":159},"            \"the figure disappears into the night.",[145,35985,12085],{"class":155},[145,35987,951],{"class":159},[145,35989,35990],{"class":147,"line":716},[145,35991,35992],{"class":159},"            \"Maintain @Image1 character appearance — especially the distinctive red coat. \"\n",[145,35994,35995],{"class":147,"line":722},[145,35996,35997],{"class":159},"            \"Realistic chase physics. High-contrast noir lighting. Mysterious identity \"\n",[145,35999,36000],{"class":147,"line":728},[145,36001,36002],{"class":159},"            \"preserved throughout.\"\n",[145,36004,36005],{"class":147,"line":739},[145,36006,1343],{"class":263},[145,36008,36009,36011,36013,36016],{"class":147,"line":744},[145,36010,2683],{"class":159},[145,36012,10809],{"class":263},[145,36014,36015],{"class":159},"\"https://example.com/red_coat_figure.jpg\"",[145,36017,10815],{"class":263},[145,36019,36020,36022,36024,36026],{"class":147,"line":750},[145,36021,1348],{"class":159},[145,36023,438],{"class":263},[145,36025,16342],{"class":155},[145,36027,453],{"class":263},[145,36029,36030,36032,36034],{"class":147,"line":767},[145,36031,1364],{"class":159},[145,36033,438],{"class":263},[145,36035,32656],{"class":159},[145,36037,36038],{"class":147,"line":788},[145,36039,1408],{"class":263},[145,36041,36042],{"class":147,"line":834},[145,36043,407],{"class":263},[145,36045,36046],{"class":147,"line":839},[145,36047,33547],{"class":174},[32270,36049,36051],{"id":36050},"附加模板街头人群奔跑场景","附加模板：街头人群奔跑场景",[11,36053,36054,36056],{},[23,36055,33309],{}," 一个展示人群奔跑场景的额外示例，非常适合需要多角色和城市活力的动作序列。",[56,36058,60,36059],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,36060],{"src":36061,"type":65},"https://cdn.evolink.ai/seedance2api/%E8%A1%97%E5%A4%B4%E4%B8%80%E5%A0%86%E4%BA%BA%E5%9C%A8%E8%B7%91.mp4",[136,36063,36065],{"className":339,"code":36064,"language":341,"meta":141,"style":141},"# 附加模板: 街头人群奔跑场景 — 使用上方第一个示例的初始化设置\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"@Image1 as scene reference for crowd composition and urban environment.\\n\"\n            \"【Style】Action thriller, handheld camera, urgent pacing, realistic movement.\\n\"\n            \"【Duration】8 seconds\\n\\n\"\n            \"[00:00-00:03] Mass Movement Begins.\\n\"\n            \"A crowd of people suddenly breaks into a run down a busy street. Camera \"\n            \"is handheld, in the middle of the action. Multiple individuals in different \"\n            \"clothing all moving in the same direction with urgent purpose.\\n\\n\"\n            \"[00:03-00:06] Chaos and Urgency.\\n\"\n            \"Camera weaves through the running crowd. Close-ups on determined faces, \"\n            \"flying hair, scattered personal items. People help each other maintain \"\n            \"pace. Urban storefronts blur past in the background.\\n\\n\"\n            \"[00:06-00:08] Dispersal.\\n\"\n            \"The crowd reaches an intersection and scatters in different directions. \"\n            \"Camera tilts up to show the scope of the mass movement from a high angle \"\n            \"as people disappear down various streets.\\n\\n\"\n            \"Realistic crowd physics and natural human movement. Handheld camera shake \"\n            \"for authenticity. Urban street environment based on @Image1.\"\n        ),\n        \"image_urls\": [\"https://example.com/street_crowd.jpg\"],\n        \"duration\": 8,\n        \"quality\": \"1080p\"\n    }\n)\n# 使用上方第一个示例中的轮询循环\n",[28,36066,36067,36072,36080,36092,36114,36122,36132,36138,36147,36156,36165,36174,36179,36184,36193,36202,36207,36212,36221,36230,36235,36240,36249,36254,36259,36263,36274,36284,36292,36296,36300],{"__ignoreMap":141},[145,36068,36069],{"class":147,"line":148},[145,36070,36071],{"class":174},"# 附加模板: 街头人群奔跑场景 — 使用上方第一个示例的初始化设置\n",[145,36073,36074,36076,36078],{"class":147,"line":166},[145,36075,6508],{"class":263},[145,36077,267],{"class":259},[145,36079,1433],{"class":263},[145,36081,36082,36084,36086,36088,36090],{"class":147,"line":178},[145,36083,6517],{"class":259},[145,36085,450],{"class":159},[145,36087,679],{"class":155},[145,36089,1445],{"class":159},[145,36091,453],{"class":263},[145,36093,36094,36096,36098,36100,36102,36104,36106,36108,36110,36112],{"class":147,"line":187},[145,36095,6530],{"class":701},[145,36097,267],{"class":259},[145,36099,685],{"class":263},[145,36101,31432],{"class":159},[145,36103,438],{"class":263},[145,36105,441],{"class":259},[145,36107,444],{"class":159},[145,36109,447],{"class":155},[145,36111,450],{"class":159},[145,36113,19515],{"class":263},[145,36115,36116,36118,36120],{"class":147,"line":374},[145,36117,6541],{"class":701},[145,36119,267],{"class":259},[145,36121,1865],{"class":263},[145,36123,36124,36126,36128,36130],{"class":147,"line":380},[145,36125,1304],{"class":159},[145,36127,438],{"class":263},[145,36129,1309],{"class":159},[145,36131,453],{"class":263},[145,36133,36134,36136],{"class":147,"line":386},[145,36135,1320],{"class":159},[145,36137,1323],{"class":263},[145,36139,36140,36143,36145],{"class":147,"line":410},[145,36141,36142],{"class":159},"            \"@Image1 as scene reference for crowd composition and urban environment.",[145,36144,1671],{"class":155},[145,36146,951],{"class":159},[145,36148,36149,36152,36154],{"class":147,"line":421},[145,36150,36151],{"class":159},"            \"【Style】Action thriller, handheld camera, urgent pacing, realistic movement.",[145,36153,1671],{"class":155},[145,36155,951],{"class":159},[145,36157,36158,36161,36163],{"class":147,"line":432},[145,36159,36160],{"class":159},"            \"【Duration】8 seconds",[145,36162,12085],{"class":155},[145,36164,951],{"class":159},[145,36166,36167,36170,36172],{"class":147,"line":456},[145,36168,36169],{"class":159},"            \"[00:00-00:03] Mass Movement Begins.",[145,36171,1671],{"class":155},[145,36173,951],{"class":159},[145,36175,36176],{"class":147,"line":467},[145,36177,36178],{"class":159},"            \"A crowd of people suddenly breaks into a run down a busy street. Camera \"\n",[145,36180,36181],{"class":147,"line":600},[145,36182,36183],{"class":159},"            \"is handheld, in the middle of the action. Multiple individuals in different \"\n",[145,36185,36186,36189,36191],{"class":147,"line":605},[145,36187,36188],{"class":159},"            \"clothing all moving in the same direction with urgent purpose.",[145,36190,12085],{"class":155},[145,36192,951],{"class":159},[145,36194,36195,36198,36200],{"class":147,"line":611},[145,36196,36197],{"class":159},"            \"[00:03-00:06] Chaos and Urgency.",[145,36199,1671],{"class":155},[145,36201,951],{"class":159},[145,36203,36204],{"class":147,"line":617},[145,36205,36206],{"class":159},"            \"Camera weaves through the running crowd. Close-ups on determined faces, \"\n",[145,36208,36209],{"class":147,"line":623},[145,36210,36211],{"class":159},"            \"flying hair, scattered personal items. People help each other maintain \"\n",[145,36213,36214,36217,36219],{"class":147,"line":628},[145,36215,36216],{"class":159},"            \"pace. Urban storefronts blur past in the background.",[145,36218,12085],{"class":155},[145,36220,951],{"class":159},[145,36222,36223,36226,36228],{"class":147,"line":639},[145,36224,36225],{"class":159},"            \"[00:06-00:08] Dispersal.",[145,36227,1671],{"class":155},[145,36229,951],{"class":159},[145,36231,36232],{"class":147,"line":654},[145,36233,36234],{"class":159},"            \"The crowd reaches an intersection and scatters in different directions. \"\n",[145,36236,36237],{"class":147,"line":660},[145,36238,36239],{"class":159},"            \"Camera tilts up to show the scope of the mass movement from a high angle \"\n",[145,36241,36242,36245,36247],{"class":147,"line":671},[145,36243,36244],{"class":159},"            \"as people disappear down various streets.",[145,36246,12085],{"class":155},[145,36248,951],{"class":159},[145,36250,36251],{"class":147,"line":698},[145,36252,36253],{"class":159},"            \"Realistic crowd physics and natural human movement. Handheld camera shake \"\n",[145,36255,36256],{"class":147,"line":710},[145,36257,36258],{"class":159},"            \"for authenticity. Urban street environment based on @Image1.\"\n",[145,36260,36261],{"class":147,"line":716},[145,36262,1343],{"class":263},[145,36264,36265,36267,36269,36272],{"class":147,"line":722},[145,36266,2683],{"class":159},[145,36268,10809],{"class":263},[145,36270,36271],{"class":159},"\"https://example.com/street_crowd.jpg\"",[145,36273,10815],{"class":263},[145,36275,36276,36278,36280,36282],{"class":147,"line":728},[145,36277,1348],{"class":159},[145,36279,438],{"class":263},[145,36281,3691],{"class":155},[145,36283,453],{"class":263},[145,36285,36286,36288,36290],{"class":147,"line":739},[145,36287,1364],{"class":159},[145,36289,438],{"class":263},[145,36291,32656],{"class":159},[145,36293,36294],{"class":147,"line":744},[145,36295,1408],{"class":263},[145,36297,36298],{"class":147,"line":750},[145,36299,407],{"class":263},[145,36301,36302],{"class":147,"line":767},[145,36303,33547],{"class":174},[92,36305,36306],{"id":36306},"视频延伸模板",[32270,36308,36310],{"id":36309},"e1向前延伸添加品牌收尾","E1：向前延伸，添加品牌收尾",[11,36312,36313,36315],{},[23,36314,33309],{}," 通过新增场景和专业品牌收尾（含 Logo 与标语）来延伸现有视频。",[136,36317,36319],{"className":339,"code":36318,"language":341,"meta":141,"style":141},"# E1: 向前延伸，添加品牌收尾 — 使用上方第一个示例的初始化设置\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"Extend @Video1 forward with 8 additional seconds.\\n\"\n            \"【Style】Match @Video1 style exactly.\\n\"\n            \"【Duration】8 seconds extension\\n\\n\"\n            \"Continue the existing narrative: if it ends with product showcase, add lifestyle usage scene. \"\n            \"Show the product being used in natural environment with satisfied users. \"\n            \"Final 2 seconds: elegant brand logo animation with company tagline appearing below. \"\n            \"Maintain consistent lighting and color grading throughout. \"\n            \"Smooth transition from original content to extension.\"\n        ),\n        \"video_urls\": [\"https://example.com/existing_video.mp4\"],\n        \"duration\": 8,\n        \"quality\": \"1080p\"\n    }\n)\n# 使用上方第一个示例中的轮询循环\n",[28,36320,36321,36326,36334,36346,36368,36376,36386,36392,36401,36410,36419,36424,36429,36434,36439,36444,36448,36459,36469,36477,36481,36485],{"__ignoreMap":141},[145,36322,36323],{"class":147,"line":148},[145,36324,36325],{"class":174},"# E1: 向前延伸，添加品牌收尾 — 使用上方第一个示例的初始化设置\n",[145,36327,36328,36330,36332],{"class":147,"line":166},[145,36329,6508],{"class":263},[145,36331,267],{"class":259},[145,36333,1433],{"class":263},[145,36335,36336,36338,36340,36342,36344],{"class":147,"line":178},[145,36337,6517],{"class":259},[145,36339,450],{"class":159},[145,36341,679],{"class":155},[145,36343,1445],{"class":159},[145,36345,453],{"class":263},[145,36347,36348,36350,36352,36354,36356,36358,36360,36362,36364,36366],{"class":147,"line":187},[145,36349,6530],{"class":701},[145,36351,267],{"class":259},[145,36353,685],{"class":263},[145,36355,31432],{"class":159},[145,36357,438],{"class":263},[145,36359,441],{"class":259},[145,36361,444],{"class":159},[145,36363,447],{"class":155},[145,36365,450],{"class":159},[145,36367,19515],{"class":263},[145,36369,36370,36372,36374],{"class":147,"line":374},[145,36371,6541],{"class":701},[145,36373,267],{"class":259},[145,36375,1865],{"class":263},[145,36377,36378,36380,36382,36384],{"class":147,"line":380},[145,36379,1304],{"class":159},[145,36381,438],{"class":263},[145,36383,1309],{"class":159},[145,36385,453],{"class":263},[145,36387,36388,36390],{"class":147,"line":386},[145,36389,1320],{"class":159},[145,36391,1323],{"class":263},[145,36393,36394,36397,36399],{"class":147,"line":410},[145,36395,36396],{"class":159},"            \"Extend @Video1 forward with 8 additional seconds.",[145,36398,1671],{"class":155},[145,36400,951],{"class":159},[145,36402,36403,36406,36408],{"class":147,"line":421},[145,36404,36405],{"class":159},"            \"【Style】Match @Video1 style exactly.",[145,36407,1671],{"class":155},[145,36409,951],{"class":159},[145,36411,36412,36415,36417],{"class":147,"line":432},[145,36413,36414],{"class":159},"            \"【Duration】8 seconds extension",[145,36416,12085],{"class":155},[145,36418,951],{"class":159},[145,36420,36421],{"class":147,"line":456},[145,36422,36423],{"class":159},"            \"Continue the existing narrative: if it ends with product showcase, add lifestyle usage scene. \"\n",[145,36425,36426],{"class":147,"line":467},[145,36427,36428],{"class":159},"            \"Show the product being used in natural environment with satisfied users. \"\n",[145,36430,36431],{"class":147,"line":600},[145,36432,36433],{"class":159},"            \"Final 2 seconds: elegant brand logo animation with company tagline appearing below. \"\n",[145,36435,36436],{"class":147,"line":605},[145,36437,36438],{"class":159},"            \"Maintain consistent lighting and color grading throughout. \"\n",[145,36440,36441],{"class":147,"line":611},[145,36442,36443],{"class":159},"            \"Smooth transition from original content to extension.\"\n",[145,36445,36446],{"class":147,"line":617},[145,36447,1343],{"class":263},[145,36449,36450,36452,36454,36457],{"class":147,"line":623},[145,36451,12121],{"class":159},[145,36453,10809],{"class":263},[145,36455,36456],{"class":159},"\"https://example.com/existing_video.mp4\"",[145,36458,10815],{"class":263},[145,36460,36461,36463,36465,36467],{"class":147,"line":628},[145,36462,1348],{"class":159},[145,36464,438],{"class":263},[145,36466,3691],{"class":155},[145,36468,453],{"class":263},[145,36470,36471,36473,36475],{"class":147,"line":639},[145,36472,1364],{"class":159},[145,36474,438],{"class":263},[145,36476,32656],{"class":159},[145,36478,36479],{"class":147,"line":654},[145,36480,1408],{"class":263},[145,36482,36483],{"class":147,"line":660},[145,36484,407],{"class":263},[145,36486,36487],{"class":147,"line":671},[145,36488,33547],{"class":174},[32270,36490,36492],{"id":36491},"e2向后延伸添加前情背景","E2：向后延伸，添加前情背景",[11,36494,36495,36497],{},[23,36496,33309],{}," 在现有视频内容之前添加背景铺垫，构建更完整的叙事。",[136,36499,36501],{"className":339,"code":36500,"language":341,"meta":141,"style":141},"# E2: 向后延伸，添加前情背景 — 使用上方第一个示例的初始化设置\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"Create 6 seconds of backstory before @Video1 begins.\\n\"\n            \"【Style】Match @Video1 visual style exactly.\\n\"\n            \"【Duration】6 seconds extension\\n\\n\"\n            \"If @Video1 shows action, show the calm setup or preparation moment. \"\n            \"If @Video1 shows a reveal, show the mystery or anticipation beforehand. \"\n            \"Match the visual style, lighting, and character appearances exactly. \"\n            \"Create narrative tension that builds toward the existing video's opening moment. \"\n            \"Seamless transition into original content.\"\n        ),\n        \"video_urls\": [\"https://example.com/main_video.mp4\"],\n        \"duration\": 6,\n        \"quality\": \"1080p\"\n    }\n)\n# 使用上方第一个示例中的轮询循环\n",[28,36502,36503,36508,36516,36528,36550,36558,36568,36574,36583,36592,36601,36606,36611,36616,36621,36626,36630,36641,36651,36659,36663,36667],{"__ignoreMap":141},[145,36504,36505],{"class":147,"line":148},[145,36506,36507],{"class":174},"# E2: 向后延伸，添加前情背景 — 使用上方第一个示例的初始化设置\n",[145,36509,36510,36512,36514],{"class":147,"line":166},[145,36511,6508],{"class":263},[145,36513,267],{"class":259},[145,36515,1433],{"class":263},[145,36517,36518,36520,36522,36524,36526],{"class":147,"line":178},[145,36519,6517],{"class":259},[145,36521,450],{"class":159},[145,36523,679],{"class":155},[145,36525,1445],{"class":159},[145,36527,453],{"class":263},[145,36529,36530,36532,36534,36536,36538,36540,36542,36544,36546,36548],{"class":147,"line":187},[145,36531,6530],{"class":701},[145,36533,267],{"class":259},[145,36535,685],{"class":263},[145,36537,31432],{"class":159},[145,36539,438],{"class":263},[145,36541,441],{"class":259},[145,36543,444],{"class":159},[145,36545,447],{"class":155},[145,36547,450],{"class":159},[145,36549,19515],{"class":263},[145,36551,36552,36554,36556],{"class":147,"line":374},[145,36553,6541],{"class":701},[145,36555,267],{"class":259},[145,36557,1865],{"class":263},[145,36559,36560,36562,36564,36566],{"class":147,"line":380},[145,36561,1304],{"class":159},[145,36563,438],{"class":263},[145,36565,1309],{"class":159},[145,36567,453],{"class":263},[145,36569,36570,36572],{"class":147,"line":386},[145,36571,1320],{"class":159},[145,36573,1323],{"class":263},[145,36575,36576,36579,36581],{"class":147,"line":410},[145,36577,36578],{"class":159},"            \"Create 6 seconds of backstory before @Video1 begins.",[145,36580,1671],{"class":155},[145,36582,951],{"class":159},[145,36584,36585,36588,36590],{"class":147,"line":421},[145,36586,36587],{"class":159},"            \"【Style】Match @Video1 visual style exactly.",[145,36589,1671],{"class":155},[145,36591,951],{"class":159},[145,36593,36594,36597,36599],{"class":147,"line":432},[145,36595,36596],{"class":159},"            \"【Duration】6 seconds extension",[145,36598,12085],{"class":155},[145,36600,951],{"class":159},[145,36602,36603],{"class":147,"line":456},[145,36604,36605],{"class":159},"            \"If @Video1 shows action, show the calm setup or preparation moment. \"\n",[145,36607,36608],{"class":147,"line":467},[145,36609,36610],{"class":159},"            \"If @Video1 shows a reveal, show the mystery or anticipation beforehand. \"\n",[145,36612,36613],{"class":147,"line":600},[145,36614,36615],{"class":159},"            \"Match the visual style, lighting, and character appearances exactly. \"\n",[145,36617,36618],{"class":147,"line":605},[145,36619,36620],{"class":159},"            \"Create narrative tension that builds toward the existing video's opening moment. \"\n",[145,36622,36623],{"class":147,"line":611},[145,36624,36625],{"class":159},"            \"Seamless transition into original content.\"\n",[145,36627,36628],{"class":147,"line":617},[145,36629,1343],{"class":263},[145,36631,36632,36634,36636,36639],{"class":147,"line":623},[145,36633,12121],{"class":159},[145,36635,10809],{"class":263},[145,36637,36638],{"class":159},"\"https://example.com/main_video.mp4\"",[145,36640,10815],{"class":263},[145,36642,36643,36645,36647,36649],{"class":147,"line":628},[145,36644,1348],{"class":159},[145,36646,438],{"class":263},[145,36648,33222],{"class":155},[145,36650,453],{"class":263},[145,36652,36653,36655,36657],{"class":147,"line":639},[145,36654,1364],{"class":159},[145,36656,438],{"class":263},[145,36658,32656],{"class":159},[145,36660,36661],{"class":147,"line":654},[145,36662,1408],{"class":263},[145,36664,36665],{"class":147,"line":660},[145,36666,407],{"class":263},[145,36668,36669],{"class":147,"line":671},[145,36670,33547],{"class":174},[18,36672,36673],{},[11,36674,36675],{},[37,36676,36678],{"href":211,"rel":36677},[41],"使用你的 EvoLink API Key 运行这些进阶模板，立即免费注册 →",[45,36680],{},[48,36682,36684],{"id":36683},"seedance-提示词常见错误及修复方法","Seedance 提示词常见错误及修复方法",[2036,36686,36687,36703],{},[2039,36688,36689],{},[2042,36690,36691,36694,36697,36700],{},[2045,36692,36693],{},"#",[2045,36695,36696],{},"错误",[2045,36698,36699],{},"失败原因",[2045,36701,36702],{},"修复方法",[2052,36704,36705,36721,36739,36760,36776,36792,36808,36823,36839,36855],{},[2042,36706,36707,36709,36715,36718],{},[2057,36708,5419],{},[2057,36710,36711,36714],{},[23,36712,36713],{},"过于模糊"," — \"一只狗的精彩视频\"",[2057,36716,36717],{},"模型需要猜测品种、动作、镜头、风格",[2057,36719,36720],{},"\"一只金毛猎犬在公园里在阳光下跳接飞盘，慢动作侧面角度\"",[2042,36722,36723,36725,36733,36736],{},[2057,36724,5400],{},[2057,36726,36727,36730,36731],{},[23,36728,36729],{},"@Tag 编号错误"," — 只上传了 2 张图像却使用 ",[28,36732,2917],{},[2057,36734,36735],{},"标签引用不存在的文件，导致生成失败或被忽略",[2057,36737,36738],{},"仔细核对上传顺序；标签从 1 开始，按类型递增",[2042,36740,36741,36743,36749,36752],{},[2057,36742,5043],{},[2057,36744,36745,36748],{},[23,36746,36747],{},"缺少约束参数"," — 未指定时长或分辨率",[2057,36750,36751],{},"模型默认值可能不符合需求",[2057,36753,36754,36755,2955,36757],{},"始终在提示词文本和 API 参数中明确指定 ",[28,36756,1774],{},[28,36758,36759],{},"resolution",[2042,36761,36762,36764,36770,36773],{},[2057,36763,3991],{},[2057,36765,36766,36769],{},[23,36767,36768],{},"模态冲突"," — 图像显示白天，提示词却说\"黑暗夜景\"",[2057,36771,36772],{},"模型收到矛盾信号，生成灯光不一致的画面",[2057,36774,36775],{},"确保提示词描述与参考内容保持一致",[2042,36777,36778,36780,36786,36789],{},[2057,36779,1353],{},[2057,36781,36782,36785],{},[23,36783,36784],{},"提示词过载"," — 超过 200 字描述每个细节",[2057,36787,36788],{},"模型优先级混乱，关键指令被稀释",[2057,36790,36791],{},"提示词控制在 150 字以内；用参考文件传递视觉细节而非文字描述",[2042,36793,36794,36796,36802,36805],{},[2057,36795,33222],{},[2057,36797,36798,36801],{},[23,36799,36800],{},"缺少镜头方向"," — 描述场景但未说明镜头如何运动",[2057,36803,36804],{},"输出静止或随机运动",[2057,36806,36807],{},"添加明确的镜头指令：\"缓慢推轨推进\"或\"静止广角\"",[2042,36809,36810,36812,36817,36820],{},[2057,36811,33254],{},[2057,36813,36814,36816],{},[23,36815,31857],{}," — 上传真实人类面部照片",[2057,36818,36819],{},"被合规过滤器拦截，请求被拒绝",[2057,36821,36822],{},"使用插画、风格化或非写实的角色参考",[2042,36824,36825,36827,36833,36836],{},[2057,36826,3691],{},[2057,36828,36829,36832],{},[23,36830,36831],{},"超出文件数量限制"," — 上传 10 张图像",[2057,36834,36835],{},"最多 9 张图像，请求被拒绝",[2057,36837,36838],{},"遵守限制：图像 ≤9，视频 ≤3，音频 ≤3，总计 ≤12",[2042,36840,36841,36843,36849,36852],{},[2057,36842,30510],{},[2057,36844,36845,36848],{},[23,36846,36847],{},"无风格锚点"," — 使用笼统的\"电影感\"而非具体参考",[2057,36850,36851],{},"输出效果平庸、缺乏焦点",[2057,36853,36854],{},"锚定至具体导演、电影或艺术风格：\"Denis Villeneuve 科幻史诗\"或\"梵高后印象主义\"",[2042,36856,36857,36859,36865,36868],{},[2057,36858,537],{},[2057,36860,36861,36864],{},[23,36862,36863],{},"无时间码"," — 写散文而非结构化分镜脚本",[2057,36866,36867],{},"动作在时长内随机分布",[2057,36869,36870,36871,36873],{},"使用 ",[28,36872,32246],{}," 时间码精确控制每个动作的发生时刻",[11,36875,36876,36877,298],{},"如需详细的错误处理模式和重试逻辑，请参阅 ",[37,36878,36879],{"href":14322},"API 文档",[45,36881],{},[48,36883,36885],{"id":36884},"api-开发者提示词工程最佳实践","API 开发者提示词工程最佳实践",[92,36887,36888],{"id":36888},"批量生成时模板化提示词",[11,36890,36891],{},"大批量生成视频时，定义可复用的提示词模板并使用变量：",[136,36893,36895],{"className":339,"code":36894,"language":341,"meta":141,"style":141},"PRODUCT_TEMPLATE = (\n    \"@Image1 as first frame.\\n\"\n    \"【Style】{style}\\n\"\n    \"【Duration】{duration} seconds\\n\\n\"\n    \"[00:00-00:03] Product slowly begins rotating clockwise. \"\n    \"{lighting_description}. Every texture detail remains razor-sharp.\\n\\n\"\n    \"[00:03-00:06] Rotation continues to 180 degrees. Camera subtly lowers angle \"\n    \"to reveal the product's profile.\\n\\n\"\n    \"[00:06-{end_tc}] Rotation slows to a stop at the most photogenic angle. \"\n    \"Clean, minimal, premium.\\n\\n\"\n    \"Maintain exact product proportions from @Image1. {background}. Commercial-grade lighting.\"\n)\n\n# Generate multiple product videos\nproducts = [\n    {\"style\": \"Clean white infinity cove, premium commercial\",\n     \"duration\": 8, \"end_tc\": \"00:08\",\n     \"lighting_description\": \"Soft studio lighting creates a gentle gradient\",\n     \"background\": \"White background throughout\"},\n    {\"style\": \"Warm wooden surface, artisan craft aesthetic\",\n     \"duration\": 10, \"end_tc\": \"00:10\",\n     \"lighting_description\": \"Warm golden spotlight from above\",\n     \"background\": \"Natural wood grain texture visible\"},\n]\n\nfor product in products:\n    prompt = PRODUCT_TEMPLATE.format(**product)\n    # Submit to API using the prompt...\n",[28,36896,36897,36906,36915,36925,36940,36945,36960,36965,36974,36985,36994,37005,37009,37013,37018,37026,37039,37060,37072,37084,37097,37116,37127,37138,37142,37146,37157,37175],{"__ignoreMap":141},[145,36898,36899,36902,36904],{"class":147,"line":148},[145,36900,36901],{"class":155},"PRODUCT_TEMPLATE",[145,36903,392],{"class":259},[145,36905,19621],{"class":263},[145,36907,36908,36911,36913],{"class":147,"line":166},[145,36909,36910],{"class":159},"    \"@Image1 as first frame.",[145,36912,1671],{"class":155},[145,36914,951],{"class":159},[145,36916,36917,36920,36923],{"class":147,"line":178},[145,36918,36919],{"class":159},"    \"【Style】",[145,36921,36922],{"class":155},"{style}\\n",[145,36924,951],{"class":159},[145,36926,36927,36930,36933,36936,36938],{"class":147,"line":187},[145,36928,36929],{"class":159},"    \"【Duration】",[145,36931,36932],{"class":155},"{duration}",[145,36934,36935],{"class":159}," seconds",[145,36937,12085],{"class":155},[145,36939,951],{"class":159},[145,36941,36942],{"class":147,"line":374},[145,36943,36944],{"class":159},"    \"[00:00-00:03] Product slowly begins rotating clockwise. \"\n",[145,36946,36947,36950,36953,36956,36958],{"class":147,"line":380},[145,36948,36949],{"class":159},"    \"",[145,36951,36952],{"class":155},"{lighting_description}",[145,36954,36955],{"class":159},". Every texture detail remains razor-sharp.",[145,36957,12085],{"class":155},[145,36959,951],{"class":159},[145,36961,36962],{"class":147,"line":386},[145,36963,36964],{"class":159},"    \"[00:03-00:06] Rotation continues to 180 degrees. Camera subtly lowers angle \"\n",[145,36966,36967,36970,36972],{"class":147,"line":410},[145,36968,36969],{"class":159},"    \"to reveal the product's profile.",[145,36971,12085],{"class":155},[145,36973,951],{"class":159},[145,36975,36976,36979,36982],{"class":147,"line":421},[145,36977,36978],{"class":159},"    \"[00:06-",[145,36980,36981],{"class":155},"{end_tc}",[145,36983,36984],{"class":159},"] Rotation slows to a stop at the most photogenic angle. \"\n",[145,36986,36987,36990,36992],{"class":147,"line":432},[145,36988,36989],{"class":159},"    \"Clean, minimal, premium.",[145,36991,12085],{"class":155},[145,36993,951],{"class":159},[145,36995,36996,36999,37002],{"class":147,"line":456},[145,36997,36998],{"class":159},"    \"Maintain exact product proportions from @Image1. ",[145,37000,37001],{"class":155},"{background}",[145,37003,37004],{"class":159},". Commercial-grade lighting.\"\n",[145,37006,37007],{"class":147,"line":467},[145,37008,407],{"class":263},[145,37010,37011],{"class":147,"line":600},[145,37012,377],{"emptyLinePlaceholder":58},[145,37014,37015],{"class":147,"line":605},[145,37016,37017],{"class":174},"# Generate multiple product videos\n",[145,37019,37020,37022,37024],{"class":147,"line":611},[145,37021,28791],{"class":263},[145,37023,267],{"class":259},[145,37025,8843],{"class":263},[145,37027,37028,37030,37032,37034,37037],{"class":147,"line":617},[145,37029,19487],{"class":263},[145,37031,21156],{"class":159},[145,37033,438],{"class":263},[145,37035,37036],{"class":159},"\"Clean white infinity cove, premium commercial\"",[145,37038,453],{"class":263},[145,37040,37041,37044,37046,37048,37050,37053,37055,37058],{"class":147,"line":623},[145,37042,37043],{"class":159},"     \"duration\"",[145,37045,438],{"class":263},[145,37047,3691],{"class":155},[145,37049,401],{"class":263},[145,37051,37052],{"class":159},"\"end_tc\"",[145,37054,438],{"class":263},[145,37056,37057],{"class":159},"\"00:08\"",[145,37059,453],{"class":263},[145,37061,37062,37065,37067,37070],{"class":147,"line":628},[145,37063,37064],{"class":159},"     \"lighting_description\"",[145,37066,438],{"class":263},[145,37068,37069],{"class":159},"\"Soft studio lighting creates a gentle gradient\"",[145,37071,453],{"class":263},[145,37073,37074,37077,37079,37082],{"class":147,"line":639},[145,37075,37076],{"class":159},"     \"background\"",[145,37078,438],{"class":263},[145,37080,37081],{"class":159},"\"White background throughout\"",[145,37083,19515],{"class":263},[145,37085,37086,37088,37090,37092,37095],{"class":147,"line":654},[145,37087,19487],{"class":263},[145,37089,21156],{"class":159},[145,37091,438],{"class":263},[145,37093,37094],{"class":159},"\"Warm wooden surface, artisan craft aesthetic\"",[145,37096,453],{"class":263},[145,37098,37099,37101,37103,37105,37107,37109,37111,37114],{"class":147,"line":660},[145,37100,37043],{"class":159},[145,37102,438],{"class":263},[145,37104,537],{"class":155},[145,37106,401],{"class":263},[145,37108,37052],{"class":159},[145,37110,438],{"class":263},[145,37112,37113],{"class":159},"\"00:10\"",[145,37115,453],{"class":263},[145,37117,37118,37120,37122,37125],{"class":147,"line":671},[145,37119,37064],{"class":159},[145,37121,438],{"class":263},[145,37123,37124],{"class":159},"\"Warm golden spotlight from above\"",[145,37126,453],{"class":263},[145,37128,37129,37131,37133,37136],{"class":147,"line":698},[145,37130,37076],{"class":159},[145,37132,438],{"class":263},[145,37134,37135],{"class":159},"\"Natural wood grain texture visible\"",[145,37137,19515],{"class":263},[145,37139,37140],{"class":147,"line":710},[145,37141,764],{"class":263},[145,37143,37144],{"class":147,"line":716},[145,37145,377],{"emptyLinePlaceholder":58},[145,37147,37148,37150,37153,37155],{"class":147,"line":722},[145,37149,8207],{"class":259},[145,37151,37152],{"class":263}," product ",[145,37154,1181],{"class":259},[145,37156,28881],{"class":263},[145,37158,37159,37162,37164,37167,37170,37172],{"class":147,"line":728},[145,37160,37161],{"class":263},"    prompt ",[145,37163,267],{"class":259},[145,37165,37166],{"class":155}," PRODUCT_TEMPLATE",[145,37168,37169],{"class":263},".format(",[145,37171,16731],{"class":259},[145,37173,37174],{"class":263},"product)\n",[145,37176,37177],{"class":147,"line":739},[145,37178,37179],{"class":174},"    # Submit to API using the prompt...\n",[11,37181,37182],{},"这种方式保持提示词的一致性，同时使 A/B 测试更加便捷。",[92,37184,37185],{"id":37185},"复杂场景使用分镜脚本格式",[11,37187,37188],{},"任何超过 5 秒或涉及多个动作的视频，都应使用分镜脚本格式：",[70,37190,37191,37203,37211,37217,37223],{},[73,37192,37193,37196,37197,2955,37200],{},[23,37194,37195],{},"在顶部声明风格和时长","，使用 ",[28,37198,37199],{},"【Style】",[28,37201,37202],{},"【Duration】",[73,37204,37205,37196,37208,37210],{},[23,37206,37207],{},"拆分为 3-5 秒片段",[28,37209,32246],{}," 时间码",[73,37212,37213,37216],{},[23,37214,37215],{},"为每个镜头命名","并说明其功能：\"镜头 1：揭示\"",[73,37218,37219,37222],{},[23,37220,37221],{},"添加物理细节"," — 描述实际发生的物理现象（水花飞溅、尘土飞扬）而非抽象概念",[73,37224,37225,37228],{},[23,37226,37227],{},"以约束条件结尾"," — 一致性规则、色调说明、物理要求",[92,37230,37231],{"id":37231},"跨多次生成保持角色一致性",[11,37233,37234],{},"要在多个视频中保持同一角色：",[70,37236,37237,37246,37253],{},[73,37238,37239,37240,37243,37244,16468],{},"每次请求都",[23,37241,37242],{},"使用相同的参考图像","，通过 ",[28,37245,3016],{},[73,37247,37248,37249,37252],{},"在提示词中",[23,37250,37251],{},"加入明确的外观描述","——\"同款红色夹克，黑色短发\"——即使已使用图像参考也应保留",[73,37254,37255,37258],{},[23,37256,37257],{},"按顺序生成","，将第 N 个视频的最后一帧作为第 N+1 个视频的首帧图像",[11,37260,32332,37261,37264],{},[37,37262,37263],{"href":3376},"图生视频指南","中详细介绍了高级多镜头一致性模式——包括批量生成和角色锁定。",[92,37266,37267],{"id":37267},"降低成本",[11,37269,37270],{},"视频参考文件的生成成本高于纯文本或仅含图像的提示词。使用以下决策树：",[96,37272,37273,37278,37284],{},[73,37274,37275,37277],{},[23,37276,30371],{}," — 成本最低；适用于通用场景或没有参考素材时",[73,37279,37280,37283],{},[23,37281,37282],{},"图像参考"," — 中等成本；适用于需要保持角色或场景一致性时",[73,37285,37286,37289],{},[23,37287,37288],{},"视频参考"," — 成本最高；仅在需要镜头复现或动作迁移时使用",[18,37291,37292],{},[11,37293,37294,37295,37300],{},"具体定价因分辨率和时长而异。请查看 ",[37,37296,37299],{"href":37297,"rel":37298},"https://evolink.ai/#pricing",[41],"EvoLink 定价页面","获取最新费率（截至 2026 年 2 月）。",[92,37302,37303],{"id":37303},"对提示词进行版本管理",[11,37305,37306],{},"像管理代码一样管理提示词。将其存入版本控制系统，附带元数据：",[136,37308,37310],{"className":339,"code":37309,"language":341,"meta":141,"style":141},"PROMPT_REGISTRY = {\n    \"product_hero_v3\": {\n        \"version\": \"3.0\",\n        \"prompt\": \"【Style】Clean white infinity cove...\",\n        \"model\": \"seedance-2.0\",\n        \"duration\": 10,\n        \"test_results\": {\"ctr\": 0.24, \"conversion\": 0.087},\n        \"created\": \"2026-02-19\"\n    }\n}\n",[28,37311,37312,37321,37328,37340,37351,37361,37371,37398,37408,37412],{"__ignoreMap":141},[145,37313,37314,37317,37319],{"class":147,"line":148},[145,37315,37316],{"class":155},"PROMPT_REGISTRY",[145,37318,392],{"class":259},[145,37320,429],{"class":263},[145,37322,37323,37326],{"class":147,"line":166},[145,37324,37325],{"class":159},"    \"product_hero_v3\"",[145,37327,1943],{"class":263},[145,37329,37330,37333,37335,37338],{"class":147,"line":178},[145,37331,37332],{"class":159},"        \"version\"",[145,37334,438],{"class":263},[145,37336,37337],{"class":159},"\"3.0\"",[145,37339,453],{"class":263},[145,37341,37342,37344,37346,37349],{"class":147,"line":187},[145,37343,1320],{"class":159},[145,37345,438],{"class":263},[145,37347,37348],{"class":159},"\"【Style】Clean white infinity cove...\"",[145,37350,453],{"class":263},[145,37352,37353,37355,37357,37359],{"class":147,"line":374},[145,37354,1304],{"class":159},[145,37356,438],{"class":263},[145,37358,1309],{"class":159},[145,37360,453],{"class":263},[145,37362,37363,37365,37367,37369],{"class":147,"line":380},[145,37364,1348],{"class":159},[145,37366,438],{"class":263},[145,37368,537],{"class":155},[145,37370,453],{"class":263},[145,37372,37373,37376,37378,37381,37383,37386,37388,37391,37393,37396],{"class":147,"line":386},[145,37374,37375],{"class":159},"        \"test_results\"",[145,37377,20403],{"class":263},[145,37379,37380],{"class":159},"\"ctr\"",[145,37382,438],{"class":263},[145,37384,37385],{"class":155},"0.24",[145,37387,401],{"class":263},[145,37389,37390],{"class":159},"\"conversion\"",[145,37392,438],{"class":263},[145,37394,37395],{"class":155},"0.087",[145,37397,19515],{"class":263},[145,37399,37400,37403,37405],{"class":147,"line":410},[145,37401,37402],{"class":159},"        \"created\"",[145,37404,438],{"class":263},[145,37406,37407],{"class":159},"\"2026-02-19\"\n",[145,37409,37410],{"class":147,"line":421},[145,37411,1408],{"class":263},[145,37413,37414],{"class":147,"line":432},[145,37415,470],{"class":263},[11,37417,37418],{},"这样可以对提示词进行 A/B 测试，并在需要时回滚至之前的版本。",[92,37420,37421],{"id":37421},"优雅地处理生成失败",[11,37423,37424],{},"并非每次提示词都能成功生成。构建带有指数退避的重试逻辑：",[136,37426,37428],{"className":339,"code":37427,"language":341,"meta":141,"style":141},"import time\nimport random\n\ndef generate_with_retry(prompt_data, max_retries=3):\n    for attempt in range(max_retries):\n        try:\n            response = requests.post(f\"{BASE_URL}/videos/generations\",\n                                   json=prompt_data, headers=headers)\n            if response.status_code == 200:\n                return response.json()\n        except Exception as e:\n            if attempt == max_retries - 1:\n                raise e\n            time.sleep(2 ** attempt + random.uniform(0, 1))\n    return None\n",[28,37429,37430,37436,37442,37446,37462,37474,37480,37498,37514,37526,37532,37542,37560,37567,37590],{"__ignoreMap":141},[145,37431,37432,37434],{"class":147,"line":148},[145,37433,348],{"class":259},[145,37435,357],{"class":263},[145,37437,37438,37440],{"class":147,"line":166},[145,37439,348],{"class":259},[145,37441,5024],{"class":263},[145,37443,37444],{"class":147,"line":178},[145,37445,377],{"emptyLinePlaceholder":58},[145,37447,37448,37450,37453,37456,37458,37460],{"class":147,"line":187},[145,37449,526],{"class":259},[145,37451,37452],{"class":151}," generate_with_retry",[145,37454,37455],{"class":263},"(prompt_data, max_retries",[145,37457,267],{"class":259},[145,37459,5043],{"class":155},[145,37461,548],{"class":263},[145,37463,37464,37466,37468,37470,37472],{"class":147,"line":374},[145,37465,5101],{"class":259},[145,37467,5104],{"class":263},[145,37469,1181],{"class":259},[145,37471,5109],{"class":155},[145,37473,5112],{"class":263},[145,37475,37476,37478],{"class":147,"line":380},[145,37477,5117],{"class":259},[145,37479,860],{"class":263},[145,37481,37482,37484,37486,37488,37490,37492,37494,37496],{"class":147,"line":386},[145,37483,5124],{"class":263},[145,37485,267],{"class":259},[145,37487,26960],{"class":263},[145,37489,441],{"class":259},[145,37491,450],{"class":159},[145,37493,679],{"class":155},[145,37495,1445],{"class":159},[145,37497,453],{"class":263},[145,37499,37500,37503,37505,37508,37510,37512],{"class":147,"line":410},[145,37501,37502],{"class":701},"                                   json",[145,37504,267],{"class":259},[145,37506,37507],{"class":263},"prompt_data, ",[145,37509,17766],{"class":701},[145,37511,267],{"class":259},[145,37513,17771],{"class":263},[145,37515,37516,37518,37520,37522,37524],{"class":147,"line":421},[145,37517,5192],{"class":259},[145,37519,2504],{"class":263},[145,37521,854],{"class":259},[145,37523,2509],{"class":155},[145,37525,860],{"class":263},[145,37527,37528,37530],{"class":147,"line":432},[145,37529,5205],{"class":259},[145,37531,736],{"class":263},[145,37533,37534,37536,37538,37540],{"class":147,"line":456},[145,37535,5515],{"class":259},[145,37537,7041],{"class":155},[145,37539,7044],{"class":259},[145,37541,5633],{"class":263},[145,37543,37544,37546,37548,37550,37553,37556,37558],{"class":147,"line":467},[145,37545,5192],{"class":259},[145,37547,5104],{"class":263},[145,37549,854],{"class":259},[145,37551,37552],{"class":263}," max_retries ",[145,37554,37555],{"class":259},"-",[145,37557,21184],{"class":155},[145,37559,860],{"class":263},[145,37561,37562,37564],{"class":147,"line":600},[145,37563,5317],{"class":259},[145,37565,37566],{"class":263}," e\n",[145,37568,37569,37572,37574,37576,37578,37580,37582,37584,37586,37588],{"class":147,"line":605},[145,37570,37571],{"class":263},"            time.sleep(",[145,37573,5400],{"class":155},[145,37575,5403],{"class":259},[145,37577,5104],{"class":263},[145,37579,5409],{"class":259},[145,37581,5412],{"class":263},[145,37583,783],{"class":155},[145,37585,401],{"class":263},[145,37587,5419],{"class":155},[145,37589,8777],{"class":263},[145,37591,37592,37594],{"class":147,"line":611},[145,37593,1704],{"class":259},[145,37595,11915],{"class":155},[11,37597,37598],{},"常见失败原因：",[96,37600,37601,37607,37613],{},[73,37602,37603,37606],{},[23,37604,37605],{},"内容政策违规"," — 通常由上传真实人脸照片引起",[73,37608,37609,37612],{},[23,37610,37611],{},"资源耗尽"," — 等待更长时间后重试",[73,37614,37615,37618],{},[23,37616,37617],{},"无效的 @Tag 引用"," — 检查文件上传顺序",[45,37620],{},[48,37622,37624],{"id":37623},"高级技巧专业用户进阶","高级技巧：专业用户进阶",[92,37626,37627],{"id":37627},"链式多次生成",[11,37629,37630],{},"将上一个视频的最后一帧作为下一个视频的首帧，创作更长的叙事：",[136,37632,37634],{"className":339,"code":37633,"language":341,"meta":141,"style":141},"# Step 1: Generate opening scene\nscene1_result = generate_video({\n    \"prompt\": \"A detective enters a dark office...\",\n    \"duration\": 8\n})\n\n# Step 2: Extract last frame and use as first frame for scene 2\nlast_frame = extract_frame(scene1_result[\"video_url\"], timestamp=-1)\n\nscene2_result = generate_video({\n    \"files\": [(\"references\", last_frame)],\n    \"prompt\": \"@Image1 as first frame. The detective discovers a clue...\",\n    \"duration\": 10\n})\n",[28,37635,37636,37641,37651,37662,37670,37675,37679,37684,37708,37712,37721,37735,37746,37754],{"__ignoreMap":141},[145,37637,37638],{"class":147,"line":148},[145,37639,37640],{"class":174},"# Step 1: Generate opening scene\n",[145,37642,37643,37646,37648],{"class":147,"line":166},[145,37644,37645],{"class":263},"scene1_result ",[145,37647,267],{"class":259},[145,37649,37650],{"class":263}," generate_video({\n",[145,37652,37653,37655,37657,37660],{"class":147,"line":178},[145,37654,3674],{"class":159},[145,37656,438],{"class":263},[145,37658,37659],{"class":159},"\"A detective enters a dark office...\"",[145,37661,453],{"class":263},[145,37663,37664,37666,37668],{"class":147,"line":187},[145,37665,3686],{"class":159},[145,37667,438],{"class":263},[145,37669,26013],{"class":155},[145,37671,37672],{"class":147,"line":374},[145,37673,37674],{"class":263},"})\n",[145,37676,37677],{"class":147,"line":380},[145,37678,377],{"emptyLinePlaceholder":58},[145,37680,37681],{"class":147,"line":386},[145,37682,37683],{"class":174},"# Step 2: Extract last frame and use as first frame for scene 2\n",[145,37685,37686,37689,37691,37694,37696,37698,37701,37704,37706],{"class":147,"line":410},[145,37687,37688],{"class":263},"last_frame ",[145,37690,267],{"class":259},[145,37692,37693],{"class":263}," extract_frame(scene1_result[",[145,37695,14886],{"class":159},[145,37697,10723],{"class":263},[145,37699,37700],{"class":701},"timestamp",[145,37702,37703],{"class":259},"=-",[145,37705,5419],{"class":155},[145,37707,407],{"class":263},[145,37709,37710],{"class":147,"line":421},[145,37711,377],{"emptyLinePlaceholder":58},[145,37713,37714,37717,37719],{"class":147,"line":432},[145,37715,37716],{"class":263},"scene2_result ",[145,37718,267],{"class":259},[145,37720,37650],{"class":263},[145,37722,37723,37726,37729,37732],{"class":147,"line":456},[145,37724,37725],{"class":159},"    \"files\"",[145,37727,37728],{"class":263},": [(",[145,37730,37731],{"class":159},"\"references\"",[145,37733,37734],{"class":263},", last_frame)],\n",[145,37736,37737,37739,37741,37744],{"class":147,"line":467},[145,37738,3674],{"class":159},[145,37740,438],{"class":263},[145,37742,37743],{"class":159},"\"@Image1 as first frame. The detective discovers a clue...\"",[145,37745,453],{"class":263},[145,37747,37748,37750,37752],{"class":147,"line":600},[145,37749,3686],{"class":159},[145,37751,438],{"class":263},[145,37753,26061],{"class":155},[145,37755,37756],{"class":147,"line":605},[145,37757,37674],{"class":263},[92,37759,37760],{"id":37760},"动态提示词生成",[11,37762,37763],{},"使用 AI 生成成功提示词的多个变体：",[136,37765,37767],{"className":339,"code":37766,"language":341,"meta":141,"style":141},"def generate_prompt_variations(base_prompt, num_variations=3):\n    variations = []\n    for i in range(num_variations):\n        # Use OpenAI/Claude to generate stylistic variations\n        variation = ai_rephrase(base_prompt, style=f\"variation_{i}\")\n        variations.append(variation)\n    return variations\n\n# Test multiple versions for A/B optimization\nbase = \"【Style】Cinematic product showcase...\"\nfor variation in generate_prompt_variations(base):\n    result = generate_video({\"prompt\": variation})\n    # Track performance metrics...\n",[28,37768,37769,37785,37794,37808,37813,37842,37847,37854,37858,37863,37873,37885,37899],{"__ignoreMap":141},[145,37770,37771,37773,37776,37779,37781,37783],{"class":147,"line":148},[145,37772,526],{"class":259},[145,37774,37775],{"class":151}," generate_prompt_variations",[145,37777,37778],{"class":263},"(base_prompt, num_variations",[145,37780,267],{"class":259},[145,37782,5043],{"class":155},[145,37784,548],{"class":263},[145,37786,37787,37790,37792],{"class":147,"line":166},[145,37788,37789],{"class":263},"    variations ",[145,37791,267],{"class":259},[145,37793,5856],{"class":263},[145,37795,37796,37798,37801,37803,37805],{"class":147,"line":178},[145,37797,5101],{"class":259},[145,37799,37800],{"class":263}," i ",[145,37802,1181],{"class":259},[145,37804,5109],{"class":155},[145,37806,37807],{"class":263},"(num_variations):\n",[145,37809,37810],{"class":147,"line":187},[145,37811,37812],{"class":174},"        # Use OpenAI/Claude to generate stylistic variations\n",[145,37814,37815,37818,37820,37823,37825,37827,37829,37832,37834,37836,37838,37840],{"class":147,"line":374},[145,37816,37817],{"class":263},"        variation ",[145,37819,267],{"class":259},[145,37821,37822],{"class":263}," ai_rephrase(base_prompt, ",[145,37824,11186],{"class":701},[145,37826,267],{"class":259},[145,37828,441],{"class":259},[145,37830,37831],{"class":159},"\"variation_",[145,37833,685],{"class":155},[145,37835,6309],{"class":263},[145,37837,691],{"class":155},[145,37839,450],{"class":159},[145,37841,407],{"class":263},[145,37843,37844],{"class":147,"line":380},[145,37845,37846],{"class":263},"        variations.append(variation)\n",[145,37848,37849,37851],{"class":147,"line":386},[145,37850,1704],{"class":259},[145,37852,37853],{"class":263}," variations\n",[145,37855,37856],{"class":147,"line":410},[145,37857,377],{"emptyLinePlaceholder":58},[145,37859,37860],{"class":147,"line":421},[145,37861,37862],{"class":174},"# Test multiple versions for A/B optimization\n",[145,37864,37865,37868,37870],{"class":147,"line":432},[145,37866,37867],{"class":263},"base ",[145,37869,267],{"class":259},[145,37871,37872],{"class":159}," \"【Style】Cinematic product showcase...\"\n",[145,37874,37875,37877,37880,37882],{"class":147,"line":456},[145,37876,8207],{"class":259},[145,37878,37879],{"class":263}," variation ",[145,37881,1181],{"class":259},[145,37883,37884],{"class":263}," generate_prompt_variations(base):\n",[145,37886,37887,37889,37891,37894,37896],{"class":147,"line":467},[145,37888,1619],{"class":263},[145,37890,267],{"class":259},[145,37892,37893],{"class":263}," generate_video({",[145,37895,5901],{"class":159},[145,37897,37898],{"class":263},": variation})\n",[145,37900,37901],{"class":147,"line":600},[145,37902,37903],{"class":174},"    # Track performance metrics...\n",[92,37905,37906],{"id":37906},"自动质量评估",[11,37908,37909],{},"在人工审核前自动为生成的视频打分：",[136,37911,37913],{"className":339,"code":37912,"language":341,"meta":141,"style":141},"def assess_video_quality(video_url):\n    scores = {}\n\n    # Motion smoothness (analyze frame-to-frame changes)\n    scores[\"motion\"] = calculate_motion_smoothness(video_url)\n\n    # Visual consistency (check for flickering/artifacts)\n    scores[\"consistency\"] = detect_visual_artifacts(video_url)\n\n    # Prompt adherence (use CLIP to compare with text description)\n    scores[\"adherence\"] = measure_prompt_alignment(video_url, prompt)\n\n    return scores\n\n# Only proceed with high-quality generations\nresult = generate_video(prompt_data)\nif assess_video_quality(result[\"video_url\"])[\"overall\"] > 0.8:\n    publish_video(result[\"video_url\"])\n",[28,37914,37915,37925,37934,37938,37943,37958,37962,37967,37981,37985,37990,38004,38008,38015,38019,38024,38033,38057],{"__ignoreMap":141},[145,37916,37917,37919,37922],{"class":147,"line":148},[145,37918,526],{"class":259},[145,37920,37921],{"class":151}," assess_video_quality",[145,37923,37924],{"class":263},"(video_url):\n",[145,37926,37927,37930,37932],{"class":147,"line":166},[145,37928,37929],{"class":263},"    scores ",[145,37931,267],{"class":259},[145,37933,16748],{"class":263},[145,37935,37936],{"class":147,"line":178},[145,37937,377],{"emptyLinePlaceholder":58},[145,37939,37940],{"class":147,"line":187},[145,37941,37942],{"class":174},"    # Motion smoothness (analyze frame-to-frame changes)\n",[145,37944,37945,37948,37951,37953,37955],{"class":147,"line":374},[145,37946,37947],{"class":263},"    scores[",[145,37949,37950],{"class":159},"\"motion\"",[145,37952,14864],{"class":263},[145,37954,267],{"class":259},[145,37956,37957],{"class":263}," calculate_motion_smoothness(video_url)\n",[145,37959,37960],{"class":147,"line":380},[145,37961,377],{"emptyLinePlaceholder":58},[145,37963,37964],{"class":147,"line":386},[145,37965,37966],{"class":174},"    # Visual consistency (check for flickering/artifacts)\n",[145,37968,37969,37971,37974,37976,37978],{"class":147,"line":410},[145,37970,37947],{"class":263},[145,37972,37973],{"class":159},"\"consistency\"",[145,37975,14864],{"class":263},[145,37977,267],{"class":259},[145,37979,37980],{"class":263}," detect_visual_artifacts(video_url)\n",[145,37982,37983],{"class":147,"line":421},[145,37984,377],{"emptyLinePlaceholder":58},[145,37986,37987],{"class":147,"line":432},[145,37988,37989],{"class":174},"    # Prompt adherence (use CLIP to compare with text description)\n",[145,37991,37992,37994,37997,37999,38001],{"class":147,"line":456},[145,37993,37947],{"class":263},[145,37995,37996],{"class":159},"\"adherence\"",[145,37998,14864],{"class":263},[145,38000,267],{"class":259},[145,38002,38003],{"class":263}," measure_prompt_alignment(video_url, prompt)\n",[145,38005,38006],{"class":147,"line":467},[145,38007,377],{"emptyLinePlaceholder":58},[145,38009,38010,38012],{"class":147,"line":600},[145,38011,1704],{"class":259},[145,38013,38014],{"class":263}," scores\n",[145,38016,38017],{"class":147,"line":605},[145,38018,377],{"emptyLinePlaceholder":58},[145,38020,38021],{"class":147,"line":611},[145,38022,38023],{"class":174},"# Only proceed with high-quality generations\n",[145,38025,38026,38028,38030],{"class":147,"line":617},[145,38027,12197],{"class":263},[145,38029,267],{"class":259},[145,38031,38032],{"class":263}," generate_video(prompt_data)\n",[145,38034,38035,38037,38040,38042,38045,38048,38050,38052,38055],{"class":147,"line":623},[145,38036,1720],{"class":259},[145,38038,38039],{"class":263}," assess_video_quality(result[",[145,38041,14886],{"class":159},[145,38043,38044],{"class":263},"])[",[145,38046,38047],{"class":159},"\"overall\"",[145,38049,14864],{"class":263},[145,38051,5972],{"class":259},[145,38053,38054],{"class":155}," 0.8",[145,38056,860],{"class":263},[145,38058,38059,38062,38064],{"class":147,"line":628},[145,38060,38061],{"class":263},"    publish_video(result[",[145,38063,14886],{"class":159},[145,38065,1630],{"class":263},[18,38067,38068],{},[11,38069,38070],{},[37,38071,38073],{"href":211,"rel":38072},[41],"使用 EvoLink Pro 方案访问 Seedance 高级功能",[45,38075],{},[48,38077,9036],{"id":9036},[92,38079,38081],{"id":38080},"seedance-10-和-20-有什么区别","Seedance 1.0 和 2.0 有什么区别？",[11,38083,38084],{},"Seedance 2.0 引入了多模态输入（@Tag 引用）、更长的生成时长支持（4 到 15 秒），以及显著改进的时序一致性。提示词结构基本相似，但 2.0 对复杂场景的处理能力大幅提升。",[92,38086,38088],{"id":38087},"为什么我的-tag-引用有时会被忽略","为什么我的 @Tag 引用有时会被忽略？",[11,38090,38091],{},"常见原因：",[70,38093,38094,38101,38109,38115],{},[73,38095,38096,36730,38099],{},[23,38097,38098],{},"编号错误",[28,38100,2917],{},[73,38102,38103,38106,38107],{},[23,38104,38105],{},"文件类型不匹配"," — 上传了图像却引用 ",[28,38108,16467],{},[73,38110,38111,38114],{},[23,38112,38113],{},"指令冲突"," — 要求\"黑暗夜景\"却提供了明亮白天的图像",[73,38116,38117,38120],{},[23,38118,38119],{},"上传顺序混淆"," — 标签按各类型内的上传顺序分配",[92,38122,38124],{"id":38123},"如何在多个视频中保持角色一致性","如何在多个视频中保持角色一致性？",[70,38126,38127,38130,38133,38136],{},[73,38128,38129],{},"每次生成都使用完全相同的参考图像",[73,38131,38132],{},"在文本中加入明确的角色描述（\"同款蓝色夹克，肩膀长度的棕色头发\"）",[73,38134,38135],{},"将第 N 个视频的最后一帧作为第 N+1 个视频的首帧",[73,38137,38138],{},"在所有提示词中保持角色描述完全一致",[92,38140,38142],{"id":38141},"我可以修改现有视频吗","我可以修改现有视频吗？",[11,38144,38145],{},"可以！通过 video_urls 上传你的现有视频，并在提示词中使用 @Video1 引用来编辑它——替换角色、修改场景、延长时长或更改剧情。",[11,38147,38148],{},"你还可以：",[96,38150,38151,38154,38157],{},[73,38152,38153],{},"使用 @Video1 引用原始视频，并在提示词中描述你的编辑",[73,38155,38156],{},"通过 image_urls 上传参考图像来替换角色或添加元素",[73,38158,38159],{},"使用延伸提示词在原始视频前后添加内容",[11,38161,38162,38163,298],{},"完整的编辑参数规格请参阅",[37,38164,22903],{"href":22902},[92,38166,38168],{"id":38167},"视频最长可以生成多久","视频最长可以生成多久？",[11,38170,38171],{},"Seedance 2.0 支持 4 到 15 秒的单次生成。对于超出 15 秒限制的更长内容，建议：",[96,38173,38174,38177,38180],{},[73,38175,38176],{},"将其拆分为多个场景并链式串联",[73,38178,38179],{},"使用带有明确时间码的分镜脚本格式",[73,38181,38182],{},"每次生成聚焦于单一概念",[92,38184,38186],{"id":38185},"如何避免内容政策违规","如何避免内容政策违规？",[96,38188,38189,38192,38195,38198],{},[73,38190,38191],{},"不要上传真实人类的面部照片",[73,38193,38194],{},"避免使用受版权保护的角色或名人形象",[73,38196,38197],{},"使用插画或风格化角色参考代替真实照片",[73,38199,38200],{},"专注于原创概念，而非重现现有媒体内容",[92,38202,38204],{"id":38203},"为什么有些提示词的费用更高","为什么有些提示词的费用更高？",[11,38206,38207],{},"生成费用的影响因素：",[70,38209,38210,38215,38221,38227],{},[73,38211,38212,38214],{},[23,38213,18272],{}," — 视频越长费用越高",[73,38216,38217,38220],{},[23,38218,38219],{},"分辨率"," — 1080p 比 720p 更贵",[73,38222,38223,38226],{},[23,38224,38225],{},"参考文件数量"," — 视频参考比图像参考费用更高",[73,38228,38229,38232],{},[23,38230,38231],{},"复杂度"," — 多角色场景可能消耗更多算力",[92,38234,38236],{"id":38235},"如何从分镜脚本格式中获得最佳效果","如何从分镜脚本格式中获得最佳效果？",[70,38238,38239,38242,38245,38248,38251],{},[73,38240,38241],{},"每个镜头片段控制在 3-5 秒以内",[73,38243,38244],{},"使用具体的风格锚点（\"克里斯托弗·诺兰惊悚片\"而非\"电影感\"）",[73,38246,38247],{},"描述物理动作而非抽象概念",[73,38249,38250],{},"为每个镜头添加镜头运动指令",[73,38252,38253],{},"以一致性约束和物理要求结尾",[92,38255,38257],{"id":38256},"seedance-可以用于商业项目吗","Seedance 可以用于商业项目吗？",[11,38259,38260,38261,38264],{},"可以，但需要适当的许可授权。具体政策可能因订阅等级而异，请在 ",[37,38262,213],{"href":211,"rel":38263},[41]," 查看最新条款。",[92,38266,38268],{"id":38267},"如何排查生成失败的问题","如何排查生成失败的问题？",[70,38270,38271,38277,38283,38289,38295],{},[73,38272,38273,38276],{},[23,38274,38275],{},"检查文件数量限制"," — 图像 ≤9，视频 ≤3，音频 ≤3",[73,38278,38279,38282],{},[23,38280,38281],{},"核实 @Tag 编号","是否与上传文件对应",[73,38284,38285,38288],{},[23,38286,38287],{},"简化提示词","，如果超过 200 字",[73,38290,38291,38294],{},[23,38292,38293],{},"移除冲突指令","，消除文本与参考文件之间的矛盾",[73,38296,38297,38300],{},[23,38298,38299],{},"先尝试纯文本","，然后逐步添加参考文件",[92,38302,38304],{"id":38303},"什么样的提示词达到专业级水准","什么样的提示词达到\"专业级\"水准？",[11,38306,38307],{},"专业级提示词通常包含：",[96,38309,38310,38313,38316,38319,38322],{},[73,38311,38312],{},"带时间码的分镜脚本格式",[73,38314,38315],{},"具体的风格锚点（导演姓名、艺术运动）",[73,38317,38318],{},"物理动作描述而非抽象概念",[73,38320,38321],{},"一致性约束和物理要求",[73,38323,38324],{},"合理的参考文件选择和 @Tag 用法",[45,38326],{},[48,38328,38329],{"id":38329},"总结",[11,38331,38332],{},"掌握 Seedance 2.0 提示词的核心在于理解文本描述与多模态参考之间的平衡。分镜脚本格式赋予你电影级的精准控制，而 @Tag 引用则确保视觉一致性。",[11,38334,38335],{},"从本指南中的纯文本模板开始，熟悉语法后再逐步引入图像和视频参考。专注于清晰、具体的指令，而非过于复杂的描述。",[11,38337,38338],{},"本文的模板覆盖了最常见的使用场景——从产品广告到角色动画，再到风格转换。你可以通过修改风格锚点、时间码和参考文件，将它们适配到自己的具体需求。",[11,38340,38341,38342,38345,38346,38349],{},"最重要的是：",[23,38343,38344],{},"多实验","。每一条提示词都会告诉你 Seedance 2.0 是如何理解指令的。",[37,38347,32328],{"href":32326,"rel":38348},[41]," 社区持续分享成功的提示词模式和突破性技巧。",[11,38351,38352,2423,38355,38359],{},[23,38353,38354],{},"准备好开始创作了吗？",[37,38356,38358],{"href":211,"rel":38357},[41],"获取你的免费 EvoLink API Key","，运行本指南中的每一个模板。视频创作的未来是多模态的——而它现在就已经触手可及。",[11,38361,38362,38365,38366,38369,38370,38372,38373],{},[23,38363,38364],{},"延伸阅读："," 掌握 @tag 引用系统 → ",[37,38367,38368],{"href":2962},"多模态指南"," | ",[37,38371,22959],{"href":3376}," | 使用完整 Python 示例学习",[37,38374,34850],{"href":3849},[45,38376],{},[11,38378,38379],{},[2614,38380,38381],{},"最后更新：2026 年 2 月 19 日 | Written by J, Growth Lead at EvoLink",[11186,38383,38384],{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}",{"title":141,"searchDepth":166,"depth":166,"links":38386},[38387,38393,38400,38406,38407,38415,38420,38433],{"id":32117,"depth":166,"text":32091,"children":38388},[38389,38390,38391,38392],{"id":32205,"depth":178,"text":32205},{"id":32225,"depth":178,"text":32226},{"id":32339,"depth":178,"text":32340},{"id":32370,"depth":178,"text":32371},{"id":32887,"depth":166,"text":32888,"children":38394},[38395,38396,38397,38398,38399],{"id":32896,"depth":178,"text":32896},{"id":32956,"depth":178,"text":32957},{"id":33045,"depth":178,"text":33046},{"id":33123,"depth":178,"text":33124},{"id":33184,"depth":178,"text":33184},{"id":33296,"depth":166,"text":33297,"children":38401},[38402,38403,38404,38405],{"id":33300,"depth":178,"text":33300},{"id":34044,"depth":178,"text":34044},{"id":35190,"depth":178,"text":35191},{"id":36306,"depth":178,"text":36306},{"id":36683,"depth":166,"text":36684},{"id":36884,"depth":166,"text":36885,"children":38408},[38409,38410,38411,38412,38413,38414],{"id":36888,"depth":178,"text":36888},{"id":37185,"depth":178,"text":37185},{"id":37231,"depth":178,"text":37231},{"id":37267,"depth":178,"text":37267},{"id":37303,"depth":178,"text":37303},{"id":37421,"depth":178,"text":37421},{"id":37623,"depth":166,"text":37624,"children":38416},[38417,38418,38419],{"id":37627,"depth":178,"text":37627},{"id":37760,"depth":178,"text":37760},{"id":37906,"depth":178,"text":37906},{"id":9036,"depth":166,"text":9036,"children":38421},[38422,38423,38424,38425,38426,38427,38428,38429,38430,38431,38432],{"id":38080,"depth":178,"text":38081},{"id":38087,"depth":178,"text":38088},{"id":38123,"depth":178,"text":38124},{"id":38141,"depth":178,"text":38142},{"id":38167,"depth":178,"text":38168},{"id":38185,"depth":178,"text":38186},{"id":38203,"depth":178,"text":38204},{"id":38235,"depth":178,"text":38236},{"id":38256,"depth":178,"text":38257},{"id":38267,"depth":178,"text":38268},{"id":38303,"depth":178,"text":38304},{"id":38329,"depth":166,"text":38329},"掌握 Seedance 2.0 提示词的 @Tag 语法、多模态引用与 15+ 即用模板，附带 Python API 代码示例。",{"date":38436,"image":38437,"pinned":58},"2026-02-19","/111.png","/zh/blog/seedance-2-prompt-guide",{"title":13367,"description":38434},"zh/blog/seedance-2-prompt-guide","W2p2Xi1Z3Sr7Ytd_DfuC2KX1yVjDb5FCb_Off8BUNmA",{"id":38443,"title":38444,"body":38445,"description":41334,"extension":11248,"meta":41335,"navigation":58,"path":41356,"seo":41357,"stem":41358,"__hash__":41359},"content/zh/blog/seedance-2-vs-sora-2-api-comparison.md","Seedance 2.0 vs Sora 2：相同提示词的真实 API 测试对比（2026）",{"type":8,"value":38446,"toc":41291},[38447,38450,38453,38470,38483,38487,38490,38510,38516,38522,38525,38531,38599,38602,38605,38609,38614,38619,38622,38627,38687,38693,38696,38702,38705,38710,38760,38765,38768,38773,38777,38783,38789,38792,38797,38860,38863,38867,38871,38876,38879,38884,38938,38943,38949,38952,38955,38958,38963,39017,39023,39026,39032,39036,39042,39045,39052,39057,39116,39119,39122,39126,39130,39135,39138,39143,39197,39202,39205,39208,39211,39216,39266,39272,39275,39279,39285,39288,39293,39353,39356,39359,39366,39370,39373,39542,39547,39565,39569,39572,39576,39579,40157,40163,40296,40302,40306,40507,40510,40516,40522,40528,40534,40545,40549,40552,40556,40617,40628,40639,40643,40649,40652,40722,40729,40735,40739,40785,40789,40792,40796,40836,40840,40866,40870,40873,40876,41104,41107,41111,41114,41116,41120,41123,41127,41138,41142,41145,41149,41155,41159,41166,41170,41177,41179,41183,41260,41263,41276,41288],[23028,38448,38444],{"id":38449},"seedance-20-vs-sora-2相同提示词的真实-api-测试对比2026",[11,38451,38452],{},"大多数\"Seedance vs Sora\"文章只是对比参数表。我们用相同的三个提示词测试了两个模型，记录输出结果，并逐帧打分。以下是我们的发现——包含视频证据、可复制的 API 代码，以及可能影响你选择的价格明细。",[11,38454,38455,38456,38461,38462,38465,38466,38469],{},"Seedance 2.0（由字节跳动的 ",[37,38457,38460],{"href":38458,"rel":38459},"https://seed.bytedance.com/en",[41],"Seed 团队","开发）在我们的测试中总体得分 ",[23,38463,38464],{},"8.5/10","，而 Sora 2 为 ",[23,38467,38468],{},"8.0/10","。差距并不在我们预期的地方。",[38471,38472,38474],"callout",{"type":38473},"info",[11,38475,38476,38479,38482],{},[23,38477,38478],{},"想自己运行这些测试？",[37,38480,38481],{"href":16408},"获取免费的 EvoLink API 密钥","，使用下面的确切提示词。",[48,38484,38486],{"id":38485},"the-test-setup","The Test Setup",[11,38488,38489],{},"We designed three prompts to stress-test different capabilities:",[70,38491,38492,38498,38504],{},[73,38493,38494,38497],{},[23,38495,38496],{},"Slow-motion physics"," — a porcelain vase shattering (particle dynamics, material rendering)",[73,38499,38500,38503],{},[23,38501,38502],{},"Dynamic human motion"," — rooftop breakdancing at night (anatomy, motion blur, neon lighting)",[73,38505,38506,38509],{},[23,38507,38508],{},"Facial expression & lighting"," — an elderly woman discovering a magical book (micro-expressions, volumetric light)",[11,38511,38512,38515],{},[23,38513,38514],{},"Methodology:"," Each prompt was submitted verbatim to both APIs. No cherry-picking — we used the first generation from each model. Videos are 15 seconds, unedited. Scoring uses six dimensions: image quality, prompt adherence, physics/anatomy realism, lighting, motion fluidity, and detail richness.",[11,38517,38518,38521],{},[23,38519,38520],{},"Why this matters:"," If you're building a product on top of an AI video API, you need to know which model handles your use case. Spec sheets won't tell you that Sora 2's human anatomy breaks down on pause, or that Seedance's 60fps makes slow-motion scenes noticeably smoother.",[11,38523,38524],{},"Every existing \"Seedance vs Sora\" article we found relies on feature-list comparisons or single cherry-picked examples. None uses controlled, identical prompts with systematic scoring. That's the gap this test fills.",[11,38526,38527,38530],{},[23,38528,38529],{},"What we didn't test:"," We didn't evaluate text-overlay quality, multi-scene narratives, or audio-sync accuracy in this round. Those deserve their own dedicated tests. We also limited ourselves to text-to-video mode — image-to-video and video-to-video comparisons are planned for a follow-up.",[2036,38532,38533,38545],{},[2039,38534,38535],{},[2042,38536,38537,38540,38542],{},[2045,38538,38539],{},"Parameter",[2045,38541,17335],{"align":13756},[2045,38543,38544],{"align":13756},"Sora 2",[2052,38546,38547,38558,38569,38578,38588],{},[2042,38548,38549,38552,38555],{},[2057,38550,38551],{},"Resolution",[2057,38553,38554],{"align":13756},"1280×720 (720p)",[2057,38556,38557],{"align":13756},"1792×1024 (~1080p)",[2042,38559,38560,38563,38566],{},[2057,38561,38562],{},"Frame Rate",[2057,38564,38565],{"align":13756},"60fps",[2057,38567,38568],{"align":13756},"30fps",[2042,38570,38571,38574,38576],{},[2057,38572,38573],{},"Duration",[2057,38575,4067],{"align":13756},[2057,38577,4067],{"align":13756},[2042,38579,38580,38583,38586],{},[2057,38581,38582],{},"Codec",[2057,38584,38585],{"align":13756},"H.264",[2057,38587,38585],{"align":13756},[2042,38589,38590,38593,38596],{},[2057,38591,38592],{},"Audio",[2057,38594,38595],{"align":13756},"AAC 44.1kHz stereo",[2057,38597,38598],{"align":13756},"AAC 96kHz stereo",[11,38600,38601],{},"Seedance trades resolution for double the frame rate. Sora delivers ~2.5× more pixels per frame. Both choices have real consequences for different content types — as you'll see below.",[11,38603,38604],{},"A quick note on audio: both models generate synchronized audio (dialogue, SFX, music), but their sample rates differ. Sora's 96kHz output exceeds CD quality, while Seedance's 44.1kHz matches standard CD audio. In practice, most delivery platforms (YouTube, TikTok, Instagram) downsample to 48kHz or lower, so this difference rarely matters for final distribution.",[48,38606,38608],{"id":38607},"test-1-slow-motion-physics-porcelain-vase","Test 1 — Slow-Motion Physics (Porcelain Vase)",[11,38610,38611],{},[23,38612,38613],{},"Prompt:",[18,38615,38616],{},[11,38617,38618],{},"A porcelain vase falls from a marble table in slow motion. Camera starts with a close-up of the vase wobbling on the edge, then follows it downward with a smooth tracking shot as it shatters on a stone floor. Fragments scatter in all directions. Dust particles float in warm afternoon sunlight streaming through a window. Shallow depth of field, 24fps cinematic look",[92,38620,17335],{"id":38621},"seedance-20",[56,38623,60,38624],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,38625],{"src":38626,"type":65},"https://cdn.evolink.ai/skills-media/seedance2/seedance2.0%E7%93%B7%E5%99%A8%E6%8E%89%E5%9C%B0%E4%B8%8A.mp4",[2036,38628,38629,38642],{},[2039,38630,38631],{},[2042,38632,38633,38636,38639],{},[2045,38634,38635],{},"Dimension",[2045,38637,38638],{"align":13756},"Score",[2045,38640,38641],{},"Notes",[2052,38643,38644,38654,38665,38676],{},[2042,38645,38646,38649,38651],{},[2057,38647,38648],{},"Image Quality",[2057,38650,38464],{"align":13756},[2057,38652,38653],{},"Near-cinematic. Blue-white porcelain texture crisp, marble grain realistic",[2042,38655,38656,38659,38662],{},[2057,38657,38658],{},"Prompt Adherence",[2057,38660,38661],{"align":13756},"7.5/10",[2057,38663,38664],{},"Vase, marble table, warm light, shallow DoF — all present. Dust particles missing",[2042,38666,38667,38670,38673],{},[2057,38668,38669],{},"Physics Realism",[2057,38671,38672],{"align":13756},"7.0/10",[2057,38674,38675],{},"Fall trajectory reasonable but fragments cluster too tightly. Missing motion blur gives a \"floating\" feel",[2042,38677,38678,38681,38684],{},[2057,38679,38680],{},"Lighting",[2057,38682,38683],{"align":13756},"9.0/10",[2057,38685,38686],{},"Afternoon warmth from window is consistent. Specular highlights on glaze are accurate",[11,38688,38689,38692],{},[23,38690,38691],{},"Standout:"," The bokeh and warm-light rendering feel genuinely filmic. At 60fps, the slow-motion fall is buttery smooth — you can track individual fragments frame by frame without any judder. The blue-white porcelain glaze catches afternoon light exactly the way real celadon does, with soft specular highlights that shift naturally as the vase rotates during its fall.",[11,38694,38695],{},"The shallow depth-of-field execution deserves special mention. Background elements blur with a natural gradient, not the hard-edged mask you see in cheaper implementations. The marble table's golden edge trim stays crisp in the foreground while the room behind falls off convincingly.",[11,38697,38698,38701],{},[23,38699,38700],{},"Weakness:"," Fragments don't scatter far enough for a hard stone floor impact. Real porcelain hitting stone at that velocity would send shards several feet in all directions — here they cluster within a tight radius. There's no visible dust or ceramic powder, which the prompt specifically requested. The falling vase also lacks motion blur, creating a slight \"floating\" quality in mid-air frames.",[92,38703,38544],{"id":38704},"sora-2",[56,38706,60,38707],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,38708],{"src":38709,"type":65},"https://cdn.evolink.ai/skills-media/seedance2/sora2%E7%93%B7%E5%99%A8%E6%8E%89%E5%9C%B0%E4%B8%8A.mp4",[2036,38711,38712,38722],{},[2039,38713,38714],{},[2042,38715,38716,38718,38720],{},[2045,38717,38635],{},[2045,38719,38638],{"align":13756},[2045,38721,38641],{},[2052,38723,38724,38733,38742,38751],{},[2042,38725,38726,38728,38730],{},[2057,38727,38648],{},[2057,38729,38683],{"align":13756},[2057,38731,38732],{},"Higher resolution reveals more detail. Cross-section of broken ceramic (grey body under glaze) is impressive",[2042,38734,38735,38737,38739],{},[2057,38736,38658],{},[2057,38738,38661],{"align":13756},[2057,38740,38741],{},"Main elements present. Also missing dust particles",[2042,38743,38744,38746,38748],{},[2057,38745,38669],{},[2057,38747,38468],{"align":13756},[2057,38749,38750],{},"Fracture mechanics more convincing — uneven thickness, irregular break edges match brittle fracture behavior",[2042,38752,38753,38755,38757],{},[2057,38754,38680],{},[2057,38756,38683],{"align":13756},[2057,38758,38759],{},"Warm light from right. Correct differentiation between glossy ceramic and matte stone surfaces",[11,38761,38762,38764],{},[23,38763,38691],{}," The fracture detail is superior. You can see the grey ceramic body (the bisque) beneath the glaze at break points — a subtle but physically accurate detail that most 3D renders don't even attempt. The neck staying intact while the body shatters matches real ceramic stress distribution: the neck is the thickest, most structurally reinforced part of a vase.",[11,38766,38767],{},"Fragment edges show irregular, conchoidal fracture patterns consistent with brittle material failure. Some pieces have thin edges where the glaze chipped away from the body, others show thicker cross-sections. This level of fracture variance is what separates \"convincing\" from \"obviously CG.\"",[11,38769,38770,38772],{},[23,38771,38700],{}," Despite the superior fracture physics, some fragments still exhibit a slight \"hovering\" quality — they decelerate too quickly after impact rather than bouncing and sliding on the stone. Dust particles are absent, same as Seedance. The fragment count is also lower than expected for a vase of this size hitting a hard surface.",[92,38774,38776],{"id":38775},"test-1-verdict","Test 1 Verdict",[11,38778,38779,38782],{},[23,38780,38781],{},"Sora 2 wins on fracture detail and raw resolution."," The higher pixel count and more convincing break physics make this a clear edge for static-heavy or close-up content.",[11,38784,38785,38788],{},[23,38786,38787],{},"Seedance 2.0 wins on motion smoothness."," The 60fps frame rate makes the slow-motion fall visually smoother. If your use case is actual slow-motion video (ads, product demos), that frame rate matters.",[11,38790,38791],{},"Both models failed to generate floating dust particles in sunlight — a shared limitation of current AI video generation. Volumetric particle effects (dust, smoke, mist) remain a weak point across all diffusion-based video models, likely because training data rarely isolates these subtle atmospheric elements.",[11,38793,38794],{},[23,38795,38796],{},"Score summary for Test 1:",[2036,38798,38799,38820],{},[2039,38800,38801],{},[2042,38802,38803,38806,38808,38810,38813,38815],{},[2045,38804,38805],{},"Model",[2045,38807,38648],{"align":13756},[2045,38809,38658],{"align":13756},[2045,38811,38812],{"align":13756},"Physics",[2045,38814,38680],{"align":13756},[2045,38816,38817],{"align":13756},[23,38818,38819],{},"Average",[2052,38821,38822,38843],{},[2042,38823,38824,38826,38829,38832,38835,38838],{},[2057,38825,17335],{},[2057,38827,38828],{"align":13756},"8.5",[2057,38830,38831],{"align":13756},"7.5",[2057,38833,38834],{"align":13756},"7.0",[2057,38836,38837],{"align":13756},"9.0",[2057,38839,38840],{"align":13756},[23,38841,38842],{},"8.0",[2042,38844,38845,38847,38849,38851,38853,38855],{},[2057,38846,38544],{},[2057,38848,38837],{"align":13756},[2057,38850,38831],{"align":13756},[2057,38852,38842],{"align":13756},[2057,38854,38837],{"align":13756},[2057,38856,38857],{"align":13756},[23,38858,38859],{},"8.4",[11,38861,38862],{},"Sora 2 takes this round by a narrow margin, driven by superior fracture physics and resolution. But if your use case prioritizes smooth slow-motion playback over freeze-frame detail, the 60fps advantage tips back toward Seedance.",[48,38864,38866],{"id":38865},"test-2-dynamic-human-motion-rooftop-breakdance","Test 2 — Dynamic Human Motion (Rooftop Breakdance)",[11,38868,38869],{},[23,38870,38613],{},[18,38872,38873],{},[11,38874,38875],{},"A street dancer performs an explosive breakdance routine on a rain-soaked city rooftop at night. Neon lights from surrounding buildings reflect off the wet surface. Camera circles the dancer in a dynamic 360-degree orbit. The dancer transitions from a power move into a freeze pose. Dramatic rim lighting, cinematic color grading with teal and orange tones",[92,38877,17335],{"id":38878},"seedance-20-1",[56,38880,60,38881],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,38882],{"src":38883,"type":65},"https://cdn.evolink.ai/skills-media/seedance2/seedance2.0%E5%A4%9C%E6%99%AF%E8%A1%97%E8%88%9E.mp4",[2036,38885,38886,38896],{},[2039,38887,38888],{},[2042,38889,38890,38892,38894],{},[2045,38891,38635],{},[2045,38893,38638],{"align":13756},[2045,38895,38641],{},[2052,38897,38898,38907,38917,38927],{},[2042,38899,38900,38902,38904],{},[2057,38901,38648],{},[2057,38903,38683],{"align":13756},[2057,38905,38906],{},"Stunning night rendering. Neon reflections on wet surfaces are almost photographic",[2042,38908,38909,38912,38914],{},[2057,38910,38911],{},"Anatomy Accuracy",[2057,38913,38464],{"align":13756},[2057,38915,38916],{},"B-boy floor work poses are recognizable. Wrist-forearm-shoulder force lines align correctly",[2042,38918,38919,38922,38924],{},[2057,38920,38921],{},"Motion Dynamics",[2057,38923,38683],{"align":13756},[2057,38925,38926],{},"Motion blur direction matches movement. Low center of gravity fits breakdance mechanics. 60fps keeps fast transitions smooth",[2042,38928,38929,38932,38935],{},[2057,38930,38931],{},"Lighting & Atmosphere",[2057,38933,38934],{"align":13756},"9.5/10",[2057,38936,38937],{},"Near-perfect neon reflections on wet ground. Rim lighting + backlit silhouette creates cinematic drama",[11,38939,38940,38942],{},[23,38941,38691],{}," This is where Seedance 2.0 truly shines. The teal-and-orange color grading is executed precisely. Neon reflections on the rain-soaked rooftop are stunning — red and cyan complementary colors map naturally onto the wet surface. The atmosphere is immersive enough for a professional music video.",[11,38944,38945,38948],{},[23,38946,38947],{},"The 60fps advantage is decisive here."," Fast arm sweeps, power moves, and transitions look fluid rather than stuttery. Clothing has weight and drapes correctly during motion — the hoodie fabric stretches and bunches at the shoulders in ways that suggest real textile physics.",[11,38950,38951],{},"The color grading deserves a closer look. Teal and orange are complementary colors, and the prompt specifically requested this combination. Seedance didn't just tint the image — it placed warm orange neon sources behind the dancer (creating rim light) and cool cyan sources in front, then let the wet rooftop surface mix both colors in reflections. This is how a cinematographer would actually light this scene.",[11,38953,38954],{},"Water behavior on the rooftop is also convincing. The surface has a thin, even layer of water that reflects the cityscape above. When the dancer moves, you can see subtle disturbance patterns radiating outward from points of contact. It's not perfect fluid simulation, but it reads as \"wet ground\" instantly.",[92,38956,38544],{"id":38957},"sora-2-1",[56,38959,60,38960],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,38961],{"src":38962,"type":65},"https://cdn.evolink.ai/skills-media/seedance2/sora2%E5%A4%9C%E6%99%AF%E8%A1%97%E8%88%9E.mp4",[2036,38964,38965,38975],{},[2039,38966,38967],{},[2042,38968,38969,38971,38973],{},[2045,38970,38635],{},[2045,38972,38638],{"align":13756},[2045,38974,38641],{},[2052,38976,38977,38986,38999,39008],{},[2042,38978,38979,38981,38983],{},[2057,38980,38648],{},[2057,38982,38468],{"align":13756},[2057,38984,38985],{},"Strong cyberpunk aesthetic, detailed city background. But has an \"AI sheen\" — everything looks too perfectly graded",[2042,38987,38988,38990,38993],{},[2057,38989,38911],{},[2057,38991,38992],{"align":13756},"6.5/10",[2057,38994,16059,38995,38998],{},[23,38996,38997],{},"Major weakness."," Hand-ground contact is blurry, fingers indistinguishable. Torso narrows unnaturally during handstand. Feet/shoe edges have a \"melting\" quality",[2042,39000,39001,39003,39005],{},[2057,39002,38921],{},[2057,39004,38468],{"align":13756},[2057,39006,39007],{},"Water splash effects are good, rotational momentum is credible. But some water droplets look more like noise than real droplets",[2042,39009,39010,39012,39014],{},[2057,39011,38931],{},[2057,39013,38464],{"align":13756},[2057,39015,39016],{},"Dual-source contrast (warm orange backlight + cool cyan front) handled well. But immersion falls short of Seedance",[11,39018,39019,39022],{},[23,39020,39021],{},"The anatomy problem is serious."," During freeze poses and handstands, the dancer's hands dissolve into the ground contact surface — individual fingers are indistinguishable. The torso becomes tube-like rather than showing realistic ribcage-to-pelvis structure, losing the natural width variation between chest, waist, and hips. A second arm disappears entirely in some frames, creating an anatomical gap that breaks the illusion.",[11,39024,39025],{},"Foot and shoe edges exhibit a \"melting\" quality, where the boundary between footwear and air becomes soft and undefined. This is a common failure mode in diffusion-based video models when limbs overlap or contact surfaces.",[11,39027,39028,39031],{},[23,39029,39030],{},"It looks fine while playing at normal speed. Pause any frame during a freeze pose and things fall apart."," For content that will only be viewed as video (social media, ads), this may be acceptable. For anything that might be screenshotted, thumbnailed, or analyzed, it's a dealbreaker.",[92,39033,39035],{"id":39034},"test-2-verdict","Test 2 Verdict",[11,39037,39038,39041],{},[23,39039,39040],{},"Seedance 2.0 wins decisively."," The anatomy accuracy gap (8.5 vs 6.5) is the largest single-dimension difference across all three tests. For any content involving dynamic human movement — dance, sports, action sequences — Seedance is the more reliable choice right now.",[11,39043,39044],{},"The 60fps frame rate compounds this advantage. At 30fps, fast breakdance movements produce noticeable judder. At 60fps, they're smooth.",[11,39046,39047,39048,39051],{},"If you're building a product that generates human-motion content through an ",[37,39049,39050],{"href":14322},"AI video API",", this result should heavily influence your model selection.",[11,39053,39054],{},[23,39055,39056],{},"Score summary for Test 2:",[2036,39058,39059,39079],{},[2039,39060,39061],{},[2042,39062,39063,39065,39067,39070,39073,39075],{},[2045,39064,38805],{},[2045,39066,38648],{"align":13756},[2045,39068,39069],{"align":13756},"Anatomy",[2045,39071,39072],{"align":13756},"Motion",[2045,39074,38680],{"align":13756},[2045,39076,39077],{"align":13756},[23,39078,38819],{},[2052,39080,39081,39098],{},[2042,39082,39083,39085,39087,39089,39091,39094],{},[2057,39084,17335],{},[2057,39086,38837],{"align":13756},[2057,39088,38828],{"align":13756},[2057,39090,38837],{"align":13756},[2057,39092,39093],{"align":13756},"9.5",[2057,39095,39096],{"align":13756},[23,39097,38837],{},[2042,39099,39100,39102,39104,39107,39109,39111],{},[2057,39101,38544],{},[2057,39103,38842],{"align":13756},[2057,39105,39106],{"align":13756},"6.5",[2057,39108,38842],{"align":13756},[2057,39110,38828],{"align":13756},[2057,39112,39113],{"align":13756},[23,39114,39115],{},"7.75",[11,39117,39118],{},"This is the widest gap across all three tests. Seedance outperforms in every single dimension. The anatomy accuracy delta (8.5 vs 6.5) alone should be disqualifying for Sora in human-motion applications where frame-level quality matters.",[11,39120,39121],{},"For developers working on fitness apps, dance content platforms, sports highlights, or any product featuring dynamic human movement, this test provides strong evidence for defaulting to Seedance 2.0.",[48,39123,39125],{"id":39124},"test-3-facial-expression-lighting-elder-bookshop","Test 3 — Facial Expression & Lighting (Elder Bookshop)",[11,39127,39128],{},[23,39129,38613],{},[18,39131,39132],{},[11,39133,39134],{},"A wise elderly woman with silver hair and round spectacles sits in a cluttered antique bookshop. She picks up a leather-bound book, opens it, and her expression shifts from curiosity to wonder as golden light emanates from the pages. The light illuminates her face and the surrounding book spines. Camera slowly pushes in from medium shot to close-up on her face. Warm tungsten lighting mixed with the magical golden glow.",[92,39136,17335],{"id":39137},"seedance-20-2",[56,39139,60,39140],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,39141],{"src":39142,"type":65},"https://cdn.evolink.ai/skills-media/seedance2/seedance2.0%E8%80%81%E4%BA%BA%E5%A5%87%E9%81%87.mp4",[2036,39144,39145,39155],{},[2039,39146,39147],{},[2042,39148,39149,39151,39153],{},[2045,39150,38635],{},[2045,39152,38638],{"align":13756},[2045,39154,38641],{},[2052,39156,39157,39167,39177,39187],{},[2042,39158,39159,39162,39164],{},[2057,39160,39161],{},"Facial Quality",[2057,39163,38464],{"align":13756},[2057,39165,39166],{},"Wrinkles, crow's feet, nasolabial folds render naturally. Round spectacles sit correctly on nose bridge with subtle refraction",[2042,39168,39169,39172,39174],{},[2057,39170,39171],{},"Expression Transition",[2057,39173,38464],{"align":13756},[2057,39175,39176],{},"Quiet focus → wonder is conveyed through widening eyes, slightly raised brows, parting lips. Layered micro-expressions",[2042,39178,39179,39182,39184],{},[2057,39180,39181],{},"Environment Detail",[2057,39183,38683],{"align":13756},[2057,39185,39186],{},"⭐ Richest scene of all tests. Floor-to-ceiling leather book spines, rolling library ladder, globe desk lamp, ink bottles, brass instruments",[2042,39188,39189,39192,39194],{},[2057,39190,39191],{},"Golden Light Effect",[2057,39193,38683],{"align":13756},[2057,39195,39196],{},"Volumetric golden light radiates upward from pages. Correctly illuminates chin, cheeks, under-nose. Blends naturally with existing warm tungsten",[11,39198,39199,39201],{},[23,39200,38691],{}," The bookshop environment is extraordinary. It feels like a real, lived-in space — books stacked chaotically on floors and tables, period-appropriate props scattered naturally. The scene evokes a Dickensian bookshop or an Oxford study. Seedance built the entire world around the character, not just the character.",[11,39203,39204],{},"The golden light has actual volume. It interacts correctly with silver hair edges and fabric folds, creating natural rim highlights. The light doesn't just illuminate the face — it casts subtle warm reflections on the nearest book spines and creates a gentle glow on the table surface. This kind of multi-surface light interaction is what sells the \"magical\" quality of the scene.",[11,39206,39207],{},"The expression transition is worth examining in detail. It's not a simple cut from \"neutral\" to \"amazed.\" You can see a sequence: concentration as she opens the book → slight confusion as the light first appears → recognition → genuine wonder with slightly parted lips and widened eyes. This micro-expression layering is what separates AI-generated faces that feel \"alive\" from those that feel \"posed.\"",[92,39209,38544],{"id":39210},"sora-2-2",[56,39212,60,39213],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,39214],{"src":39215,"type":65},"https://cdn.evolink.ai/skills-media/seedance2/sora2%E8%80%81%E4%BA%BA%E5%A5%87%E9%81%87.mp4",[2036,39217,39218,39228],{},[2039,39219,39220],{},[2042,39221,39222,39224,39226],{},[2045,39223,38635],{},[2045,39225,38638],{"align":13756},[2045,39227,38641],{},[2052,39229,39230,39239,39248,39257],{},[2042,39231,39232,39234,39236],{},[2057,39233,39161],{},[2057,39235,38661],{"align":13756},[2057,39237,39238],{},"Passable but \"waxy.\" Forehead and cheeks are too smooth. Aging inconsistent — some areas look 70+, others 50",[2042,39240,39241,39243,39245],{},[2057,39242,39171],{},[2057,39244,38468],{"align":13756},[2057,39246,39247],{},"Wonder comes through (mouth opens, eyes widen). But eyelid and brow expressiveness is less nuanced than Seedance",[2042,39249,39250,39252,39254],{},[2057,39251,39181],{},[2057,39253,38464],{"align":13756},[2057,39255,39256],{},"Good atmosphere with green banker's lamp. Depth of field handled well. But less layered — missing ladder, floor books, desk props",[2042,39258,39259,39261,39263],{},[2057,39260,39191],{},[2057,39262,38683],{"align":13756},[2057,39264,39265],{},"Upward lighting direction correct. Golden particle effects add magical feel. Good subsurface scattering on skin",[11,39267,39268,39271],{},[23,39269,39270],{},"The \"wax face\" problem:"," Sora 2 renders elderly skin that's simultaneously wrinkled and oddly smooth. The forehead lacks the texture density you'd expect — age spots, pore visibility, and the slight translucency of thin elderly skin are all muted. Some areas of the face read as 70+ years old (around the eyes), while others look closer to 50 (forehead, cheeks). This inconsistency breaks the uncanny valley in close-up shots — exactly the shot this prompt calls for.",[11,39273,39274],{},"The bookshop environment, while atmospheric, is less layered than Seedance's version. It has a green banker's lamp and well-handled depth of field, but lacks the rolling ladder, floor-level book stacks, brass instruments, ink bottles, and other period props that make Seedance's version feel like a real space rather than a set.",[92,39276,39278],{"id":39277},"test-3-verdict","Test 3 Verdict",[11,39280,39281,39284],{},[23,39282,39283],{},"Seedance 2.0 wins on facial detail and environmental richness."," For character-driven content — storytelling, narrative ads, emotional close-ups — Seedance produces more believable faces and richer worlds.",[11,39286,39287],{},"Both models nail the golden magical light effect. That's a tie.",[11,39289,39290],{},[23,39291,39292],{},"Score summary for Test 3:",[2036,39294,39295,39317],{},[2039,39296,39297],{},[2042,39298,39299,39301,39304,39307,39310,39313],{},[2045,39300,38805],{},[2045,39302,39303],{"align":13756},"Face Quality",[2045,39305,39306],{"align":13756},"Expression",[2045,39308,39309],{"align":13756},"Environment",[2045,39311,39312],{"align":13756},"Light Effect",[2045,39314,39315],{"align":13756},[23,39316,38819],{},[2052,39318,39319,39336],{},[2042,39320,39321,39323,39325,39327,39329,39331],{},[2057,39322,17335],{},[2057,39324,38828],{"align":13756},[2057,39326,38828],{"align":13756},[2057,39328,38837],{"align":13756},[2057,39330,38837],{"align":13756},[2057,39332,39333],{"align":13756},[23,39334,39335],{},"8.75",[2042,39337,39338,39340,39342,39344,39346,39348],{},[2057,39339,38544],{},[2057,39341,38831],{"align":13756},[2057,39343,38842],{"align":13756},[2057,39345,38828],{"align":13756},[2057,39347,38837],{"align":13756},[2057,39349,39350],{"align":13756},[23,39351,39352],{},"8.25",[11,39354,39355],{},"Seedance wins this round through more convincing facial aging and a richer environment. The \"wax face\" issue with Sora is particularly problematic in close-up shots, which are exactly what this prompt demands with its \"medium shot to close-up\" camera push.",[11,39357,39358],{},"For narrative content, short films, character-driven ads, or any application where emotional authenticity matters, Seedance's facial rendering is a meaningful advantage.",[11,39360,39361,39362,39365],{},"For more on getting the best results from Seedance prompts, see our ",[37,39363,39364],{"href":1766},"prompt engineering guide",".",[48,39367,39369],{"id":39368},"technical-specs-comparison","Technical Specs Comparison",[11,39371,39372],{},"Here's the full technical breakdown based on our actual output analysis:",[2036,39374,39375,39386],{},[2039,39376,39377],{},[2042,39378,39379,39382,39384],{},[2045,39380,39381],{},"Specification",[2045,39383,17335],{"align":13756},[2045,39385,38544],{"align":13756},[2052,39387,39388,39398,39411,39422,39435,39448,39458,39468,39481,39494,39507,39518,39530],{},[2042,39389,39390,39394,39396],{},[2057,39391,39392],{},[23,39393,38551],{},[2057,39395,38554],{"align":13756},[2057,39397,38557],{"align":13756},[2042,39399,39400,39405,39408],{},[2057,39401,39402],{},[23,39403,39404],{},"Pixels per frame",[2057,39406,39407],{"align":13756},"921,600",[2057,39409,39410],{"align":13756},"1,835,008 (~2×)",[2042,39412,39413,39418,39420],{},[2057,39414,39415],{},[23,39416,39417],{},"Frame rate",[2057,39419,38565],{"align":13756},[2057,39421,38568],{"align":13756},[2042,39423,39424,39429,39432],{},[2057,39425,39426],{},[23,39427,39428],{},"Total frames (15s)",[2057,39430,39431],{"align":13756},"900",[2057,39433,39434],{"align":13756},"450",[2042,39436,39437,39442,39445],{},[2057,39438,39439],{},[23,39440,39441],{},"Duration range",[2057,39443,39444],{"align":13756},"4–15s",[2057,39446,39447],{"align":13756},"Up to 20s",[2042,39449,39450,39454,39456],{},[2057,39451,39452],{},[23,39453,38582],{},[2057,39455,38585],{"align":13756},[2057,39457,38585],{"align":13756},[2042,39459,39460,39464,39466],{},[2057,39461,39462],{},[23,39463,38592],{},[2057,39465,38595],{"align":13756},[2057,39467,38598],{"align":13756},[2042,39469,39470,39475,39478],{},[2057,39471,39472],{},[23,39473,39474],{},"Audio generation",[2057,39476,39477],{"align":13756},"Built-in (voice, SFX, music)",[2057,39479,39480],{"align":13756},"Built-in",[2042,39482,39483,39488,39491],{},[2057,39484,39485],{},[23,39486,39487],{},"Aspect ratios",[2057,39489,39490],{"align":13756},"16:9, 9:16, 1:1, 4:3, 3:4, 21:9",[2057,39492,39493],{"align":13756},"16:9, 9:16, 1:1",[2042,39495,39496,39501,39504],{},[2057,39497,39498],{},[23,39499,39500],{},"Input modes",[2057,39502,39503],{"align":13756},"Text, image, video, audio → video",[2057,39505,39506],{"align":13756},"Text, image → video",[2042,39508,39509,39514,39516],{},[2057,39510,39511],{},[23,39512,39513],{},"Max input images",[2057,39515,30510],{"align":13756},[2057,39517,5419],{"align":13756},[2042,39519,39520,39525,39527],{},[2057,39521,39522],{},[23,39523,39524],{},"Max input videos",[2057,39526,5043],{"align":13756},[2057,39528,39529],{"align":13756},"N/A",[2042,39531,39532,39537,39540],{},[2057,39533,39534],{},[23,39535,39536],{},"@-reference system",[2057,39538,39539],{"align":13756},"✅ (multimodal tags)",[2057,39541,13779],{"align":13756},[11,39543,39544],{},[23,39545,39546],{},"Key takeaways:",[96,39548,39549,39552,39555,39562],{},[73,39550,39551],{},"Seedance's 60fps produces 2× more frames in the same duration, which is why motion looks smoother",[73,39553,39554],{},"Sora's higher resolution is better for content that will be paused or screenshotted",[73,39556,39557,39558,39561],{},"Seedance's ",[37,39559,39560],{"href":2962},"multimodal @-reference system"," allows combining image, video, and audio inputs in a single prompt — a capability Sora 2 doesn't offer",[73,39563,39564],{},"Seedance supports 1080p output as well (see API parameters below), though our tests used the default 720p",[48,39566,39568],{"id":39567},"api-access-code-examples","API Access & Code Examples",[11,39570,39571],{},"Both models are accessible via REST APIs. Here's how to call each one.",[92,39573,39575],{"id":39574},"seedance-20-via-evolink-api","Seedance 2.0 via EvoLink API",[11,39577,39578],{},"EvoLink provides unified API access to Seedance 2.0 with async task processing. Here's a complete Python example:",[136,39580,39582],{"className":339,"code":39581,"language":341,"meta":141,"style":141},"import requests\nimport time\n\nAPI_KEY = \"your-evolink-api-key\"  # Get one at evolink.ai/dashboard/keys\nBASE_URL = \"https://api.evolink.ai/v1\"\n\ndef generate_video(prompt: str, duration: int = 15, quality: str = \"720p\") -> str:\n    \"\"\"Generate a video with Seedance 2.0 and return the video URL.\"\"\"\n\n    # Step 1: Submit generation task\n    response = requests.post(\n        f\"{BASE_URL}/video/generations\",\n        headers={\n            \"Authorization\": f\"Bearer {API_KEY}\",\n            \"Content-Type\": \"application/json\",\n        },\n        json={\n            \"model\": \"seedance-2.0\",\n            \"prompt\": prompt,\n            \"duration\": duration,\n            \"quality\": quality,\n            \"aspect_ratio\": \"16:9\",\n            \"generate_audio\": True,\n        },\n    )\n    response.raise_for_status()\n    task_id = response.json()[\"task_id\"]\n    print(f\"Task submitted: {task_id}\")\n\n    # Step 2: Poll for completion\n    while True:\n        status_resp = requests.get(\n            f\"{BASE_URL}/tasks/{task_id}\",\n            headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n        )\n        status_resp.raise_for_status()\n        task = status_resp.json()\n\n        if task[\"status\"] == \"completed\":\n            video_url = task[\"output\"][\"video_url\"]\n            print(f\"Done! Video URL (valid 24h): {video_url}\")\n            return video_url\n        elif task[\"status\"] == \"failed\":\n            raise RuntimeError(f\"Task failed: {task.get('error', 'Unknown error')}\")\n\n        print(f\"Status: {task['status']}... waiting 5s\")\n        time.sleep(5)\n\n\n# Run the porcelain vase test\nvideo = generate_video(\n    prompt=(\n        \"A porcelain vase falls from a marble table in slow motion. \"\n        \"Camera starts with a close-up of the vase wobbling on the edge, \"\n        \"then follows it downward with a smooth tracking shot as it shatters \"\n        \"on a stone floor. Fragments scatter in all directions. \"\n        \"Dust particles float in warm afternoon sunlight streaming through a window. \"\n        \"Shallow depth of field, 24fps cinematic look\"\n    ),\n    duration=15,\n    quality=\"720p\",\n)\n",[28,39583,39584,39590,39596,39600,39611,39619,39623,39658,39663,39667,39672,39680,39693,39701,39718,39730,39735,39743,39753,39759,39765,39771,39782,39793,39797,39801,39805,39817,39837,39841,39846,39854,39862,39882,39904,39908,39912,39920,39924,39940,39956,39977,39984,40000,40030,40034,40060,40068,40072,40076,40081,40091,40099,40104,40109,40114,40119,40124,40129,40133,40143,40153],{"__ignoreMap":141},[145,39585,39586,39588],{"class":147,"line":148},[145,39587,348],{"class":259},[145,39589,329],{"class":263},[145,39591,39592,39594],{"class":147,"line":166},[145,39593,348],{"class":259},[145,39595,357],{"class":263},[145,39597,39598],{"class":147,"line":178},[145,39599,377],{"emptyLinePlaceholder":58},[145,39601,39602,39604,39606,39608],{"class":147,"line":187},[145,39603,389],{"class":155},[145,39605,392],{"class":259},[145,39607,14611],{"class":159},[145,39609,39610],{"class":174},"  # Get one at evolink.ai/dashboard/keys\n",[145,39612,39613,39615,39617],{"class":147,"line":374},[145,39614,413],{"class":155},[145,39616,392],{"class":259},[145,39618,418],{"class":159},[145,39620,39621],{"class":147,"line":380},[145,39622,377],{"emptyLinePlaceholder":58},[145,39624,39625,39627,39629,39631,39633,39636,39638,39640,39642,39645,39647,39649,39652,39654,39656],{"class":147,"line":386},[145,39626,526],{"class":259},[145,39628,14669],{"class":151},[145,39630,15770],{"class":263},[145,39632,8649],{"class":155},[145,39634,39635],{"class":263},", duration: ",[145,39637,17692],{"class":155},[145,39639,392],{"class":259},[145,39641,5975],{"class":155},[145,39643,39644],{"class":263},", quality: ",[145,39646,8649],{"class":155},[145,39648,392],{"class":259},[145,39650,39651],{"class":159}," \"720p\"",[145,39653,15775],{"class":263},[145,39655,8649],{"class":155},[145,39657,860],{"class":263},[145,39659,39660],{"class":147,"line":410},[145,39661,39662],{"class":159},"    \"\"\"Generate a video with Seedance 2.0 and return the video URL.\"\"\"\n",[145,39664,39665],{"class":147,"line":421},[145,39666,377],{"emptyLinePlaceholder":58},[145,39668,39669],{"class":147,"line":432},[145,39670,39671],{"class":174},"    # Step 1: Submit generation task\n",[145,39673,39674,39676,39678],{"class":147,"line":456},[145,39675,1428],{"class":263},[145,39677,267],{"class":259},[145,39679,1433],{"class":263},[145,39681,39682,39684,39686,39688,39691],{"class":147,"line":467},[145,39683,1438],{"class":259},[145,39685,450],{"class":159},[145,39687,679],{"class":155},[145,39689,39690],{"class":159},"/video/generations\"",[145,39692,453],{"class":263},[145,39694,39695,39697,39699],{"class":147,"line":600},[145,39696,1456],{"class":701},[145,39698,267],{"class":259},[145,39700,1865],{"class":263},[145,39702,39703,39706,39708,39710,39712,39714,39716],{"class":147,"line":605},[145,39704,39705],{"class":159},"            \"Authorization\"",[145,39707,438],{"class":263},[145,39709,441],{"class":259},[145,39711,444],{"class":159},[145,39713,447],{"class":155},[145,39715,450],{"class":159},[145,39717,453],{"class":263},[145,39719,39720,39723,39725,39728],{"class":147,"line":611},[145,39721,39722],{"class":159},"            \"Content-Type\"",[145,39724,438],{"class":263},[145,39726,39727],{"class":159},"\"application/json\"",[145,39729,453],{"class":263},[145,39731,39732],{"class":147,"line":617},[145,39733,39734],{"class":263},"        },\n",[145,39736,39737,39739,39741],{"class":147,"line":623},[145,39738,1471],{"class":701},[145,39740,267],{"class":259},[145,39742,1865],{"class":263},[145,39744,39745,39747,39749,39751],{"class":147,"line":628},[145,39746,8453],{"class":159},[145,39748,438],{"class":263},[145,39750,1309],{"class":159},[145,39752,453],{"class":263},[145,39754,39755,39757],{"class":147,"line":639},[145,39756,8464],{"class":159},[145,39758,8467],{"class":263},[145,39760,39761,39763],{"class":147,"line":654},[145,39762,8472],{"class":159},[145,39764,16800],{"class":263},[145,39766,39767,39769],{"class":147,"line":660},[145,39768,8483],{"class":159},[145,39770,16808],{"class":263},[145,39772,39773,39776,39778,39780],{"class":147,"line":671},[145,39774,39775],{"class":159},"            \"aspect_ratio\"",[145,39777,438],{"class":263},[145,39779,1385],{"class":159},[145,39781,453],{"class":263},[145,39783,39784,39787,39789,39791],{"class":147,"line":698},[145,39785,39786],{"class":159},"            \"generate_audio\"",[145,39788,438],{"class":263},[145,39790,1140],{"class":155},[145,39792,453],{"class":263},[145,39794,39795],{"class":147,"line":710},[145,39796,39734],{"class":263},[145,39798,39799],{"class":147,"line":716},[145,39800,1484],{"class":263},[145,39802,39803],{"class":147,"line":722},[145,39804,2792],{"class":263},[145,39806,39807,39809,39811,39813,39815],{"class":147,"line":728},[145,39808,7197],{"class":263},[145,39810,267],{"class":259},[145,39812,12168],{"class":263},[145,39814,7673],{"class":159},[145,39816,764],{"class":263},[145,39818,39819,39821,39823,39825,39827,39829,39831,39833,39835],{"class":147,"line":739},[145,39820,1103],{"class":155},[145,39822,794],{"class":263},[145,39824,441],{"class":259},[145,39826,6570],{"class":159},[145,39828,685],{"class":155},[145,39830,688],{"class":263},[145,39832,691],{"class":155},[145,39834,450],{"class":159},[145,39836,407],{"class":263},[145,39838,39839],{"class":147,"line":744},[145,39840,377],{"emptyLinePlaceholder":58},[145,39842,39843],{"class":147,"line":750},[145,39844,39845],{"class":174},"    # Step 2: Poll for completion\n",[145,39847,39848,39850,39852],{"class":147,"line":767},[145,39849,642],{"class":259},[145,39851,14792],{"class":155},[145,39853,860],{"class":263},[145,39855,39856,39858,39860],{"class":147,"line":788},[145,39857,14799],{"class":263},[145,39859,267],{"class":259},[145,39861,668],{"class":263},[145,39863,39864,39866,39868,39870,39872,39874,39876,39878,39880],{"class":147,"line":834},[145,39865,674],{"class":259},[145,39867,450],{"class":159},[145,39869,679],{"class":155},[145,39871,682],{"class":159},[145,39873,685],{"class":155},[145,39875,688],{"class":263},[145,39877,691],{"class":155},[145,39879,450],{"class":159},[145,39881,453],{"class":263},[145,39883,39884,39886,39888,39890,39892,39894,39896,39898,39900,39902],{"class":147,"line":839},[145,39885,702],{"class":701},[145,39887,267],{"class":259},[145,39889,685],{"class":263},[145,39891,31432],{"class":159},[145,39893,438],{"class":263},[145,39895,441],{"class":259},[145,39897,444],{"class":159},[145,39899,447],{"class":155},[145,39901,450],{"class":159},[145,39903,19515],{"class":263},[145,39905,39906],{"class":147,"line":845},[145,39907,713],{"class":263},[145,39909,39910],{"class":147,"line":863},[145,39911,14840],{"class":263},[145,39913,39914,39916,39918],{"class":147,"line":872},[145,39915,731],{"class":263},[145,39917,267],{"class":259},[145,39919,14849],{"class":263},[145,39921,39922],{"class":147,"line":887},[145,39923,377],{"emptyLinePlaceholder":58},[145,39925,39926,39928,39930,39932,39934,39936,39938],{"class":147,"line":903},[145,39927,848],{"class":259},[145,39929,758],{"class":263},[145,39931,761],{"class":159},[145,39933,14864],{"class":263},[145,39935,854],{"class":259},[145,39937,857],{"class":159},[145,39939,860],{"class":263},[145,39941,39942,39944,39946,39948,39950,39952,39954],{"class":147,"line":915},[145,39943,7383],{"class":263},[145,39945,267],{"class":259},[145,39947,758],{"class":263},[145,39949,21462],{"class":159},[145,39951,1563],{"class":263},[145,39953,14886],{"class":159},[145,39955,764],{"class":263},[145,39957,39958,39960,39962,39964,39967,39969,39971,39973,39975],{"class":147,"line":954},[145,39959,5558],{"class":155},[145,39961,794],{"class":263},[145,39963,441],{"class":259},[145,39965,39966],{"class":159},"\"Done! Video URL (valid 24h): ",[145,39968,685],{"class":155},[145,39970,1679],{"class":263},[145,39972,691],{"class":155},[145,39974,450],{"class":159},[145,39976,407],{"class":263},[145,39978,39979,39981],{"class":147,"line":960},[145,39980,866],{"class":259},[145,39982,39983],{"class":263}," video_url\n",[145,39985,39986,39988,39990,39992,39994,39996,39998],{"class":147,"line":965},[145,39987,875],{"class":259},[145,39989,758],{"class":263},[145,39991,761],{"class":159},[145,39993,14864],{"class":263},[145,39995,854],{"class":259},[145,39997,882],{"class":159},[145,39999,860],{"class":263},[145,40001,40002,40004,40006,40008,40010,40012,40014,40016,40018,40020,40022,40024,40026,40028],{"class":147,"line":971},[145,40003,906],{"class":259},[145,40005,909],{"class":155},[145,40007,794],{"class":263},[145,40009,441],{"class":259},[145,40011,14944],{"class":159},[145,40013,685],{"class":155},[145,40015,17876],{"class":263},[145,40017,11831],{"class":159},[145,40019,401],{"class":263},[145,40021,943],{"class":159},[145,40023,946],{"class":263},[145,40025,691],{"class":155},[145,40027,450],{"class":159},[145,40029,407],{"class":263},[145,40031,40032],{"class":147,"line":977},[145,40033,377],{"emptyLinePlaceholder":58},[145,40035,40036,40038,40040,40042,40044,40046,40048,40051,40053,40055,40058],{"class":147,"line":989},[145,40037,791],{"class":155},[145,40039,794],{"class":263},[145,40041,441],{"class":259},[145,40043,11860],{"class":159},[145,40045,685],{"class":155},[145,40047,1530],{"class":263},[145,40049,40050],{"class":159},"'status'",[145,40052,1536],{"class":263},[145,40054,691],{"class":155},[145,40056,40057],{"class":159},"... waiting 5s\"",[145,40059,407],{"class":263},[145,40061,40062,40064,40066],{"class":147,"line":994},[145,40063,15001],{"class":263},[145,40065,1353],{"class":155},[145,40067,407],{"class":263},[145,40069,40070],{"class":147,"line":5521},[145,40071,377],{"emptyLinePlaceholder":58},[145,40073,40074],{"class":147,"line":5527},[145,40075,377],{"emptyLinePlaceholder":58},[145,40077,40078],{"class":147,"line":5555},[145,40079,40080],{"class":174},"# Run the porcelain vase test\n",[145,40082,40083,40086,40088],{"class":147,"line":5586},[145,40084,40085],{"class":263},"video ",[145,40087,267],{"class":259},[145,40089,40090],{"class":263}," generate_video(\n",[145,40092,40093,40095,40097],{"class":147,"line":5606},[145,40094,16973],{"class":701},[145,40096,267],{"class":259},[145,40098,912],{"class":263},[145,40100,40101],{"class":147,"line":5612},[145,40102,40103],{"class":159},"        \"A porcelain vase falls from a marble table in slow motion. \"\n",[145,40105,40106],{"class":147,"line":5618},[145,40107,40108],{"class":159},"        \"Camera starts with a close-up of the vase wobbling on the edge, \"\n",[145,40110,40111],{"class":147,"line":5623},[145,40112,40113],{"class":159},"        \"then follows it downward with a smooth tracking shot as it shatters \"\n",[145,40115,40116],{"class":147,"line":5636},[145,40117,40118],{"class":159},"        \"on a stone floor. Fragments scatter in all directions. \"\n",[145,40120,40121],{"class":147,"line":5642},[145,40122,40123],{"class":159},"        \"Dust particles float in warm afternoon sunlight streaming through a window. \"\n",[145,40125,40126],{"class":147,"line":5669},[145,40127,40128],{"class":159},"        \"Shallow depth of field, 24fps cinematic look\"\n",[145,40130,40131],{"class":147,"line":5709},[145,40132,3797],{"class":263},[145,40134,40135,40137,40139,40141],{"class":147,"line":5728},[145,40136,17000],{"class":701},[145,40138,267],{"class":259},[145,40140,3898],{"class":155},[145,40142,453],{"class":263},[145,40144,40145,40147,40149,40151],{"class":147,"line":5733},[145,40146,17011],{"class":701},[145,40148,267],{"class":259},[145,40150,1369],{"class":159},[145,40152,453],{"class":263},[145,40154,40155],{"class":147,"line":5738},[145,40156,407],{"class":263},[11,40158,40159,40162],{},[23,40160,40161],{},"Multimodal input example"," — using an image as the first frame:",[136,40164,40166],{"className":339,"code":40165,"language":341,"meta":141,"style":141},"response = requests.post(\n    f\"{BASE_URL}/video/generations\",\n    headers={\n        \"Authorization\": f\"Bearer {API_KEY}\",\n        \"Content-Type\": \"application/json\",\n    },\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": \"@Image1 as first frame, the vase begins to wobble and fall\",\n        \"image_urls\": [\"https://example.com/porcelain-vase.jpg\"],\n        \"duration\": 10,\n        \"quality\": \"1080p\",\n    },\n)\n",[28,40167,40168,40176,40188,40196,40213,40224,40228,40236,40246,40257,40268,40278,40288,40292],{"__ignoreMap":141},[145,40169,40170,40172,40174],{"class":147,"line":148},[145,40171,6508],{"class":263},[145,40173,267],{"class":259},[145,40175,1433],{"class":263},[145,40177,40178,40180,40182,40184,40186],{"class":147,"line":166},[145,40179,6517],{"class":259},[145,40181,450],{"class":159},[145,40183,679],{"class":155},[145,40185,39690],{"class":159},[145,40187,453],{"class":263},[145,40189,40190,40192,40194],{"class":147,"line":178},[145,40191,6530],{"class":701},[145,40193,267],{"class":259},[145,40195,1865],{"class":263},[145,40197,40198,40201,40203,40205,40207,40209,40211],{"class":147,"line":187},[145,40199,40200],{"class":159},"        \"Authorization\"",[145,40202,438],{"class":263},[145,40204,441],{"class":259},[145,40206,444],{"class":159},[145,40208,447],{"class":155},[145,40210,450],{"class":159},[145,40212,453],{"class":263},[145,40214,40215,40218,40220,40222],{"class":147,"line":374},[145,40216,40217],{"class":159},"        \"Content-Type\"",[145,40219,438],{"class":263},[145,40221,39727],{"class":159},[145,40223,453],{"class":263},[145,40225,40226],{"class":147,"line":380},[145,40227,22124],{"class":263},[145,40229,40230,40232,40234],{"class":147,"line":386},[145,40231,6541],{"class":701},[145,40233,267],{"class":259},[145,40235,1865],{"class":263},[145,40237,40238,40240,40242,40244],{"class":147,"line":410},[145,40239,1304],{"class":159},[145,40241,438],{"class":263},[145,40243,1309],{"class":159},[145,40245,453],{"class":263},[145,40247,40248,40250,40252,40255],{"class":147,"line":421},[145,40249,1320],{"class":159},[145,40251,438],{"class":263},[145,40253,40254],{"class":159},"\"@Image1 as first frame, the vase begins to wobble and fall\"",[145,40256,453],{"class":263},[145,40258,40259,40261,40263,40266],{"class":147,"line":432},[145,40260,2683],{"class":159},[145,40262,10809],{"class":263},[145,40264,40265],{"class":159},"\"https://example.com/porcelain-vase.jpg\"",[145,40267,10815],{"class":263},[145,40269,40270,40272,40274,40276],{"class":147,"line":456},[145,40271,1348],{"class":159},[145,40273,438],{"class":263},[145,40275,537],{"class":155},[145,40277,453],{"class":263},[145,40279,40280,40282,40284,40286],{"class":147,"line":467},[145,40281,1364],{"class":159},[145,40283,438],{"class":263},[145,40285,3703],{"class":159},[145,40287,453],{"class":263},[145,40289,40290],{"class":147,"line":600},[145,40291,22124],{"class":263},[145,40293,40294],{"class":147,"line":605},[145,40295,407],{"class":263},[11,40297,40298,40299,39365],{},"For advanced multimodal workflows with @Image, @Video, and @Audio references, see our ",[37,40300,40301],{"href":2962},"@Tags guide",[92,40303,40305],{"id":40304},"sora-2-via-openai-api","Sora 2 via OpenAI API",[136,40307,40309],{"className":339,"code":40308,"language":341,"meta":141,"style":141},"from openai import OpenAI\n\nclient = OpenAI()  # Uses OPENAI_API_KEY env var\n\n# Submit video generation\nresponse = client.responses.create(\n    model=\"sora\",\n    input=[{\n        \"type\": \"text\",\n        \"text\": (\n            \"A porcelain vase falls from a marble table in slow motion. \"\n            \"Camera starts with a close-up of the vase wobbling on the edge, \"\n            \"then follows it downward with a smooth tracking shot as it shatters \"\n            \"on a stone floor. Fragments scatter in all directions. \"\n            \"Dust particles float in warm afternoon sunlight streaming through a window. \"\n            \"Shallow depth of field, 24fps cinematic look\"\n        ),\n    }],\n    resolution=\"1080p\",\n    duration=15,\n)\n\n# Get the video URL from the response\nvideo_url = response.output[0].url\nprint(f\"Video URL: {video_url}\")\n",[28,40310,40311,40323,40327,40340,40344,40349,40358,40370,40380,40392,40399,40404,40409,40414,40419,40424,40429,40433,40438,40449,40459,40463,40467,40472,40486],{"__ignoreMap":141},[145,40312,40313,40315,40318,40320],{"class":147,"line":148},[145,40314,6707],{"class":259},[145,40316,40317],{"class":263}," openai ",[145,40319,348],{"class":259},[145,40321,40322],{"class":263}," OpenAI\n",[145,40324,40325],{"class":147,"line":166},[145,40326,377],{"emptyLinePlaceholder":58},[145,40328,40329,40332,40334,40337],{"class":147,"line":178},[145,40330,40331],{"class":263},"client ",[145,40333,267],{"class":259},[145,40335,40336],{"class":263}," OpenAI()  ",[145,40338,40339],{"class":174},"# Uses OPENAI_API_KEY env var\n",[145,40341,40342],{"class":147,"line":187},[145,40343,377],{"emptyLinePlaceholder":58},[145,40345,40346],{"class":147,"line":374},[145,40347,40348],{"class":174},"# Submit video generation\n",[145,40350,40351,40353,40355],{"class":147,"line":380},[145,40352,6508],{"class":263},[145,40354,267],{"class":259},[145,40356,40357],{"class":263}," client.responses.create(\n",[145,40359,40360,40363,40365,40368],{"class":147,"line":386},[145,40361,40362],{"class":701},"    model",[145,40364,267],{"class":259},[145,40366,40367],{"class":159},"\"sora\"",[145,40369,453],{"class":263},[145,40371,40372,40375,40377],{"class":147,"line":410},[145,40373,40374],{"class":701},"    input",[145,40376,267],{"class":259},[145,40378,40379],{"class":263},"[{\n",[145,40381,40382,40385,40387,40390],{"class":147,"line":421},[145,40383,40384],{"class":159},"        \"type\"",[145,40386,438],{"class":263},[145,40388,40389],{"class":159},"\"text\"",[145,40391,453],{"class":263},[145,40393,40394,40397],{"class":147,"line":432},[145,40395,40396],{"class":159},"        \"text\"",[145,40398,1323],{"class":263},[145,40400,40401],{"class":147,"line":456},[145,40402,40403],{"class":159},"            \"A porcelain vase falls from a marble table in slow motion. \"\n",[145,40405,40406],{"class":147,"line":467},[145,40407,40408],{"class":159},"            \"Camera starts with a close-up of the vase wobbling on the edge, \"\n",[145,40410,40411],{"class":147,"line":600},[145,40412,40413],{"class":159},"            \"then follows it downward with a smooth tracking shot as it shatters \"\n",[145,40415,40416],{"class":147,"line":605},[145,40417,40418],{"class":159},"            \"on a stone floor. Fragments scatter in all directions. \"\n",[145,40420,40421],{"class":147,"line":611},[145,40422,40423],{"class":159},"            \"Dust particles float in warm afternoon sunlight streaming through a window. \"\n",[145,40425,40426],{"class":147,"line":617},[145,40427,40428],{"class":159},"            \"Shallow depth of field, 24fps cinematic look\"\n",[145,40430,40431],{"class":147,"line":623},[145,40432,1343],{"class":263},[145,40434,40435],{"class":147,"line":628},[145,40436,40437],{"class":263},"    }],\n",[145,40439,40440,40443,40445,40447],{"class":147,"line":639},[145,40441,40442],{"class":701},"    resolution",[145,40444,267],{"class":259},[145,40446,3703],{"class":159},[145,40448,453],{"class":263},[145,40450,40451,40453,40455,40457],{"class":147,"line":654},[145,40452,17000],{"class":701},[145,40454,267],{"class":259},[145,40456,3898],{"class":155},[145,40458,453],{"class":263},[145,40460,40461],{"class":147,"line":660},[145,40462,407],{"class":263},[145,40464,40465],{"class":147,"line":671},[145,40466,377],{"emptyLinePlaceholder":58},[145,40468,40469],{"class":147,"line":698},[145,40470,40471],{"class":174},"# Get the video URL from the response\n",[145,40473,40474,40476,40478,40481,40483],{"class":147,"line":710},[145,40475,29761],{"class":263},[145,40477,267],{"class":259},[145,40479,40480],{"class":263}," response.output[",[145,40482,783],{"class":155},[145,40484,40485],{"class":263},"].url\n",[145,40487,40488,40490,40492,40494,40497,40499,40501,40503,40505],{"class":147,"line":716},[145,40489,6563],{"class":155},[145,40491,794],{"class":263},[145,40493,441],{"class":259},[145,40495,40496],{"class":159},"\"Video URL: ",[145,40498,685],{"class":155},[145,40500,1679],{"class":263},[145,40502,691],{"class":155},[145,40504,450],{"class":159},[145,40506,407],{"class":263},[11,40508,40509],{},"Both APIs follow a similar pattern: submit a prompt, get back a video. But the differences go beyond just the endpoint.",[11,40511,40512,40515],{},[23,40513,40514],{},"Async vs sync:"," The EvoLink API for Seedance is asynchronous — you submit a task and poll for completion (or use a webhook callback). Sora via OpenAI returns directly. For production pipelines processing many videos, the async pattern is often preferable since you can submit batches without blocking.",[11,40517,40518,40521],{},[23,40519,40520],{},"Input flexibility:"," Seedance's @-reference system lets you combine up to 9 images, 3 videos, and 3 audio tracks in a single prompt. You can say \"@Image1 as first frame, replicate @Video1 camera movement, sync to @Audio1 beat.\" Sora 2 supports image input but doesn't offer this kind of multimodal composition.",[11,40523,40524,40527],{},[23,40525,40526],{},"Output options:"," Seedance lets you toggle audio generation on or off per request, choose from six aspect ratios (including 21:9 ultrawide), and select 480p/720p/1080p resolution. Sora offers fewer output configuration options but delivers higher default resolution.",[11,40529,40530,40533],{},[23,40531,40532],{},"Video URL expiry:"," EvoLink video URLs expire after 24 hours — download or cache them immediately. Plan your pipeline accordingly.",[38471,40535,40536],{"type":21786},[11,40537,40538,2423,40541,40544],{},[23,40539,40540],{},"Run this comparison yourself.",[37,40542,40543],{"href":16408},"Get your EvoLink API key"," and test with your own prompts. The code above works out of the box.",[48,40546,40548],{"id":40547},"pricing-breakdown","Pricing Breakdown",[11,40550,40551],{},"Cost per 15-second video at default settings, as of February 2026:",[92,40553,40555],{"id":40554},"sora-2-via-openai-evolink","Sora 2 (via OpenAI / EvoLink)",[2036,40557,40558,40569],{},[2039,40559,40560],{},[2042,40561,40562,40564,40566],{},[2045,40563,38551],{},[2045,40565,38573],{"align":13756},[2045,40567,40568],{"align":13756},"Price per video",[2052,40570,40571,40582,40593,40605],{},[2042,40572,40573,40575,40577],{},[2057,40574,1786],{},[2057,40576,4061],{"align":13756},[2057,40578,40579],{"align":13756},[23,40580,40581],{},"$0.50",[2042,40583,40584,40586,40588],{},[2057,40585,1786],{},[2057,40587,4064],{"align":13756},[2057,40589,40590],{"align":13756},[23,40591,40592],{},"$1.00",[2042,40594,40595,40597,40600],{},[2057,40596,1786],{},[2057,40598,40599],{"align":13756},"12s",[2057,40601,40602],{"align":13756},[23,40603,40604],{},"$1.20",[2042,40606,40607,40609,40612],{},[2057,40608,1786],{},[2057,40610,40611],{"align":13756},"20s",[2057,40613,40614],{"align":13756},[23,40615,40616],{},"$2.00",[11,40618,40619,40620,40623,40624,40627],{},"That works out to ",[23,40621,40622],{},"$0.10/second"," at 720p standard tier. Our 15-second test videos cost approximately ",[23,40625,40626],{},"$1.50 each"," on Sora 2.",[11,40629,40630],{},[2614,40631,40632,40633,40638],{},"Source: ",[37,40634,40637],{"href":40635,"rel":40636},"https://seedance2api.app/pricing",[41],"seedance2api.app/pricing",", as of Feb 2026",[92,40640,40642],{"id":40641},"seedance-20-via-evolink","Seedance 2.0 (via EvoLink)",[11,40644,40645,40648],{},[23,40646,40647],{},"Pricing coming soon."," Seedance 2.0 pricing will be announced at launch. The model supports 480p, 720p, and 1080p output with optional audio generation.",[11,40650,40651],{},"For context, here's how it stacks up against other models in the market:",[2036,40653,40654,40669],{},[2039,40655,40656],{},[2042,40657,40658,40660,40663,40666],{},[2045,40659,38805],{},[2045,40661,40662],{"align":13756},"Cost per second",[2045,40664,40665],{"align":13756},"Est. cost per video",[2045,40667,40668],{"align":13756},"Max resolution",[2052,40670,40671,40682,40695,40709],{},[2042,40672,40673,40675,40678,40680],{},[2057,40674,17335],{},[2057,40676,40677],{"align":13756},"Coming soon",[2057,40679,40677],{"align":13756},[2057,40681,1794],{"align":13756},[2042,40683,40684,40686,40689,40692],{},[2057,40685,38544],{},[2057,40687,40688],{"align":13756},"$0.10 (720p)",[2057,40690,40691],{"align":13756},"$1.20 / 12s",[2057,40693,40694],{"align":13756},"720p (Std) / 1080p (Pro)",[2042,40696,40697,40700,40703,40706],{},[2057,40698,40699],{},"Kling 3.0",[2057,40701,40702],{"align":13756},"$0.112 (1080p)",[2057,40704,40705],{"align":13756},"$1.12 / 10s",[2057,40707,40708],{"align":13756},"4K",[2042,40710,40711,40714,40717,40720],{},[2057,40712,40713],{},"Veo 3.1",[2057,40715,40716],{"align":13756},"$0.40 (1080p)",[2057,40718,40719],{"align":13756},"$3.20 / 8s",[2057,40721,40708],{"align":13756},[11,40723,40724],{},[2614,40725,40632,40726],{},[37,40727,40637],{"href":40635,"rel":40728},[41],[11,40730,40731,40734],{},[37,40732,40733],{"href":16408},"Get early access"," to lock in launch pricing when it's announced.",[92,40736,40738],{"id":40737},"cost-considerations","Cost Considerations",[96,40740,40741,40747,40753,40759,40769,40775],{},[73,40742,40743,40746],{},[23,40744,40745],{},"Resolution tradeoff:"," Seedance at 720p costs less than Sora at 1080p, but delivers 60fps vs 30fps. Depending on your use case, the higher frame rate may be more valuable than the higher resolution.",[73,40748,40749,40752],{},[23,40750,40751],{},"Audio bundling:"," Both models can generate synchronized audio. Factor this into your per-video cost if you'd otherwise need separate audio generation.",[73,40754,40755,40758],{},[23,40756,40757],{},"Volume matters:"," For production workloads generating hundreds of videos, even small per-second differences compound. Test both with your actual prompts before committing.",[73,40760,40761,40764,40765,40768],{},[23,40762,40763],{},"Intellectual property:"," Seedance 2.0 outputs include ",[37,40766,40767],{"href":9172},"commercial usage rights"," — verify the latest terms for your use case.",[73,40770,40771,40774],{},[23,40772,40773],{},"Hidden costs:"," Don't forget bandwidth, storage, and post-processing. Sora's higher resolution means larger file sizes (~2× per frame). If you're serving these videos to end users, CDN costs scale with file size. Seedance's 60fps means more frames per second but at lower resolution, resulting in comparable file sizes.",[73,40776,40777,40780,40781,40784],{},[23,40778,40779],{},"Free tier testing:"," Before committing to either API for production, run your actual prompts through both. The results from these three prompts may not generalize to your specific content domain. EvoLink offers a ",[37,40782,40783],{"href":16408},"free API key"," to get started with Seedance testing.",[48,40786,40788],{"id":40787},"when-to-choose-which","When to Choose Which",[11,40790,40791],{},"Picking a model isn't about \"which is better\" — it's about matching capabilities to your specific use case.",[92,40793,40795],{"id":40794},"choose-seedance-20-when","Choose Seedance 2.0 when:",[96,40797,40798,40804,40810,40816,40824,40830],{},[73,40799,40800,40803],{},[23,40801,40802],{},"Dynamic human content"," — dance, sports, action, fitness. The anatomy accuracy gap (8.5 vs 6.5 in our test) is significant.",[73,40805,40806,40809],{},[23,40807,40808],{},"Slow-motion or high-motion content"," — 60fps makes a visible difference in ads, product demos, and cinematic sequences.",[73,40811,40812,40815],{},[23,40813,40814],{},"Character close-ups"," — facial detail and micro-expression rendering are more convincing, especially for elderly or highly detailed faces.",[73,40817,40818,40821,40822,39365],{},[23,40819,40820],{},"Multimodal workflows"," — you need to combine reference images, videos, and audio in a single generation using the ",[37,40823,39536],{"href":2962},[73,40825,40826,40829],{},[23,40827,40828],{},"Rich environment scenes"," — Seedance builds more detailed, \"lived-in\" environments with more props and depth layers.",[73,40831,40832,40835],{},[23,40833,40834],{},"Flexible aspect ratios"," — 21:9 ultrawide and 4:3 formats aren't available on Sora.",[92,40837,40839],{"id":40838},"choose-sora-2-when","Choose Sora 2 when:",[96,40841,40842,40848,40854,40860],{},[73,40843,40844,40847],{},[23,40845,40846],{},"Maximum resolution matters"," — if your output will be displayed at 1080p+ or screenshotted/paused frequently, Sora's higher pixel count wins.",[73,40849,40850,40853],{},[23,40851,40852],{},"Object destruction physics"," — fracture detail on breaking objects is more convincing (uneven thickness, visible internal material layers).",[73,40855,40856,40859],{},[23,40857,40858],{},"Static or slow-moving scenes"," — when the 60fps advantage doesn't apply, Sora's resolution advantage is uncontested.",[73,40861,40862,40865],{},[23,40863,40864],{},"Existing OpenAI integration"," — if your stack already uses the OpenAI SDK, adding Sora requires minimal new infrastructure.",[92,40867,40869],{"id":40868},"the-hybrid-approach","The hybrid approach",[11,40871,40872],{},"For production pipelines, consider using both. Generate character/motion content with Seedance 2.0 and object/environment establishing shots with Sora 2. Both APIs follow standard REST patterns, making it straightforward to route prompts based on content type.",[11,40874,40875],{},"A simple routing heuristic based on our test results:",[136,40877,40879],{"className":339,"code":40878,"language":341,"meta":141,"style":141},"def choose_model(prompt: str, needs_pause_quality: bool = False) -> str:\n    \"\"\"Route to the better model based on content type.\"\"\"\n    motion_keywords = [\"dance\", \"run\", \"fight\", \"sport\", \"action\", \"slow motion\", \"jump\"]\n    face_keywords = [\"close-up\", \"expression\", \"portrait\", \"face\", \"emotion\", \"elderly\"]\n    \n    prompt_lower = prompt.lower()\n    \n    if any(kw in prompt_lower for kw in motion_keywords):\n        return \"seedance-2.0\"  # Better anatomy + 60fps\n    if any(kw in prompt_lower for kw in face_keywords):\n        return \"seedance-2.0\"  # Better facial detail\n    if needs_pause_quality:\n        return \"sora\"          # Higher resolution for screenshots\n    return \"seedance-2.0\"      # Default to higher overall score\n",[28,40880,40881,40909,40914,40958,40997,41001,41009,41013,41038,41048,41069,41078,41085,41095],{"__ignoreMap":141},[145,40882,40883,40885,40888,40890,40892,40895,40898,40900,40903,40905,40907],{"class":147,"line":148},[145,40884,526],{"class":259},[145,40886,40887],{"class":151}," choose_model",[145,40889,15770],{"class":263},[145,40891,8649],{"class":155},[145,40893,40894],{"class":263},", needs_pause_quality: ",[145,40896,40897],{"class":155},"bool",[145,40899,392],{"class":259},[145,40901,40902],{"class":155}," False",[145,40904,15775],{"class":263},[145,40906,8649],{"class":155},[145,40908,860],{"class":263},[145,40910,40911],{"class":147,"line":166},[145,40912,40913],{"class":159},"    \"\"\"Route to the better model based on content type.\"\"\"\n",[145,40915,40916,40919,40921,40923,40926,40928,40931,40933,40936,40938,40941,40943,40946,40948,40951,40953,40956],{"class":147,"line":178},[145,40917,40918],{"class":263},"    motion_keywords ",[145,40920,267],{"class":259},[145,40922,8170],{"class":263},[145,40924,40925],{"class":159},"\"dance\"",[145,40927,401],{"class":263},[145,40929,40930],{"class":159},"\"run\"",[145,40932,401],{"class":263},[145,40934,40935],{"class":159},"\"fight\"",[145,40937,401],{"class":263},[145,40939,40940],{"class":159},"\"sport\"",[145,40942,401],{"class":263},[145,40944,40945],{"class":159},"\"action\"",[145,40947,401],{"class":263},[145,40949,40950],{"class":159},"\"slow motion\"",[145,40952,401],{"class":263},[145,40954,40955],{"class":159},"\"jump\"",[145,40957,764],{"class":263},[145,40959,40960,40963,40965,40967,40970,40972,40975,40977,40980,40982,40985,40987,40990,40992,40995],{"class":147,"line":187},[145,40961,40962],{"class":263},"    face_keywords ",[145,40964,267],{"class":259},[145,40966,8170],{"class":263},[145,40968,40969],{"class":159},"\"close-up\"",[145,40971,401],{"class":263},[145,40973,40974],{"class":159},"\"expression\"",[145,40976,401],{"class":263},[145,40978,40979],{"class":159},"\"portrait\"",[145,40981,401],{"class":263},[145,40983,40984],{"class":159},"\"face\"",[145,40986,401],{"class":263},[145,40988,40989],{"class":159},"\"emotion\"",[145,40991,401],{"class":263},[145,40993,40994],{"class":159},"\"elderly\"",[145,40996,764],{"class":263},[145,40998,40999],{"class":147,"line":374},[145,41000,563],{"class":263},[145,41002,41003,41005,41007],{"class":147,"line":380},[145,41004,15789],{"class":263},[145,41006,267],{"class":259},[145,41008,15794],{"class":263},[145,41010,41011],{"class":147,"line":386},[145,41012,563],{"class":263},[145,41014,41015,41017,41020,41023,41025,41028,41030,41033,41035],{"class":147,"line":410},[145,41016,2501],{"class":259},[145,41018,41019],{"class":155}," any",[145,41021,41022],{"class":263},"(kw ",[145,41024,1181],{"class":259},[145,41026,41027],{"class":263}," prompt_lower ",[145,41029,8207],{"class":259},[145,41031,41032],{"class":263}," kw ",[145,41034,1181],{"class":259},[145,41036,41037],{"class":263}," motion_keywords):\n",[145,41039,41040,41042,41045],{"class":147,"line":421},[145,41041,7172],{"class":259},[145,41043,41044],{"class":159}," \"seedance-2.0\"",[145,41046,41047],{"class":174},"  # Better anatomy + 60fps\n",[145,41049,41050,41052,41054,41056,41058,41060,41062,41064,41066],{"class":147,"line":432},[145,41051,2501],{"class":259},[145,41053,41019],{"class":155},[145,41055,41022],{"class":263},[145,41057,1181],{"class":259},[145,41059,41027],{"class":263},[145,41061,8207],{"class":259},[145,41063,41032],{"class":263},[145,41065,1181],{"class":259},[145,41067,41068],{"class":263}," face_keywords):\n",[145,41070,41071,41073,41075],{"class":147,"line":456},[145,41072,7172],{"class":259},[145,41074,41044],{"class":159},[145,41076,41077],{"class":174},"  # Better facial detail\n",[145,41079,41080,41082],{"class":147,"line":467},[145,41081,2501],{"class":259},[145,41083,41084],{"class":263}," needs_pause_quality:\n",[145,41086,41087,41089,41092],{"class":147,"line":600},[145,41088,7172],{"class":259},[145,41090,41091],{"class":159}," \"sora\"",[145,41093,41094],{"class":174},"          # Higher resolution for screenshots\n",[145,41096,41097,41099,41101],{"class":147,"line":605},[145,41098,1704],{"class":259},[145,41100,41044],{"class":159},[145,41102,41103],{"class":174},"      # Default to higher overall score\n",[11,41105,41106],{},"This is intentionally simplistic — your production router would use more sophisticated classification. But the principle holds: match the model to the content's primary requirement.",[92,41108,41110],{"id":41109},"what-about-other-models","What about other models?",[11,41112,41113],{},"This comparison focused exclusively on Seedance 2.0 and Sora 2 because they represent the current production-grade tier of AI video APIs. Other models like Runway Gen-3, Pika, and Kling are viable alternatives but weren't included in this specific test. We may cover broader comparisons in future articles.",[48,41115,13255],{"id":13254},[92,41117,41119],{"id":41118},"is-seedance-20-better-than-sora-2","Is Seedance 2.0 better than Sora 2?",[11,41121,41122],{},"In our tests, Seedance 2.0 scored higher overall (8.5 vs 8.0), with particular strengths in human anatomy accuracy, motion fluidity (60fps), lighting, and facial detail. Sora 2 wins on resolution and object fracture physics. Neither is universally \"better\" — it depends on your content type.",[92,41124,41126],{"id":41125},"can-i-access-seedance-20-through-an-api","Can I access Seedance 2.0 through an API?",[11,41128,41129,41130,41134,41135,39365],{},"Yes. Seedance 2.0 is available through the ",[37,41131,41133],{"href":16087,"rel":41132},[41],"EvoLink API"," with standard REST endpoints. It supports text-to-video, image-to-video, and video-to-video generation. ",[37,41136,41137],{"href":16408},"Get an API key here",[92,41139,41141],{"id":41140},"whats-the-actual-output-quality-difference-at-720p","What's the actual output quality difference at 720p?",[11,41143,41144],{},"At matched 720p resolution, Seedance delivers 60fps while Sora delivers 30fps. This means Seedance produces twice as many frames per second, resulting in noticeably smoother motion — especially in fast-moving scenes. For static content, the visual quality is comparable at the same resolution.",[92,41146,41148],{"id":41147},"do-both-models-generate-audio","Do both models generate audio?",[11,41150,41151,41152,41154],{},"Yes. Both Seedance 2.0 and Sora 2 can generate synchronized audio including voice, sound effects, and background music. Seedance allows you to control audio generation with a ",[28,41153,1822],{}," parameter and can align output to reference audio tracks via the @Audio tag.",[92,41156,41158],{"id":41157},"which-model-is-more-cost-effective-for-production-use","Which model is more cost-effective for production use?",[11,41160,41161,41162,41165],{},"It depends on volume and content type. Sora 2 standard tier costs $0.10/second for 720p — a 15-second video runs about $1.50. Seedance 2.0 pricing hasn't been announced yet (coming at launch). Check ",[37,41163,40637],{"href":40635,"rel":41164},[41]," for the latest. If your content is motion-heavy, Seedance's 60fps at 720p may deliver better perceived quality per dollar than Sora's 30fps at the same resolution.",[92,41167,41169],{"id":41168},"can-i-use-seedance-20-outputs-commercially","Can I use Seedance 2.0 outputs commercially?",[11,41171,41172,41173,41176],{},"Seedance 2.0 outputs through the EvoLink API include commercial usage rights, but terms vary. Read our ",[37,41174,41175],{"href":9172},"detailed copyright and licensing guide"," for the full breakdown of what's allowed, including monetization on YouTube, use in client work, and redistribution rights. Always verify the latest terms before production deployment.",[45,41178],{},[48,41180,41182],{"id":41181},"final-scores","Final Scores",[2036,41184,41185,41195],{},[2039,41186,41187],{},[2042,41188,41189,41191,41193],{},[2045,41190,38635],{},[2045,41192,17335],{"align":13756},[2045,41194,38544],{"align":13756},[2052,41196,41197,41207,41216,41226,41236,41245],{},[2042,41198,41199,41201,41204],{},[2057,41200,38648],{},[2057,41202,41203],{"align":13756},"8.7",[2057,41205,41206],{"align":13756},"8.3",[2042,41208,41209,41211,41213],{},[2057,41210,38658],{},[2057,41212,41206],{"align":13756},[2057,41214,41215],{"align":13756},"7.8",[2042,41217,41218,41221,41223],{},[2057,41219,41220],{},"Physics/Anatomy Realism",[2057,41222,38842],{"align":13756},[2057,41224,41225],{"align":13756},"7.3",[2042,41227,41228,41230,41233],{},[2057,41229,38680],{},[2057,41231,41232],{"align":13756},"9.2",[2057,41234,41235],{"align":13756},"8.8",[2042,41237,41238,41241,41243],{},[2057,41239,41240],{},"Motion Fluidity",[2057,41242,38828],{"align":13756},[2057,41244,41215],{"align":13756},[2042,41246,41247,41252,41256],{},[2057,41248,41249],{},[23,41250,41251],{},"Overall",[2057,41253,41254],{"align":13756},[23,41255,38828],{},[2057,41257,41258],{"align":13756},[23,41259,38842],{},[11,41261,41262],{},"Both models represent the state of the art in AI video generation as of early 2026. Neither can generate floating dust particles. Neither produces perfect hands every time. But for production API use, these results should guide your model selection based on what you're actually building.",[11,41264,41265,41266,41270,41271,39365],{},"For the latest on Seedance model capabilities, see the official ",[37,41267,41269],{"href":38458,"rel":41268},[41],"ByteDance Seed research page",". For Sora documentation and updates, refer to ",[37,41272,41275],{"href":41273,"rel":41274},"https://platform.openai.com/docs",[41],"OpenAI's official platform docs",[38471,41277,41279],{"type":41278},"primary",[11,41280,41281,2423,41284,41287],{},[23,41282,41283],{},"Start building with Seedance 2.0.",[37,41285,41286],{"href":16408},"Get your free EvoLink API key"," and generate your first video in under a minute.",[11186,41289,41290],{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":141,"searchDepth":166,"depth":166,"links":41292},[41293,41294,41299,41304,41309,41310,41314,41319,41325,41333],{"id":38485,"depth":166,"text":38486},{"id":38607,"depth":166,"text":38608,"children":41295},[41296,41297,41298],{"id":38621,"depth":178,"text":17335},{"id":38704,"depth":178,"text":38544},{"id":38775,"depth":178,"text":38776},{"id":38865,"depth":166,"text":38866,"children":41300},[41301,41302,41303],{"id":38878,"depth":178,"text":17335},{"id":38957,"depth":178,"text":38544},{"id":39034,"depth":178,"text":39035},{"id":39124,"depth":166,"text":39125,"children":41305},[41306,41307,41308],{"id":39137,"depth":178,"text":17335},{"id":39210,"depth":178,"text":38544},{"id":39277,"depth":178,"text":39278},{"id":39368,"depth":166,"text":39369},{"id":39567,"depth":166,"text":39568,"children":41311},[41312,41313],{"id":39574,"depth":178,"text":39575},{"id":40304,"depth":178,"text":40305},{"id":40547,"depth":166,"text":40548,"children":41315},[41316,41317,41318],{"id":40554,"depth":178,"text":40555},{"id":40641,"depth":178,"text":40642},{"id":40737,"depth":178,"text":40738},{"id":40787,"depth":166,"text":40788,"children":41320},[41321,41322,41323,41324],{"id":40794,"depth":178,"text":40795},{"id":40838,"depth":178,"text":40839},{"id":40868,"depth":178,"text":40869},{"id":41109,"depth":178,"text":41110},{"id":13254,"depth":166,"text":13255,"children":41326},[41327,41328,41329,41330,41331,41332],{"id":41118,"depth":178,"text":41119},{"id":41125,"depth":178,"text":41126},{"id":41140,"depth":178,"text":41141},{"id":41147,"depth":178,"text":41148},{"id":41157,"depth":178,"text":41158},{"id":41168,"depth":178,"text":41169},{"id":41181,"depth":166,"text":41182},"我们用相同的提示词测试了 Seedance 2.0 和 Sora 2。查看真实输出对比、逐帧分析、API 代码和价格明细。",{"head":41336,"slug":41343,"date":41344,"image":41345,"tags":41346,"keywords":41352},{"meta":41337},[41338,41341],{"name":41339,"content":41340},"og:title","Seedance 2.0 vs Sora 2 API：并排测试对比 | 2026",{"name":41342,"content":41334},"og:description","seedance-2-vs-sora-2-api-comparison","2026-02-24","/seedance2-vs-sora2-hero.png",[41347,41348,41349,41350,41351],"seedance 2.0","sora 2","ai 视频 api","api 对比","视频生成",[41353,41354,41355],"seedance 2.0 vs sora 2","seedance vs sora api","ai 视频 api 对比","/zh/blog/seedance-2-vs-sora-2-api-comparison",{"title":38444,"description":41334},"zh/blog/seedance-2-vs-sora-2-api-comparison","EzeghXrDtMIVk-eXxMqIA6wMxaSL34-erNaENtyecSw",1775067561025]