fix: P0-2 预签名URL诊断日志 + P0-3 xfade exit 234 三重修复 #207
Reference in New Issue
Block a user
Delete Branch "fix/p02-p03-deep-fix"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
修复内容
P0-2: 预签名 URL staging 未生效
storage.pyget_download_url()增加诊断日志(bucket=None/sign_url失败场景)P0-3: FFmpeg xfade exit 234 三重修复
_build_single_clip_filter始终 trim 到effective_duration = min(clip.duration, clip.actual_duration)_build_filter_complex用 effective_duration(而非原始 duration)计算 xfade offsetbuild_xfade_filter_chain逐步安全钳制:first_input_dur跟踪td钳制到available和remainingoffset + td ≤ first_input_duration测试
改动文件
apps/api/app/core/storage.pyapps/worker/video_processing/ffmpeg_utils.pyapps/worker/video_processing/unified_render_service.pytests/unit/test_p02_p03_fixes.py🤖 Generated with Claude Code
🟡 PR #207 审计 — 有条件通过(1 P1 需修复)
结论:需要修改 — 0 P0 / 1 P1 / 0 P2 / 2 P3
✅ P0-3 修复:大部分正确
三重修复方向正确:
min(duration, actual_duration),确保实际输出时长与计算一致。unified_render_service.py中 trim 逻辑和layer_durations计算逻辑一致。layer_durations使用与 trim 相同的有效时长,offset 计算基准统一。build_xfade_filter_chain中available = first_input_dur - offset+safe_td = min(td, available),确保offset + td ≤ first_input_duration,防止 exit 234。⚠️ P1:缺少对第二个输入时长的钳制(需修复)
文件:
apps/worker/video_processing/ffmpeg_utils.py(build_xfade_filter_chain)问题:当前代码有
remaining = sum(clip_durations) - cumulative钳制,但这是「后续所有片段总时长」,不是「当前第二个输入(clip_durations[i])的时长」。sum - cumulative = clip_durations[1],恰好正确 ✅sum - cumulative = clip_durations[i] + clip_durations[i+1] + ... > clip_durations[i],钳制太松 ❌复现场景:3 片段
[5.0, 0.3, 5.0],td=0.5s修复建议:在 safe_td 钳制处增加对第二个输入时长的限制:
替换掉当前不准确的
remaining钳制(或同时保留,但应取更严格的 clip_durations[i])。✅ P0-2 诊断日志:合理,无信息泄露
文件:
apps/api/app/core/storage.py✅ 测试覆盖:20 个用例,覆盖充分
P0-3 xfade 安全钳制(7+ 个场景):
P0-3 effective_duration trim(5 个用例):
P0-2 预签名 URL(6 个用例):
P0-2 诊断日志(2 个用例):
💡 P3 建议(非阻塞)
offset 计算偏差:
offset = cumulative - transition_duration * i假设所有转场都是完整 td,但前面的转场被钳制后,后续 offset 会有轻微偏差。不导致 crash,只是转场时机略有偏移,用户几乎不可感知。极端场景下可优化为动态累计。sum(clip_durations)重复计算:循环内每次都算sum(clip_durations) - cumulative,可提到循环外。性能影响可忽略,纯代码整洁度建议。总结:
safe_td = min(safe_td, clip_durations[i])即可✅ PR #207 复审通过
结论:通过 — 0 P0 / 0 P1 / 0 P2 / 2 P3(建议项,不阻塞)
P1 修复验证 ✅
文件:
apps/worker/video_processing/ffmpeg_utils.py:301safe_td = min(safe_td, clip_durations[i]),确保 td 不超过当前第二个输入片段的时长边界场景验证通过(手动 + 自动):
测试验证 ✅
test_middle_clip_shorter_than_td专项测试([5.0, 0.3, 5.0] + td=0.5s)td ≤ 第二个输入时长断言P3 建议(非阻塞,后续统一优化)
offset = cumulative - transition_duration * i假设所有转场完整,被钳制后后续 offset 有轻微偏差。不 crash,仅效果微偏。sum(clip_durations)重复计算:可提到循环外。纯代码整洁度建议。最终结论:P1 已修复到位,PR #207 可以合并。
P0-3 xfade exit 234 三重修复全部验证通过: