1. websocket
多站点验证multiple sites
  • Default module
    • Sample APIs
      • markdown_请检查图片是否访问正常
      • Find pet by ID
      • Add a new pet to the store
      • Update an existing pet
      • Deletes a pet
      • Finds Pets by status
  • module2
    • markdown2
    • markdown1
    • Pet
      • 无 slug
      • 1slug-a
      • slug-multiple modified
      • Update Pet
    • User
      • Create User
      • Get User
    • Webhooks
      • Order Status Changed Event
      • Payment Succeeded Event
    • Websocket, Socket.IO & more
      • gRPC API
      • Other protocol API example
      • WebSocket example
      • Socket.IO example
      • Webhook example
      • GraphQL example
      • SSE example
      • SOAP example
    • Dashboard
      • Get Dashboard Stats
    • User Management
      • List Users
      • Get User Details
      • Update User Status
    • Order Management
      • List All Orders
      • Force Cancel Order
    • Audit Logs
      • Get Audit Log Details
  • 默认模块
    • 项目管理
      • 修改项目
      • 删除项目
      • 提示词列表查询
      • 分类统计
      • 丢弃ai解析结果
      • 音色列表(支持场景/性别/年龄段筛选)
      • 获取模型选项
      • 创建项目
      • 获取项目详情
      • 项目列表/搜索
      • 获取项目统计
      • 导出剧本Word
      • 预览ai解析内容
      • 应用ai解析内容
    • 测试控制器 - 用于验证跨域配置
      • 测试跨域的GET请求
      • 测试跨域的POST请求
      • 测试OPTIONS预检请求
      • 测试XSS防护
      • 测试XSS防护的GET请求
      • 简单GET测试接口(通过参数传递提示词)
      • 生成图片并保存到本地(测试Base64转换功能)
      • 直接测试Base64转图片功能
      • 测试图片生成并上传到指定路径
      • 测试图片生成并上传到指定路径(包含负面提示词)
      • 测试图片编辑功能
      • 测试图片编辑功能(GET简化版)
      • 测试Banana图片生成功能
      • 测试Banana图片生成功能(GET简化版)
      • 测试Banana API响应解析(调试用)
      • 测试Banana图片编辑功能(带图片输入)
      • 测试火山引擎图生图功能
      • 测试火山引擎图生图功能(GET简化版)
      • 测试火山引擎文生图功能
      • 测试火山引擎文生图功能(GET简化版)
      • 测试火山引擎文生图功能(带负面提示词)
      • 测试Banana图生图功能
      • 测试Banana图生图功能(GET简化版)
      • 测试Banana图生图功能(多张参考图)
      • 测试Banana图生图功能(不同尺寸格式)
      • 测试Banana图生图功能(本地文件)
      • Banana图生图功能综合测试接口
      • 测试Banana所有功能的健康检查
    • 分镜模块控制器
      • 分镜参考生图
      • 获取分镜参考生图支持的图片模型列表
      • 获取可用的LLM模型列表
      • AI帮写提示词接口
      • 根据章节ID查询分镜列表
      • 查询剧集关联的资产列表(按类型分类)
      • 创建分镜(通过AI生成)
      • 新增分镜(手动创建)
      • 修改分镜
      • 删除分镜
      • 更新分镜排序
      • 根据分镜ID查询混合图像列表
      • 根据分镜ID查询视频生成列表
      • 根据分镜ID查询TTS语音生成列表
      • 根据分镜ID查询素材列表
      • 上传分镜图片
      • 上传分镜音频
      • 上传分镜视频
      • 保存混合图像生成草稿(每个分镜仅保留一条草稿,重复保存覆盖旧草稿,不触发生成)
      • 查询某个分镜下最近一条混合图像草稿
      • 保存视频生成草稿(每个分镜仅保留一条草稿,重复保存覆盖旧草稿,不触发生成)
      • 查询某个分镜下最近一条视频草稿
      • 新增分镜素材
      • 删除分镜素材
      • 删除分镜图片生成草稿
      • 设置分镜素材选中状态
      • 删除分镜视频生成草稿
      • 删除TTS语音生成记录
      • 抽取分镜尾帧
      • 根据分镜ID查询其所属剧集的资产列表(按类型分类)
      • 根据分镜ID查询分镜详情(含资产及子资产图片)
      • 根据项目ID查询资产列表
      • 查询章节下每个分镜最近选中的视频素材(含关联的视频生成记录)
      • 查询章节下每个分镜最近选中的图片素材(含通过taskId关联的混合图像生成记录)
      • 根据章节ID导出选中素材压缩包
    • websocket
      • 生成章节分镜
      • 生成章节分镜视频
      • 批量生成章节分镜视频
      • 生成章节分镜图片
    • 云空间模块控制器
      • 上传素材
      • 导入云空间
      • 批量上传素材(支持多文件)
      • 云空间素材列表
      • 批量删除素材
      • 重命名素材
    • 场景模块控制器
      • 查询场景列表
      • 查询某个场景下所有选中图片
      • 查询某个场景下所有选中图片
      • 查询某个图片详情
      • 场景图片设置是否选中
      • 删除图片
      • 查询场景明细
      • 新建场景
      • 编辑场景
      • 上传场景图片
      • 从云空间导入场景图片
      • 上传参考图
      • 自动生成
      • 手动生成
      • 一键生成图片
      • 批量删除场景
      • 查询场景角度资产列表
      • 新建场景资产
      • 编辑场景资产
      • 根据角度表ID查询明细
      • 根据角度表ID查询明细
      • 批量删除场景
      • 图片截图上传
      • 截图处理
      • 图片超分处理
      • 图片增强处理
      • 图片关联到场景或角度
    • 提示词模块控制器
      • 新建提示词模版
      • 上传提示词模版封面
      • 编辑提示词模版
      • 提示词模板列表查询
      • 按模版Id查询模块明细
      • 按模版Id删除提示词模板
      • 切换收藏状态
    • 视频分析控制器
      • 上传视频文件
      • 分析视频
      • 查询任务状态
      • 查询任务列表
    • 用户管理
      • 发送短信验证码
      • 登录(短信验证码/密码)
      • 根据ID获取用户信息
      • 获取当前登录用户信息(需JWT)
    • 章节
      • 分集控制器
        • 根据项目ID查询章节列表(无分页)
        • 根据项目ID分页查询章节列表
        • 根据ID查询章节详情
        • 新增章节
        • 修改章节
        • 删除章节
    • 道具
      • 物品模块控制器
        • 查询物品列表
        • 查询某个 项目下所有道具选中图片
        • 查询某个图片详情
        • 物品图片设置是否选中
        • 删除图片
        • 查询物品明细
        • 新建物品
        • 编辑物品
        • 上传物品图片
        • 从云空间导入物品图片
        • 上传参考图
        • 自动生成
        • 手动生成
        • 一键生成图片
        • 批量删除场景
    • 豆包语音合成控制器
      • 根据场景、性别、年龄段查询音色列表
      • 根据场景、性别、年龄段查询音色列表(GET 方法)
      • 语音合成
      • 根据文本获取推荐音色
      • 快速语音合成(使用默认参数)
    • 生物模块控制器
      • 查询生物列表
      • 查询某个项目下所有生物选中图片
      • 查询某个图片详情
      • 生物图片设置是否选中
      • 删除图片
      • 查询生物明细
      • 新建生物
      • 编辑生物
      • 上传生物图片
      • 从云空间导入生物图片
      • 上传参考图
      • 自动生成
      • 手动生成
      • 一键生成图片
      • 批量删除生物
    • 角色管理
      • 查询角色列表
      • 查询角色下所有已选中图片
      • 查询图片明细
      • 设置角色图片选中状态
      • 删除角色图片
      • 查询角色明细
      • 绑定音色
      • 解除绑定音色
      • 新建角色
      • 编辑角色
      • 上传角色图片
      • 从云空间导入角色图片
      • 批量上传参考图
      • 自动生成角色图片(使用角色描述作为提示词)
      • 手动生成角色图片(自定义提示词/参数)
      • 一键批量生成角色图片
      • 批量删除角色
      • 查询角色造型列表
      • 新建角色造型
      • 编辑角色造型
      • 查询角色造型明细
      • 批量删除角色造型
    • websocket生成剧本
  1. websocket

