You've already forked FrameTour-RenderWorker
feat(video): 添加视频渲染的宽高参数支持
- 在 render_video 函数中添加 width 和 height 参数传递 - 为 overlay 功能添加 scale 滤镜支持 - 更新 filter_complex 字符串以包含尺寸缩放逻辑 - 修改 overlay 处理流程以正确应用指定尺寸 - 添加相关参数的文档说明
This commit is contained in:
@@ -466,6 +466,8 @@ class RenderSegmentVideoHandler(BaseHandler):
|
||||
base_filters=filters,
|
||||
effects=effects,
|
||||
fps=fps,
|
||||
width=width,
|
||||
height=height,
|
||||
has_overlay=has_overlay,
|
||||
is_video_overlay=is_video_overlay,
|
||||
overlap_head_ms=overlap_head_ms,
|
||||
@@ -492,12 +494,13 @@ class RenderSegmentVideoHandler(BaseHandler):
|
||||
if has_overlay:
|
||||
# 使用 filter_complex 格式
|
||||
base_filters = ','.join(filters) if filters else 'copy'
|
||||
overlay_scale = f"scale={width}:{height}"
|
||||
# 视频 overlay 使用 eof_action=pass(结束后消失),图片 overlay 使用默认行为(保持显示)
|
||||
overlay_params = 'eof_action=pass' if is_video_overlay else ''
|
||||
overlay_filter = f"overlay=0:0:{overlay_params}" if overlay_params else 'overlay=0:0'
|
||||
# 视频 overlay 需要在末尾统一颜色范围,避免 overlay 结束后 range 从 tv 变为 pc
|
||||
range_fix = ',format=yuv420p,setrange=tv' if is_video_overlay else ''
|
||||
return f"[0:v]{base_filters}[base];[base][1:v]{overlay_filter}{range_fix}"
|
||||
return f"[0:v]{base_filters}[base];[1:v]{overlay_scale}[overlay];[base][overlay]{overlay_filter}{range_fix}"
|
||||
else:
|
||||
return ','.join(filters) if filters else ''
|
||||
|
||||
@@ -506,6 +509,8 @@ class RenderSegmentVideoHandler(BaseHandler):
|
||||
base_filters: List[str],
|
||||
effects: List[Effect],
|
||||
fps: int,
|
||||
width: int,
|
||||
height: int,
|
||||
has_overlay: bool = False,
|
||||
is_video_overlay: bool = False,
|
||||
overlap_head_ms: int = 0,
|
||||
@@ -521,6 +526,8 @@ class RenderSegmentVideoHandler(BaseHandler):
|
||||
base_filters: 基础滤镜列表
|
||||
effects: 特效列表
|
||||
fps: 帧率
|
||||
width: 输出宽度
|
||||
height: 输出高度
|
||||
has_overlay: 是否有叠加层
|
||||
is_video_overlay: 叠加层是否为视频格式(如 .mov)
|
||||
overlap_head_ms: 头部 overlap 时长
|
||||
@@ -604,9 +611,12 @@ class RenderSegmentVideoHandler(BaseHandler):
|
||||
# 视频 overlay 使用 eof_action=pass(结束后消失),图片 overlay 使用默认行为(保持显示)
|
||||
overlay_params = 'eof_action=pass' if is_video_overlay else ''
|
||||
overlay_filter = f"overlay=0:0:{overlay_params}" if overlay_params else 'overlay=0:0'
|
||||
overlay_scale = f"scale={width}:{height}"
|
||||
overlay_output = '[v_overlay]'
|
||||
# 视频 overlay 需要在末尾统一颜色范围,避免 overlay 结束后 range 从 tv 变为 pc
|
||||
range_fix = ',format=yuv420p,setrange=tv' if is_video_overlay else ''
|
||||
filter_parts.append(f"{current_output}[1:v]{overlay_filter}{range_fix}")
|
||||
filter_parts.append(f"[1:v]{overlay_scale}{overlay_output}")
|
||||
filter_parts.append(f"{current_output}{overlay_output}{overlay_filter}{range_fix}")
|
||||
else:
|
||||
# 移除最后一个标签,直接输出
|
||||
# 将最后一个滤镜的输出标签替换为空(直接输出)
|
||||
|
||||
Reference in New Issue
Block a user