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: # 移除最后一个标签,直接输出 # 将最后一个滤镜的输出标签替换为空(直接输出)