| """ |
| Simplified Keyframe Extraction |
| Avoids infinite loops by using basic frame selection |
| """ |
|
|
| import os |
| import srt |
| import cv2 |
| import numpy as np |
| from backend.keyframes.extract_frames import extract_frames |
| from backend.utils import copy_and_rename_file |
|
|
| def generate_keyframes_simple(video): |
| """Generate keyframes using simplified method""" |
| print("π― Using simplified keyframe generation...") |
| |
| |
| try: |
| with open("test1.srt") as f: |
| data = f.read() |
| subs = list(srt.parse(data)) |
| except: |
| print("β Error reading subtitles") |
| return False |
| |
| |
| final_dir = os.path.join("frames", "final") |
| if not os.path.exists(final_dir): |
| os.makedirs(final_dir) |
| print(f"Created directory: {final_dir}") |
| |
| frame_counter = 1 |
| total_subs = len(subs) |
| |
| print(f"π― Processing {total_subs} subtitle segments...") |
| |
| |
| segments_to_process = min(16, total_subs) |
| |
| for i, sub in enumerate(subs[:segments_to_process], 1): |
| print(f"π Processing segment {i}/{segments_to_process}: {sub.content[:50]}...") |
| |
| |
| sub_dir = f"frames/sub{sub.index}" |
| if not os.path.exists(sub_dir): |
| os.makedirs(sub_dir) |
| |
| try: |
| |
| frames = extract_frames(video, sub_dir, |
| sub.start.total_seconds(), |
| sub.end.total_seconds(), |
| 3) |
| |
| if frames: |
| |
| best_frame = _select_best_frame_simple(frames) |
| |
| if best_frame and frame_counter <= 16: |
| |
| final_name = f"frame{frame_counter:03}.png" |
| copy_and_rename_file(best_frame, final_dir, final_name) |
| print(f"π Frame {frame_counter}: {sub.content[:30]}...") |
| frame_counter += 1 |
| |
| except Exception as e: |
| print(f"β οΈ Error processing segment {i}: {e}") |
| continue |
| |
| frames_generated = frame_counter - 1 |
| print(f"β
Generated {frames_generated} frames using simplified method") |
| |
| |
| if frames_generated < 16: |
| print(f"π Duplicating frames to reach 16 total...") |
| for i in range(frames_generated + 1, 17): |
| |
| source_frame = f"frame{((i-1) % frames_generated) + 1:03}.png" |
| source_path = os.path.join(final_dir, source_frame) |
| target_path = os.path.join(final_dir, f"frame{i:03}.png") |
| |
| if os.path.exists(source_path): |
| import shutil |
| shutil.copy2(source_path, target_path) |
| print(f"π Duplicated frame{i:03}.png") |
| |
| return True |
|
|
| def _select_best_frame_simple(frames): |
| """Select best frame using simple criteria""" |
| if not frames: |
| return None |
| |
| if len(frames) == 1: |
| return frames[0] |
| |
| |
| best_frame = None |
| best_score = 0 |
| |
| for frame_path in frames: |
| try: |
| img = cv2.imread(frame_path) |
| if img is not None: |
| |
| variance = np.var(img) |
| if variance > best_score: |
| best_score = variance |
| best_frame = frame_path |
| except: |
| continue |
| |
| |
| return best_frame if best_frame else frames[len(frames)//2] |
|
|
| if __name__ == "__main__": |
| |
| generate_keyframes_simple("video/IronMan.mp4") |