跳转到内容

上传与素材管理

使用签名凭证直传文件、确认素材入库,并管理原件与处理版本。

发送文件前先查询允许的格式、大小、尺寸和时长。能够上传不代表所有工具都可以处理该素材,每个工具还有自己的限制。

GET/api/v1/assets/upload-limits
Bearer API Key权限: read成功: 200

调用示例

Terminal window
curl --include --fail-with-body --silent --show-error --max-time 60 \
--request GET 'https://app.berserkapi.com/api/v1/assets/upload-limits' \
--header "Authorization: Bearer $GLACIER_API_KEY"
响应字段 · 200
imageobject必填
展开字段 / 类型
maxAspectinteger · int64必填

长边 / 短边上限

maxBytesinteger · int64必填

文件大小上限(字节)

maxDurationMsinteger · int64必填

视频时长上限(毫秒)

maxFrameRateinteger · int64必填

视频帧率上限(帧/秒)

maxFramesinteger · int64必填

视频帧数上限

maxPixelsinteger · int64必填

总像素(宽 × 高)上限

maxSideinteger · int64必填

长边上限(像素)

minSideinteger · int64必填

短边下限(像素)

videoobject必填
展开字段 / 类型
maxAspectinteger · int64必填

长边 / 短边上限

maxBytesinteger · int64必填

文件大小上限(字节)

maxDurationMsinteger · int64必填

视频时长上限(毫秒)

maxFrameRateinteger · int64必填

视频帧率上限(帧/秒)

maxFramesinteger · int64必填

视频帧数上限

maxPixelsinteger · int64必填

总像素(宽 × 高)上限

maxSideinteger · int64必填

长边上限(像素)

minSideinteger · int64必填

短边下限(像素)

传入文件名、MIME 类型与准确字节数。请把示例中的 123456 改为实际文件大小。201 响应包含 assetId、uploadUrl、method、headers(名称 / 值二元数组)、fileField 和 expiresAt。将响应保存为本地 ticket.json 供下一步读取;其中包含临时签名地址,请妥善保管。

POST/api/v1/assets/uploads
Bearer API Key权限: write成功: 201
请求体字段 · application/json
mimeTypestring必填
multipartboolean可选

用表单(multipart/form-data)POST 上传:给只能发表单的客户端(微信小程序 wx.uploadFile);默认 PUT 原始字节

namestring必填
sizeBytesinteger · int64必填

调用示例

Terminal window
curl --include --fail-with-body --silent --show-error --max-time 60 \
--request POST 'https://app.berserkapi.com/api/v1/assets/uploads' \
--header "Authorization: Bearer $GLACIER_API_KEY" \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "input.png",
"mimeType": "image/png",
"sizeBytes": 123456
}'
响应字段 · 201
assetIdstring必填
expiresAtstring · date-time必填
fileFieldstring | null必填

method 为 POST(表单上传)时文件所在的字段名;PUT 为 null

headersstring[][]必填
展开字段 / 类型

string

method"PUT" | "POST"必填
uploadUrlstring必填

下面使用默认 PUT 凭证,把 input.png 流式上传到返回的 URL,并使用返回的请求头。这是存储请求,不经过 /api/v1,不要附带 API Key。

Terminal window
# Save the upload-ticket response as ticket.json. Requires jq.
# The ticket must be for input.png with its exact byte length.
test "$(jq -r '.method' ticket.json)" = PUT || exit 1
headers=()
while IFS= read -r header; do headers+=(--header "$header"); done < <(
jq -r '.headers[] | .[0] + ": " + .[1]' ticket.json
)
curl --fail-with-body --silent --show-error --max-time 1800 \
--request PUT "$(jq -r '.uploadUrl' ticket.json)" \
"${headers[@]}" --upload-file input.png

如果申请凭证时明确传入 multipart: true,返回的方法会变成 POST。使用 multipart/form-data,把文件放在返回的 fileField 字段,保留返回的请求头,并让 HTTP 库自动设置 multipart boundary。不要把 POST 凭证用于上面的 PUT 示例。

