Spaces:
Sleeping
Sleeping
| # FFmpeg Clip Generation Methods | |
| This document describes the different FFmpeg methods available for generating video clips from detected plays. | |
| ## Benchmark Summary | |
| Tested on 20 plays (~3.8 minutes of video) from OSU vs Tennessee 12.21.24: | |
| | Method | Time | Speedup | File Size | Accuracy | | |
| |--------|------|---------|-----------|----------| | |
| | **Parallel Stream Copy** | 0.8s | **77x** | 132 MB | Keyframe-aligned (~1s variance) | | |
| | **Ultrafast Preset** | 15.2s | **4x** | 371 MB | Frame-accurate | | |
| | **Baseline (Re-encode)** | 63.0s | 1x | 161 MB | Frame-accurate | | |
| ## Available Methods | |
| ### 1. `stream_copy` (Default) | |
| **Command-line:** `--clip-method stream_copy` or omit flag | |
| Uses FFmpeg's stream copy mode (`-c copy`) to extract clips without re-encoding, then concatenates them. Clips are extracted in parallel for maximum speed. | |
| **Pros:** | |
| - Extremely fast (77x faster than re-encoding) | |
| - Smallest file size (preserves original encoding) | |
| - No quality loss | |
| **Cons:** | |
| - Cuts must align to keyframes (typically every 2-5 seconds in broadcast video) | |
| - Each clip may have ~1-2 extra seconds of footage | |
| - Total output may be ~10% longer than expected | |
| **Best for:** Quick turnaround, highlight reels where extra footage is acceptable | |
| ### 2. `ultrafast` | |
| **Command-line:** `--clip-method ultrafast` | |
| Re-encodes video using libx264 with the `ultrafast` preset. This is the fastest encoding option while maintaining frame-accurate cuts. | |
| **Pros:** | |
| - Frame-accurate cuts (exact start/end times) | |
| - 4x faster than baseline encoding | |
| - Good balance of speed and accuracy | |
| **Cons:** | |
| - Larger file size (2.3x baseline due to less compression) | |
| - Still slower than stream copy | |
| **Best for:** When frame-accurate cuts are important but speed is still a priority | |
| ### 3. `reencode` | |
| **Command-line:** `--clip-method reencode` | |
| Re-encodes video using libx264 with the `fast` preset and CRF 23. This is the original method used in main.py. | |
| **Pros:** | |
| - Frame-accurate cuts | |
| - Best compression ratio (smallest re-encoded file) | |
| - Highest quality per file size | |
| **Cons:** | |
| - Slowest method | |
| - CPU-intensive | |
| **Best for:** Final production output where file size and quality matter most | |
| ## Technical Details | |
| ### Keyframe Alignment (Stream Copy) | |
| Video files use keyframes (I-frames) as reference points. When using stream copy: | |
| - FFmpeg can only cut cleanly at keyframe boundaries | |
| - Broadcast video typically has keyframes every 2-5 seconds | |
| - The `--padding` already adds 2 seconds before/after each play, so keyframe variance is usually absorbed | |
| ### Parallel Processing | |
| The `stream_copy` method uses Python's `concurrent.futures.ThreadPoolExecutor` with 4 workers to extract clips simultaneously, providing additional speedup beyond just avoiding re-encoding. | |
| ## Benchmark Details | |
| Full benchmark results are saved in: | |
| - `output/ffmpeg_benchmark/benchmark_results.json` | |
| Individual method outputs for comparison: | |
| - `output/ffmpeg_benchmark/1_baseline_reencode/output.mp4` | |
| - `output/ffmpeg_benchmark/2_stream_copy/output.mp4` | |
| - `output/ffmpeg_benchmark/3_parallel_stream_copy/output.mp4` | |
| - `output/ffmpeg_benchmark/5_ultrafast/output.mp4` | |
| ## Usage Examples | |
| ```bash | |
| # Default (fastest - parallel stream copy) | |
| python main.py --video "full_videos/game.mp4" | |
| # Explicit stream copy | |
| python main.py --video "full_videos/game.mp4" --clip-method stream_copy | |
| # Frame-accurate with faster encoding | |
| python main.py --video "full_videos/game.mp4" --clip-method ultrafast | |
| # Original method (best compression) | |
| python main.py --video "full_videos/game.mp4" --clip-method reencode | |
| ``` | |