【剪映小助手】贴纸处理接口

贴纸处理接口

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构概览
  5. 详细组件分析
  6. 依赖分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文档介绍贴纸处理接口,重点覆盖两个接口:

  • /v1/add_sticker:贴纸添加接口,支持在指定时间段内向剪映草稿中添加贴纸,可配置缩放与位置偏移
  • /v1/search_sticker:贴纸搜索接口,支持按关键词检索贴纸列表

文档说明请求参数、时间线定位机制、缩放与位置配置、层级关系与渲染顺序、透明度与动画效果的应用方式,并提供贴纸 ID 获取、贴纸预览与效果配置的示例与最佳实践。

项目结构

贴纸处理接口位于后端服务的 v1 路由模块中,采用"路由 → 模型(Schema)→ 服务(Service)"的分层设计:

  • 路由层:定义 /v1/add_sticker 与 /v1/search_sticker 的 HTTP 接口与响应模型
  • 模型层:使用 Pydantic 定义请求与响应的数据结构
  • 服务层:实现具体的业务逻辑,包括贴纸添加与贴纸搜索
  • 数据与配置:贴纸搜索依赖本地配置文件;贴纸添加依赖剪映草稿脚本与轨道系统

#mermaid-svg-j9COBI8pAJ0XnDeJ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-j9COBI8pAJ0XnDeJ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-j9COBI8pAJ0XnDeJ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-j9COBI8pAJ0XnDeJ .error-icon{fill:#552222;}#mermaid-svg-j9COBI8pAJ0XnDeJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-j9COBI8pAJ0XnDeJ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-j9COBI8pAJ0XnDeJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-j9COBI8pAJ0XnDeJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-j9COBI8pAJ0XnDeJ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-j9COBI8pAJ0XnDeJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-j9COBI8pAJ0XnDeJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-j9COBI8pAJ0XnDeJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-j9COBI8pAJ0XnDeJ .marker.cross{stroke:#333333;}#mermaid-svg-j9COBI8pAJ0XnDeJ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-j9COBI8pAJ0XnDeJ p{margin:0;}#mermaid-svg-j9COBI8pAJ0XnDeJ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-j9COBI8pAJ0XnDeJ .cluster-label text{fill:#333;}#mermaid-svg-j9COBI8pAJ0XnDeJ .cluster-label span{color:#333;}#mermaid-svg-j9COBI8pAJ0XnDeJ .cluster-label span p{background-color:transparent;}#mermaid-svg-j9COBI8pAJ0XnDeJ .label text,#mermaid-svg-j9COBI8pAJ0XnDeJ span{fill:#333;color:#333;}#mermaid-svg-j9COBI8pAJ0XnDeJ .node rect,#mermaid-svg-j9COBI8pAJ0XnDeJ .node circle,#mermaid-svg-j9COBI8pAJ0XnDeJ .node ellipse,#mermaid-svg-j9COBI8pAJ0XnDeJ .node polygon,#mermaid-svg-j9COBI8pAJ0XnDeJ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-j9COBI8pAJ0XnDeJ .rough-node .label text,#mermaid-svg-j9COBI8pAJ0XnDeJ .node .label text,#mermaid-svg-j9COBI8pAJ0XnDeJ .image-shape .label,#mermaid-svg-j9COBI8pAJ0XnDeJ .icon-shape .label{text-anchor:middle;}#mermaid-svg-j9COBI8pAJ0XnDeJ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-j9COBI8pAJ0XnDeJ .rough-node .label,#mermaid-svg-j9COBI8pAJ0XnDeJ .node .label,#mermaid-svg-j9COBI8pAJ0XnDeJ .image-shape .label,#mermaid-svg-j9COBI8pAJ0XnDeJ .icon-shape .label{text-align:center;}#mermaid-svg-j9COBI8pAJ0XnDeJ .node.clickable{cursor:pointer;}#mermaid-svg-j9COBI8pAJ0XnDeJ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-j9COBI8pAJ0XnDeJ .arrowheadPath{fill:#333333;}#mermaid-svg-j9COBI8pAJ0XnDeJ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-j9COBI8pAJ0XnDeJ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-j9COBI8pAJ0XnDeJ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-j9COBI8pAJ0XnDeJ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-j9COBI8pAJ0XnDeJ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-j9COBI8pAJ0XnDeJ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-j9COBI8pAJ0XnDeJ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-j9COBI8pAJ0XnDeJ .cluster text{fill:#333;}#mermaid-svg-j9COBI8pAJ0XnDeJ .cluster span{color:#333;}#mermaid-svg-j9COBI8pAJ0XnDeJ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-j9COBI8pAJ0XnDeJ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-j9COBI8pAJ0XnDeJ rect.text{fill:none;stroke-width:0;}#mermaid-svg-j9COBI8pAJ0XnDeJ .icon-shape,#mermaid-svg-j9COBI8pAJ0XnDeJ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-j9COBI8pAJ0XnDeJ .icon-shape p,#mermaid-svg-j9COBI8pAJ0XnDeJ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-j9COBI8pAJ0XnDeJ .icon-shape .label rect,#mermaid-svg-j9COBI8pAJ0XnDeJ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-j9COBI8pAJ0XnDeJ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-j9COBI8pAJ0XnDeJ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-j9COBI8pAJ0XnDeJ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 客户端
FastAPI 路由