存储上传成功后,使用凭证中的 assetId 确认完成,服务会检查真实媒体信息并加入素材库。此接口是幂等的。上传响应丢失时,先用已知素材 ID 尝试确认,再决定是否重新上传。未确认的素材不会出现在列表和详情中,请保留凭证直到确认成功。

POST/api/v1/assets/{assetId}/complete
Bearer API Key权限: write成功: 200
路径、查询与请求头
参数位置类型与约束
assetId
必填
pathstring

素材 ID

调用示例

Terminal window
curl --include --fail-with-body --silent --show-error --max-time 60 \
--request POST 'https://app.berserkapi.com/api/v1/assets/ASSET_ID/complete' \
--header "Authorization: Bearer $GLACIER_API_KEY"
响应字段 · 200
coverUrlstring | null必填

视频封面(上传时截取的原件首帧 JPEG,长边不超过 1920);图片或截取失败时为 null

createdAtstring · date-time必填
durationMsinteger | null · int64必填

视频与动图有值(动图为各帧时长之和)

expiresAtstring | null · date-time必填

素材保留期限;null 表示沿用原保留规则

heightinteger · int64必填
idstring必填
isPublicboolean必填

公共素材(示范素材):所有用户可见、不可删除;对它发起处理时自动复制到个人素材库,任务的 assetId 为副本

kind"image" | "video"必填
mimeTypestring必填
namestring必填
sizeBytesinteger · int64必填
thumbnailUrlstring | null必填
updatedAtstring · date-time必填
urlstring必填

原件地址(已签名,可直接用于 <img>/<video>)

versionCountinteger · int64必填

现存版本数(含原件;删除的版本不计)

widthinteger · int64必填

scope=mine 只查询自己的素材,scope=public 查询示范素材,默认 scope=all。可用 kind、search 筛选。把返回的 nextCursor 作为下一页的 cursor 参数,直到它为 null。示例每页查询 24 条。

GET/api/v1/assets
Bearer API Key权限: read成功: 200
路径、查询与请求头
参数位置类型与约束
scope
可选
query"all" | "mine" | "public"

不传 = all:公共素材在前,然后是我的素材

kind
可选
query"image" | "video"

不传 = 全部类型

search
可选
querystring

按名称模糊搜索

maxLength: 100

limit
可选
queryinteger · int64

minimum: 1 · maximum: 100 · default: 24

cursor
可选
querystring

上一页返回的 nextCursor

调用示例

Terminal window
curl --include --fail-with-body --silent --show-error --max-time 60 \
--request GET 'https://app.berserkapi.com/api/v1/assets?scope=mine&limit=24' \
--header "Authorization: Bearer $GLACIER_API_KEY"
响应字段 · 200
itemsobject[]必填
展开字段 / 类型
coverUrlstring | null必填

视频封面(上传时截取的原件首帧 JPEG,长边不超过 1920);图片或截取失败时为 null

createdAtstring · date-time必填
durationMsinteger | null · int64必填

视频与动图有值(动图为各帧时长之和)

expiresAtstring | null · date-time必填

素材保留期限;null 表示沿用原保留规则

heightinteger · int64必填
idstring必填
isPublicboolean必填

公共素材(示范素材):所有用户可见、不可删除;对它发起处理时自动复制到个人素材库,任务的 assetId 为副本

kind"image" | "video"必填
mimeTypestring必填
namestring必填
sizeBytesinteger · int64必填
thumbnailUrlstring | null必填
updatedAtstring · date-time必填
urlstring必填

原件地址(已签名,可直接用于 <img>/<video>)

versionCountinteger · int64必填

现存版本数(含原件;删除的版本不计)

widthinteger · int64必填
nextCursorstring | null必填
totalinteger · int64必填

响应包含 asset 和 versions。如需以某个处理版本继续加工,保留它的版本 ID,作为后续任务的 sourceVersionId。文件地址是临时链接,需要时重新查询获取。处理公共素材时可能生成个人副本,后续以任务返回的 assetId 为准。

GET/api/v1/assets/{assetId}
Bearer API Key权限: read成功: 200
路径、查询与请求头
参数位置类型与约束
assetId
必填
pathstring

素材 ID