生成章节分镜视频

Developing
127.0.0.1:8080/api/b2v/websocket

CreateReferenceVideoHandler.handle 接口文档#

1. 接口概述#

项目说明
接口名称图片转视频(参考图模式 / Seedance reference2video)
处理器类com.star.b2v.web.socket.handler.CreateReferenceVideoHandler
入口方法handle(CreateReferenceVideoMessage message)
消息类型(messageType)CreateReferenceVideoMessage
通信协议WebSocket(双向,异步)
执行方式@Async("websocketTaskExecutor") 异步线程池执行
核心依赖IMultipleImg2Video.img2video(默认实现:SeedanceMultipleImg2VideoImpl)

业务说明#

接收客户端通过 WebSocket 推送的"图片转视频"任务,调用豆包 Seedance reference2video 接口创建视频生成任务,并启动异步轮询。视频生成的最终结果(成功/失败)由 SeedanceBaseService 轮询线程通过 TaskEventPublisher 发布事件,再由 WebSocket 推回客户端。
注意:本接口不是立即返回视频URL,而是提交一个异步任务。客户端需通过同一 WebSocket 监听后续推送的结果消息。

2. 调用链路#

客户端 WebSocket 文本消息
        │
        ▼
ApiWebSocketHandler.handleTextMessage           ← 解析 payload,按 messageType 路由
        │  (messageType = "CreateReferenceVideoMessage")
        ▼
