A PyQt6-based desktop application for parsing MoTeC .ld telemetry files and overlaying real-time telemetry data onto video recordings.
- Parse MoTeC LD telemetry files with GPS support
- Visualize telemetry data with configurable overlays:
- RPM Gauge: Semicircular tachometer with color-coded zones (blue/green/yellow/red)
- G-G Diagram: Lateral and longitudinal G-force scatter plot with trail history
- Bar Overlay: Generic telemetry bar for throttle/brake/any scalar channel
- Text Overlay: Generic telemetry text readout with format options
- GPS Track: Track map showing current position ± 10 seconds
- Video player with draggable overlays
- Dual-handle timeline range selection for export in/out
- Plot-based sync workflow using fixed-width telemetry selection window
- Drag-and-drop overlay positioning
- Offline FFmpeg export with burned-in overlays (MP4/H.264 + AAC)
- Export progress, cancel, overwrite warning, and done state in export dialog
uv syncuv run main.pyCommand line options:
uv run main.py --ld-file path/to/data.ld --video-file path/to/video.mp4
uv run main.py --config path/to/config.json- Load telemetry with LD File....
- Load video with Video File....
- Click Parse to populate channels.
- Select channels to display in telemetry plots.
- Set video in/out segment using timeline range handles.
- Move the plot selection window to align telemetry with video (this sets sync offset).
- Click Export and choose output path/quality.
- Drag telemetry selection window to change sync offset.
- Arrow keys on plot window: nudge by 1.0s.
- Shift + Arrow: nudge by 0.1s.
- Hold Arrow for ~3s: nudge by 10.0s steps.
├── main.py # Entry point
├── config.py # Application configuration constants
├── parsers/
│ ├── ldparser.py # MoTeC LD file parser
│ └── gps_parser.py # GPS coordinate utilities
├── models/
│ ├── telemetry_data.py # Parsed telemetry container
│ ├── channel.py # Single channel data/interpolation
│ └── overlay_instance.py # Overlay config/state model
├── widgets/
│ ├── rpm_gauge.py # Tachometer widget
│ ├── gg_diagram.py # G-force diagram
│ ├── bar_overlay.py # Generic telemetry bar overlay
│ ├── text_overlay.py # Generic telemetry text overlay
│ ├── gps_track.py # GPS track map
│ ├── channel_plot.py # Time-series plot + fixed selection region
│ ├── multi_channel_plot.py # Linked stack of channel plots
│ ├── range_slider.py # Timeline with range handles + playhead
│ └── overlay_widget.py # Shared overlay behavior
├── views/
│ ├── main_window.py # Main application window
│ ├── video_player.py # QMediaPlayer + timeline + overlay scene
│ ├── settings_panel.py # Overlay settings UI
│ └── export_dialog.py # Export options/progress dialog
├── controllers/
│ ├── data_controller.py
│ ├── playback_controller.py
│ └── export_renderer.py # Offline FFmpeg export renderer
└── utils/
├── math_utils.py
└── video_exporter.py
- Python 3.10+
- PyQt6
- pyqtgraph
- numpy
- FFmpeg (
ffmpegandffprobeavailable inPATH)