/v1/add_sticker

/v1/search_sticker
请求模型

AddStickerRequest
请求模型

SearchStickerRequest
服务层

add_sticker()
服务层

search_sticker()
剪映草稿脚本

ScriptFile
贴纸轨道

TrackType.sticker
贴纸配置文件

sticker.json

核心组件

  • 贴纸添加接口(/v1/add_sticker)
    • 请求参数:draft_url、sticker_id、start、end、scale、transform_x、transform_y
    • 处理流程:参数校验 → 时间范围验证 → 从缓存获取草稿 → 创建贴纸轨道 → 构造图像调节设置(含缩放与位置)→ 创建贴纸片段 → 添加到轨道 → 保存草稿 → 返回 track_id、segment_id、duration
  • 贴纸搜索接口(/v1/search_sticker)
    • 请求参数:keyword
    • 处理流程:读取贴纸配置文件 → 关键词匹配 → 若无匹配则随机返回最多 50 条 → 截断至 50 条以内

架构概览

贴纸处理接口的调用链如下:
"贴纸轨道" "剪映草稿脚本" "服务层" "路由层(v1)" "客户端" "贴纸轨道" "剪映草稿脚本" "服务层" "路由层(v1)" "客户端" #mermaid-svg-kO5cmZ7n0SKZq6no{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-kO5cmZ7n0SKZq6no .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-kO5cmZ7n0SKZq6no .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-kO5cmZ7n0SKZq6no .error-icon{fill:#552222;}#mermaid-svg-kO5cmZ7n0SKZq6no .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-kO5cmZ7n0SKZq6no .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-kO5cmZ7n0SKZq6no .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-kO5cmZ7n0SKZq6no .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-kO5cmZ7n0SKZq6no .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-kO5cmZ7n0SKZq6no .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-kO5cmZ7n0SKZq6no .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-kO5cmZ7n0SKZq6no .marker{fill:#333333;stroke:#333333;}#mermaid-svg-kO5cmZ7n0SKZq6no .marker.cross{stroke:#333333;}#mermaid-svg-kO5cmZ7n0SKZq6no svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-kO5cmZ7n0SKZq6no p{margin:0;}#mermaid-svg-kO5cmZ7n0SKZq6no .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-kO5cmZ7n0SKZq6no text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-kO5cmZ7n0SKZq6no .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-kO5cmZ7n0SKZq6no .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-kO5cmZ7n0SKZq6no .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-kO5cmZ7n0SKZq6no .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-kO5cmZ7n0SKZq6no #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-kO5cmZ7n0SKZq6no .sequenceNumber{fill:white;}#mermaid-svg-kO5cmZ7n0SKZq6no #sequencenumber{fill:#333;}#mermaid-svg-kO5cmZ7n0SKZq6no #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-kO5cmZ7n0SKZq6no .messageText{fill:#333;stroke:none;}#mermaid-svg-kO5cmZ7n0SKZq6no .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-kO5cmZ7n0SKZq6no .labelText,#mermaid-svg-kO5cmZ7n0SKZq6no .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-kO5cmZ7n0SKZq6no .loopText,#mermaid-svg-kO5cmZ7n0SKZq6no .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-kO5cmZ7n0SKZq6no .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-kO5cmZ7n0SKZq6no .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-kO5cmZ7n0SKZq6no .noteText,#mermaid-svg-kO5cmZ7n0SKZq6no .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-kO5cmZ7n0SKZq6no .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-kO5cmZ7n0SKZq6no .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-kO5cmZ7n0SKZq6no .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-kO5cmZ7n0SKZq6no .actorPopupMenu{position:absolute;}#mermaid-svg-kO5cmZ7n0SKZq6no .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-kO5cmZ7n0SKZq6no .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-kO5cmZ7n0SKZq6no .actor-man circle,#mermaid-svg-kO5cmZ7n0SKZq6no line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-kO5cmZ7n0SKZq6no :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} POST /v1/add_sticker 调用 add_sticker(...) 校验时间范围(end>start) 从缓存获取草稿 创建贴纸轨道(若不存在) 构造ClipSettings(scale, transform_x/960, transform_y/540) 创建StickerSegment并添加到轨道 保存草稿 返回draft_url, sticker_id, track_id, segment_id, duration 200 OK POST /v1/search_sticker 调用 search_sticker(keyword) 读取config/sticker.json 关键词匹配/随机采样(<=50) 返回data列表 200 OK