MessageMappingFactory.getHandler(CreateReferenceVideoMessage.class)
        │
        ▼
MsgHandlerAspect.around                          ← @Around 切面,@Order(1)
        │  1. 解析 taskId = "{userId}_{clientId}"
        │  2. 查重(同 msgType + 同 msg 内容 + INIT 状态)→ 重复则返回"任务正在处理中"
        │  3. 落库 aisp_websocket_task,回写 dataTaskId
        │  4. point.proceed()
        ▼
CreateReferenceVideoHandler.handle               ← @Async 异步执行
        │
        ▼
SeedanceMultipleImg2VideoImpl.img2video
        │  1. buildRequest(message)              ← 组装 Seedance 请求体
        │  2. createVideoTask(apiUrl, request)   ← 调用火山 Seedance API
        │  3. saveGenerateVideo(message, taskId) ← 落库 aisp_generate_video (状态=进行中)
        │  4. putTaskAsyncDelayed(...)           ← 启动异步轮询
        ▼
(轮询完成后由 SeedanceBaseService 推送结果给客户端)

3. WebSocket 连接#

连接地址:ws(s)://<host>/ws?userId={userId}
userId 必填,用于会话路由
连接成功:服务端推送 CONNECT_SUCCESS
心跳:客户端发送 ping,服务端回复 {"pong":"pong"}
消息格式:JSON 文本帧

4. 请求消息(客户端 → 服务端)#

4.1 报文结构#

外层为 SocketMessage 基础字段 + CreateReferenceVideoMessage 业务字段混合平铺。
字段类型必填说明
messageTypeString是固定值:CreateReferenceVideoMessage(路由用)
taskIdString是格式:{userId}_{clientId},如 1001_abc123;用于切面解析 userId/clientId 并落库
sessionIdString否由服务端在 ApiWebSocketHandler 中按连接自动回填,客户端无需传
msgTypeString否由服务端回填为 CreateReferenceVideoMessage,客户端无需传
dataTaskIdLong否由切面 MsgHandlerAspect 落库后回写,客户端无需传

4.2 业务字段(CreateReferenceVideoMessage)#

