Skip to content

Latest commit

 

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Garmin Card Reader

A Garmin dash cam chops your drives into a few hundred one-minute videos and leaves them on the card with nothing to say which ones belong together. The filenames are no help: the numbering wraps around, so the highest number isn't the newest. Finding the two minutes you care about means opening files one by one and guessing.

This reads the card, puts the pieces back into drives, and plays each one straight through. It sets aside the clips where you started the engine and went nowhere, and it hands a drive to VLC if you'd rather watch it there.

A drive can also be exported as one MP4. The fragments share an encoder configuration, so the export copies their coded samples and rebuilds the index around them: nothing is decoded, nothing is re-encoded, and it runs as fast as the card reader. Garmin's private text track is the one thing left behind — the writer would have to invent a sample description it cannot read.

Grab a build from Releases. macOS, Windows, Linux.

Running it from source

bun install
bun run dev      # the app, with hot reload
bun run build    # installers land in src-tauri/target/release/bundle

Before committing:

cd src-tauri && cargo test --all-features
cd src-tauri && cargo clippy --all-features --all-targets -- -D warnings
cd frontend && bun run check

Resizing the app window to check the layout is a pain, so a small server hands the same card over HTTP and you can run the whole interface in a browser instead:

cd src-tauri && cargo run --features devserver --bin devserver
cd frontend && bun run dev

If you touch how the card is read

Everything in src-tauri/src/library/ was worked out by reading a real card, not from any documentation. Each of these cost a measurement or a bug:

  • Sort clips by the time the camera recorded them, never by filename. The numbering wraps around.
  • A clip runs 60.06 seconds, not 60. Round it off and a long drive drifts by several seconds.
  • Never treat a locked recording as throwaway. A crash clip is often a few seconds long, which is exactly the footage the cleanup panel must not offer to delete.
  • A clip cut short by the power dropping can't break a scan. Keep whatever survived and flag it.
  • A fragment's tracks don't all fill the minute it declares: audio starts 19 ms late and ends 28 ms early. Join fragments without carrying that slack and the sound drifts further ahead of the picture with every minute.

The webview reaches recordings over a loopback port with a token in the path, not through a custom URI scheme. WebKit cancels range requests whenever the player seeks or swaps its buffered element, and answering a cancelled scheme task raised an Objective-C exception that aborted the process mid-playback.

About

Desktop reader for Garmin dash cams

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Contributors

Languages