详细组件分析

贴纸添加接口 /v1/add_sticker

  • 接口地址:/openapi/capcut-mate/v1/add_sticker

  • 方法:POST

  • 请求体字段

    • draft_url:草稿 URL(必填)
    • sticker_id:贴纸唯一标识(必填)
    • start:开始时间(微秒,必填)
    • end:结束时间(微秒,必填)
    • scale:缩放比例,默认 1.0(建议范围 0.1--5.0)
    • transform_x:X 轴位置偏移(像素,以画布中心为原点,默认 0)
    • transform_y:Y 轴位置偏移(像素,以画布中心为原点,默认 0)
  • 时间线定位机制

    • 贴纸在时间轴上的起止由 start 与 end 决定,持续时间为 duration = end - start
    • 时间范围必须满足 end > start,否则返回参数错误
  • 缩放与位置配置

    • scale 控制贴纸的缩放比例,1.0 表示原始尺寸
    • transform_x 与 transform_y 以像素为单位传入,内部转换为"半画布宽/高"单位进行存储:
      • transform_x 存储值 = transform_x / 960(假设画布宽度 1920)
      • transform_y 存储值 = transform_y / 540(假设画布高度 1080)
  • 层级关系与渲染顺序

    • 贴纸轨道类型为 sticker,渲染顺序高于视频、音频、特效、滤镜、文本等轨道
    • 轨道创建时使用唯一名称,确保同一草稿中贴纸轨道隔离
  • 透明度与动画效果

    • 透明度通过图像调节设置中的 alpha 字段控制(范围 0--1)
    • 动画效果可通过关键帧与片段动画实现(见"性能考量"与"附录")
  • 响应字段

    • draft_url:更新后的草稿 URL
    • sticker_id:贴纸唯一标识
    • track_id:贴纸轨道 ID
    • segment_id:贴纸片段 ID
    • duration:贴纸显示时长(微秒)
  • 错误处理

    • 参数缺失或 end ≤ start:返回 400
    • 草稿不存在或无效:返回 404
    • 内部处理异常:返回 500
  • 使用示例

    • 基础贴纸添加、带缩放的贴纸、带位置偏移的贴纸

