From ffb9d5390e2bdce164e39a2665eb269a112822d4 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Tue, 27 Jan 2026 17:03:56 +0800 Subject: [PATCH] =?UTF-8?q?feat(video):=20=E6=B7=BB=E5=8A=A0=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E6=B8=B2=E6=9F=93=E7=9A=84=E5=AE=BD=E9=AB=98=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 render_video 函数中添加 width 和 height 参数传递 - 为 overlay 功能添加 scale 滤镜支持 - 更新 filter_complex 字符串以包含尺寸缩放逻辑 - 修改 overlay 处理流程以正确应用指定尺寸 - 添加相关参数的文档说明 --- handlers/render_video.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/handlers/render_video.py b/handlers/render_video.py index 1fe4cd3..2369522 100644 --- a/handlers/render_video.py +++ b/handlers/render_video.py @@ -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: # 移除最后一个标签,直接输出 # 将最后一个滤镜的输出标签替换为空(直接输出)