You've already forked FrameTour-RenderWorker
feat(video): 添加视频缩放特效功能支持
- 在 EffectConfig 中新增 zoom 特效类型及参数解析 - 实现 get_zoom_params 方法用于获取缩放效果参数 - 更新文档注释说明 zoom 特效使用格式示例 - 修改渲染逻辑支持 zoom 特效的 filter_complex 处理 - 添加缩放特效的视频滤镜构建实现 - 统一处理 cameraShot 和 zoom 特效的效果叠加逻辑
This commit is contained in:
@@ -5,12 +5,13 @@
|
||||
定义任务类型、任务实体、渲染规格、输出规格等数据结构。
|
||||
"""
|
||||
|
||||
from enum import Enum
|
||||
from dataclasses import dataclass, field
|
||||
from typing import Dict, Any, Optional, List
|
||||
from datetime import datetime
|
||||
from urllib.parse import urlparse, unquote
|
||||
import os
|
||||
from dataclasses import dataclass, field
|
||||
from datetime import datetime
|
||||
from enum import Enum
|
||||
from math import isfinite
|
||||
from typing import Dict, Any, Optional, List
|
||||
from urllib.parse import urlparse, unquote
|
||||
|
||||
|
||||
# 支持的图片扩展名
|
||||
@@ -95,7 +96,9 @@ class Effect:
|
||||
特效配置
|
||||
|
||||
格式:type:params
|
||||
例如:cameraShot:3,1 表示在第3秒定格1秒
|
||||
例如:
|
||||
- cameraShot:3,1 表示在第3秒定格1秒
|
||||
- zoom:1.5,1.2,2 表示从第1.5秒开始放大 1.2 倍并持续 2 秒
|
||||
"""
|
||||
effect_type: str # 效果类型
|
||||
params: str = "" # 参数字符串
|
||||
@@ -122,7 +125,7 @@ class Effect:
|
||||
解析效果字符串
|
||||
|
||||
格式:effect1|effect2|effect3
|
||||
例如:cameraShot:3,1|blur:5
|
||||
例如:cameraShot:3,1|zoom:1.5,1.2,2
|
||||
"""
|
||||
if not effects_str:
|
||||
return []
|
||||
@@ -152,6 +155,40 @@ class Effect:
|
||||
except ValueError:
|
||||
return (3, 1)
|
||||
|
||||
def get_zoom_params(self) -> tuple:
|
||||
"""
|
||||
获取 zoom 效果参数
|
||||
|
||||
Returns:
|
||||
(start_sec, scale_factor, duration_sec): 起始时间、放大倍数、持续时长(秒)
|
||||
"""
|
||||
if self.effect_type != 'zoom':
|
||||
return (0.0, 1.2, 1.0)
|
||||
|
||||
default_start_sec = 0.0
|
||||
default_scale_factor = 1.2
|
||||
default_duration_sec = 1.0
|
||||
|
||||
if not self.params:
|
||||
return (default_start_sec, default_scale_factor, default_duration_sec)
|
||||
|
||||
parts = [part.strip() for part in self.params.split(',')]
|
||||
try:
|
||||
start_sec = float(parts[0]) if len(parts) >= 1 and parts[0] else default_start_sec
|
||||
scale_factor = float(parts[1]) if len(parts) >= 2 and parts[1] else default_scale_factor
|
||||
duration_sec = float(parts[2]) if len(parts) >= 3 and parts[2] else default_duration_sec
|
||||
except ValueError:
|
||||
return (default_start_sec, default_scale_factor, default_duration_sec)
|
||||
|
||||
if not isfinite(start_sec) or start_sec < 0:
|
||||
start_sec = default_start_sec
|
||||
if not isfinite(scale_factor) or scale_factor <= 1.0:
|
||||
scale_factor = default_scale_factor
|
||||
if not isfinite(duration_sec) or duration_sec <= 0:
|
||||
duration_sec = default_duration_sec
|
||||
|
||||
return (start_sec, scale_factor, duration_sec)
|
||||
|
||||
|
||||
@dataclass
|
||||
class RenderSpec:
|
||||
|
||||
Reference in New Issue
Block a user