Prerequisites
Before you begin, make sure you have:- Python 3.11+ installed
- FFmpeg installed and in your system PATH
- Completed the installation steps
- At least 2 video files to synchronize (
.mp4,.mov, or.avi)
Choose Your Sync Method
The application supports two synchronization methods. You must choose one before starting the application by editingsrc/config.py:
- Visual (Motion)
- Audio (GCC-PHAT)
src/config.py
- Silent videos or poor audio quality
- Videos with significant motion/activity
- Noisy recording environments
The sync method cannot be changed from the UI — you must set it in
src/config.py before starting the application.Synchronize Your Videos
Start the application
From the project root directory, run:You should see output indicating the Flask server is running:
Upload your videos
- Click the upload area or drag and drop your video files
- Select 2 or more videos (
.mp4,.mov, or.aviformats) - Wait for the uploads to complete
/tmp/video_synchronization/raw/).Run synchronization
- Click the Synchronize button
- The system will process your videos using the configured sync method
- Wait for processing to complete (time depends on video length and count)
Review the results
Once sync completes, you’ll see:
- A multi-video preview player
- Universal seek bar controlling all videos simultaneously
- Audio master toggle (only one video plays audio at a time)
- Computed time offsets for each video
- Confidence scores for the alignment
Export synchronized videos
Click the Download button to export all synchronized videos as a ZIP archive.The output files will have
_synced appended to their names and will be:- Time-aligned to a common reference frame
- Padded to the same duration (with black frames and silence)
- Re-encoded with FFmpeg for compatibility
Understanding the Output
Time Offsets
The system displays the computed time offset for each video:- Positive offset (
+2.5s): Video starts 2.5 seconds after the reference — black frames/silence added at the beginning - Negative offset (
-1.2s): Video starts 1.2 seconds before the reference — first 1.2 seconds trimmed - Zero offset (
0.0s): Video is the reference timeline
Confidence Scores
Each sync has a confidence score between 0.0 and 1.0:| Score | Interpretation |
|---|---|
> 0.7 | High confidence — reliable sync |
0.3 - 0.7 | Medium confidence — verify in preview |
< 0.3 | Low confidence — may be incorrect |
Example Session
Here’s what a typical sync session looks like:Next Steps
Using the UI
Learn about all UI features and advanced workflows
Configuration
Customize sync parameters and processing options
Core Concepts
Understand how the sync algorithms work
Interpreting Results
Learn how to interpret confidence scores and diagnostics
Troubleshooting
FFmpeg not found
FFmpeg not found
If you see errors about FFmpeg during sync or export:
- macOS:
brew install ffmpeg - Windows: Download from ffmpeg.org and add to PATH
- Linux:
sudo apt install ffmpeg
ffmpeg -versionLow confidence scores
Low confidence scores
If all confidence scores are below 0.3:
- Try the other sync method: Audio ↔ Visual
- Check video overlap: Ensure videos were recorded at the same time
- Verify content: Videos need sufficient motion (visual) or clear audio (audio method)
- Increase max_offset_sec: Edit
src/audio_sync.pyorsrc/visual_sync.pyif videos have large offsets
Out of memory errors
Out of memory errors
For large videos or many files:
- Reduce processing resolution: Edit
downsampleparameter insrc/visual_sync.py - Use audio sync: Generally more memory-efficient than visual
- Process fewer videos: Sync in batches of 3-4 instead of all at once
Sync takes too long
Sync takes too long
To speed up processing:
- Reduce frame skip: Edit
stepparameter insrc/visual_sync.py(default: 3) - Limit audio window: Edit
window_secinsrc/audio_sync.py(default: 30s) - Use audio sync: Typically faster than visual for videos under 10 minutes