#mermaid-svg-z1bxFgIvSoBK4Rvf{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-z1bxFgIvSoBK4Rvf .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-z1bxFgIvSoBK4Rvf .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-z1bxFgIvSoBK4Rvf .error-icon{fill:#552222;}#mermaid-svg-z1bxFgIvSoBK4Rvf .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-z1bxFgIvSoBK4Rvf .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-z1bxFgIvSoBK4Rvf .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-z1bxFgIvSoBK4Rvf .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-z1bxFgIvSoBK4Rvf .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-z1bxFgIvSoBK4Rvf .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-z1bxFgIvSoBK4Rvf .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-z1bxFgIvSoBK4Rvf .marker{fill:#333333;stroke:#333333;}#mermaid-svg-z1bxFgIvSoBK4Rvf .marker.cross{stroke:#333333;}#mermaid-svg-z1bxFgIvSoBK4Rvf svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-z1bxFgIvSoBK4Rvf p{margin:0;}#mermaid-svg-z1bxFgIvSoBK4Rvf .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-z1bxFgIvSoBK4Rvf .cluster-label text{fill:#333;}#mermaid-svg-z1bxFgIvSoBK4Rvf .cluster-label span{color:#333;}#mermaid-svg-z1bxFgIvSoBK4Rvf .cluster-label span p{background-color:transparent;}#mermaid-svg-z1bxFgIvSoBK4Rvf .label text,#mermaid-svg-z1bxFgIvSoBK4Rvf span{fill:#333;color:#333;}#mermaid-svg-z1bxFgIvSoBK4Rvf .node rect,#mermaid-svg-z1bxFgIvSoBK4Rvf .node circle,#mermaid-svg-z1bxFgIvSoBK4Rvf .node ellipse,#mermaid-svg-z1bxFgIvSoBK4Rvf .node polygon,#mermaid-svg-z1bxFgIvSoBK4Rvf .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-z1bxFgIvSoBK4Rvf .rough-node .label text,#mermaid-svg-z1bxFgIvSoBK4Rvf .node .label text,#mermaid-svg-z1bxFgIvSoBK4Rvf .image-shape .label,#mermaid-svg-z1bxFgIvSoBK4Rvf .icon-shape .label{text-anchor:middle;}#mermaid-svg-z1bxFgIvSoBK4Rvf .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-z1bxFgIvSoBK4Rvf .rough-node .label,#mermaid-svg-z1bxFgIvSoBK4Rvf .node .label,#mermaid-svg-z1bxFgIvSoBK4Rvf .image-shape .label,#mermaid-svg-z1bxFgIvSoBK4Rvf .icon-shape .label{text-align:center;}#mermaid-svg-z1bxFgIvSoBK4Rvf .node.clickable{cursor:pointer;}#mermaid-svg-z1bxFgIvSoBK4Rvf .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-z1bxFgIvSoBK4Rvf .arrowheadPath{fill:#333333;}#mermaid-svg-z1bxFgIvSoBK4Rvf .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-z1bxFgIvSoBK4Rvf .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-z1bxFgIvSoBK4Rvf .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-z1bxFgIvSoBK4Rvf .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-z1bxFgIvSoBK4Rvf .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-z1bxFgIvSoBK4Rvf .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-z1bxFgIvSoBK4Rvf .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-z1bxFgIvSoBK4Rvf .cluster text{fill:#333;}#mermaid-svg-z1bxFgIvSoBK4Rvf .cluster span{color:#333;}#mermaid-svg-z1bxFgIvSoBK4Rvf div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-z1bxFgIvSoBK4Rvf .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-z1bxFgIvSoBK4Rvf rect.text{fill:none;stroke-width:0;}#mermaid-svg-z1bxFgIvSoBK4Rvf .icon-shape,#mermaid-svg-z1bxFgIvSoBK4Rvf .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-z1bxFgIvSoBK4Rvf .icon-shape p,#mermaid-svg-z1bxFgIvSoBK4Rvf .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-z1bxFgIvSoBK4Rvf .icon-shape .label rect,#mermaid-svg-z1bxFgIvSoBK4Rvf .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-z1bxFgIvSoBK4Rvf .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-z1bxFgIvSoBK4Rvf .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-z1bxFgIvSoBK4Rvf :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否

进入 add_sticker
校验参数与时间范围
end > start ?
返回 400 参数错误
从缓存获取草稿
创建贴纸轨道(若不存在)
构建图像调节设置

scale, transform_x/960, transform_y/540
创建贴纸片段
添加到轨道
保存草稿
返回 track_id, segment_id, duration

贴纸搜索接口 /v1/search_sticker

  • 接口地址:/openapi/capcut-mate/v1/search_sticker

  • 方法:POST

  • 请求体字段

    • keyword:关键词(必填)
  • 响应字段

    • data:贴纸数据列表,每项包含:
      • sticker:贴纸详细信息(large_image、preview_cover、sticker_package、sticker_type、track_thumbnail)
      • sticker_id:贴纸 ID
      • title:贴纸标题
  • 搜索策略

    • 从配置文件加载贴纸数据
    • 基于关键词在标题中进行包含匹配
    • 若无匹配结果,随机返回最多 50 条记录
    • 结果集超过 50 条时截断至 50 条
  • 使用示例

    • 关键词"人"搜索、关键词"动物"搜索