调用示例

Terminal window
curl --include --fail-with-body --silent --show-error --max-time 60 \
--request GET 'https://app.berserkapi.com/api/v1/assets/ASSET_ID' \
--header "Authorization: Bearer $GLACIER_API_KEY"
响应字段 · 200
assetobject必填
展开字段 / 类型
coverUrlstring | null必填

视频封面(上传时截取的原件首帧 JPEG,长边不超过 1920);图片或截取失败时为 null

createdAtstring · date-time必填
durationMsinteger | null · int64必填

视频与动图有值(动图为各帧时长之和)

expiresAtstring | null · date-time必填

素材保留期限;null 表示沿用原保留规则

heightinteger · int64必填
idstring必填
isPublicboolean必填

公共素材(示范素材):所有用户可见、不可删除;对它发起处理时自动复制到个人素材库,任务的 assetId 为副本

kind"image" | "video"必填
mimeTypestring必填
namestring必填
sizeBytesinteger · int64必填
thumbnailUrlstring | null必填
updatedAtstring · date-time必填
urlstring必填

原件地址(已签名,可直接用于 <img>/<video>)

versionCountinteger · int64必填

现存版本数(含原件;删除的版本不计)

widthinteger · int64必填
versionsobject[]必填
展开字段 / 类型
assetIdstring必填
createdAtstring · date-time必填
downloadUrlstring必填

下载地址(响应带 Content-Disposition: attachment,文件名形如 原名_V2_超分.mp4)

durationMsinteger | null · int64必填

视频与动图有值(动图为各帧时长之和)

frameCountinteger | null · int64必填

帧数,视频与动图有值(图片的 frameCount > 1 即动图,按帧计费);旧版本为 null

frameRatenumber | null · double必填

平均帧率(帧/秒),视频与动图有值(动图各帧时长不同,只用于展示);旧版本为 null

heightinteger · int64必填
idstring必填
indexinteger · int64必填

版本号,0 = 原件;只增不减,删除过的版本号不复用(版本列表可能不连续)

labelstring必填
maskUrlstring | null必填

去水印的识别遮罩视频(H.264,与输入版本 sourceVersionId 按时间对齐,亮 = 被修复的像素,分辨率可能低于原视频),前端对比时叠加在原视频上;其他版本为 null

mimeTypestring必填
previewPendingboolean必填

预览正在后台转码,完成后 previewUrl 才有值;期间可轮询 getAsset

previewUrlstring | null必填

浏览器可播放的 H.264 预览;为 null 时直接播放 url(原视频浏览器可播放、图片、转码失败)

sizeBytesinteger · int64必填
sourceVersionIdstring | null必填

由哪个版本处理而来(前端默认与它对比);原件为 null;该版本可能已被删除

thumbnailUrlstring | null必填
toolIdstring | null必填
urlstring必填

原始文件地址(已签名)

watermarkMarksobject[]必填

用户在这个版本上的去水印标记(随版本保存,下次打开继续编辑);没有为空数组

展开字段 / 类型
colorstring可选

