From 16db1d2a010d4593c55423e6426bcc45b8a9041e Mon Sep 17 00:00:00 2001 From: leether Date: Sun, 7 Jun 2026 15:55:58 +0800 Subject: [PATCH] fix(concat): correct xfade offset calculation for variable transition durations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: offset = cum_duration - trans_duration * i This assumed all transitions have the same duration. When a later transition duration increased (e.g., 0.4 -> 0.5), trans_duration*i could grow faster than cum_duration, causing negative offset regression. Example from rsi_cn timeline: i=38 offset=520.58 (td=0.4) i=39 offset=519.66 (td=0.5) ← regression! Fix: offset = cum_duration - sum(all_transition_durations[:i]) Each transition's actual duration is now accumulated individually. Verified: all 48 offsets are monotonically increasing after fix. Closes: concat-engine-offset-regression --- core/concat_engine.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/concat_engine.py b/core/concat_engine.py index 51732db..fcb46fb 100644 --- a/core/concat_engine.py +++ b/core/concat_engine.py @@ -385,9 +385,13 @@ def _build_filter_complex( trans_duration = trans.get("duration", self.config.default_transition_duration) # 计算 offset - # offset = sum(clips[0:i].duration) - trans_duration * i + # offset = sum(clips[0:i].duration) - sum(all_transition_durations[0:i]) cum_duration = sum(c["duration"] for c in clips[:i]) - offset = cum_duration - trans_duration * i + cum_trans_duration = sum( + clips[j].get("transition", {}).get("duration", 0.0) + for j in range(i) + ) + offset = cum_duration - cum_trans_duration # xfade 视频转场 xfade_types = {