简短回答
原厂拿到的不是图片,而是你那边服务器返回的一段报错。浏览器能打开,只能说明浏览器下载一次没问题,不能说明原厂服务器抓取也没问题。 典型报错如下,提交任务时直接返回 400,不会创建任务:received: "" 表示原厂没有从下载到的内容里识别出任何图片格式。
最省事的改法:把图片放到普通的对象存储或 CDN 上,用一个干净的公网直链(例如 https://cdn.example.com/xxx.png)。
一个真实案例
一位客户的首帧图链接长这样:
最后一行说明图片本身和请求参数都没问题,问题只出在这个链接上。
为什么会有这种链接
这不是图片地址,而是一个业务接口:用户的私有文件存在后台,每次需要下载时,由应用临时签发一个「下载授权」,里面带着过期时间、签名和下载次数上限。这是保护私有文件的常见做法:链接泄露出去也用不了多久、用不了几次,每次下载也能记录审计。 这种设计是给一个人在浏览器里下载一次准备的,拿来给服务器抓图就会出问题:- 不支持 Range 请求:很多服务在抓取素材时,会先用
Range头取文件开头几个字节来判断格式,或者分段下载。这类接口只会整份返回文件,碰到 Range 就报错 - 限制下载次数:原厂抓取素材时,可能会探测、下载、失败后重试,不一定只下载一次。次数用完后,返回的就是一段报错 JSON
- 有效期太短:链接过期后返回的也不是图片
三种传法怎么选
如果你的文件存在自己的后台、只能通过这种下载授权接口拿到,可以在提交前换一种方式出链:
- 文件本来就在对象存储里(OSS、S3、R2 等):直接生成对象存储的预签名 URL,有效期设为 1 小时以上。预签名 URL 只按时间过期,不限下载次数,也支持 Range
- 否则先把图片转存到一个公开的对象存储或 CDN,再把新链接传给 Seedance
提交前自查链接
在任意一台能上网的机器上跑下面两条命令,把<URL> 换成你的图片链接(整个链接用单引号包起来,避免 & 被 shell 解析):
- 两条命令返回的都是图片,不是 JSON 或 HTML
- 多次下载都能成功,没有次数限制
- 不需要 Cookie、登录态或额外的请求头
- 有效期至少覆盖到任务提交完成,建议 1 小时以上
- 公网可直接访问,不在内网或 IP 白名单之后
相关文档
视频生成接口
图片支持的三种传法与全部请求参数
素材优先实践
三种传法在提交阶段的耗时对比,以及入库拿素材 ID 的步骤