refactor(video): 重构视频裁切功能实现

- 将 crop_size 字段替换为 crop_scale 浮点数字段,支持缩放倍率控制
- 将 face_pos 字段重命名为 crop_pos,统一裁切位置控制
- 移除 zoom_cut 和 crop_size 字段,简化裁切参数
- 新增 _build_crop_filter 静态方法,统一构建裁切滤镜逻辑
- 优化裁切算法,支持按目标比例和倍率进行精确裁切
- 统一处理图像和视频的裁切逻辑,消除代码重复
- 添加 cropScale 参数的安全解析,防止非法数值导致错误
- 改进裁切位置解析,支持浮点数坐标并添加异常处理
This commit is contained in:
2026-02-27 13:37:42 +08:00
parent 9dd5b6237d
commit 34e7d84d52
2 changed files with 57 additions and 43 deletions

View File

@@ -216,14 +216,13 @@ class RenderSpec:
用于 RENDER_SEGMENT_VIDEO 任务,定义视频渲染参数。
"""
crop_enable: bool = False
crop_size: Optional[str] = None
crop_scale: float = 1.0
speed: str = "1.0"
lut_url: Optional[str] = None
overlay_url: Optional[str] = None
effects: Optional[str] = None
zoom_cut: bool = False
video_crop: Optional[str] = None
face_pos: Optional[str] = None
crop_pos: Optional[str] = None
transitions: Optional[str] = None
# 转场配置(PRD v2 新增)
transition_in: Optional[TransitionConfig] = None # 入场转场
@@ -234,16 +233,24 @@ class RenderSpec:
"""从字典创建 RenderSpec"""
if not data:
return cls()
# 安全解析 cropScale:接受浮点数或字符串浮点数,非法值回退到 1.0
try:
crop_scale = float(data.get('cropScale', 1.0))
if crop_scale <= 0 or not isfinite(crop_scale):
crop_scale = 1.0
except (ValueError, TypeError):
crop_scale = 1.0
return cls(
crop_enable=data.get('cropEnable', False),
crop_size=data.get('cropSize'),
crop_scale=crop_scale,
speed=str(data.get('speed', '1.0')),
lut_url=data.get('lutUrl'),
overlay_url=data.get('overlayUrl'),
effects=data.get('effects'),
zoom_cut=data.get('zoomCut', False),
video_crop=data.get('videoCrop'),
face_pos=data.get('facePos'),
crop_pos=data.get('cropPos'),
transitions=data.get('transitions'),
transition_in=TransitionConfig.from_dict(data.get('transitionIn')),
transition_out=TransitionConfig.from_dict(data.get('transitionOut'))