| 项目 | 说明 |
|---|---|
| 接口名称 | 图片转视频(参考图模式 / Seedance reference2video) |
| 处理器类 | com.star.b2v.web.socket.handler.CreateReferenceVideoHandler |
| 入口方法 | handle(CreateReferenceVideoMessage message) |
| 消息类型(messageType) | CreateReferenceVideoMessage |
| 通信协议 | WebSocket(双向,异步) |
| 执行方式 | @Async("websocketTaskExecutor") 异步线程池执行 |
| 核心依赖 | IMultipleImg2Video.img2video(默认实现:SeedanceMultipleImg2VideoImpl) |
reference2video 接口创建视频生成任务,并启动异步轮询。视频生成的最终结果(成功/失败)由 SeedanceBaseService 轮询线程通过 TaskEventPublisher 发布事件,再由 WebSocket 推回客户端。注意:本接口不是立即返回视频URL,而是提交一个异步任务。客户端需通过同一 WebSocket 监听后续推送的结果消息。
客户端 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 推送结果给客户端)ws(s)://<host>/ws?userId={userId}userId 必填,用于会话路由CONNECT_SUCCESSping,服务端回复 {"pong":"pong"}SocketMessage 基础字段 + CreateReferenceVideoMessage 业务字段混合平铺。| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
messageType | String | 是 | 固定值:CreateReferenceVideoMessage(路由用) |
taskId | String | 是 | 格式:{userId}_{clientId},如 1001_abc123;用于切面解析 userId/clientId 并落库 |
sessionId | String | 否 | 由服务端在 ApiWebSocketHandler 中按连接自动回填,客户端无需传 |
msgType | String | 否 | 由服务端回填为 CreateReferenceVideoMessage,客户端无需传 |
dataTaskId | Long | 否 | 由切面 MsgHandlerAspect 落库后回写,客户端无需传 |
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
taskId | String | 是 | - | 与外层 taskId 同值(业务唯一任务标识);格式必须为 {userId}_{clientId},否则被切面拦截 |
storyboardId | Integer | 是 | - | 所属分镜 ID,用于查询所属剧集资产(角色/场景/道具/生物)并启动轮询 |
refImages | List<String> | 否 | - | 参考图 URL 列表,全部映射为 reference_image |
firstLastImages | List<String> | 条件 | - | 首帧/尾帧图;genWay > 0 时生效 |
genWay | Byte | 否 | 0 | 生成方式:0-单帧,1-首帧(取 firstLastImages[0]),2-首尾帧(取前2张) |
refAudio | List<String> | 否 | - | 参考音频 URL;与角色音频合计 > 3 时将被舍弃 |
refVoice | List<String> | 否 | - | 参考视频 URL(实际以 reference_video 角色提交) |
prompt | String | 否 | "" | 生成提示词;若指定 promptTemplateId 则作为 basePrompt |
promptTemplateId | Integer | 否 | - | 关联提示词模板 ID;为空时直接使用 prompt |
promptParams | String(JSON) | 否 | - | 模板变量 JSON,解析为 List<VariableVo> 覆盖模板变量 |
seed | Integer | 否 | 0 | 随机种子 |
amount | Integer | 否 | 1 | 生成数量(仅落库,当前实现单任务提交) |
duration | Integer | 否 | - | 视频时长(秒);直接透传给 Seedance,不传则由模型默认决定。注意:r2v(参考图模式)下 Seedance 可能忽略此参数,时长以提示词描述为准 |
aspectRatio | String | 否 | 9:16 | 画面比例(如 16:9、4:3、1:1) |
resolution | String | 否 | 720p | 分辨率 |
hasAudio | Byte | 否 | 0(false) | 是否含音频:0-否,1-是 |
videoModelId | Byte | 否 | - | 视频模型 ID(仅落库,模型名固定为 doubao-seedance-2-0-260128) |
consumeAmount | Integer |