#mermaid-svg-8RLRmr7IjBXCDN86{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-8RLRmr7IjBXCDN86 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8RLRmr7IjBXCDN86 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8RLRmr7IjBXCDN86 .error-icon{fill:#552222;}#mermaid-svg-8RLRmr7IjBXCDN86 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8RLRmr7IjBXCDN86 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8RLRmr7IjBXCDN86 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8RLRmr7IjBXCDN86 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8RLRmr7IjBXCDN86 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8RLRmr7IjBXCDN86 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8RLRmr7IjBXCDN86 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8RLRmr7IjBXCDN86 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8RLRmr7IjBXCDN86 .marker.cross{stroke:#333333;}#mermaid-svg-8RLRmr7IjBXCDN86 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8RLRmr7IjBXCDN86 p{margin:0;}#mermaid-svg-8RLRmr7IjBXCDN86 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-8RLRmr7IjBXCDN86 .cluster-label text{fill:#333;}#mermaid-svg-8RLRmr7IjBXCDN86 .cluster-label span{color:#333;}#mermaid-svg-8RLRmr7IjBXCDN86 .cluster-label span p{background-color:transparent;}#mermaid-svg-8RLRmr7IjBXCDN86 .label text,#mermaid-svg-8RLRmr7IjBXCDN86 span{fill:#333;color:#333;}#mermaid-svg-8RLRmr7IjBXCDN86 .node rect,#mermaid-svg-8RLRmr7IjBXCDN86 .node circle,#mermaid-svg-8RLRmr7IjBXCDN86 .node ellipse,#mermaid-svg-8RLRmr7IjBXCDN86 .node polygon,#mermaid-svg-8RLRmr7IjBXCDN86 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8RLRmr7IjBXCDN86 .rough-node .label text,#mermaid-svg-8RLRmr7IjBXCDN86 .node .label text,#mermaid-svg-8RLRmr7IjBXCDN86 .image-shape .label,#mermaid-svg-8RLRmr7IjBXCDN86 .icon-shape .label{text-anchor:middle;}#mermaid-svg-8RLRmr7IjBXCDN86 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-8RLRmr7IjBXCDN86 .rough-node .label,#mermaid-svg-8RLRmr7IjBXCDN86 .node .label,#mermaid-svg-8RLRmr7IjBXCDN86 .image-shape .label,#mermaid-svg-8RLRmr7IjBXCDN86 .icon-shape .label{text-align:center;}#mermaid-svg-8RLRmr7IjBXCDN86 .node.clickable{cursor:pointer;}#mermaid-svg-8RLRmr7IjBXCDN86 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-8RLRmr7IjBXCDN86 .arrowheadPath{fill:#333333;}#mermaid-svg-8RLRmr7IjBXCDN86 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-8RLRmr7IjBXCDN86 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-8RLRmr7IjBXCDN86 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8RLRmr7IjBXCDN86 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-8RLRmr7IjBXCDN86 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8RLRmr7IjBXCDN86 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-8RLRmr7IjBXCDN86 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8RLRmr7IjBXCDN86 .cluster text{fill:#333;}#mermaid-svg-8RLRmr7IjBXCDN86 .cluster span{color:#333;}#mermaid-svg-8RLRmr7IjBXCDN86 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-8RLRmr7IjBXCDN86 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8RLRmr7IjBXCDN86 rect.text{fill:none;stroke-width:0;}#mermaid-svg-8RLRmr7IjBXCDN86 .icon-shape,#mermaid-svg-8RLRmr7IjBXCDN86 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8RLRmr7IjBXCDN86 .icon-shape p,#mermaid-svg-8RLRmr7IjBXCDN86 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-8RLRmr7IjBXCDN86 .icon-shape .label rect,#mermaid-svg-8RLRmr7IjBXCDN86 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8RLRmr7IjBXCDN86 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-8RLRmr7IjBXCDN86 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-8RLRmr7IjBXCDN86 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是

进入 search_sticker
读取 config/sticker.json
按 keyword 在 title 中匹配
是否有匹配?
限制返回数量<=50
随机采样<=50条
返回 data 列表

贴纸 ID 获取、贴纸预览与贴纸效果配置

  • 贴纸 ID 获取
    • 通过 /v1/search_sticker 获取贴纸列表后,从响应 data 中提取 sticker_id
  • 贴纸预览
    • large_image.image_url 为贴纸大图 URL,track_thumbnail 为轨道缩略图 URL
  • 贴纸效果配置
    • 透明度:通过图像调节设置中的 alpha(0--1)控制
    • 动画效果:可结合关键帧与片段动画实现(参见"性能考量"与"附录")

