From 5f78098256a12ca3ea32fc9c1482c72efd9fc52f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=96=8C?= <259278618@qq.com> Date: Wed, 15 Jul 2026 14:26:14 +0800 Subject: [PATCH] 1 --- Dockerfile | 1 + api.json | 218 ++++++ default_first_frame.png | Bin 69 -> 5525 bytes negative_prompt.md | 1 + short_drama.db | Bin 143360 -> 462848 bytes shortdrama/agent/chat_model.go | 88 ++- shortdrama/agent/react_agent.go | 11 + shortdrama/consts/status.go | 1 + shortdrama/controller/config_controller.go | 10 - shortdrama/dao/generation_task_dao.go | 22 +- shortdrama/dao/model_config_dao.go | 23 +- shortdrama/model/dto/config_dto.go | 4 +- shortdrama/model/entity/generation_task.go | 25 +- shortdrama/model/entity/model_config.go | 4 +- shortdrama/model/segment_output.go | 2 +- shortdrama/service/config_service.go | 129 +--- shortdrama/service/drama_service.go | 792 +++++++++++++++++---- shortdrama/service/episode_service.go | 383 +++++++++- shortdrama/service/generation_context.go | 27 +- test.json | 1 + tools/split_merged/split_merged.go | 263 +++++++ 21 files changed, 1633 insertions(+), 372 deletions(-) create mode 100644 api.json create mode 100644 negative_prompt.md create mode 100644 test.json create mode 100644 tools/split_merged/split_merged.go diff --git a/Dockerfile b/Dockerfile index 561f976..61eb4bb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,6 +19,7 @@ RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone WORKDIR /app COPY --from=builder /build/config.yml . COPY --from=builder /build/prompt.md . +COPY --from=builder /build/negative_prompt.md . COPY --from=builder /build/default_first_frame.png . COPY --from=builder /build/main . RUN printf '#!/bin/sh\nif [ -d /app/short_drama.db ]; then rm -rf /app/short_drama.db; fi\ntouch /app/short_drama.db 2>/dev/null || true\nexec ./main\n' > /app/entrypoint.sh && chmod +x /app/entrypoint.sh diff --git a/api.json b/api.json new file mode 100644 index 0000000..a44d3f0 --- /dev/null +++ b/api.json @@ -0,0 +1,218 @@ +{ + "model": "wan2.6-r2v-flash", + "input": { + "prompt": "Character2 坐在靠窗的椅子上,手持 character3,在 character4 旁演奏一首舒缓的美国乡村民谣。Character1 对Character2开口说道:“听起来不错”", + "negative_prompt": "", + "reference_urls": [ + "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20260129/hfugmr/wan-r2v-role1.mp4", + "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20260129/qigswt/wan-r2v-role2.mp4", + "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20260129/qpzxps/wan-r2v-object4.png", + "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20260129/wfjikw/wan-r2v-backgroud5.png" + ] + }, + "parameters": { + "size": "1280*720", + "duration": 10, + "audio": true, + "shot_type": "multi", + "watermark": true, + "seed": 2147483647 + } +} + +//model string (必选) +// +//模型名称。模型列表与价格详见模型价格。 +// +//示例值:wan2.6-r2v-flash。 +// +//input object (必选) +// +//输入的基本信息,如提示词等。 +// +//属性 +// +//prompt string (必选) +// +//文本提示词。用来描述生成视频中期望包含的元素和视觉特点。 +// +//支持中英文,每个汉字、字母、标点占一个字符,超过部分会自动截断。 +// +//wan2.6-r2v-flash:长度不超过1500个字符。 +// +//wan2.6-r2v:长度不超过1500个字符。 +// +//角色引用说明:通过“character1、character2”这类标识引用参考角色,每个参考(视频或图像)仅包含单一角色。模型仅通过此方式识别参考中的角色。 +// +//示例值:character1在沙发上开心地看电影。 +// +//提示词的使用技巧请参见文生视频/图生视频Prompt指南。 +// +//negative_prompt string (可选) +// +//反向提示词,用来描述不希望在视频画面中出现的内容,可以对视频画面进行限制。 +// +//支持中英文,长度不超过500个字符,超过部分会自动截断。 +// +//示例值:低分辨率、错误、最差质量、低质量、残缺、多余的手指、比例不良等。 +// +//reference_urls array[string] (必选) +// +//重要 +//reference_urls直接影响费用,计费规则请参见计费与限流。 +// +//上传的参考文件 URL 数组,支持传入视频和图像。用于提取角色形象与音色(如有),以生成符合参考特征的视频。 +// +//每个 URL 可指向 一张图像 或 一段视频: +// +//图像数量:0~5。 +// +//视频数量:0~3。 +// +//总数限制:图像 + 视频 ≤ 5。 +// +//传入多个参考文件时,按照数组顺序定义角色的顺序。即第 1 个 URL 对应 character1,第 2 个对应 character2,以此类推。 +// +//每个参考文件仅包含一个主体角色。例如 character1 为小女孩,character2 为闹钟。 +// +//支持输入的格式: +// +//公网URL: +// +//支持 HTTP 或 HTTPS 协议。 +// +//示例值:https://cdn.translate.alibaba.com/xxx.png。 +// +//临时URL: +// +//支持OSS协议,必须通过上传文件获取临时 URL。 +// +//示例值:oss://dashscope-instant/xxx/xxx.png。 +// +//参考视频要求: +// +//格式:MP4、MOV。 +// +//时长:1s~30s。 +// +//视频大小:不超过100MB。 +// +//参考图像要求: +// +//格式:JPEG、JPG、PNG(不支持透明通道)、BMP、WEBP。 +// +//分辨率:宽高均需在[240,8000]像素之间。 +// +//图像大小:不超过20MB。 +// +//示例值:["https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/xxx.mp4", "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/xxx.jpg"]。 +// +//已废弃字段 +// +//parameters object (可选) +// +//图像处理参数。如设置视频分辨率、开启prompt智能改写、添加水印等。 +// +//属性 +// +//size string (可选) +// +//重要 +//size直接影响费用,费用 = 单价(基于分辨率)× 时长(秒)。同一模型:1080P > 720P ,请在调用前确认模型价格。 +// +//size必须设置为具体数值(如 1280*720),而不是 1:1或720P。 +// +//指定生成的视频分辨率,格式为宽*高。该参数的默认值和可用枚举值依赖于 model 参数,规则如下: +// +//wan2.6-r2v-flash:默认值为 1920*1080(1080P)。可选分辨率:720P、1080P对应的所有分辨率。 +// +//wan2.6-r2v:默认值为 1920*1080(1080P)。可选分辨率:720P、1080P对应的所有分辨率。 +// +//720P档位:可选的视频分辨率及其对应的视频宽高比为: +// +//1280*720:16:9。 +// +//720*1280:9:16。 +// +//960*960:1:1。 +// +//1088*832:4:3。 +// +//832*1088:3:4。 +// +//1080P档位:可选的视频分辨率及其对应的视频宽高比为: +// +//1920*1080: 16:9。 +// +//1080*1920: 9:16。 +// +//1440*1440: 1:1。 +// +//1632*1248: 4:3。 +// +//1248*1632: 3:4。 +// +//duration integer (可选) +// +//重要 +//duration直接影响费用。费用 = 单价(基于分辨率)× 时长(秒),请在调用前确认模型价格。 +// +//生成视频的时长,单位为秒。 +// +//wan2.6-r2v-flash:取值为[2, 10]之间的整数。默认值为5。 +// +//wan2.6-r2v:取值为[2, 10]之间的整数。默认值为5。 +// +//示例值:5。 +// +//shot_type string (可选) +// +//指定生成视频的镜头类型,即视频是由一个连续镜头还是多个切换镜头组成。 +// +//参数优先级:shot_type > prompt。例如,若 shot_type设置为"single",即使 prompt 中包含“生成多镜头视频”,模型仍会输出单镜头视频。 +// +//可选值: +// +//single:默认值,输出单镜头视频 +// +//multi:输出多镜头视频。 +// +//示例值:single。 +// +//说明 +//当希望严格控制视频的叙事结构(如产品展示用单镜头、故事短片用多镜头),可通过此参数指定。 +// +//audio boolean (可选) +// +//重要 +//audio直接影响费用,有声视频与无声视频价格不同,请在调用前确认模型价格。 +// +//支持模型:wan2.6-r2v-flash。 +// +//是否生成有声视频。 +// +//可选值: +// +//true:默认值,输出有声视频。 +// +//false:输出无声视频。 +// +//示例值:true。 +// +//watermark boolean (可选) +// +//是否添加水印标识,水印位于视频右下角,文案固定为“AI生成”。 +// +//false:默认值,不添加水印。 +// +//true:添加水印。 +// +//示例值:false。 +// +//seed integer (可选) +// +//随机数种子,取值范围为[0, 2147483647]。 +// +//未指定时,系统自动生成随机种子。若需提升生成结果的可复现性,建议固定seed值。 +// +//请注意,由于模型生成具有概率性,即使使用相同 seed,也不能保证每次生成结果完全一致。 \ No newline at end of file diff --git a/default_first_frame.png b/default_first_frame.png index 94381b429d7f7fe87e1bade52d893ab348ae29cc..9fce5c051b42b774d7f3c4e0411b93df4c459e11 100644 GIT binary patch literal 5525 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

