diff --git a/apps/web/src/pages/generate/hooks/step2-materials/useSmartMatch.ts b/apps/web/src/pages/generate/hooks/step2-materials/useSmartMatch.ts index e297b4626..3be6c288e 100755 --- a/apps/web/src/pages/generate/hooks/step2-materials/useSmartMatch.ts +++ b/apps/web/src/pages/generate/hooks/step2-materials/useSmartMatch.ts @@ -20,13 +20,14 @@ const SECONDS_PER_ASSET = 15 /** * 根据模板 segments 计算所需素材数量上限。 * 取每个 segment 的 duration_min 之和作为目标视频总时长, - * 再按 15 秒/素材估算需要多少个素材;结果钳制到 [1, 200] 区间(后端 limit 上限 200)。 + * 再按 15 秒/素材估算需要多少个素材,且保证不少于片段数(每个片段至少 1 个素材); + * 结果钳制到 [1, 200] 区间(后端 limit 上限 200)。 */ function computeLimitFromSegments(segments?: TemplateSegment[]): number { if (!segments || segments.length === 0) return DEFAULT_LIMIT const totalSeconds = segments.reduce((sum, seg) => sum + (seg.duration_min || 0), 0) if (totalSeconds <= 0) return DEFAULT_LIMIT - const limit = Math.ceil(totalSeconds / SECONDS_PER_ASSET) + const limit = Math.max(segments.length, Math.ceil(totalSeconds / SECONDS_PER_ASSET)) return Math.max(1, Math.min(limit, 200)) }