依赖分析

  • 路由到服务
    • /v1/add_sticker → service.add_sticker
    • /v1/search_sticker → service.search_sticker
  • 服务到模型
    • 请求模型:AddStickerRequest、SearchStickerRequest
    • 响应模型:AddStickerResponse、SearchStickerResponse
  • 服务到外部
    • 贴纸搜索依赖 config/sticker.json
    • 贴纸添加依赖剪映草稿脚本与轨道系统

#mermaid-svg-OS7QsPJxfUyQ4iaw{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-OS7QsPJxfUyQ4iaw .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-OS7QsPJxfUyQ4iaw .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-OS7QsPJxfUyQ4iaw .error-icon{fill:#552222;}#mermaid-svg-OS7QsPJxfUyQ4iaw .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OS7QsPJxfUyQ4iaw .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-OS7QsPJxfUyQ4iaw .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OS7QsPJxfUyQ4iaw .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OS7QsPJxfUyQ4iaw .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-OS7QsPJxfUyQ4iaw .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OS7QsPJxfUyQ4iaw .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OS7QsPJxfUyQ4iaw .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OS7QsPJxfUyQ4iaw .marker.cross{stroke:#333333;}#mermaid-svg-OS7QsPJxfUyQ4iaw svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OS7QsPJxfUyQ4iaw p{margin:0;}#mermaid-svg-OS7QsPJxfUyQ4iaw .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-OS7QsPJxfUyQ4iaw .cluster-label text{fill:#333;}#mermaid-svg-OS7QsPJxfUyQ4iaw .cluster-label span{color:#333;}#mermaid-svg-OS7QsPJxfUyQ4iaw .cluster-label span p{background-color:transparent;}#mermaid-svg-OS7QsPJxfUyQ4iaw .label text,#mermaid-svg-OS7QsPJxfUyQ4iaw span{fill:#333;color:#333;}#mermaid-svg-OS7QsPJxfUyQ4iaw .node rect,#mermaid-svg-OS7QsPJxfUyQ4iaw .node circle,#mermaid-svg-OS7QsPJxfUyQ4iaw .node ellipse,#mermaid-svg-OS7QsPJxfUyQ4iaw .node polygon,#mermaid-svg-OS7QsPJxfUyQ4iaw .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OS7QsPJxfUyQ4iaw .rough-node .label text,#mermaid-svg-OS7QsPJxfUyQ4iaw .node .label text,#mermaid-svg-OS7QsPJxfUyQ4iaw .image-shape .label,#mermaid-svg-OS7QsPJxfUyQ4iaw .icon-shape .label{text-anchor:middle;}#mermaid-svg-OS7QsPJxfUyQ4iaw .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-OS7QsPJxfUyQ4iaw .rough-node .label,#mermaid-svg-OS7QsPJxfUyQ4iaw .node .label,#mermaid-svg-OS7QsPJxfUyQ4iaw .image-shape .label,#mermaid-svg-OS7QsPJxfUyQ4iaw .icon-shape .label{text-align:center;}#mermaid-svg-OS7QsPJxfUyQ4iaw .node.clickable{cursor:pointer;}#mermaid-svg-OS7QsPJxfUyQ4iaw .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-OS7QsPJxfUyQ4iaw .arrowheadPath{fill:#333333;}#mermaid-svg-OS7QsPJxfUyQ4iaw .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-OS7QsPJxfUyQ4iaw .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-OS7QsPJxfUyQ4iaw .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OS7QsPJxfUyQ4iaw .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-OS7QsPJxfUyQ4iaw .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OS7QsPJxfUyQ4iaw .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-OS7QsPJxfUyQ4iaw .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-OS7QsPJxfUyQ4iaw .cluster text{fill:#333;}#mermaid-svg-OS7QsPJxfUyQ4iaw .cluster span{color:#333;}#mermaid-svg-OS7QsPJxfUyQ4iaw div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-OS7QsPJxfUyQ4iaw .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-OS7QsPJxfUyQ4iaw rect.text{fill:none;stroke-width:0;}#mermaid-svg-OS7QsPJxfUyQ4iaw .icon-shape,#mermaid-svg-OS7QsPJxfUyQ4iaw .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OS7QsPJxfUyQ4iaw .icon-shape p,#mermaid-svg-OS7QsPJxfUyQ4iaw .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-OS7QsPJxfUyQ4iaw .icon-shape .label rect,#mermaid-svg-OS7QsPJxfUyQ4iaw .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OS7QsPJxfUyQ4iaw .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-OS7QsPJxfUyQ4iaw .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-OS7QsPJxfUyQ4iaw :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 路由 v1
service.add_sticker
service.search_sticker
schemas.add_sticker
schemas.search_sticker
config/sticker.json

