From ca9093504f452d285e88127ac59c586a148ab341 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Wed, 21 Jan 2026 16:48:05 +0800 Subject: [PATCH] =?UTF-8?q?fix(video):=20=E4=BF=AE=E5=A4=8D=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E5=AE=9A=E6=A0=BC=E6=95=88=E6=9E=9C=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改cameraShot实现注释,明确标注定格效果功能 - 使用tpad代替freezeframes实现更准确的定格效果 - 更新滤镜链参数配置,确保定格时长正确应用 - 优化变量命名,提高代码可读性 - 调整concat拼接输入源,确保视频流正确连接 --- handlers/render_video.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/handlers/render_video.py b/handlers/render_video.py index 48d19cd..1fe4cd3 100644 --- a/handlers/render_video.py +++ b/handlers/render_video.py @@ -547,15 +547,16 @@ class RenderSegmentVideoHandler(BaseHandler): if start_sec <= 0 or duration_sec <= 0: continue - # cameraShot 实现: + # cameraShot 实现(定格效果): # 1. fps + split 分割 - # 2. 第一路:trim(0, start+duration) + freezeframes + # 2. 第一路:trim(0, start) + tpad冻结duration秒 # 3. 第二路:trim(start, end) # 4. concat 拼接 - start_frame = start_sec * fps split_out_a = f'[eff{effect_idx}_a]' split_out_b = f'[eff{effect_idx}_b]' + frozen_out = f'[eff{effect_idx}_frozen]' + rest_out = f'[eff{effect_idx}_rest]' effect_output = f'[v_eff{effect_idx}]' # fps + split @@ -563,24 +564,21 @@ class RenderSegmentVideoHandler(BaseHandler): f"{current_output}fps=fps={fps},split{split_out_a}{split_out_b}" ) - # 第一路:trim + freezeframes(在 start 帧处冻结 duration 秒) - # freezeframes: 从 first 帧开始,用 replace 帧替换后续帧 - # 这样实现定格效果:在 start_frame 位置冻结 + # 第一路:trim(0, start) + tpad冻结 + # tpad=stop_mode=clone 将最后一帧冻结指定时长 filter_parts.append( - f"{split_out_a}trim=start=0:end={start_sec + duration_sec}," - f"setpts=PTS-STARTPTS," - f"freezeframes=first={start_frame}:last={start_frame + duration_sec * fps - 1}:replace={start_frame}" - f"{split_out_a}" + f"{split_out_a}trim=start=0:end={start_sec},setpts=PTS-STARTPTS," + f"tpad=stop_mode=clone:stop_duration={duration_sec}{frozen_out}" ) # 第二路:trim 从 start 开始 filter_parts.append( - f"{split_out_b}trim=start={start_sec},setpts=PTS-STARTPTS{split_out_b}" + f"{split_out_b}trim=start={start_sec},setpts=PTS-STARTPTS{rest_out}" ) # concat 拼接 filter_parts.append( - f"{split_out_a}{split_out_b}concat=n=2:v=1:a=0{effect_output}" + f"{frozen_out}{rest_out}concat=n=2:v=1:a=0{effect_output}" ) current_output = effect_output