eVMoD&&jcA~%*n?UmmrW*q7^$V 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 OI7*Nva3*BaKK(D(d~#9% literal 143360 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 KG^<76mj4eyRvE4U diff --git a/shortdrama/agent/chat_model.go b/shortdrama/agent/chat_model.go index 16ea6f6..463c402 100644 --- a/shortdrama/agent/chat_model.go +++ b/shortdrama/agent/chat_model.go @@ -6,10 +6,11 @@ import ( "encoding/json" "fmt" "io" - "log" "net/http" "strings" "time" + + "github.com/gogf/gf/v2/frame/g" ) // ModelConfig 模型配置 @@ -39,7 +40,7 @@ func CallChatModel(ctx context.Context, cfg *ModelConfig, req *ChatRequest) (*Ch timeout := cfg.Timeout if timeout <= 0 { - timeout = 60 * time.Second + timeout = 180 * time.Second } body, err := buildReqBody(cfg.ModelName, req) @@ -48,13 +49,14 @@ func CallChatModel(ctx context.Context, cfg *ModelConfig, req *ChatRequest) (*Ch } url := trimSlashes(cfg.BaseURL) + "/v1/chat/completions" + g.Log().Infof(ctx, "ChatAPI 开始调用 model=%s timeout=%v max_retries=3 body_size=%d", cfg.ModelName, timeout, len(body)) var lastErr error maxRetries := 3 for attempt := 0; attempt <= maxRetries; attempt++ { if attempt > 0 { wait := time.Duration(1<<(attempt-1)) * time.Second - log.Printf("API限流重试第%d次(等待%v)...", attempt, wait) + g.Log().Infof(ctx, "ChatAPI 限流重试第%d次(等待%v)", attempt, wait) select { case <-ctx.Done(): return nil, ctx.Err() @@ -64,10 +66,13 @@ func CallChatModel(ctx context.Context, cfg *ModelConfig, req *ChatRequest) (*Ch result, doErr := doChatRequest(ctx, url, cfg.APIKey, body, timeout) if doErr == nil { + g.Log().Infof(ctx, "ChatAPI 调用成功 url=%s tool_calls=%d content_len=%d", + url, len(result.ToolCalls), len(result.Content)) return result, nil } lastErr = doErr + g.Log().Warningf(ctx, "ChatAPI 请求失败(attempt=%d/%d): %v", attempt+1, maxRetries+1, doErr) // 只有限流或服务端错误才重试 errStr := lastErr.Error() if !strings.Contains(errStr, "limit_requests") && @@ -79,6 +84,7 @@ func CallChatModel(ctx context.Context, cfg *ModelConfig, req *ChatRequest) (*Ch } } + g.Log().Errorf(ctx, "ChatAPI %d次重试后最终失败: %v", maxRetries+1, lastErr) return nil, lastErr } @@ -90,18 +96,27 @@ func doChatRequest(ctx context.Context, url, apiKey string, body []byte, timeout httpReq.Header.Set("Authorization", "Bearer "+apiKey) httpReq.Header.Set("Content-Type", "application/json") + start := time.Now() client := &http.Client{Timeout: timeout} resp, err := client.Do(httpReq) + elapsed := time.Since(start) if err != nil { - return nil, fmt.Errorf("请求失败: %w", err) + return nil, fmt.Errorf("请求失败(耗时%v): %w", elapsed, err) } defer resp.Body.Close() respBody, err := io.ReadAll(resp.Body) if err != nil { - return nil, fmt.Errorf("读取响应失败: %w", err) + return nil, fmt.Errorf("读取响应失败(状态码=%d): %w", resp.StatusCode, err) } + if resp.StatusCode != 200 { + return nil, fmt.Errorf("API返回错误状态码=%d body=%s", resp.StatusCode, string(respBody)) + } + + g.Log().Infof(ctx, "ChatAPI 响应完成 status=%d body_len=%d elapsed=%v", + resp.StatusCode, len(respBody), elapsed) + return parseRespBody(respBody) } @@ -145,24 +160,37 @@ type apiRespBody struct { } type apiChoice struct { - Index int `json:"index"` - Message apiMsg `json:"message"` + Index int `json:"index"` + Message apiRespMsg `json:"message"` } -type apiMsg struct { - Content string `json:"content"` - ToolCalls []apiToolCall `json:"tool_calls,omitempty"` +// apiRespMsg 响应消息体(arguments 使用 json.RawMessage 兼容对象和字符串) +type apiRespMsg struct { + Content string `json:"content"` + ToolCalls []apiRespToolCall `json:"tool_calls,omitempty"` +} + +type apiRespToolCall struct { + ID string `json:"id"` + Type string `json:"type"` + Function apiRespFuncCall `json:"function"` +} + +type apiRespFuncCall struct { + Name string `json:"name"` + Arguments json.RawMessage `json:"arguments"` } type apiToolCall struct { - ID string `json:"id"` - Type string `json:"type"` - Function apiFuncCall `json:"function"` + ID string `json:"id"` + Type string `json:"type"` + Function apiReqFuncCall `json:"function"` } -type apiFuncCall struct { - Name string `json:"name"` - Arguments string `json:"arguments"` +// apiReqFuncCall 请求中的 function call(arguments 为 json.RawMessage 避免二次编码) +type apiReqFuncCall struct { + Name string `json:"name"` + Arguments json.RawMessage `json:"arguments"` } func buildReqBody(model string, req *ChatRequest) ([]byte, error) { @@ -201,12 +229,16 @@ func toAPIMessages(msgs []*ChatMessage) []apiMessage { if len(m.ToolCalls) > 0 { om.ToolCalls = make([]apiToolCall, 0, len(m.ToolCalls)) for _, tc := range m.ToolCalls { + args := tc.Arguments + if args == "" { + args = "{}" + } om.ToolCalls = append(om.ToolCalls, apiToolCall{ ID: tc.ID, Type: "function", - Function: apiFuncCall{ + Function: apiReqFuncCall{ Name: tc.Name, - Arguments: tc.Arguments, + Arguments: json.RawMessage(args), }, }) } @@ -233,16 +265,34 @@ func parseRespBody(data []byte) (*ChatResponse, error) { if len(msg.ToolCalls) > 0 { cr.ToolCalls = make([]*ToolCall, 0, len(msg.ToolCalls)) for _, tc := range msg.ToolCalls { + args := resolveArguments(tc.Function.Arguments) cr.ToolCalls = append(cr.ToolCalls, &ToolCall{ ID: tc.ID, Name: tc.Function.Name, - Arguments: tc.Function.Arguments, + Arguments: args, }) } } return cr, nil } +// resolveArguments 将 json.RawMessage 的参数转为字符串 +// API 可能返回 "arguments": "{\"key\":\"val\"}"(字符串)或 "arguments": {"key":"val"}(对象) +func resolveArguments(raw json.RawMessage) string { + if len(raw) == 0 { + return "" + } + // 如果是 JSON 字符串(以 " 开头),直接提取字符串值 + if raw[0] == '"' { + var s string + if json.Unmarshal(raw, &s) == nil { + return s + } + } + // 否则是 JSON 对象,重新序列化回字符串 + return string(raw) +} + func trimSlashes(s string) string { for len(s) > 0 && s[len(s)-1] == '/' { s = s[:len(s)-1] diff --git a/shortdrama/agent/react_agent.go b/shortdrama/agent/react_agent.go index 881c230..fc23f5d 100644 --- a/shortdrama/agent/react_agent.go +++ b/shortdrama/agent/react_agent.go @@ -81,6 +81,17 @@ func (a *ReActAgent) Run(ctx context.Context, userInput string) (string, error) continue } + if tc.Arguments == "" { + g.Log().Warningf(ctx, "ReAct step %d: 工具 %s 参数为空,跳过", step+1, tc.Name) + messages = append(messages, &ChatMessage{ + Role: RoleTool, + Content: "工具参数为空", + Name: tc.Name, + ToolCallID: tc.ID, + }) + continue + } + var args map[string]any if err := json.Unmarshal([]byte(tc.Arguments), &args); err != nil { g.Log().Warningf(ctx, "ReAct step %d: 参数解析失败: %v", step+1, err) diff --git a/shortdrama/consts/status.go b/shortdrama/consts/status.go index 63e64ae..5600f4c 100644 --- a/shortdrama/consts/status.go +++ b/shortdrama/consts/status.go @@ -7,6 +7,7 @@ const ( EpisodeStatusCompleted = "completed" EpisodeStatusFailed = "failed" + TaskStatusPending = "pending" TaskStatusGenerating = "generating" TaskStatusReview = "review" TaskStatusCompleted = "completed" diff --git a/shortdrama/controller/config_controller.go b/shortdrama/controller/config_controller.go index 984f0e2..8f8a0fa 100644 --- a/shortdrama/controller/config_controller.go +++ b/shortdrama/controller/config_controller.go @@ -2,7 +2,6 @@ package controller import ( "context" - "fmt" "video-factory/shortdrama/model/dto" "video-factory/shortdrama/model/entity" @@ -18,15 +17,6 @@ func (c *config) Get(ctx context.Context, req *dto.GetModelConfigReq) (res *dto. } func (c *config) Save(ctx context.Context, req *dto.SaveModelConfigReq) (res *struct{}, err error) { - if req.MinSingleDuration < 1 { - return nil, fmt.Errorf("单次生成最小时长必须大于等于1") - } - if req.MaxSingleDuration < 1 { - return nil, fmt.Errorf("单次生成最大时长必须大于等于1") - } - if req.MinSingleDuration > req.MaxSingleDuration { - return nil, fmt.Errorf("单次生成最小时长不能大于最大时长") - } return nil, service.ConfigService.Save(ctx, req) } diff --git a/shortdrama/dao/generation_task_dao.go b/shortdrama/dao/generation_task_dao.go index 044979f..a40aa60 100644 --- a/shortdrama/dao/generation_task_dao.go +++ b/shortdrama/dao/generation_task_dao.go @@ -23,6 +23,8 @@ func init() { episode_id INTEGER NOT NULL DEFAULT 0, -- 剧集ID segment_idx INTEGER NOT NULL DEFAULT 0, -- 段索引 status TEXT NOT NULL DEFAULT 'pending', -- 任务状态 + script TEXT NOT NULL DEFAULT '', -- 段脚本内容 + duration INTEGER NOT NULL DEFAULT 0, -- 段时长(秒) error_message TEXT NOT NULL DEFAULT '', created_at DATETIME DEFAULT (datetime('now','localtime')), updated_at DATETIME DEFAULT (datetime('now','localtime')) @@ -34,11 +36,6 @@ func init() { `ALTER TABLE `+public.TableNameGenerationTask+` ADD COLUMN segment_idx INTEGER NOT NULL DEFAULT 0`); err != nil { g.Log().Debugf(ctx, "添加 segment_idx 列失败(可能已存在): %v", err) } - // 迁移:添加 script_path 列 - if _, err := g.DB().Exec(ctx, - `ALTER TABLE `+public.TableNameGenerationTask+` ADD COLUMN script_path TEXT NOT NULL DEFAULT ''`); err != nil { - g.Log().Debugf(ctx, "添加 script_path 列失败(可能已存在): %v", err) - } // 迁移:添加 video_task_id 列 if _, err := g.DB().Exec(ctx, `ALTER TABLE `+public.TableNameGenerationTask+` ADD COLUMN video_task_id TEXT NOT NULL DEFAULT ''`); err != nil { @@ -69,6 +66,21 @@ func init() { `ALTER TABLE `+public.TableNameGenerationTask+` DROP COLUMN steps_data`); err != nil { g.Log().Debugf(ctx, "删除 steps_data 列失败(可能已不存在): %v", err) } + // 迁移:删除废弃的 script_path 列 + if _, err := g.DB().Exec(ctx, + `ALTER TABLE `+public.TableNameGenerationTask+` DROP COLUMN script_path`); err != nil { + g.Log().Debugf(ctx, "删除 script_path 列失败(可能已不存在): %v", err) + } + // 迁移:添加 script 列 + if _, err := g.DB().Exec(ctx, + `ALTER TABLE `+public.TableNameGenerationTask+` ADD COLUMN script TEXT NOT NULL DEFAULT ''`); err != nil { + g.Log().Debugf(ctx, "添加 script 列失败(可能已存在): %v", err) + } + // 迁移:添加 duration 列 + if _, err := g.DB().Exec(ctx, + `ALTER TABLE `+public.TableNameGenerationTask+` ADD COLUMN duration INTEGER NOT NULL DEFAULT 0`); err != nil { + g.Log().Debugf(ctx, "添加 duration 列失败(可能已存在): %v", err) + } } func (d *generationTaskDao) Insert(ctx context.Context, data *entity.GenerationTask) (id int64, err error) { diff --git a/shortdrama/dao/model_config_dao.go b/shortdrama/dao/model_config_dao.go index 38c002a..fc09254 100644 --- a/shortdrama/dao/model_config_dao.go +++ b/shortdrama/dao/model_config_dao.go @@ -27,8 +27,6 @@ func init() { video_api_key TEXT NOT NULL DEFAULT '', video_base_url TEXT NOT NULL DEFAULT '', video_model_name TEXT NOT NULL DEFAULT '', - max_single_duration INTEGER NOT NULL DEFAULT 15, - min_single_duration INTEGER NOT NULL DEFAULT 5, video_schema TEXT NOT NULL DEFAULT '', video_task_callback_url TEXT NOT NULL DEFAULT '', price_per_second INTEGER NOT NULL DEFAULT 0, @@ -40,6 +38,7 @@ func init() { // 清理旧字段 for _, col := range []string{ + "max_single_duration", "min_single_duration", "chat_provider", "video_provider", "video_no_duration_support", "video_model_category", "image_model_name", @@ -75,17 +74,15 @@ func init() { count, _ := g.DB().Model(public.TableNameModelConfig).Ctx(ctx).Count() if count == 0 { _, err := g.DB().Model(public.TableNameModelConfig).Ctx(ctx).Data(g.Map{ - "chat_api_key": "sk-ws-H.RXDDPMR.E8Rn.MEUCIQD00xjpXeNJlnXQejmbFTyC5ILHF8hLB2at4QXU6nf6GwIgae5TA8siaylUxMBDQcOWFfNx6hxB4rFsdCxoV6md810", - "chat_base_url": "https://dashscope.aliyuncs.com/compatible-mode", - "chat_model_name": "qwen-math-turbo", - "max_tokens": 8192, - "temperature": 0.7, - "video_api_key": "sk-ws-H.RXDDPMR.E8Rn.MEUCIQD00xjpXeNJlnXQejmbFTyC5ILHF8hLB2at4QXU6nf6GwIgae5TA8siaylUxMBDQcOWFfNx6hxB4rFsdCxoV6md810", - "video_base_url": "https://ws-0mn9581u5vt4lcx9.cn-beijing.maas.aliyuncs.com/api/v1/tasks", - "video_task_callback_url": "https://ws-0mn9581u5vt4lcx9.cn-beijing.maas.aliyuncs.com/api/v1/tasks/{task_id}", - "video_model_name": "wan2.7-r2v", - "max_single_duration": 5, - "min_single_duration": 2, + "chat_api_key": "", + "chat_base_url": "", + "chat_model_name": "", + "max_tokens": 4096, + "temperature": 0.85, + "video_api_key": "", + "video_base_url": "", + "video_task_callback_url": "", + "video_model_name": "", "price_per_second": 10, "created_at": gtime.Now().Format("Y-m-d H:i:s"), "updated_at": gtime.Now().Format("Y-m-d H:i:s"), diff --git a/shortdrama/model/dto/config_dto.go b/shortdrama/model/dto/config_dto.go index 9f8a16d..0aa3bc3 100644 --- a/shortdrama/model/dto/config_dto.go +++ b/shortdrama/model/dto/config_dto.go @@ -31,9 +31,7 @@ type SaveModelConfigReq struct { VideoApiKey string `v:"required" json:"videoApiKey" dc:"视频模型API密钥"` VideoBaseUrl string `v:"required|url" json:"videoBaseUrl" dc:"视频模型API接口地址"` VideoModelName string `v:"required" json:"videoModelName" dc:"视频模型名称"` - MaxSingleDuration int `v:"required" json:"maxSingleDuration" dc:"单段最大时长"` - MinSingleDuration int `v:"required" json:"minSingleDuration" dc:"单段最小时长"` - VideoSchema *gjson.Json `json:"videoSchema" dc:"视频生成模型schema"` + VideoSchema *gjson.Json `json:"videoSchema" dc:"视频生成模型schema(JSON, 含duration/ref/params/sizes)"` PricePerSecond int `v:"required|min:1" json:"pricePerSecond" dc:"每秒价格(分)"` VideoTaskCallbackUrl string `json:"videoTaskCallbackUrl" dc:"视频生成任务回调地址"` } diff --git a/shortdrama/model/entity/generation_task.go b/shortdrama/model/entity/generation_task.go index 5b3c9e9..0aa14fb 100644 --- a/shortdrama/model/entity/generation_task.go +++ b/shortdrama/model/entity/generation_task.go @@ -3,16 +3,17 @@ package entity import "github.com/gogf/gf/v2/os/gtime" type GenerationTask struct { - Id int64 `orm:"id" json:"id" dc:"任务ID" json:"id" json:"id" dc:"任务ID"` - DramaId int64 `orm:"drama_id" json:"dramaId" dc:"短剧ID" json:"drama_id" json:"dramaId" dc:"短剧ID"` - EpisodeId int64 `orm:"episode_id" json:"episodeId" dc:"剧集ID" json:"episode_id" json:"episodeId" dc:"剧集ID"` - SegmentIdx int `orm:"segment_idx" json:"segmentIdx" dc:"段索引" json:"segment_idx" json:"segmentIdx" dc:"段索引"` - Status string `orm:"status" json:"status" dc:"任务状态(pending/generating/review/completed/failed)" json:"status" json:"status" dc:"任务状态(pending/generating/review/completed/failed)"` - ScriptPath string `orm:"script_path" json:"scriptPath" dc:"脚本文件路径" json:"script_path" json:"scriptPath" dc:"脚本文件路径"` - VideoTaskId string `orm:"video_task_id" json:"videoTaskId" dc:"视频合成任务ID" json:"video_task_id" json:"videoTaskId" dc:"视频合成任务ID"` - VideoUrl string `orm:"video_url" json:"videoUrl" dc:"视频文件路径" json:"video_url" json:"videoUrl" dc:"视频文件路径"` - NumSegments int `orm:"num_segments" json:"numSegments" dc:"本集总段数" json:"num_segments" json:"numSegments" dc:"本集总段数"` - ErrorMessage string `orm:"error_message" json:"errorMessage" dc:"错误信息" json:"error_message" json:"errorMessage" dc:"错误信息"` - CreatedAt *gtime.Time `orm:"created_at" json:"createdAt" dc:"创建时间" json:"created_at" json:"createdAt" dc:"创建时间"` - UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt" dc:"更新时间" json:"updated_at" json:"updatedAt" dc:"更新时间"` + Id int64 `orm:"id" json:"id" dc:"任务ID"` + DramaId int64 `orm:"drama_id" json:"dramaId" dc:"短剧ID"` + EpisodeId int64 `orm:"episode_id" json:"episodeId" dc:"剧集ID"` + SegmentIdx int `orm:"segment_idx" json:"segmentIdx" dc:"段索引"` + Status string `orm:"status" json:"status" dc:"任务状态(pending/generating/review/completed/failed)"` + Script string `orm:"script" json:"script" dc:"段脚本内容"` + Duration int `orm:"duration" json:"duration" dc:"段时长(秒)"` + VideoTaskId string `orm:"video_task_id" json:"videoTaskId" dc:"视频合成任务ID"` + VideoUrl string `orm:"video_url" json:"videoUrl" dc:"视频文件路径"` + NumSegments int `orm:"num_segments" json:"numSegments" dc:"本集总段数"` + ErrorMessage string `orm:"error_message" json:"errorMessage" dc:"错误信息"` + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt" dc:"创建时间"` + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt" dc:"更新时间"` } diff --git a/shortdrama/model/entity/model_config.go b/shortdrama/model/entity/model_config.go index 4735c6d..c44954d 100644 --- a/shortdrama/model/entity/model_config.go +++ b/shortdrama/model/entity/model_config.go @@ -15,9 +15,7 @@ type ModelConfig struct { VideoApiKey string `orm:"video_api_key" json:"videoApiKey" dc:"视频模型API密钥"` VideoBaseUrl string `orm:"video_base_url" json:"videoBaseUrl" dc:"视频模型接口地址"` VideoModelName string `orm:"video_model_name" json:"videoModelName" dc:"视频模型名称"` - MaxSingleDuration int `orm:"max_single_duration" json:"maxSingleDuration" dc:"单段最大时长"` - MinSingleDuration int `orm:"min_single_duration" json:"minSingleDuration" dc:"单段最小时长"` - VideoSchema string `orm:"video_schema" json:"videoSchema" dc:"视频生成模型schema"` + VideoSchema string `orm:"video_schema" json:"videoSchema" dc:"视频生成模型schema(JSON, 含duration/ref/prams/sizes)"` PricePerSecond int `orm:"price_per_second" json:"pricePerSecond" dc:"每秒价格(分)"` VideoTaskCallbackUrl string `orm:"video_task_callback_url" json:"videoTaskCallbackUrl" dc:"视频生成任务回调地址"` CreatedAt *gtime.Time `orm:"created_at" json:"createdAt" dc:"创建时间"` diff --git a/shortdrama/model/segment_output.go b/shortdrama/model/segment_output.go index 438a760..13b482c 100644 --- a/shortdrama/model/segment_output.go +++ b/shortdrama/model/segment_output.go @@ -30,5 +30,5 @@ type SegmentCharacter struct { type VideoRef struct { Type string `json:"type"` // "character" | "scene" | "prop" Name string `json:"name"` // 实体名称 - MediaURL string `json:"mediaUrl"` // 参考素材 URL(base64 data URL 或 HTTP URL) + MediaURL string `json:"mediaUrl"` // 参考素材 URL(API 要求 HTTPS 公网 URL 或 OSS URL) } diff --git a/shortdrama/service/config_service.go b/shortdrama/service/config_service.go index ab16464..b1e4a90 100644 --- a/shortdrama/service/config_service.go +++ b/shortdrama/service/config_service.go @@ -2,10 +2,6 @@ package service import ( "context" - "encoding/json" - "io" - "net/http" - "strings" "video-factory/shortdrama/dao" "video-factory/shortdrama/model/dto" @@ -88,133 +84,14 @@ func (s *configService) SavePaymentConfig(ctx context.Context, cfg *entity.Payme return dao.PaymentConfigDao.Save(ctx, cfg) } -// syncModelDurationFromAPI 查询模型API,获取模型支持的参数和时长范围 +// syncModelDurationFromAPI 保存前校验配置完整性,设置默认值 func syncModelDurationFromAPI(ctx context.Context, cfg *entity.ModelConfig) { - if cfg.VideoApiKey == "" || cfg.VideoBaseUrl == "" || cfg.VideoModelName == "" { - return - } - - if cfg.MinSingleDuration <= 0 { - cfg.MinSingleDuration = 2 - g.Log().Infof(ctx, "使用默认单段最小时长: 2 秒") - } - if cfg.MaxSingleDuration <= 0 { - cfg.MaxSingleDuration = 15 - g.Log().Infof(ctx, "使用默认单段最大时长: 15 秒") - } if cfg.Temperature <= 0 { cfg.Temperature = 0.85 g.Log().Infof(ctx, "使用默认 Temperature: 0.85") } - - if cfg.ChatApiKey == "" || cfg.ChatBaseUrl == "" || cfg.ChatModelName == "" { - return - } - - modelsURL := strings.TrimRight(cfg.ChatBaseUrl, "/") + "/models" - chatReq, err := http.NewRequestWithContext(ctx, "GET", modelsURL, nil) - if err != nil { - g.Log().Warningf(ctx, "创建对话模型查询请求失败: %v", err) - return - } - chatReq.Header.Set("Authorization", "Bearer "+cfg.ChatApiKey) - chatReq.Header.Set("Content-Type", "application/json") - - chatResp, err := http.DefaultClient.Do(chatReq) - if err != nil { - g.Log().Warningf(ctx, "查询对话模型列表API失败: %v(不影响配置保存,max_tokens将使用默认值)", err) - return - } - defer chatResp.Body.Close() - - chatBody, _ := io.ReadAll(chatResp.Body) - var chatModelList struct { - Object string `json:"object"` - Data []struct { - Id string `json:"id"` - Object string `json:"object"` - Created int64 `json:"created"` - OwnedBy string `json:"owned_by"` - } `json:"data"` - FirstId string `json:"first_id"` - LastId string `json:"last_id"` - HasMore bool `json:"has_more"` - } - if err := json.Unmarshal(chatBody, &chatModelList); err != nil || chatModelList.Object != "list" { - g.Log().Debugf(ctx, "解析对话模型列表响应失败(可能非OpenAI兼容API): %v", err) - return - } - - chatModelName := strings.ToLower(cfg.ChatModelName) - if cfg.MaxTokens <= 0 { - cfg.MaxTokens = inferChatMaxTokens(chatModelName) - g.Log().Infof(ctx, "根据模型名称推断 max_tokens: %d(用户在表单中可手动修改)", cfg.MaxTokens) - } - if cfg.Temperature <= 0 { - cfg.Temperature = inferChatTemperature(chatModelName) - g.Log().Infof(ctx, "根据模型名称推断 Temperature: %.2f(用户在表单中可手动修改)", cfg.Temperature) - } -} - -func inferChatMaxTokens(modelName string) int { - switch { - case strings.Contains(modelName, "qwen-math"): - return 32768 - case strings.Contains(modelName, "qwen3"): - return 65536 - case strings.Contains(modelName, "qwen2.5"): - return 32768 - case strings.Contains(modelName, "qwen-max"): - return 8192 - case strings.Contains(modelName, "qwen-plus"): - return 16384 - case strings.Contains(modelName, "gpt-4o"): - return 16384 - case strings.Contains(modelName, "gpt-4"): - return 8192 - case strings.Contains(modelName, "gpt-3.5"): - return 4096 - case strings.Contains(modelName, "deepseek"): - return 8192 - case strings.Contains(modelName, "doubao") || strings.Contains(modelName, "豆包"): - return 65536 - case strings.Contains(modelName, "glm"): - return 8192 - case strings.Contains(modelName, "ernie"): - return 8192 - default: - return 4096 - } -} - -func inferChatTemperature(modelName string) float64 { - switch { - case strings.Contains(modelName, "qwen-math"): - return 0.5 - case strings.Contains(modelName, "qwen3"): - return 0.7 - case strings.Contains(modelName, "qwen2.5"): - return 0.7 - case strings.Contains(modelName, "qwen-max"): - return 0.8 - case strings.Contains(modelName, "qwen-plus"): - return 0.8 - case strings.Contains(modelName, "gpt-4o"): - return 0.8 - case strings.Contains(modelName, "gpt-4"): - return 0.7 - case strings.Contains(modelName, "gpt-3.5"): - return 0.7 - case strings.Contains(modelName, "deepseek"): - return 0.7 - case strings.Contains(modelName, "doubao") || strings.Contains(modelName, "豆包"): - return 0.95 - case strings.Contains(modelName, "glm"): - return 0.8 - case strings.Contains(modelName, "ernie"): - return 0.8 - default: - return 0.7 + cfg.MaxTokens = 4096 + g.Log().Infof(ctx, "使用默认 MaxTokens: 4096") } } diff --git a/shortdrama/service/drama_service.go b/shortdrama/service/drama_service.go index a93ccd4..df3fc0f 100644 --- a/shortdrama/service/drama_service.go +++ b/shortdrama/service/drama_service.go @@ -9,7 +9,10 @@ import ( "math" "net/http" "os" + "os/exec" "path/filepath" + "sort" + "strconv" "strings" "sync" "time" @@ -280,31 +283,16 @@ func (s *dramaService) GenerateEpisode(ctx context.Context, dramaId, epId int64, // 清理本集之前生成的 workspace 文件 cleanupEpisodeWorkspace(ctx, d.Title, ep.Index, ep.Title) - // 事务:删除旧任务 → 批量创建新任务 → 更新剧集状态 - taskIds := make([]int64, numSegments) + // 更新任务状态:pending → generating err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { - // 删除旧任务 - if _, e := tx.Model(public.TableNameGenerationTask).Ctx(ctx).Where("episode_id", epId).Delete(); e != nil { + // 将所有待生成任务标记为生成中 + if _, e := tx.Model(public.TableNameGenerationTask).Ctx(ctx). + Where("episode_id", epId). + Where("status", consts.TaskStatusPending). + Data(g.Map{"status": consts.TaskStatusGenerating}).Update(); e != nil { return e } - // 创建新任务 - for i := range segDurs { - segDur := segDurs[i] - r, e := tx.Model(public.TableNameGenerationTask).Ctx(ctx).Data(g.Map{ - "drama_id": dramaId, - "episode_id": epId, - "segment_idx": i, - "status": consts.TaskStatusGenerating, - "num_segments": numSegments, - }).Insert() - if e != nil { - return fmt.Errorf("创建第%d段任务失败: %w", i+1, e) - } - taskId, _ := r.LastInsertId() - taskIds[i] = taskId - g.Log().Infof(ctx, "第%d集第%d段任务创建(id=%d, segDur=%ds)", ep.Index, i+1, taskId, segDur) - } - // 更新剧集状态和生成模式 + // 更新剧集状态 _, e := tx.Model(public.TableNameEpisode).Ctx(ctx).Data(g.Map{"status": consts.EpisodeStatusGenerating, "video_url": ""}).Where("id", epId).Update() return e }) @@ -312,8 +300,14 @@ func (s *dramaService) GenerateEpisode(ctx context.Context, dramaId, epId int64, return err } - // 更新 poll cache + // 加载任务列表(状态已更新为 generating) tasks, _ := dao.GenerationTask.ListByEpisode(ctx, epId) + + // 构建 taskId 查找表 + taskIds := make(map[int]int64) + for _, t := range tasks { + taskIds[t.SegmentIdx] = t.Id + } setPollCache(ctx, epId, tasks) if mode == "serial" { @@ -351,7 +345,16 @@ func (s *dramaService) GenerateEpisode(ctx context.Context, dramaId, epId int64, wg.Add(1) sem <- struct{}{} go func(idx, dur int, tid int64) { - defer func() { <-sem; wg.Done() }() + defer func() { + if r := recover(); r != nil { + errMsg := fmt.Sprintf("panic: %v", r) + g.Log().Errorf(genCtx, "第%d集第%d段生成panic: %v", ep.Index, idx+1, r) + _ = dao.GenerationTask.UpdateFailed(genCtx, tid, errMsg) + clearPollCache(genCtx, epId) + } + <-sem + wg.Done() + }() startTime := time.Now() g.Log().Infof(genCtx, "第%d集第%d段开始生成(segDur=%ds)", ep.Index, idx+1, dur) if err := s.generateOneSegment(genCtx, d, ep, tid, idx, dur, "", genCtx2); err != nil { @@ -457,21 +460,83 @@ func (s *dramaService) generateOneSegment(ctx context.Context, d *entity.Drama, // 提交视频合成 // 构建引用列表:从Agent输出的角色名匹配预加载的参考图片 var videoRefs []model.VideoRef + + // 1. 角色参考 for _, ch := range segOutput.Characters { - if url := genCtx.LookupRef("演员", ch.Name); url != "" { + mediaURL := genCtx.LookupRef("演员", ch.Name) + if mediaURL == "" { + continue + } + videoRefs = append(videoRefs, model.VideoRef{ + Type: "character", Name: ch.Name, MediaURL: mediaURL, + }) + } + + // 2. 场景和道具参考:从脚本镜头中解析本段时间范围内涉及的场景和道具 + segEndTime := segStartTime + segDur + var coveredScenes []string + var coveredProps []string + if domain.IsShotsJSON(ep.Script) { + var shots []domain.Shot + if err := json.Unmarshal([]byte(ep.Script), &shots); err == nil { + for _, sh := range shots { + shStart := parseMMSSToSeconds(sh.StartTime) + shEnd := parseMMSSToSeconds(sh.EndTime) + // 检查镜头是否与本段时间范围重叠 + if shEnd <= segStartTime || shStart >= segEndTime { + continue + } + if sh.Scene != "" { + coveredScenes = append(coveredScenes, sh.Scene) + } + for _, p := range sh.Props { + if p != "" { + coveredProps = append(coveredProps, p) + } + } + } + } + } + + // 去重后添加场景参考 + seenScene := make(map[string]bool) + for _, name := range coveredScenes { + if seenScene[name] { + continue + } + seenScene[name] = true + if url := genCtx.LookupRef("场景", name); url != "" { videoRefs = append(videoRefs, model.VideoRef{ - Type: "character", Name: ch.Name, MediaURL: url, + Type: "scene", Name: name, MediaURL: url, }) } } - taskID, submitErr := s.submitVideoTask(ctx, d, ep, segIdx, segDur, segOutput.Scenes, videoRefs) + // 去重后添加道具参考 + seenProp := make(map[string]bool) + for _, name := range coveredProps { + if seenProp[name] { + continue + } + seenProp[name] = true + if url := genCtx.LookupRef("道具", name); url != "" { + videoRefs = append(videoRefs, model.VideoRef{ + Type: "prop", Name: name, MediaURL: url, + }) + } + } + + g.Log().Infof(ctx, "第%d段视频参考素材: %d个(角色%d 场景%d 道具%d)", + segIdx+1, len(videoRefs), len(segOutput.Characters), len(coveredScenes), len(coveredProps)) + + taskID, _, submitErr := s.submitVideoTask(ctx, d, ep, segIdx, segDur, segOutput.Scenes, videoRefs) if submitErr != nil { - g.Log().Warningf(ctx, "第%d段视频提交失败,后台轮询器将自动重试: %v", segIdx+1, submitErr) + g.Log().Errorf(ctx, "第%d段视频提交失败: %v", segIdx+1, submitErr) + return submitErr } else { g.Log().Infof(ctx, "第%d集第%d段视频已提交(taskId=%s, duration=%ds)", ep.Index, segIdx+1, taskID, segDur) } - // 更新 task 字段 + // 只更新 video_task_id 和 num_segments,不覆盖 script(保留 createPendingTasks 的原始 bodyJSON) updateFields := g.Map{ "num_segments": numSegments, "updated_at": nil, @@ -755,7 +820,7 @@ func (s *dramaService) ContinueSegment(ctx context.Context, taskId int64) error return nil } -// FeedbackSegment 反馈并重新生成本段 +// FeedbackSegment 反馈并重新提交本段视频(跳过 Agent,直接使用 task.Script 重新调用模型 API) func (s *dramaService) FeedbackSegment(ctx context.Context, taskId int64, feedback string) error { task, err := dao.GenerationTask.GetOne(ctx, taskId) if err != nil { @@ -780,6 +845,11 @@ func (s *dramaService) FeedbackSegment(ctx context.Context, taskId int64, feedba return err } + modelCfg := ConfigService.Get(ctx) + if modelCfg.VideoApiKey == "" || modelCfg.VideoBaseUrl == "" { + return fmt.Errorf("视频模型未配置") + } + d, err := dao.Drama.GetOne(ctx, task.DramaId) if err != nil || d == nil { return fmt.Errorf("短剧不存在") @@ -789,29 +859,49 @@ func (s *dramaService) FeedbackSegment(ctx context.Context, taskId int64, feedba return fmt.Errorf("剧集不存在") } - modelCfg := ConfigService.Get(ctx) - - segDurs := calcSegDurs(d.EpisodeDuration, modelCfg) - segDur := segDurs[task.SegmentIdx] - - // 预加载引用数据 - feedbackGenCtx, fbErr := BuildGenerationContext(context.Background(), d) - if fbErr != nil { - g.Log().Errorf(ctx, "反馈重试构建生成上下文失败: %v", fbErr) - return fbErr - } - go func() { genCtx := context.Background() genCtx = agent.WithDramaID(genCtx, d.Id) - g.Log().Infof(genCtx, "第%d集第%d段根据反馈重新生成", ep.Index, task.SegmentIdx+1) - if err := s.generateOneSegment(genCtx, d, ep, taskId, task.SegmentIdx, segDur, feedback, feedbackGenCtx); err != nil { - g.Log().Errorf(genCtx, "第%d集第%d段重新生成失败: %v", ep.Index, task.SegmentIdx+1, err) - _ = dao.GenerationTask.UpdateFailed(genCtx, taskId, err.Error()) + g.Log().Infof(genCtx, "第%d集第%d段重新提交视频(跳过Agent)", ep.Index, task.SegmentIdx+1) + + // 将 feedback 追加到 task.Script 的 prompt 末尾,不覆盖原有内容 + // 同时用当前数据库中的模型名更新 model 字段 + bodyBytes := []byte(task.Script) + { + var bodyMap map[string]any + if err := json.Unmarshal(bodyBytes, &bodyMap); err == nil { + if input, ok := bodyMap["input"].(map[string]any); ok { + if p, ok := input["prompt"].(string); ok && feedback != "" { + input["prompt"] = p + "\n\n【修改意见】" + feedback + } + } + // 用当前配置的模型名覆盖(兼容数据库配置变更后重做) + bodyMap["model"] = modelCfg.VideoModelName + bodyBytes, _ = json.Marshal(bodyMap) + } + } + + newTaskID, resolvedBody, submitErr := resubmitVideoTask(genCtx, modelCfg.VideoApiKey, modelCfg.VideoBaseUrl, bodyBytes) + if submitErr != nil { + g.Log().Errorf(genCtx, "第%d集第%d段重新提交视频失败: %v", ep.Index, task.SegmentIdx+1, submitErr) + _ = dao.GenerationTask.UpdateFailed(genCtx, taskId, submitErr.Error()) clearPollCache(genCtx, task.EpisodeId) if ts, e := dao.GenerationTask.ListByEpisode(genCtx, task.EpisodeId); e == nil { setPollCache(genCtx, task.EpisodeId, ts) } + return + } + + g.Log().Infof(genCtx, "第%d集第%d段重提提交成功(taskId=%s)", ep.Index, task.SegmentIdx+1, newTaskID) + _ = dao.GenerationTask.UpdateFields(genCtx, taskId, g.Map{ + "video_task_id": newTaskID, + "script": string(resolvedBody), + "updated_at": nil, + }) + clearPollCache(genCtx, task.EpisodeId) + _ = dao.Episode.UpdateStatus(genCtx, task.EpisodeId, consts.EpisodeStatusGenerating, "") + if ts, e := dao.GenerationTask.ListByEpisode(genCtx, task.EpisodeId); e == nil { + setPollCache(genCtx, task.EpisodeId, ts) } }() @@ -989,6 +1079,66 @@ func (s *dramaService) pollPendingVideos(ctx context.Context) { continue } + // 任务没有 video_task_id —— 从任务自带 script 或剧集脚本重试提交 + ep, _ := dao.Episode.GetOne(ctx, task.EpisodeId) + d, _ := dao.Drama.GetOne(ctx, task.DramaId) + if ep != nil && d != nil && (task.Script != "" || ep.Script != "") { + // 优先使用任务自带的 script(新格式为 JSON 请求体),旧数据回退到 ep.Script + scriptText := task.Script + if scriptText != "" { + // 新格式:task.Script 为 JSON,从中提取 prompt + var bodyMap map[string]any + if err := json.Unmarshal([]byte(scriptText), &bodyMap); err == nil { + // 如果是完整的 bodyJSON(含 model/input/parameters),说明是 createPendingTasks 创建的新任务 + // 尚未经过 generateOneSegment 的 Agent 处理,跳过重试以避免重复提交 + if _, ok := bodyMap["model"]; ok { + if _, ok := bodyMap["parameters"]; ok { + g.Log().Infof(ctx, "轮询器: 任务 %d 第%d段为 bodyJSON 格式,跳过重试等待主流程处理", + task.Id, task.SegmentIdx+1) + continue + } + } + // 尝试从 bodyJSON 的 input.prompt 提取(兼容旧的重试场景) + if p, ok := bodyMap["prompt"].(string); ok && p != "" { + scriptText = p + } else if input, ok := bodyMap["input"].(map[string]any); ok { + if p, ok := input["prompt"].(string); ok && p != "" { + scriptText = p + } + } + } + // 如果不是 JSON 或没有 prompt 字段,保持原样(旧格式纯文本) + } + if scriptText == "" { + scriptText = ep.Script + } + scenes := []model.SegmentScene{{Description: scriptText}} + g.Log().Infof(ctx, "轮询器: 任务 %d 第%d段尝试重提交视频", + task.Id, task.SegmentIdx+1) + // 优先使用任务自带的 duration,旧数据回退到 calcSegDurs + segD := task.Duration + if segD <= 0 { + segDur := calcSegDurs(d.EpisodeDuration, modelCfg) + segD = 10 + if len(segDur) > task.SegmentIdx { + segD = segDur[task.SegmentIdx] + } + } + taskID, _, err := s.submitVideoTask(ctx, d, ep, task.SegmentIdx, segD, scenes, nil) + if err != nil { + g.Log().Errorf(ctx, "轮询器: 任务 %d 第%d段视频重提交失败: %v", + task.Id, task.SegmentIdx+1, err) + } else { + g.Log().Infof(ctx, "轮询器: 任务 %d 第%d段视频重提交成功(taskId=%s)", + task.Id, task.SegmentIdx+1, taskID) + _ = dao.GenerationTask.UpdateFields(ctx, task.Id, g.Map{"video_task_id": taskID}) + epUpdates[task.EpisodeId] = true + } + } else { + g.Log().Warningf(ctx, "轮询器: 任务 %d 第%d段无剧集脚本,%s", + task.Id, task.SegmentIdx+1, "等待主流程完成") + } + } // 刷新所有 generating 任务的 episode 缓存(不管状态有无变化,确保前端轮询不走 DB) @@ -1005,9 +1155,21 @@ func (s *dramaService) pollPendingVideos(ctx context.Context) { } +// buildPollURL 从视频创建 URL 构建任务查询 URL(DashScope API 规范) +// 创建端点: /api/v1/services/aigc/video-generation/video-synthesis +// 查询端点: /api/v1/tasks/{taskId} +func buildPollURL(baseURL, taskId string) string { + // 查找 "/api/v1/" 路径并替换后面的内容为 tasks/{taskId} + if idx := strings.Index(baseURL, "/api/v1/"); idx > 0 { + return baseURL[:idx] + "/api/v1/tasks/" + taskId + } + // fallback:直接拼接 + return strings.TrimRight(baseURL, "/") + "/" + taskId +} + // pollVideoTaskOnce 单次查询视频生成任务状态 func (s *dramaService) pollVideoTaskOnce(ctx context.Context, modelCfg *entity.ModelConfig, taskId string) (string, error) { - queryURL := strings.TrimRight(modelCfg.VideoBaseUrl, "/") + "/" + taskId + queryURL := buildPollURL(modelCfg.VideoBaseUrl, taskId) req, err := http.NewRequestWithContext(ctx, "GET", queryURL, nil) if err != nil { @@ -1062,17 +1224,17 @@ func (s *dramaService) pollVideoTaskOnce(ctx context.Context, modelCfg *entity.M if videoURL != "" { return videoURL, nil } + // SUCCEEDED 但没有视频URL,输出完整响应帮助调试 + g.Log().Warningf(ctx, "任务 %s 状态为 SUCCEEDED 但未返回视频URL,完整响应: %s", taskId, string(data)) + return "", fmt.Errorf("SUCCEEDED但视频URL为空,完整响应: %s", string(data)) case videoTaskFailed: return "", fmt.Errorf("FAILED: %s", buildErrMsg()) case videoTaskRunning, videoTaskPending: return "", fmt.Errorf("RUNNING") } - errMsg := buildErrMsg() - if errMsg != result.Output.TaskStatus { - return "", fmt.Errorf("任务状态: %s", errMsg) - } - return "", fmt.Errorf("视频URL为空") + g.Log().Warningf(ctx, "任务 %s 返回未知状态,完整响应: %s", taskId, string(data)) + return "", fmt.Errorf("未知任务状态: %s,完整响应: %s", result.Output.TaskStatus, string(data)) } // mapVideoTaskStatus 将供应商任务状态映射为内部状态 @@ -1093,11 +1255,12 @@ func mapVideoTaskStatus(s string) videoTaskStatus { // ==================== Video Generation ==================== -// submitVideoTask 提交视频合成任务 -func (s *dramaService) submitVideoTask(ctx context.Context, d *entity.Drama, ep *entity.Episode, segIdx, segDur int, scenes []model.SegmentScene, refs []model.VideoRef) (string, error) { +// submitVideoTask 提交视频合成任务,返回 (taskID, requestBodyJSON, error) +// requestBodyJSON 是调用视频模型 API 时发送的完整请求体 JSON 字符串 +func (s *dramaService) submitVideoTask(ctx context.Context, d *entity.Drama, ep *entity.Episode, segIdx, segDur int, scenes []model.SegmentScene, refs []model.VideoRef) (string, string, error) { modelCfg := ConfigService.Get(ctx) if modelCfg.VideoApiKey == "" || modelCfg.VideoBaseUrl == "" || modelCfg.VideoModelName == "" { - return "", fmt.Errorf("视频模型未配置") + return "", "", fmt.Errorf("视频模型未配置") } if len(scenes) == 0 { @@ -1110,111 +1273,222 @@ func (s *dramaService) submitVideoTask(ctx context.Context, d *entity.Drama, ep } } + // 从 video_schema 读取模型特定配置(结构按 API 请求格式: input / parameters) + refMaxCount := 5 // 默认最多5个 + promptMaxChars := 0 + if modelCfg.VideoSchema != "" { + var vs map[string]any + if err := json.Unmarshal([]byte(modelCfg.VideoSchema), &vs); err == nil { + refMaxCount = intVal(nested(vs, "input", "reference_urls", "total_max"), refMaxCount) + promptMaxChars = intVal(nested(vs, "input", "prompt", "max_chars"), 0) + } + } + sceneDescs := make([]string, 0, len(scenes)) for _, s := range scenes { sceneDescs = append(sceneDescs, s.Description) } - sceneText := strings.Join(sceneDescs, ";") - // 构建参考素材说明 - var refImages []string - refPrompt := "" - if len(refs) > 0 { - refImages = make([]string, 0, len(refs)) - var refParts []string - for _, r := range refs { - refParts = append(refParts, fmt.Sprintf("%s(%s)", r.Name, r.Type)) - if r.MediaURL != "" { - refImages = append(refImages, r.MediaURL) - } + // 构建 reference_urls 数组:按 演员→场景→道具 优先级排序 + type namedURL struct { + url string + name string + } + var namedURLs []namedURL + + var chars, sceneRefs, props []model.VideoRef + for _, r := range refs { + switch r.Type { + case "character": + chars = append(chars, r) + case "scene": + sceneRefs = append(sceneRefs, r) + case "prop": + props = append(props, r) + } + } + orderedRefs := append(append(chars, sceneRefs...), props...) + + for _, r := range orderedRefs { + if len(namedURLs) >= refMaxCount { + break + } + if r.MediaURL != "" { + namedURLs = append(namedURLs, namedURL{url: r.MediaURL, name: r.Name}) } - refPrompt = fmt.Sprintf(",参考素材:%s", strings.Join(refParts, "、")) } - prompt := fmt.Sprintf("短剧《%s》第%d集第%d段:%s%s", d.Title, ep.Index, segIdx+1, sceneText, refPrompt) - maxInputLen := 3000 - if modelCfg.MaxTokens > 0 { - maxInputLen = modelCfg.MaxTokens + // 构建 prompt:将场景描述中的实体名称替换为 character1/character2/... 直接引用参考素材 + refURLs := make([]string, len(namedURLs)) + refExplanation := "" + if len(namedURLs) > 0 { + type nameLabel struct { + name string + label string + } + nlList := make([]nameLabel, len(namedURLs)) + for i, nu := range namedURLs { + label := fmt.Sprintf("character%d", i+1) + nlList[i] = nameLabel{name: nu.name, label: label} + refURLs[i] = nu.url + } + sort.Slice(nlList, func(i, j int) bool { + return len(nlList[i].name) > len(nlList[j].name) + }) + // 替换场景描述中的实体名为 characterN(模型仅通过此方式识别参考角色) + for _, nl := range nlList { + sceneText = strings.ReplaceAll(sceneText, nl.name, nl.label) + } + // 构建角色引用说明(按 character1/2/3 顺序) + var refParts []string + for i, nu := range namedURLs { + refParts = append(refParts, fmt.Sprintf("character%d=%s", i+1, nu.name)) + } + refExplanation = fmt.Sprintf("。角色引用说明:%s", strings.Join(refParts, "、")) } - if len([]rune(prompt)) > maxInputLen { + + prompt := fmt.Sprintf("短剧《%s》第%d集第%d段:%s%s", d.Title, ep.Index, segIdx+1, sceneText, refExplanation) + if promptMaxChars > 0 && len([]rune(prompt)) > promptMaxChars { prefix := fmt.Sprintf("短剧《%s》第%d集第%d段:", d.Title, ep.Index, segIdx+1) - keepLen := maxInputLen - len([]rune(prefix)) - if keepLen < 0 { - keepLen = 0 + refLen := len([]rune(refExplanation)) + keepSceneLen := promptMaxChars - refLen - len([]rune(prefix)) + if keepSceneLen < 50 { + keepSceneLen = 50 } sceneRunes := []rune(sceneText) - if keepLen < len(sceneRunes) { - sceneText = "..." + string(sceneRunes[len(sceneRunes)-keepLen+3:]) + if keepSceneLen < len(sceneRunes) { + sceneText = "..." + string(sceneRunes[len(sceneRunes)-keepSceneLen+3:]) } - prompt = prefix + sceneText - g.Log().Infof(ctx, "prompt超长已截断至%d字符(原%d字符)", maxInputLen, len([]rune(prompt))) + prompt = prefix + sceneText + refExplanation + g.Log().Infof(ctx, "prompt超长已截断至%d字符(原%d字符)", promptMaxChars, len([]rune(prompt))) } - taskId, err := createVideoTask(ctx, modelCfg.VideoApiKey, modelCfg.VideoBaseUrl, modelCfg.VideoModelName, - prompt, refImages, segDur, resolveVideoSize(d.Resolution, d.AspectRatio)) + // 读取 negative_prompt.md 文件作为反向提示词 + negativePrompt := "" + if data, err := os.ReadFile("negative_prompt.md"); err == nil { + if np := strings.TrimSpace(string(data)); np != "" { + negativePrompt = np + } + } + + taskId, requestJSON, err := createVideoTask(ctx, modelCfg.VideoApiKey, modelCfg.VideoBaseUrl, modelCfg.VideoModelName, + prompt, negativePrompt, refURLs, segDur, d.Resolution, d.AspectRatio, modelCfg.VideoSchema) if err != nil { errStr := strings.ToLower(err.Error()) if strings.Contains(errStr, "duration") && (strings.Contains(errStr, "not support") || strings.Contains(errStr, "not supported")) { - taskId, err = createVideoTask(ctx, modelCfg.VideoApiKey, modelCfg.VideoBaseUrl, modelCfg.VideoModelName, - prompt, refImages, 0, resolveVideoSize(d.Resolution, d.AspectRatio)) + taskId, requestJSON, err = createVideoTask(ctx, modelCfg.VideoApiKey, modelCfg.VideoBaseUrl, modelCfg.VideoModelName, + prompt, negativePrompt, refURLs, 0, d.Resolution, d.AspectRatio, modelCfg.VideoSchema) } if err != nil { - return "", fmt.Errorf("视频合成请求失败: %w", err) + return "", "", fmt.Errorf("视频合成请求失败: %w", err) } } if taskId == "" { - return "", fmt.Errorf("视频合成任务ID为空") + return "", "", fmt.Errorf("视频合成任务ID为空") } - return taskId, nil + return taskId, requestJSON, nil } -// createVideoTask 调用视频生成API提交任务 -func createVideoTask(ctx context.Context, apiKey, baseURL, modelName, prompt string, images []string, duration int, size string) (string, error) { - var ( - inputImages []string - paramsSize string - paramsDur int - hasParams bool - ) - if len(images) > 0 { - inputImages = images - } - if size != "" { - paramsSize = size - hasParams = true - } - if duration > 0 { - paramsDur = duration - hasParams = true - } - +// createVideoTask 调用视频生成API提交任务,返回 (taskID, requestBodyJSON, error) +// API 请求体结构由 model_config.video_schema 定义,包含: +// +// params: 额外参数(如 audio/shot_type/watermark 等) +// sizes: 分辨率→尺寸字符串映射表 +func createVideoTask(ctx context.Context, apiKey, baseURL, modelName, prompt, negativePrompt string, refURLs []string, duration int, resolution, aspectRatio, videoSchema string) (string, string, error) { body := map[string]any{ "model": modelName, "input": map[string]any{ "prompt": prompt, }, } - if len(inputImages) > 0 { - body["input"].(map[string]any)["images"] = inputImages + + // input.negative_prompt — 反向提示词(从 negative_prompt.md 读取,不为空时才发送) + if negativePrompt != "" { + body["input"].(map[string]any)["negative_prompt"] = negativePrompt } - if hasParams { - p := map[string]any{} - if paramsSize != "" { - p["size"] = paramsSize + + // input.reference_urls — 纯 URL 字符串数组,顺序对应 character1/character2/... + // 解析 refURLs:http/https/data: 开头的保持原样,文件路径转为 base64 data URL + for i, u := range refURLs { + if strings.HasPrefix(u, "http://") || strings.HasPrefix(u, "https://") || strings.HasPrefix(u, "data:") { + continue } - if paramsDur > 0 { - p["duration"] = paramsDur + if b64, err := imageFileToBase64(u); err == nil { + refURLs[i] = b64 + } else { + g.Log().Warningf(ctx, "reference_urls 元素无法解析为文件或URL,跳过: %s", u) } - body["parameters"] = p } + if len(refURLs) > 0 { + body["input"].(map[string]any)["reference_urls"] = refURLs + } else { + // 无参考图时使用默认首帧 + if imgData, err := os.ReadFile(DefaultFirstFramePath); err == nil { + b64 := base64.StdEncoding.EncodeToString(imgData) + body["input"].(map[string]any)["reference_urls"] = []string{"data:image/png;base64," + b64} + g.Log().Infof(ctx, "使用默认首帧图作为 reference_urls") + } else { + g.Log().Warningf(ctx, "读取默认首帧图失败: %v", err) + } + } + + // 从 video_schema 读取模型特定参数(结构按 API 请求格式: input / parameters) + params := map[string]any{} + if videoSchema != "" { + var vs map[string]any + if err := json.Unmarshal([]byte(videoSchema), &vs); err == nil { + // 尺寸映射 + if sizes := nested(vs, "parameters", "size", "sizes"); sizes != nil { + if sm, ok := sizes.(map[string]any); ok { + if v := resolveSizeFromSchema(sm, resolution, aspectRatio); v != "" { + params["size"] = v + } + } + } + // 遍历 parameters 读取各字段默认值注入 API 请求,跳过 supported_models 限制的参数 + if paramsDef := nested(vs, "parameters"); paramsDef != nil { + if pm, ok := paramsDef.(map[string]any); ok { + for k, v := range pm { + paramDef, ok := v.(map[string]any) + if !ok { + continue + } + // 如果有 supported_models 且不包含当前模型,跳过 + if sm, ok := paramDef["supported_models"]; ok { + if models, ok := sm.([]any); ok { + found := false + for _, m := range models { + if ms, ok := m.(string); ok && ms == modelName { + found = true + break + } + } + if !found { + continue + } + } + } + if def, ok := paramDef["default"]; ok { + params[k] = def + } + } + } + } + } + } + + if duration > 0 { + params["duration"] = duration + } + body["parameters"] = params payload, _ := json.Marshal(body) req, err := http.NewRequestWithContext(ctx, "POST", baseURL, strings.NewReader(string(payload))) if err != nil { - return "", fmt.Errorf("创建请求失败: %w", err) + return "", "", fmt.Errorf("创建请求失败: %w", err) } req.Header.Set("Authorization", "Bearer "+apiKey) req.Header.Set("Content-Type", "application/json") @@ -1223,7 +1497,7 @@ func createVideoTask(ctx context.Context, apiKey, baseURL, modelName, prompt str client := &http.Client{Timeout: 30 * time.Second} resp, err := client.Do(req) if err != nil { - return "", fmt.Errorf("请求失败: %w", err) + return "", "", fmt.Errorf("请求失败: %w", err) } defer resp.Body.Close() @@ -1236,40 +1510,125 @@ func createVideoTask(ctx context.Context, apiKey, baseURL, modelName, prompt str Message string `json:"message"` } if err := json.Unmarshal(respData, &result); err != nil { - return "", fmt.Errorf("解析响应失败: %s", string(respData)) + return "", "", fmt.Errorf("解析响应失败: %s", string(respData)) } if result.Code != "" { - return "", fmt.Errorf("请求失败(code=%s): %s", result.Code, string(respData)) + return "", "", fmt.Errorf("请求失败(code=%s): %s", result.Code, string(respData)) } if result.Output.TaskID == "" { - return "", fmt.Errorf("任务ID为空") + return "", "", fmt.Errorf("任务ID为空") } - return result.Output.TaskID, nil + return result.Output.TaskID, string(payload), nil } -// resolveVideoSize 根据分辨率和宽高比计算视频尺寸 -func resolveVideoSize(resolution, aspectRatio string) string { - res := resolution - if res == "" { - res = "720P" +// resubmitVideoTask 使用已有的 bodyJSON 重新提交视频任务(跳过 Agent,直接调 API) +func resubmitVideoTask(ctx context.Context, apiKey, baseURL string, bodyJSON []byte) (string, []byte, error) { + var bodyMap map[string]any + if err := json.Unmarshal(bodyJSON, &bodyMap); err != nil { + return "", nil, fmt.Errorf("解析 bodyJSON 失败: %w", err) } - if strings.Contains(aspectRatio, "16:9") { - if res == "1080P" { - return "1920*1080" + + // 解析 reference_urls:http/https/data: 开头的保持原样,文件路径转为 base64 + if input, ok := bodyMap["input"].(map[string]any); ok { + if refs, ok := input["reference_urls"].([]any); ok { + resolved := make([]any, len(refs)) + for i, r := range refs { + u, _ := r.(string) + if strings.HasPrefix(u, "http://") || strings.HasPrefix(u, "https://") || strings.HasPrefix(u, "data:") { + resolved[i] = u + } else if b64, err := imageFileToBase64(u); err == nil { + resolved[i] = b64 + } else { + g.Log().Warningf(ctx, "reference_urls 元素无法解析: %s", u) + resolved[i] = u + } + } + input["reference_urls"] = resolved } - return "1280*720" } - if strings.Contains(aspectRatio, "1:1") { - if res == "1080P" { - return "1080*1080" + + payload, _ := json.Marshal(bodyMap) + req, err := http.NewRequestWithContext(ctx, "POST", baseURL, strings.NewReader(string(payload))) + if err != nil { + return "", nil, fmt.Errorf("创建请求失败: %w", err) + } + req.Header.Set("Authorization", "Bearer "+apiKey) + req.Header.Set("Content-Type", "application/json") + req.Header.Set("X-DashScope-Async", "enable") + + client := &http.Client{Timeout: 30 * time.Second} + resp, err := client.Do(req) + if err != nil { + return "", nil, fmt.Errorf("请求失败: %w", err) + } + defer resp.Body.Close() + + respData, _ := io.ReadAll(resp.Body) + var result struct { + Output struct { + TaskID string `json:"task_id"` + } `json:"output"` + Code string `json:"code"` + Message string `json:"message"` + } + if err := json.Unmarshal(respData, &result); err != nil { + return "", nil, fmt.Errorf("解析响应失败: %s", string(respData)) + } + if result.Code != "" { + return "", nil, fmt.Errorf("请求失败(code=%s): %s", result.Code, string(respData)) + } + if result.Output.TaskID == "" { + return "", nil, fmt.Errorf("任务ID为空") + } + return result.Output.TaskID, payload, nil +} + +// resolveSizeFromSchema 从 video_schema.sizes 中根据分辨率和宽高比查找尺寸字符串 +// sizes 结构示例: {"720P":{"9:16":"720*1280","16:9":"1280*720"}} +func resolveSizeFromSchema(sizes map[string]any, resolution, aspectRatio string) string { + if resolution == "" || aspectRatio == "" { + return "" + } + res := strings.ToUpper(resolution) + ar := strings.ReplaceAll(aspectRatio, ":", ":") + resMap, ok := sizes[res].(map[string]any) + if !ok { + return "" + } + if v, ok := resMap[ar].(string); ok && v != "" { + return v + } + return "" +} + +// nested 从嵌套 map 中按 keys 路径安全取值 +func nested(m map[string]any, keys ...string) any { + for i, k := range keys { + if m == nil { + return nil + } + if i == len(keys)-1 { + return m[k] + } + if v, ok := m[k].(map[string]any); ok { + m = v + } else { + return nil } - return "720*720" } - // 默认竖屏 9:16 - if res == "1080P" { - return "1080*1920" + return nil +} + +// intVal 将 any 类型转为 int,非数值返回 fallback +func intVal(v any, fallback int) int { + switch n := v.(type) { + case float64: + return int(n) + case int: + return n + default: + return fallback } - return "720*1280" } func (s *dramaService) mergeEpisodeVideo(ctx context.Context, epId int64, lastTaskId int64) error { @@ -1351,6 +1710,14 @@ func (s *dramaService) mergeEpisodeVideo(ctx context.Context, epId int64, lastTa } } + // 叠加背景音乐(如果存在) + if bgmPath, err := s.overlayBackgroundMusic(ctx, d.Id, finalPath); err == nil { + finalPath = bgmPath + g.Log().Infof(ctx, "已叠加背景音乐: %s", finalPath) + } else { + g.Log().Warningf(ctx, "叠加背景音乐失败(跳过): %v", err) + } + // 事务:更新最后一段 task 状态 + 剧集状态和 video_url err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { // 更新最后一段任务为 completed @@ -1385,6 +1752,55 @@ func (s *dramaService) mergeEpisodeVideo(ctx context.Context, epId int64, lastTa // ==================== Video Helpers ==================== +// overlayBackgroundMusic 使用 ffmpeg 为视频叠加背景音乐(循环混音) +func (s *dramaService) overlayBackgroundMusic(ctx context.Context, dramaId int64, videoPath string) (string, error) { + bgmList, err := dao.BackgroundMusic.ListByDrama(ctx, dramaId) + if err != nil || len(bgmList) == 0 { + return "", fmt.Errorf("无背景音乐配置") + } + bgmPath := bgmList[0].FilePath + if bgmPath == "" { + return "", fmt.Errorf("背景音乐文件路径为空") + } + if _, err := os.Stat(bgmPath); os.IsNotExist(err) { + return "", fmt.Errorf("背景音乐文件不存在: %s", bgmPath) + } + // 检查 ffmpeg 是否可用 + if _, err := exec.LookPath("ffmpeg"); err != nil { + return "", fmt.Errorf("ffmpeg 不可用: %w", err) + } + + ext := filepath.Ext(videoPath) + bgmOutput := strings.TrimSuffix(videoPath, ext) + "_bgm" + ext + // ffmpeg 命令:循环 BGM 并降低音量,与视频原音频混音 + cmd := exec.Command("ffmpeg", + "-stream_loop", "-1", + "-i", bgmPath, + "-i", videoPath, + "-filter_complex", "[0:a]volume=0.15[bgm];[1:a][bgm]amix=inputs=2:duration=first[audio]", + "-map", "1:v", + "-map", "[audio]", + "-c:v", "copy", + "-shortest", + "-y", + bgmOutput, + ) + if output, err := cmd.CombinedOutput(); err != nil { + return "", fmt.Errorf("ffmpeg 失败: %w, 输出: %s", err, string(output)) + } + + // 替换原文件 + if err := os.Rename(bgmOutput, videoPath); err != nil { + // 如果替换失败,尝试移除原文件后重命名 + os.Remove(videoPath) + if err2 := os.Rename(bgmOutput, videoPath); err2 != nil { + os.Remove(bgmOutput) + return "", fmt.Errorf("替换视频文件失败: %w", err2) + } + } + return videoPath, nil +} + // waitForSegmentVideo 等待指定任务的视频生成完成。 // 轮询视频 API 直到视频就绪,下载到本地,更新 DB 的 video_url。 // 用于串行模式中让下一段能提取上一段的尾帧作为首帧。 @@ -1433,6 +1849,17 @@ func (s *dramaService) waitForSegmentVideo(ctx context.Context, d *entity.Drama, return fmt.Errorf("串行等待超时: 任务 %d 第%d段视频在 %d 次轮询后仍未就绪", task.Id, task.SegmentIdx+1, maxAttempts) } +func mdatDataOffset(f *mp4.File) uint64 { + offset := uint64(0) + for _, child := range f.Children { + if child == f.Mdat { + return offset + f.Mdat.HeaderSize() + } + offset += child.Size() + } + return 0 +} + func (s *dramaService) concatVideos(inputs []string, output string) error { if len(inputs) < 2 { return fmt.Errorf("需要至少2个输入文件才能合并") @@ -1455,7 +1882,7 @@ func (s *dramaService) concatVideos(inputs []string, output string) error { for i, f := range files { cumPayload[i] = totalPayload totalPayload += uint64(len(f.Mdat.Data)) - origBase[i] = f.Ftyp.Size() + f.Moov.Size() + f.Mdat.HeaderSize() + origBase[i] = mdatDataOffset(f) } // 3. 以第一个文件为蓝本构建输出结构 @@ -1527,7 +1954,7 @@ func (s *dramaService) concatVideos(inputs []string, output string) error { } // 6. 修正所有 chunk 偏移(合并后 moov 大小变化) - combinedBase := outFile.Ftyp.Size() + outFile.Moov.Size() + outFile.Mdat.HeaderSize() + combinedBase := mdatDataOffset(outFile) finalAdjust := int64(combinedBase - origBase[0]) for _, st := range states { adjustChunkOffsets(st.stbl, finalAdjust) @@ -1555,8 +1982,55 @@ func (s *dramaService) concatVideos(inputs []string, output string) error { trak.Tkhd.Duration = totalDur } - // 8. 重建顶级 Children(确保 mdat 指向合并后的数据) - outFile.Children = []mp4.Box{outFile.Ftyp, outFile.Moov, outFile.Mdat} + // 更新每个 elst 段时长(决定播放器实际播放时长) + for _, trak := range outFile.Moov.Traks { + if trak.Edts == nil || len(trak.Edts.Elst) == 0 { + continue + } + hdlr := trak.Mdia.Hdlr.HandlerType + for _, elst := range trak.Edts.Elst { + for i := range elst.Entries { + totalSegDur := uint64(0) + for _, f := range files { + for _, t := range f.Moov.Traks { + if t.Mdia.Hdlr.HandlerType == hdlr && t.Edts != nil { + for _, e := range t.Edts.Elst { + if len(e.Entries) > i { + totalSegDur += e.Entries[i].SegmentDuration + } + } + } + } + } + elst.Entries[i].SegmentDuration = totalSegDur + } + } + } + + // 更新每个 mdhd 媒体时长 + for _, trak := range outFile.Moov.Traks { + hdlr := trak.Mdia.Hdlr.HandlerType + totalDur = 0 + for _, f := range files { + for _, t := range f.Moov.Traks { + if t.Mdia.Hdlr.HandlerType == hdlr { + totalDur += t.Mdia.Mdhd.Duration + break + } + } + } + trak.Mdia.Mdhd.Duration = totalDur + } + + // 8. 重建顶级 Children(保留原始 box 顺序,仅替换 mdat 引用) + outFile.Children = make([]mp4.Box, len(files[0].Children)) + for i, child := range files[0].Children { + if _, isMdat := child.(*mp4.MdatBox); isMdat { + outFile.Children[i] = outFile.Mdat + } else { + outFile.Children[i] = child + } + } // 9. 写入输出文件 return mp4.WriteToFile(outFile, output) @@ -1751,14 +2225,19 @@ func cleanupEpisodeWorkspace(ctx context.Context, dramaTitle string, epIndex int } func calcSegDurs(episodeDuration int64, cfg *entity.ModelConfig) []int { - effectiveMax := cfg.MaxSingleDuration - if effectiveMax <= 0 { - effectiveMax = 30 - } - - minSingle := cfg.MinSingleDuration - if minSingle <= 0 { - minSingle = effectiveMax + // 从 video_schema.duration 读取模型单段时长约束 + effectiveMax := 15 // 默认值 + minSingle := 5 + if cfg.VideoSchema != "" { + var vs map[string]any + if err := json.Unmarshal([]byte(cfg.VideoSchema), &vs); err == nil { + if v := intVal(nested(vs, "parameters", "duration", "max"), 0); v > 0 { + effectiveMax = v + } + if v := intVal(nested(vs, "parameters", "duration", "min"), 0); v > 0 { + minSingle = v + } + } } if minSingle > effectiveMax { minSingle = effectiveMax @@ -1856,6 +2335,17 @@ func imageFileToBase64(path string) (string, error) { return "data:" + mime + ";base64," + base64.StdEncoding.EncodeToString(data), nil } +// parseMMSSToSeconds 将 "MM:SS" 格式的时间字符串转为总秒数 +func parseMMSSToSeconds(timeStr string) int { + parts := strings.Split(timeStr, ":") + if len(parts) == 2 { + m, _ := strconv.Atoi(parts[0]) + sec, _ := strconv.Atoi(parts[1]) + return m*60 + sec + } + return 0 +} + // ValidateUploadFile 校验上传文件的大小和格式是否符合模型配置约束 // 参数 fileSize 为文件字节数,fileName 为原始文件名 // 返回 error 表示文件不合规 diff --git a/shortdrama/service/episode_service.go b/shortdrama/service/episode_service.go index c7c3e87..c9dd201 100644 --- a/shortdrama/service/episode_service.go +++ b/shortdrama/service/episode_service.go @@ -6,6 +6,7 @@ import ( "fmt" "os" "path/filepath" + "sort" "strings" "time" @@ -50,18 +51,35 @@ func (s *dramaService) AddEpisode(ctx context.Context, dramaId int64, title, des } index = maxIdx + 1 } - id, err := dao.Episode.Insert(ctx, &entity.Episode{ - DramaId: dramaId, - Index: index, - Title: title, - Description: description, - Script: script, - Status: consts.EpisodeStatusPending, - }) - if err != nil { - return 0, err + // 无脚本时直接插入剧集(无需创建任务) + if script == "" { + return dao.Episode.Insert(ctx, &entity.Episode{ + DramaId: dramaId, Index: index, Title: title, + Description: description, Script: script, + Status: consts.EpisodeStatusPending, + }) } - return id, nil + // 有脚本时用事务同时写入剧集和任务 + var epId int64 + now := time.Now().Format("2006-01-02 15:04:05") + err := g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + r, e := tx.Model(public.TableNameEpisode).Ctx(ctx).Data(g.Map{ + "drama_id": dramaId, "idx": index, "title": title, + "description": description, "script": script, + "status": consts.EpisodeStatusPending, + "created_at": now, "updated_at": now, + }).Insert() + if e != nil { + return e + } + id, e := r.LastInsertId() + if e != nil { + return e + } + epId = id + return createPendingTasks(ctx, dramaId, epId, script, tx) + }) + return epId, err } func (s *dramaService) UpdateEpisode(ctx context.Context, dramaId, epId int64, title, description, script string, index int) error { @@ -80,17 +98,29 @@ func (s *dramaService) UpdateEpisode(ctx context.Context, dramaId, epId int64, t } if script != "" { e.Script = script - if e.Status == "" { - e.Status = consts.EpisodeStatusPending - } + e.Status = consts.EpisodeStatusPending } if index > 0 { e.Index = index } - if err := dao.Episode.Update(ctx, epId, e); err != nil { - return err - } - return nil + + needsTaskUpdate := script != "" + return g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + // 更新剧集 + if _, e := tx.Model(public.TableNameEpisode).Ctx(ctx).Data(e).Where("id", epId).Update(); e != nil { + return e + } + // 脚本变动时重创建任务 + if needsTaskUpdate { + if _, e := tx.Model(public.TableNameGenerationTask).Ctx(ctx).Where("episode_id", epId).Delete(); e != nil { + return e + } + if e := createPendingTasks(ctx, dramaId, epId, script, tx); e != nil { + return fmt.Errorf("重新创建待生成任务失败: %w", e) + } + } + return nil + }) } func (s *dramaService) DeleteEpisode(ctx context.Context, dramaId, epId int64) error { @@ -257,7 +287,322 @@ func (s *dramaService) buildScriptGenUserInput(d *entity.Drama, episodeTitle, de b.WriteString("\n") } - b.WriteString(fmt.Sprintf("【要求】\n请根据以上剧情描述,为当前剧集创作一份详细的剧本。剧情描述是核心创作依据,请严格围绕其内容展开。\n\n输出格式:JSON数组,每个元素是一个镜头对象(shot),包含以下字段:\n- index: 镜头序号(从1开始)\n- startTime: 开始时间(格式MM:SS)\n- endTime: 结束时间(格式MM:SS)\n- event: 事件描述(该镜头中发生的情节概括)\n- cameraMovement: 运镜方式,从以下标准类型中选择一种:固定镜头、推、拉、摇、移、跟、升、降、旋转、晃动、航拍\n- characters: 出演人物数组,填写演员名称,如[\"张三\", \"李四\"],从「可用演员」中选择\n- scene: 场景名称,从「可用场景」中选择\n- props: 道具数组,填写道具名称,如[\"剑\", \"酒杯\"],从「可用道具」中选择\n\n直接输出JSON数组,不要markdown代码块标记,不要其他任何内容。\n\n要求:\n1. 剧本必须紧扣剧情描述展开\n2. 所有镜头时长之和应等于 %d 秒(每个镜头5-15秒不等)\n3. 优先使用提供的演员、场景和道具,如需新增请合理创作\n4. 每个镜头的characters、scene、props字段必须从提供的可用列表中选取名称,确保与参考素材一致\n5. 对话自然流畅,情节有起伏\n6. 镜头数量建议6-15个\n", d.EpisodeDuration)) + b.WriteString(fmt.Sprintf("【要求】\n请根据以上剧情描述,为当前剧集创作一份详细的剧本。剧情描述是核心创作依据,请严格围绕其内容展开。\n\n输出格式:JSON数组,每个元素是一个镜头对象(shot),包含以下字段:\n- index: 镜头序号(从1开始)\n- startTime: 开始时间(格式MM:SS)\n- endTime: 结束时间(格式MM:SS)\n- event: 事件描述(该镜头中发生的情节概括)\n- cameraMovement: 运镜方式,从以下标准类型中选择一种:固定镜头、推、拉、摇、移、跟、升、降、旋转、晃动、航拍\n- characters: 出演人物数组,填写演员名称,如[\"张三\", \"李四\"],从「可用演员」中选择\n- scene: 场景名称,从「可用场景」中选择\n- props: 道具名称数组,如[\"剑\", \"酒杯\"],从「可用道具」中选择\n\n直接输出JSON数组,不要markdown代码块标记,不要其他任何内容。\n\n要求:\n1. 剧本必须紧扣剧情描述展开\n2. 所有镜头时长之和应等于 %d 秒(每个镜头%d-%d秒不等)\n3. 优先使用提供的演员、场景和道具,如需新增请合理创作\n4. 每个镜头的characters、scene、props字段必须从提供的可用列表中选取名称,确保与参考素材一致\n5. 对话自然流畅,情节有起伏\n6. 镜头数量建议6-15个\n", d.EpisodeDuration, d.MinShotDuration, d.MaxShotDuration)) return b.String() } + +// createPendingTasks 为剧集创建待生成任务(按 calcSegDurs 拆段),每段脚本只包含本段对应部分 +func createPendingTasks(ctx context.Context, dramaId, epId int64, script string, tx gdb.TX) error { + d, err := dao.Drama.GetOne(ctx, dramaId) + if err != nil || d == nil { + return fmt.Errorf("短剧不存在: %d", dramaId) + } + modelCfg := ConfigService.Get(ctx) + + // 预加载参考素材(演员优先,场景其次,道具最后) + chars, _, _ := dao.Character.ListPageByDrama(ctx, dramaId, 1, -1) + scenes, _ := dao.Scene.ListByDrama(ctx, dramaId) + props, _ := dao.Prop.ListByDrama(ctx, dramaId) + + // 读取反向提示词 + negativePrompt := "" + if data, err := os.ReadFile("negative_prompt.md"); err == nil { + negativePrompt = strings.TrimSpace(string(data)) + } + + // 从 video_schema 读取参考素材上限和默认参数 + refMax := 5 + var vs map[string]any + if modelCfg.VideoSchema != "" { + json.Unmarshal([]byte(modelCfg.VideoSchema), &vs) + } + if vs != nil { + if v := nested(vs, "input", "reference_urls", "total_max"); v != nil { + if n, ok := v.(float64); ok { + refMax = int(n) + } + } + } + + // 从 video_schema 读取 prompt 最大字符数 + promptMaxChars := intVal(nested(vs, "input", "prompt", "max_chars"), 0) + + // 构建参考列表:演员 base64 → 场景图片 base64 → 道具图片 base64(与提交视频时顺序一致) + type namedRef struct { + name string + url string + } + var namedRefs []namedRef + for _, ch := range chars { + if len(namedRefs) >= refMax { + break + } + if ch.PortraitPath != "" { + namedRefs = append(namedRefs, namedRef{name: ch.Name, url: ch.PortraitPath}) + } + } + for _, sc := range scenes { + if len(namedRefs) >= refMax { + break + } + if sc.ImagePath != "" { + namedRefs = append(namedRefs, namedRef{name: sc.Name, url: sc.ImagePath}) + } + } + for _, p := range props { + if len(namedRefs) >= refMax { + break + } + if p.ImagePath != "" { + namedRefs = append(namedRefs, namedRef{name: p.Name, url: p.ImagePath}) + } + } + + // 读取拆段时长约束(与 calcSegDurs 逻辑一致) + effectiveMax := 15 + minSingle := 5 + if vs != nil { + if v := intVal(nested(vs, "parameters", "duration", "max"), 0); v > 0 { + effectiveMax = v + } + if v := intVal(nested(vs, "parameters", "duration", "min"), 0); v > 0 { + minSingle = v + } + } + if minSingle > effectiveMax { + minSingle = effectiveMax + } + + // 从 video_schema 读取默认 parameters(含 duration/audio/watermark 等) + params := map[string]any{} + if vs != nil { + if paramsDef := nested(vs, "parameters"); paramsDef != nil { + if pm, ok := paramsDef.(map[string]any); ok { + for k, v := range pm { + paramDef, ok := v.(map[string]any) + if !ok { + continue + } + // 如果有 supported_models 且不包含当前模型,跳过 + if sm, ok := paramDef["supported_models"]; ok { + if models, ok := sm.([]any); ok { + found := false + for _, m := range models { + if ms, ok := m.(string); ok && ms == modelCfg.VideoModelName { + found = true + break + } + } + if !found { + continue + } + } + } + if def, ok := paramDef["default"]; ok { + params[k] = def + } + } + } + } + // 尺寸映射:从 drama 的 Resolution/AspectRatio 查 video_schema + if sizes := nested(vs, "parameters", "size", "sizes"); sizes != nil { + if sm, ok := sizes.(map[string]any); ok { + if v := resolveSizeFromSchema(sm, d.Resolution, d.AspectRatio); v != "" { + params["size"] = v + } + } + } + } + + // 预构建名称替换信息(characterN 引用) + type _nameRep struct{ name, label string } + var _reps []_nameRep + if len(namedRefs) > 0 { + for j, nr := range namedRefs { + _reps = append(_reps, _nameRep{nr.name, fmt.Sprintf("character%d", j+1)}) + } + sort.Slice(_reps, func(a, b int) bool { return len(_reps[a].name) > len(_reps[b].name) }) + } + var _refStr string + if len(_reps) > 0 { + var _parts []string + for _, r := range _reps { + _parts = append(_parts, fmt.Sprintf("%s=%s", r.label, r.name)) + } + _refStr = fmt.Sprintf("。角色引用说明:%s", strings.Join(_parts, "、")) + } + _refLen := len([]rune(_refStr)) + + // buildFinalPrompt 执行名称替换并追加引用说明 + buildFinalPrompt := func(raw string) string { + for _, r := range _reps { + raw = strings.ReplaceAll(raw, r.name, r.label) + } + return raw + _refStr + } + + // refURLs 在所有段中相同 + refURLs := make([]string, len(namedRefs)) + for j, nr := range namedRefs { + refURLs[j] = nr.url + } + + // ============ 按脚本类型分组 ============ + type _taskGroup struct { + promptText string + dur int + } + var taskGroups []_taskGroup + + if domain.IsShotsJSON(script) { + // JSON 镜头数组:按镜头分组,累加连续镜头直到触及时长或字符上限 + var allShots []domain.Shot + if err := json.Unmarshal([]byte(script), &allShots); err != nil || len(allShots) == 0 { + return fmt.Errorf("解析镜头脚本失败: %w", err) + } + type _shotGroup struct { + shots []domain.Shot + totalDur int + } + var cur _shotGroup + for _, sh := range allShots { + shDur := parseMMSSToSeconds(sh.EndTime) - parseMMSSToSeconds(sh.StartTime) + if shDur <= 0 { + shDur = 1 + } + // 计算加入当前镜头后的候选组总时长和提示词长度 + candShots := make([]domain.Shot, len(cur.shots)+1) + copy(candShots, cur.shots) + candShots[len(cur.shots)] = sh + candDur := cur.totalDur + shDur + candPrompt := buildFinalPrompt(domain.ShotsToText(candShots)) + + exceedDur := len(cur.shots) > 0 && candDur > effectiveMax + exceedChars := promptMaxChars > 0 && len([]rune(candPrompt)) > promptMaxChars + + if exceedDur || exceedChars { + // 当前组已满,保存并开启新组 + taskGroups = append(taskGroups, _taskGroup{ + promptText: buildFinalPrompt(domain.ShotsToText(cur.shots)), + dur: cur.totalDur, + }) + cur = _shotGroup{shots: []domain.Shot{sh}, totalDur: shDur} + } else { + cur.shots = candShots + cur.totalDur = candDur + } + } + if len(cur.shots) > 0 { + taskGroups = append(taskGroups, _taskGroup{ + promptText: buildFinalPrompt(domain.ShotsToText(cur.shots)), + dur: cur.totalDur, + }) + } + } else { + // 纯文本脚本:按 calcSegDurs 拆段 + splitScriptForSegment 切分(保留原逻辑) + segDurs := calcSegDurs(d.EpisodeDuration, modelCfg) + segStartTimes := make([]int, len(segDurs)) + for i := 1; i < len(segDurs); i++ { + segStartTimes[i] = segStartTimes[i-1] + segDurs[i-1] + } + totalDur := d.EpisodeDuration + + if promptMaxChars > 0 { + totalRunes := len([]rune(script)) + if totalRunes > 0 && _refLen < promptMaxChars { + charsPerSeg := promptMaxChars - _refLen + maxDurByChars := charsPerSeg * int(totalDur) / totalRunes + if maxDurByChars > 0 && maxDurByChars < effectiveMax { + if maxDurByChars < minSingle { + maxDurByChars = minSingle + } + segDurs = calcSegmentDurations(int(totalDur), maxDurByChars, minSingle) + segStartTimes = make([]int, len(segDurs)) + for i := 1; i < len(segDurs); i++ { + segStartTimes[i] = segStartTimes[i-1] + segDurs[i-1] + } + } + } + } + + for i, segDur := range segDurs { + segScript := splitScriptForSegment(script, segStartTimes[i], segDur, int(totalDur)) + taskGroups = append(taskGroups, _taskGroup{ + promptText: buildFinalPrompt(segScript), + dur: segDur, + }) + } + } + + // ============ 插入任务 ============ + for i, tg := range taskGroups { + segParams := make(map[string]any, len(params)+1) + for k, v := range params { + segParams[k] = v + } + segParams["duration"] = tg.dur + + bodyJSON, _ := json.Marshal(map[string]any{ + "model": modelCfg.VideoModelName, + "input": map[string]any{ + "prompt": tg.promptText, + "negative_prompt": negativePrompt, + "reference_urls": refURLs, + }, + "parameters": segParams, + }) + + _, err := tx.Model(public.TableNameGenerationTask).Ctx(ctx).Data(g.Map{ + "drama_id": dramaId, + "episode_id": epId, + "segment_idx": i, + "status": consts.TaskStatusPending, + "script": string(bodyJSON), + "duration": tg.dur, + "num_segments": len(taskGroups), + }).Insert() + if err != nil { + return fmt.Errorf("创建第%d段待生成任务失败: %w", i+1, err) + } + } + return nil +} + +// splitScriptForSegment 将整集脚本按时间范围切分为对应段落的脚本内容 +func splitScriptForSegment(fullScript string, segStartTime, segDur, totalDur int) string { + if domain.IsShotsJSON(fullScript) { + var shots []domain.Shot + if err := json.Unmarshal([]byte(fullScript), &shots); err != nil { + return fullScript + } + segEndTime := segStartTime + segDur + var filtered []domain.Shot + for _, s := range shots { + shStart := parseMMSSToSeconds(s.StartTime) + shEnd := parseMMSSToSeconds(s.EndTime) + if shEnd <= segStartTime || shStart >= segEndTime { + continue + } + filtered = append(filtered, s) + } + if len(filtered) > 0 { + return domain.ShotsToText(filtered) + } + return "" + } + // 纯文本脚本:按时长比例切分字符 + runes := []rune(fullScript) + if len(runes) == 0 || totalDur <= 0 { + return fullScript + } + startRune := len(runes) * segStartTime / totalDur + endRune := len(runes) * (segStartTime + segDur) / totalDur + if startRune >= len(runes) { + return "" + } + if endRune > len(runes) { + endRune = len(runes) + } + return string(runes[startRune:endRune]) +} diff --git a/shortdrama/service/generation_context.go b/shortdrama/service/generation_context.go index 8c09ba3..688eeeb 100644 --- a/shortdrama/service/generation_context.go +++ b/shortdrama/service/generation_context.go @@ -20,12 +20,13 @@ type OrderedRef struct { Index int // 在 OrderedRefs 中的位置 } -// GenerationContext 一次生成会话的上下文,预加载当前短剧的演员/场景/道具数据 +// GenerationContext 一次生成会话的上下文,预加载当前短剧的演员/场景/道具/背景音乐数据 type GenerationContext struct { - Drama *entity.Drama - Characters []*entity.Character - Scenes []*entity.Scene - Props []*entity.Prop + Drama *entity.Drama + Characters []*entity.Character + Scenes []*entity.Scene + Props []*entity.Prop + BackgroundMusic []*entity.BackgroundMusic // RefIndex 按名称索引,用于 Agent 输出匹配 RefIndex RefIndex @@ -51,12 +52,18 @@ func BuildGenerationContext(ctx context.Context, drama *entity.Drama) (*Generati return nil, fmt.Errorf("加载道具失败: %w", err) } + bgmList, err := dao.BackgroundMusic.ListByDrama(ctx, drama.Id) + if err != nil { + return nil, fmt.Errorf("加载背景音失败: %w", err) + } + ctx2 := &GenerationContext{ - Drama: drama, - Characters: characters, - Scenes: scenes, - Props: props, - RefIndex: make(RefIndex), + Drama: drama, + Characters: characters, + Scenes: scenes, + Props: props, + BackgroundMusic: bgmList, + RefIndex: make(RefIndex), } // 构建 RefIndex diff --git a/test.json b/test.json new file mode 100644 index 0000000..076c728 --- /dev/null +++ b/test.json @@ -0,0 +1 @@ +{"model": "wan2.6-r2v", "input": {"prompt": {"required": true, "type": "string", "max_chars": 1500, "description": "文本提示词。支持中英文,每个汉字/字母/标点占一个字符,超过部分自动截断。通过 character1、character2 引用参考角色,每个参考仅包含单一角色。模型仅通过此方式识别参考中的角色"}, "negative_prompt": {"required": false, "type": "string", "max_chars": 500, "description": "反向提示词,用来描述不希望在视频画面中出现的内容,可以对视频画面进行限制"}, "reference_urls": {"required": true, "type": "array", "items": "string", "ref_ordering": "按数组顺序定义角色顺序,第1个URL对应character1,第2个对应character2,依此类推。每个参考文件仅包含一个主体角色", "total_max": 5, "image_max": 5, "video_max": 3, "video_formats": ["MP4", "MOV"], "video_duration_sec": {"min": 1, "max": 30}, "video_max_size_mb": 100, "image_formats": ["JPEG", "JPG", "PNG", "BMP", "WEBP"], "image_note": "PNG不支持透明通道", "image_resolution_px": {"min": 240, "max": 8000}, "image_max_size_mb": 20}}, "parameters": {"size": {"required": false, "type": "string", "format": "{width}*{height}", "default": "1920*1080", "description": "视频分辨率,格式为宽*高。必须设置为具体数值(如1280*720),而不是1:1或720P", "sizes": {"720P": {"9:16": "720*1280", "16:9": "1280*720", "1:1": "960*960", "4:3": "1088*832", "3:4": "832*1088"}, "1080P": {"9:16": "1080*1920", "16:9": "1920*1080", "1:1": "1440*1440", "4:3": "1632*1248", "3:4": "1248*1632"}}}, "duration": {"required": false, "type": "integer", "min": 2, "max": 10, "default": 5, "description": "生成视频的时长,单位为秒"}, "shot_type": {"required": false, "type": "string", "enum": ["single", "multi"], "default": "single", "description": "镜头类型。参数优先级:shot_type > prompt。single=单镜头视频,multi=多镜头视频"}, "audio": {"required": false, "type": "boolean", "default": true, "supported_models": ["wan2.6-r2v-flash"], "description": "是否生成有声视频"}, "watermark": {"required": false, "type": "boolean", "default": false}, "seed": {"required": false, "type": "integer", "min": 0, "max": 2147483647}}} \ No newline at end of file diff --git a/tools/split_merged/split_merged.go b/tools/split_merged/split_merged.go new file mode 100644 index 0000000..f371f47 --- /dev/null +++ b/tools/split_merged/split_merged.go @@ -0,0 +1,263 @@ +package main + +import ( + "fmt" + "os" + "path/filepath" + "strconv" + + "github.com/Eyevinn/mp4ff/mp4" +) + +func main() { + if len(os.Args) < 4 { + fmt.Println("用法: split_merged <输入文件> <输出目录> <段数>") + os.Exit(1) + } + inputPath := os.Args[1] + outDir := os.Args[2] + numSegments, err := strconv.Atoi(os.Args[3]) + if err != nil || numSegments <= 0 { + fmt.Printf("无效的段数: %s\n", os.Args[3]) + os.Exit(1) + } + + // 读取合并文件 + f, err := mp4.ReadMP4File(inputPath) + if err != nil { + fmt.Printf("读取文件失败: %v\n", err) + os.Exit(1) + } + + if err := os.MkdirAll(outDir, 0755); err != nil { + fmt.Printf("创建输出目录失败: %v\n", err) + os.Exit(1) + } + + // 收集每轨道按段划分的 sample 范围 + type trakInfo struct { + trak *mp4.TrakBox + samples uint32 // 总 sample 数 + perSeg uint32 // 每段 sample 数 + } + + var traks []trakInfo + for _, trak := range f.Moov.Traks { + stbl := trak.Mdia.Minf.Stbl + if stbl.Stsz != nil { + totalSamples := stbl.Stsz.SampleNumber + perSeg := totalSamples / uint32(numSegments) + traks = append(traks, trakInfo{ + trak: trak, + samples: totalSamples, + perSeg: perSeg, + }) + fmt.Printf("轨道 %s: 总 %d samples, 每段 %d\n", trak.Mdia.Hdlr.HandlerType, totalSamples, perSeg) + } + } + + if len(traks) == 0 { + fmt.Println("未找到可分割的轨道") + os.Exit(1) + } + + // 逐段切分 + for seg := 0; seg < numSegments; seg++ { + outPath := filepath.Join(outDir, fmt.Sprintf("seg_%d.mp4", seg)) + fmt.Printf("切分第 %d 段 -> %s\n", seg, outPath) + + outFile := mp4.NewFile() + outFile.Ftyp = f.Ftyp + outFile.Moov = f.Moov // 稍后会修改 + + // 为每轨道创建仅包含本段 samples 的 stbl + for _, ti := range traks { + stbl := ti.trak.Mdia.Minf.Stbl + startSample := seg * int(ti.perSeg) + endSample := startSample + int(ti.perSeg) + if seg == numSegments-1 { + endSample = int(ti.samples) // 最后一段拿剩余所有 samples + } + + fmt.Printf(" 轨道 %s: samples [%d, %d)\n", ti.trak.Mdia.Hdlr.HandlerType, startSample, endSample) + + // 拷贝 stsz entry(只保留本段范围) + if stbl.Stsz != nil { + newStsz := &mp4.StszBox{} + if stbl.Stsz.SampleUniformSize > 0 { + newStsz.SampleUniformSize = stbl.Stsz.SampleUniformSize + newStsz.SampleNumber = uint32(endSample - startSample) + } else { + newStsz.SampleSize = make([]uint32, endSample-startSample) + copy(newStsz.SampleSize, stbl.Stsz.SampleSize[startSample:endSample]) + newStsz.SampleNumber = uint32(len(newStsz.SampleSize)) + } + stbl.Stsz = newStsz + } + + // 计算本段 chunk 范围:通过 stsc 找到对应的 chunk + // 直接根据 perSeg chunks 计算。每段 chunks = totalChunks / numSegments + chunkCount := uint32(0) + if stbl.Stco != nil { + chunkCount = uint32(len(stbl.Stco.ChunkOffset)) + } else if stbl.Co64 != nil { + chunkCount = uint32(len(stbl.Co64.ChunkOffset)) + } + perSegChunks := chunkCount / uint32(numSegments) + startChunk := seg * int(perSegChunks) + endChunk := startChunk + int(perSegChunks) + if seg == numSegments-1 { + endChunk = int(chunkCount) + } + + // 重新构建 stco(只保留本段 chunk) + if stbl.Stco != nil { + oldChunks := stbl.Stco.ChunkOffset + stbl.Stco.ChunkOffset = oldChunks[startChunk:endChunk] + // 调整偏移量:减去 mdat 中本段数据的起始位置 + baseOffset := oldChunks[startChunk] + for i := range stbl.Stco.ChunkOffset { + stbl.Stco.ChunkOffset[i] -= baseOffset + } + } + if stbl.Co64 != nil { + oldChunks := stbl.Co64.ChunkOffset + stbl.Co64.ChunkOffset = oldChunks[startChunk:endChunk] + baseOffset := oldChunks[startChunk] + for i := range stbl.Co64.ChunkOffset { + stbl.Co64.ChunkOffset[i] -= baseOffset + } + } + + // 重新构建 stsc(只保留本段 chunk 的 entries) + if stbl.Stsc != nil { + var newEntries []mp4.StscEntry + for _, e := range stbl.Stsc.Entries { + if e.FirstChunk-1 >= uint32(startChunk) && e.FirstChunk-1 < uint32(endChunk) { + newEntries = append(newEntries, mp4.StscEntry{ + FirstChunk: e.FirstChunk - uint32(startChunk), + SamplesPerChunk: e.SamplesPerChunk, + SampleDescriptionIndex: e.SampleDescriptionIndex, + }) + } + } + stbl.Stsc.Entries = newEntries + } + + // 重设 stts(重建,只保留本段 samples 对应的时间) + if stbl.Stts != nil { + newStts := &mp4.SttsBox{} + currentSample := uint32(0) + for i := range stbl.Stts.SampleCount { + count := stbl.Stts.SampleCount[i] + delta := stbl.Stts.SampleTimeDelta[i] + nextSample := currentSample + count + + if nextSample <= uint32(startSample) { + currentSample = nextSample + continue + } + if currentSample >= uint32(endSample) { + break + } + + overlapStart := uint32(0) + if currentSample < uint32(startSample) { + overlapStart = uint32(startSample) - currentSample + } + overlapEnd := count + if nextSample > uint32(endSample) { + overlapEnd = uint32(endSample) - currentSample + } + + if overlapStart < overlapEnd { + newStts.SampleCount = append(newStts.SampleCount, overlapEnd-overlapStart) + newStts.SampleTimeDelta = append(newStts.SampleTimeDelta, delta) + } + currentSample = nextSample + } + stbl.Stts = newStts + } + + // 修正 stco 偏移:加上 ftyp+moov+mdat_header 偏移 + mdatDataStart := uint32(0) // 稍后在写入时修正 + _ = mdatDataStart + } + + // 提取本段 mdat 数据 + mdatStart := uint32(0) + if len(traks) > 0 && traks[0].trak.Mdia.Minf.Stbl.Stco != nil { + // 使用第一个轨道的第一个 chunk 偏移量作为数据起始位置 + mdatStart = traks[0].trak.Mdia.Minf.Stbl.Stco.ChunkOffset[0] + } + + // 重构 mdat:从合并文件提取本段数据 + outFile.Mdat = &mp4.MdatBox{} + mdatPayloadLen := uint64(0) + // 计算本段 mdat 数据长度 + for _, ti := range traks { + stbl := ti.trak.Mdia.Minf.Stbl + if stbl.Stsz != nil { + if stbl.Stsz.SampleUniformSize > 0 { + mdatPayloadLen += uint64(stbl.Stsz.SampleUniformSize) * uint64(stbl.Stsz.SampleNumber) + } else { + for _, s := range stbl.Stsz.SampleSize { + mdatPayloadLen += uint64(s) + } + } + } + } + + if mdatPayloadLen > 0 { + segData := make([]byte, mdatPayloadLen) + // 从原始 mdat 拷贝 + offset := uint64(mdatStart) + _ = offset + copyPos := uint64(0) + for _, ti := range traks { + stbl := ti.trak.Mdia.Minf.Stbl + if stbl.Stsz != nil { + if stbl.Stsz.SampleUniformSize > 0 { + dataLen := uint64(stbl.Stsz.SampleUniformSize) * uint64(stbl.Stsz.SampleNumber) + copy(segData[copyPos:], f.Mdat.Data[offset:offset+dataLen]) + copyPos += dataLen + offset += dataLen + } else { + for _, s := range stbl.Stsz.SampleSize { + copy(segData[copyPos:], f.Mdat.Data[offset:offset+uint64(s)]) + copyPos += uint64(s) + offset += uint64(s) + } + } + } + } + outFile.Mdat.SetData(segData) + } + + // 更新 mdhd/tkhd/mvhd 时长 + outFile.Moov.Mvhd = f.Moov.Mvhd // 拷贝原始 mvhd + // 简化处理:直接使用原始 mvhd 时长 + + // 重建 Children + outFile.Children = []mp4.Box{outFile.Ftyp, outFile.Moov, outFile.Mdat} + + // 修正 stco 偏移:调整到实际文件位置 + combinedBase := outFile.Ftyp.Size() + outFile.Moov.Size() + outFile.Mdat.HeaderSize() + for _, ti := range traks { + stbl := ti.trak.Mdia.Minf.Stbl + if stbl.Stco != nil { + for i := range stbl.Stco.ChunkOffset { + stbl.Stco.ChunkOffset[i] += uint32(combinedBase) + } + } + } + + if err := mp4.WriteToFile(outFile, outPath); err != nil { + fmt.Printf("写入 %s 失败: %v\n", outPath, err) + continue + } + fmt.Printf(" 完成: %s\n", outPath) + } + + fmt.Println("切分完成") +}