Spaces:
Sleeping
Sleeping
| #!/usr/bin/env python3 | |
| """ | |
| Test FFmpegFrameReader to match exactly how the pipeline reads frames. | |
| """ | |
| import json | |
| import logging | |
| import sys | |
| from pathlib import Path | |
| # Add src to path | |
| sys.path.insert(0, str(Path(__file__).parent.parent / "src")) | |
| from video.ffmpeg_reader import FFmpegFrameReader | |
| from readers import ReadPlayClock | |
| from setup import DigitTemplateLibrary | |
| logging.basicConfig(level=logging.INFO, format="%(message)s") | |
| # Video path | |
| VIDEO_PATH = "/Users/andytaylor/Documents/Personal/cfb40/full_videos/OSU vs Oregon 01.01.25.mkv" | |
| def load_session_config(config_path: str) -> dict: | |
| """Load session config.""" | |
| with open(config_path, "r", encoding="utf-8") as f: | |
| return json.load(f) | |
| def main(): | |
| # Load config | |
| config = load_session_config("output/OSU_vs_Oregon_01_01_25_config.json") | |
| # Set up playclock coordinates | |
| playclock_coords = ( | |
| config["scorebug_x"] + config["playclock_x_offset"], | |
| config["scorebug_y"] + config["playclock_y_offset"], | |
| config["playclock_width"], | |
| config["playclock_height"], | |
| ) | |
| print(f"Playclock coords: {playclock_coords}") | |
| # Load templates | |
| library = DigitTemplateLibrary() | |
| if not library.load("output/debug/digit_templates"): | |
| print("ERROR: Could not load templates") | |
| return | |
| reader = ReadPlayClock(library, config["playclock_width"], config["playclock_height"]) | |
| # Test timestamps | |
| timestamps = [ | |
| (4104, 4115, "Known working - plays detected here"), | |
| (4125, 4145, "Gap around 4136s - missed play"), | |
| (6640, 6660, "Known working - plays detected here"), | |
| (6675, 6695, "Gap around 6684s - missed play"), | |
| ] | |
| for start, end, desc in timestamps: | |
| print(f"\n{'=' * 70}") | |
| print(f"{desc}") | |
| print(f"Testing {start}s to {end}s using FFmpegFrameReader (matches pipeline)") | |
| print("=" * 70) | |
| with FFmpegFrameReader(VIDEO_PATH, start, end, frame_interval=0.5) as reader_ctx: | |
| count = 0 | |
| detected = 0 | |
| for timestamp, frame in reader_ctx: | |
| result = reader.read_from_fixed_location(frame, playclock_coords, padding=10) | |
| status = f"value={result.value}, conf={result.confidence:.2f}" if result.detected else f"NOT DETECTED (conf={result.confidence:.2f})" | |
| if result.detected: | |
| detected += 1 | |
| count += 1 | |
| if count <= 10 or result.detected: # Show first 10 or any detected | |
| print(f" t={timestamp:.1f}s: {status}") | |
| print(f"\n Detection rate: {detected}/{count} ({100*detected/count:.1f}%)") | |
| if __name__ == "__main__": | |
| main() | |