性能考量

  • 贴纸搜索
    • 配置文件一次性加载,建议对大规模贴纸数据启用分页与缓存机制
    • 随机采样上限为 50,避免一次性返回过多数据
  • 贴纸添加
    • 自动创建贴纸轨道,避免重复创建带来的开销
    • 位置偏移转换为半画布单位,减少后续计算成本
  • 动画与透明度
    • 透明度与关键帧可叠加使用,建议合理设置关键帧密度,避免过度插值导致渲染压力

故障排查指南

  • /v1/add_sticker 常见问题
    • 参数缺失或 end ≤ start:检查请求体字段完整性与时间范围
    • 草稿不存在:确认 draft_url 有效且草稿已缓存
    • 贴纸添加失败:检查贴纸 ID 是否存在、轨道是否创建成功
  • /v1/search_sticker 常见问题
    • 关键词未命中:尝试更宽泛的关键词或检查配置文件是否存在
    • 返回空列表:确认配置文件路径与权限

结论

贴纸处理接口提供了完整的贴纸添加与搜索能力。通过清晰的参数模型与稳健的服务实现,开发者可以便捷地在剪映草稿中添加贴纸、控制其时间、缩放与位置,并通过关键词快速检索贴纸资源。

建议在生产环境中结合缓存与分页策略优化贴纸搜索性能,并合理使用透明度与关键帧实现丰富的动画效果。

附录

A. 请求与响应模型

  • 贴纸添加请求模型
    • 字段:draft_url、sticker_id、start、end、scale、transform_x、transform_y
    • 默认值:scale=1.0,transform_x=0,transform_y=0
  • 贴纸添加响应模型
    • 字段:draft_url、sticker_id、track_id、segment_id、duration
  • 贴纸搜索请求模型
    • 字段:keyword
  • 贴纸搜索响应模型
    • 字段:data(贴纸项列表)

B. 贴纸数据结构

  • 贴纸项(StickerItem)
    • 包含:sticker(StickerInfo)、sticker_id、title
  • 贴纸信息(StickerInfo)
    • 包含:large_image(LargeImage)、preview_cover、sticker_package(StickerPackage)、sticker_type、track_thumbnail
  • 大图信息(LargeImage)
    • 包含:image_url
  • 贴纸包信息(StickerPackage)
    • 包含:height_per_frame、size、width_per_frame

C. 贴纸轨道与渲染顺序

  • 贴纸轨道类型:sticker
  • 渲染顺序:高于视频、音频、特效、滤镜、文本等轨道
  • 轨道创建:按需创建,名称唯一

D. 图像调节设置与透明度

  • 图像调节设置(ClipSettings)
    • 字段:alpha(透明度,0--1)、scale_x/scale_y(缩放)、transform_x/transform_y(半画布单位)
  • 透明度控制:通过 alpha 设置,0 为完全透明,1 为不透明

E. 测试参考

  • 贴纸搜索测试
    • 正常搜索、无匹配随机返回、空关键词场景
  • 简化版贴纸搜索测试
    • 与服务层逻辑一致的简化实现

文档信息

相关推荐
志栋智能2 小时前
超越监控:超自动化巡检提供的主动价值
运维·网络·人工智能·自动化
MAXrxc2 小时前
OSPF综合实验
网络
敲星写码3 小时前
2026远程控制软件选购指南:按人群场景预算一站式锁定,ToDesk覆盖90%用户需求
开源
AIMath~3 小时前
向github中上传文件过大超过50M怎么办
网络·git·github
Sagittarius_A*3 小时前
H3CSE 高性能园区网:SNMP 网络管理协议详解
网络·计算机网络·安全·h3cse
QiLinkOS3 小时前
从技术到资产的跃迁:企业专利布局的深层逻辑
c语言·数据结构·c++·单片机·嵌入式硬件·算法·开源
杨充3 小时前
1.1 数据编码设计原理
linux·运维·网络·底层原理·数据编码
麷飞花3 小时前
Github开源协议
github·开源协议
这个DBA有点耶3 小时前
多模融合数据库深度解析:关系、文档、向量、图如何统一?
数据库·自然语言处理·aigc·dba·改行学it