字段类型必填默认值说明
taskIdString是-与外层 taskId 同值(业务唯一任务标识);格式必须为 {userId}_{clientId},否则被切面拦截
storyboardIdInteger是-所属分镜 ID,用于查询所属剧集资产(角色/场景/道具/生物)并启动轮询
refImagesList<String>否-参考图 URL 列表,全部映射为 reference_image
firstLastImagesList<String>条件-首帧/尾帧图;genWay > 0 时生效
genWayByte否0生成方式:0-单帧,1-首帧(取 firstLastImages[0]),2-首尾帧(取前2张)
refAudioList<String>否-参考音频 URL;与角色音频合计 > 3 时将被舍弃
refVoiceList<String>否-参考视频 URL(实际以 reference_video 角色提交)
promptString否""生成提示词;若指定 promptTemplateId 则作为 basePrompt
promptTemplateIdInteger否-关联提示词模板 ID;为空时直接使用 prompt
promptParamsString(JSON)否-模板变量 JSON,解析为 List<VariableVo> 覆盖模板变量
seedInteger否0随机种子
amountInteger否1生成数量(仅落库,当前实现单任务提交)
durationInteger否-视频时长(秒);直接透传给 Seedance,不传则由模型默认决定。注意:r2v(参考图模式)下 Seedance 可能忽略此参数,时长以提示词描述为准
aspectRatioString否9:16画面比例(如 16:9、4:3、1:1)
resolutionString否720p分辨率
hasAudioByte否0(false)是否含音频:0-否,1-是
videoModelIdByte否-视频模型 ID(仅落库,模型名固定为 doubao-seedance-2-0-260128)
consumeAmountInteger否-消耗积分(仅落库)
statusByte否-生成状态:0-待处理,1-进行中,2-成功,3-失败(仅落库,由轮询更新;客户端不要传)

4.3 业务规则与限制#

模型:固定 doubao-seedance-2-0-260128,不可通过消息切换。
参考图上限:参考图 + 首尾帧 + 剧集资产图片 总数 ≤ 9 张;剧集资产按 maxImages - 已用槽位 补齐。
剧集资产自动注入:根据 storyboardId → episodeId 自动查询剧集资产图片(角色/场景/道具/生物)作为 reference_image,并将角色音频作为 reference_audio。
角色名替换:提示词中出现的资产名称会被替换为 图X(X 为该资产在 content 中的 1-based 索引)。
音频标注注入:对 角色名(台词): / 角色名(独白): 模式自动追加 [音频参考:音频N]。
音频数量限制:角色音频 + refAudio 合计 > 3 时,舍弃传入的 refAudio,仅保留角色音频。
duration 透传:duration 字段(秒)会被原样写入 Seedance 请求体的 duration,不做非空兜底。但 Seedance 在 reference2video 模式下可能忽略此参数,实际时长以提示词内容控制为准。
幂等/防重:切面按 msgType + msg内容(JSON) + INIT状态 查重,重复任务直接回推 任务正在处理中,不重复执行。
returnLastFrame:请求固定为 true。

4.4 请求示例#

{
  "messageType": "CreateReferenceVideoMessage",
  "taskId": "1001_abc123",
  "storyboardId": 88,
  "refImages": [
    "https://cos.example.com/xxx/ref1.jpg",
    "https://cos.example.com/xxx/ref2.jpg"
  ],
  "firstLastImages": [
    "https://cos.example.com/xxx/first.jpg",
    "https://cos.example.com/xxx/last.jpg"
  ],
  "genWay": 2,
  "refAudio": [
    "https://cos.example.com/xxx/audio1.wav"
  ],
  "refVoice": [
    "https://cos.example.com/xxx/voice-ref.mp4"
  ],
  "prompt": "角色A(台词):你好呀;镜头缓缓推进。",
  "promptTemplateId": 12,
  "promptParams": "[{\"varName\":\"{{scene}}\",\"possibleValues\":\"雨夜街景\"}]",
  "seed": 1024,
  "amount": 1,
  "duration": 5,
  "aspectRatio": "16:9",
  "resolution": "720p",
  "hasAudio": 1,
  "videoModelId": 1,
  "consumeAmount": 10
}

5. 响应消息(服务端 → 客户端)#

所有响应通过同一 WebSocket 连接推送,均为 JSON 文本帧,由 AjaxResult 构造。

