From 4af52d5a546675990381dd1224bab6d035beba8e Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Tue, 9 Dec 2025 18:07:48 +0800 Subject: [PATCH] =?UTF-8?q?fix(ffmpeg):=20=E4=BF=AE=E5=A4=8D=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E8=A3=81=E5=89=AA=E6=97=B6=E9=97=B4=E6=88=B3=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 trim 过滤器后添加 setpts 过滤器以重置时间戳 - 修复 skip、tail 和 show 效果的时间戳计算问题 - 确保裁剪后的视频片段时间戳从零开始 - 避免因时间戳不连续导致的播放问题 --- entity/ffmpeg.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/entity/ffmpeg.py b/entity/ffmpeg.py index 660fc95..fd195d3 100644 --- a/entity/ffmpeg.py +++ b/entity/ffmpeg.py @@ -329,7 +329,7 @@ class FfmpegTask(object): skip_seconds = float(param) if skip_seconds > 0: effect_index += 1 - filter_args.append(f"{video_output_str}trim=start={skip_seconds}[v_eff{effect_index}]") + filter_args.append(f"{video_output_str}trim=start={skip_seconds},setpts=PTS-STARTPTS[v_eff{effect_index}]") video_output_str = f"[v_eff{effect_index}]" elif effect.startswith("tail:"): param = effect.split(":", 2)[1] @@ -342,7 +342,7 @@ class FfmpegTask(object): # 使用reverse+trim+reverse的方法来精确获取最后N秒 filter_args.append(f"{video_output_str}reverse[v_rev{effect_index}]") filter_args.append(f"[v_rev{effect_index}]trim=duration={tail_seconds}[v_trim{effect_index}]") - filter_args.append(f"[v_trim{effect_index}]reverse[v_eff{effect_index}]") + filter_args.append(f"[v_trim{effect_index}]reverse,setpts=PTS-STARTPTS[v_eff{effect_index}]") video_output_str = f"[v_eff{effect_index}]" elif effect.startswith("show:"): param = effect.split(":", 2)[1] @@ -351,7 +351,7 @@ class FfmpegTask(object): show_seconds = float(param) if show_seconds > 0: effect_index += 1 - filter_args.append(f"{video_output_str}trim=end={show_seconds}[v_eff{effect_index}]") + filter_args.append(f"{video_output_str}trim=end={show_seconds},setpts=PTS-STARTPTS[v_eff{effect_index}]") video_output_str = f"[v_eff{effect_index}]" elif effect.startswith("grid4:"): param = effect.split(":", 2)[1]