feat: 转场特效引擎 — TransitionEngine + 14种转场预设 + 时长边界校验 + 降级策略

核心能力:
- TransitionEngine 抽象层:TransitionType枚举 + TransitionConfig配置 + 引擎类
- 14种转场预设:fade/dissolve/zoom/circlecrop/rectcrop + slide*4 + wipe*4
- 转场时长边界校验:0.3s~2s范围,超出自动钳制
- 降级策略:不支持的转场自动fallback到硬切(cut),不阻断渲染
- 别名支持:slide_left/slide-left/crossfade/wipe/zoomin等多种写法

系统集成:
- UnifiedRenderService 接入 TransitionEngine,替换直接xfade调用
- EditPlanClip 领域模型新增 transition_duration 字段
- SQLAlchemy model + repository 同步新增列
- API层 Schema + Service 同步支持 transition_duration
- 向前兼容:transition_duration=0 表示使用全局默认值

测试:
- 54个新增单测:枚举/配置解析/边界校验/降级策略/滤镜链构建/集成验证
- 84个渲染测试 + 16个适配器测试全绿,无回归
This commit is contained in:
CI Bot
2026-07-14 00:08:16 +08:00
parent 17fbae13a8
commit 5c002de181
10 changed files with 921 additions and 6 deletions
+21 -2
View File
@@ -25,8 +25,14 @@ DEFAULT_FPS = 25
# xfade 转场映射:transition_effect 名称 → FFmpeg xfade transition 名称
# 键同时支持 TransitionEffect 枚举值和字符串名称(向后兼容)
# "cut" 为特殊值:硬切,不使用 xfade(由调用方特殊处理)
XFADE_TRANSITION_MAP: dict[str, str] = {
# 基础
"fade": "fade",
"dissolve": "dissolve",
"crossfade": "dissolve",
"crossdissolve": "dissolve",
# 滑入系列
"slideleft": "slideleft",
"slide_left": "slideleft",
"slideright": "slideright",
@@ -35,9 +41,22 @@ XFADE_TRANSITION_MAP: dict[str, str] = {
"slide_up": "slideup",
"slidedown": "slidedown",
"slide_down": "slidedown",
"dissolve": "dissolve",
"wipe": "wipeleft",
"slide": "slideleft", # 默认向左滑
# 缩放
"zoom": "zoomin",
"zoomin": "zoomin",
"zoomout": "zoomout",
# 擦除系列
"wipe": "wipeleft", # 默认向左擦
"wipeleft": "wipeleft",
"wiperight": "wiperight",
"wipeup": "wipeup",
"wipedown": "wipedown",
# 特殊效果
"circlecrop": "circlecrop",
"circle": "circlecrop",
"rectcrop": "rectcrop",
"rect": "rectcrop",
}
DEFAULT_TRANSITION_DURATION = 0.5