You've already forked FrameTour-RenderWorker
feat(video): 添加原始变速效果支持
- 在常量定义中新增 ospeed 效果类型用于兼容旧模板 - 在任务域中实现 get_ospeed_params 方法解析变速参数 - 修改视频渲染处理器合并 speed 与 ospeed 效果计算 - 更新时长计算逻辑以正确处理 ospeed 变速影响 - 新增 ospeed 参数验证和边界值处理机制 - 添加完整的 ospeed 效果单元测试覆盖各种场景
This commit is contained in:
@@ -502,12 +502,20 @@ class RenderSegmentVideoHandler(BaseHandler):
|
||||
# 去掉末尾的逗号,作为第一个滤镜
|
||||
filters.append(hwaccel_prefix.rstrip(','))
|
||||
|
||||
# 1. 变速处理
|
||||
# 1. 变速处理(合并 RenderSpec.speed 与 ospeed 效果)
|
||||
speed = float(render_spec.speed) if render_spec.speed else 1.0
|
||||
if speed != 1.0 and speed > 0:
|
||||
# setpts 公式:PTS / speed
|
||||
pts_factor = 1.0 / speed
|
||||
filters.append(f"setpts={pts_factor}*PTS")
|
||||
if speed <= 0:
|
||||
speed = 1.0
|
||||
|
||||
ospeed_factor = 1.0
|
||||
for effect in effects:
|
||||
if effect.effect_type == 'ospeed':
|
||||
ospeed_factor = effect.get_ospeed_params()
|
||||
break
|
||||
|
||||
combined_pts_factor = (1.0 / speed) * ospeed_factor
|
||||
if combined_pts_factor != 1.0:
|
||||
filters.append(f"setpts={combined_pts_factor}*PTS")
|
||||
|
||||
# 2. LUT 调色
|
||||
if lut_file:
|
||||
@@ -569,15 +577,13 @@ class RenderSegmentVideoHandler(BaseHandler):
|
||||
# 计算是否需要额外的尾部冻结(源视频时长不足)
|
||||
extra_tail_freeze_sec = 0.0
|
||||
if source_duration_sec is not None:
|
||||
speed = float(render_spec.speed) if render_spec.speed else 1.0
|
||||
if speed > 0:
|
||||
# 计算变速后的有效时长
|
||||
effective_duration_sec = source_duration_sec / speed
|
||||
required_duration_sec = duration_ms / 1000.0
|
||||
# 使用已计算的 combined_pts_factor
|
||||
effective_duration_sec = source_duration_sec * combined_pts_factor
|
||||
required_duration_sec = duration_ms / 1000.0
|
||||
|
||||
# 如果源视频时长不足,需要冻结最后一帧来补足
|
||||
if effective_duration_sec < required_duration_sec:
|
||||
extra_tail_freeze_sec = required_duration_sec - effective_duration_sec
|
||||
# 如果源视频时长不足,需要冻结最后一帧来补足
|
||||
if effective_duration_sec < required_duration_sec:
|
||||
extra_tail_freeze_sec = required_duration_sec - effective_duration_sec
|
||||
|
||||
if overlap_head_ms > 0:
|
||||
# 头部冻结:将第一帧冻结指定时长
|
||||
@@ -732,14 +738,20 @@ class RenderSegmentVideoHandler(BaseHandler):
|
||||
extra_tail_freeze_sec = 0.0
|
||||
if source_duration_sec is not None and render_spec is not None and duration_ms > 0:
|
||||
speed = float(render_spec.speed) if render_spec.speed else 1.0
|
||||
if speed > 0:
|
||||
# 计算变速后的有效时长
|
||||
effective_duration_sec = source_duration_sec / speed
|
||||
required_duration_sec = duration_ms / 1000.0
|
||||
if speed <= 0:
|
||||
speed = 1.0
|
||||
ospeed_factor = 1.0
|
||||
for effect in effects:
|
||||
if effect.effect_type == 'ospeed':
|
||||
ospeed_factor = effect.get_ospeed_params()
|
||||
break
|
||||
combined_pts_factor = (1.0 / speed) * ospeed_factor
|
||||
effective_duration_sec = source_duration_sec * combined_pts_factor
|
||||
required_duration_sec = duration_ms / 1000.0
|
||||
|
||||
# 如果源视频时长不足,需要冻结最后一帧来补足
|
||||
if effective_duration_sec < required_duration_sec:
|
||||
extra_tail_freeze_sec = required_duration_sec - effective_duration_sec
|
||||
# 如果源视频时长不足,需要冻结最后一帧来补足
|
||||
if effective_duration_sec < required_duration_sec:
|
||||
extra_tail_freeze_sec = required_duration_sec - effective_duration_sec
|
||||
|
||||
if overlap_head_ms > 0:
|
||||
head_duration_sec = overlap_head_ms / 1000.0
|
||||
|
||||
Reference in New Issue
Block a user