fix: trace video bbox no longer extends beyond last detection

This commit is contained in:
Accusys
2026-05-14 00:14:52 +08:00
parent 690254a5b2
commit 9007e46b9f

View File

@@ -305,17 +305,19 @@ async fn trace_video(
.unwrap_or(2.0);
let duration = (last_frame - first_frame) as f64 / fps + padding * 2.0;
let seek = (start_sec - padding).max(0.0);
let total_frames = (duration * fps).round() as i32;
let pad_frames = (padding * fps) as i32;
// Build filters: bbox+drawtext (1 filter + 1 drawtext per detection)
let mut parts: Vec<String> = Vec::new();
for (i, (frame, x, y, w, h)) in rows.iter().enumerate() {
let next_frame = if i + 1 < rows.len() {
rows[i + 1].0
let start_off = frame - first_frame + pad_frames;
// End at next detection, or at the last frame of the video (not beyond)
let end_off = if i + 1 < rows.len() {
rows[i + 1].0 - first_frame + pad_frames
} else {
last_frame + (padding * fps) as i32
total_frames // last bbox ends with video, no extra padding
};
let start_offset = frame - first_frame + (padding * fps) as i32;
let end_offset = next_frame - first_frame + (padding * fps) as i32;
// Bbox
parts.push(format!(
"drawbox=x={}:y={}:w={}:h={}:color=red@0.8:thickness=8:enable='between(n,{},{})'",
@@ -323,13 +325,13 @@ async fn trace_video(
y,
w,
h,
start_offset,
end_offset - 1
start_off,
end_off - 1
));
// Text label (drawtext, 1 filter vs ~175 bitmap drawboxes)
parts.push(format!(
"drawtext=text='{}':x={}:y={}:fontsize=20:fontcolor=white:box=1:boxcolor=red@0.8:enable='between(n,{},{})'",
trace_id, x + 4, y + 4, start_offset, end_offset - 1
trace_id, x + 4, y + 4, start_off, end_off - 1
));
}