5.1 任务提交成功(瞬时确认)#

注意:CreateReferenceVideoHandler.handle 本身未在成功路径主动推送 ack 给客户端,仅记录日志。客户端若需要提交确认,请依赖下方"最终结果消息"。提交失败的错误消息见 5.3。

5.2 最终结果 - 成功#

由 SeedanceBaseService 轮询成功后通过 TaskEventPublisher.publishSuccess(message, eventPublisher, data) 推送:
{
  "code": "200",
  "msgType": "CreateReferenceVideoMessage",
  "taskId": "1001_abc123",
  "data": {
    "videoUrl": "https://cos.example.com/xxx/result.mp4",
    "lastFrameUrl": "https://cos.example.com/xxx/lastframe.jpg"
  },
  "timestamp": 1690000000000
}

5.3 最终结果 - 失败#

由 CreateReferenceVideoHandler.handle 捕获异常后调用:
sendError(message, "图片转视频失败: " + e.getMessage())
TaskEventPublisher.publishFailure(message, eventPublisher, e.getMessage())
{
  "code": "500",
  "msgType": "CreateReferenceVideoMessage",
  "taskId": "1001_abc123",
  "msg": "图片转视频失败: <错误详情>",
  "timestamp": 1690000000000
}

5.4 任务重复(防重拦截)#

由 MsgHandlerAspect 直接推送,不会执行 handler:
{
  "code": "500",
  "msgType": "CreateReferenceVideoMessage",
  "taskId": "1001_abc123",
  "msg": "任务正在处理中",
  "timestamp": 1690000000000
}

5.5 taskId 格式错误(切面校验失败)#

{
  "code": "500",
  "msg": "taskId格式错误!",
  "timestamp": 1690000000000
}

6. 异常与错误码#

场景触发位置行为
taskId 不含 _ 或解析失败MsgHandlerAspect推送 taskId格式错误!,不执行 handler
同任务重复提交(INIT 状态)MsgHandlerAspect推送 任务正在处理中,不执行 handler
img2video 抛异常CreateReferenceVideoHandler.handle catch推送错误消息 + 发布 TaskCompletionEvent.failure
Seedance API 返回 taskId 为空SeedanceMultipleImg2VideoImpl.img2video抛 RuntimeException,走失败路径
任务落库 aisp_generate_video 失败saveGenerateVideo catch不影响主流程(任务已提交给 Seedance),仅记录错误日志

7. 数据落库#

表触发点关键字段
aisp_websocket_taskMsgHandlerAspect(任务创建)msgType、msg(消息体JSON)、userId、clientId、delFlag=INIT
aisp_generate_videoSeedanceMultipleImg2VideoImpl.saveGenerateVideotaskId(Seedance ID)、storyboardId、refImages、prompt、status=1(进行中) 等;后续轮询更新

8. 相关代码位置#

角色路径
Handlerb2v-web/src/main/java/com/star/b2v/web/socket/handler/CreateReferenceVideoHandler.java
消息体b2v-api/src/main/java/com/star/b2v/api/message/CreateReferenceVideoMessage.java
消息基类b2v-api/src/main/java/com/star/b2v/api/message/SocketMessage.java
处理器接口b2v-web/src/main/java/com/star/b2v/web/socket/handler/MessageHandler.java
业务实现b2v-core/src/main/java/com/star/b2v/core/service/video/SeedanceMultipleImg2VideoImpl.java
事件发布b2v-api/src/main/java/com/star/b2v/api/service/ws/TaskEventPublisher.java
切面b2v-web/src/main/java/com/star/b2v/web/socket/aspect/MsgHandlerAspect.java
WS 入口b2v-web/src/main/java/com/star/b2v/web/socket/websocket/ApiWebSocketHandler.java
路由工厂b2v-web/src/main/java/com/star/b2v/web/socket/websocket/MessageMappingFactory.java

Request

Query Params

Header Params

Cookie Params

Modified at 2026-10-24 04:39:07
Previous
生成章节分镜
Next
批量生成章节分镜视频
Built with