纯色水印的颜色(#rrggbb,如白字 #ffffff);不填表示不按颜色收紧遮罩

pattern: "^#[0-9a-fA-F]{6}$"

endMsinteger · int64可选

作用区间的结束时间(毫秒,含),须带 timeMs 且不早于它;不填表示只作用于 timeMs 这一帧。positive 带 endMs 表示确认这一段要修复

minimum: 0

heightnumber · double必填

高度(占画面高度的比例)

minimum: 0 · maximum: 1

kind"positive" | "negative" | "absent" | "suggested"可选

标记类型:positive(默认)这里有水印;negative 减选,这里不是水印;absent 这一段没有这个水印(须带 objectId);suggested 自动查找的建议,用户确认(改成 positive)前不参与识别

objectIdinteger · int64可选

水印编号(前端同一种颜色):同一编号在不同时间点的标记是同一个水印,各自向前后跟踪到彼此相遇;不填表示每处标记各是一个水印

minimum: 0 · maximum: 7

strokesobject[]可选

涂抹的画笔轨迹;为空表示框选(整个框都是水印)

maxItems: 64

展开字段 / 类型
pointsnumber · double[][]必填

轨迹点 [x, y](相对画面)

minItems: 1 · maxItems: 4000

展开字段 / 类型

number · double

radiusnumber · double必填

画笔半径(占画面宽度的比例)

minimum: 0 · maximum: 0.25

timeMsinteger · int64可选

标记时的视频时间点(毫秒);不填表示整段视频固定位置

minimum: 0

widthnumber · double必填

宽度(占画面宽度的比例)

minimum: 0 · maximum: 1

xnumber · double必填

左边缘(占画面宽度的比例)

minimum: 0 · maximum: 1

ynumber · double必填

上边缘(占画面高度的比例)

minimum: 0 · maximum: 1

watermarkObjectsobject[]必填

用户给这个版本上各个水印起的名字;没有为空数组(前端显示「水印 n」)

展开字段 / 类型
namestring必填

水印名称

minLength: 1 · maxLength: 24

objectIdinteger · int64必填

minimum: 0 · maximum: 7

widthinteger · int64必填

仅修改传入的字段。名称会去掉首尾空白,可以与其他素材重名。

PATCH/api/v1/assets/{assetId}
Bearer API Key权限: write成功: 200
路径、查询与请求头
参数位置类型与约束
assetId
必填
pathstring

素材 ID

请求体字段 · application/json
namestring可选

素材名称(首尾空白会去掉);可与其他素材重名

minLength: 1 · maxLength: 255

调用示例

Terminal window
curl --include --fail-with-body --silent --show-error --max-time 60 \
--request PATCH 'https://app.berserkapi.com/api/v1/assets/ASSET_ID' \
--header "Authorization: Bearer $GLACIER_API_KEY" \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Enhanced photo"
}'
响应字段 · 200
coverUrlstring | null必填

视频封面(上传时截取的原件首帧 JPEG,长边不超过 1920);图片或截取失败时为 null

createdAtstring · date-time必填
durationMsinteger | null · int64必填

视频与动图有值(动图为各帧时长之和)

expiresAtstring | null · date-time必填

素材保留期限;null 表示沿用原保留规则

heightinteger · int64必填
idstring必填
isPublicboolean必填

公共素材(示范素材):所有用户可见、不可删除;对它发起处理时自动复制到个人素材库,任务的 assetId 为副本

kind"image" | "video"必填
mimeTypestring必填
namestring必填
sizeBytesinteger · int64必填
thumbnailUrlstring | null必填
updatedAtstring · date-time必填
urlstring必填

原件地址(已签名,可直接用于 <img>/<video>)

versionCountinteger · int64必填

现存版本数(含原件;删除的版本不计)

widthinteger · int64必填

删除某个处理结果版本,不能通过此接口删除原件;删除原件需要删除整个素材。成功返回 204,没有响应正文。

DELETE/api/v1/assets/{assetId}/versions/{versionId}
Bearer API Key权限: write成功: 204
路径、查询与请求头
参数位置类型与约束
assetId
必填
pathstring

素材 ID

versionId
必填
pathstring

版本 ID

调用示例

Terminal window
curl --include --fail-with-body --silent --show-error --max-time 60 \
--request DELETE 'https://app.berserkapi.com/api/v1/assets/ASSET_ID/versions/VERSION_ID' \
--header "Authorization: Bearer $GLACIER_API_KEY"
响应字段 · 204

成功后无响应体。不要解析为空 JSON。

删除自己的素材并取消相关任务。请在确认不再需要原件及其版本时调用,公共示范素材不可删除。成功返回 204,没有响应正文。

DELETE/api/v1/assets/{assetId}
Bearer API Key权限: write成功: 204
路径、查询与请求头
参数位置类型与约束
assetId
必填
pathstring

素材 ID

调用示例

Terminal window
curl --include --fail-with-body --silent --show-error --max-time 60 \
--request DELETE 'https://app.berserkapi.com/api/v1/assets/ASSET_ID' \
--header "Authorization: Bearer $GLACIER_API_KEY"
响应字段 · 204

成功后无响应体。不要解析为空 JSON。