Spaces:
Running on Zero
Running on Zero
| import cv2 | |
| import os | |
| def extract_pre_alert_clip(video_path, alert_time, output_path="./extracted_clip.mp4"): | |
| """Extract a context clip around the alert time at 4fps.""" | |
| cap = cv2.VideoCapture(video_path) | |
| fps = cap.get(cv2.CAP_PROP_FPS) | |
| total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) | |
| duration_sec = float(total_frames / fps) if fps else 0.0 | |
| start_time = max(0, alert_time - 8) | |
| end_time = min(duration_sec, alert_time + 3) | |
| start_frame = int(start_time * fps) | |
| end_frame = int(end_time * fps) | |
| frame_interval = max(1, int(round(fps / 4))) | |
| frames = [] | |
| for frame_idx in range(start_frame, end_frame, frame_interval): | |
| cap.set(cv2.CAP_PROP_POS_FRAMES, frame_idx) | |
| ret, frame = cap.read() | |
| if not ret: | |
| break | |
| frames.append(frame) | |
| cap.release() | |
| if frames: | |
| height, width, _ = frames[0].shape | |
| fourcc = cv2.VideoWriter_fourcc(*'mp4v') | |
| out = cv2.VideoWriter(output_path, fourcc, 4.0, (width, height)) | |
| for frame in frames: | |
| out.write(frame) | |
| out.release() | |
| print(f"Extracted clip saved to {output_path} ({start_time:.2f}s to {end_time:.2f}s)") | |
| return output_path | |
| else: | |
| print("No frames extracted") | |
| return None | |
| if __name__ == "__main__": | |
| video_path = "./nexar_data/sample_videos/sample_dashcam_2.mp4" | |
| alert_time = 5.0 # assumed or from BADAS | |
| extract_pre_alert_clip(video_path, alert_time) | |