Mer

Slik trekker du ut GPS -informasjon fra Garmin Cam 20 videofiler


Jeg har nettopp fått en Garmin Dash Cam 20 og tatt opp noen videoer med den, og bekreftet også at Garmins egen spiller kan vise GPS -informasjonen på et kart.

Jeg ser ikke ut til å finne noen teknisk informasjon om hvor GPS -informasjonen er lagret (forutsatt i AVI -filen på dette tidspunktet) i motsetning til noen annen Garmin actionkamera jeg har som lagrer GPS -en separat i en GPX -fil. Jeg må integrere med et system, så manuelt å bruke Garmins spiller for å trekke ut det er ikke et alternativ.

Er det noen som har noen tips om hvor GPS -informasjonen kan lagres?

Det er også lyd på videoen, så den ser ikke ut som den er kodet i lydstrømmen.


Videofilene som er spilt inn med garmin dash cam 20 er RIFF AVI -filer. Det er en GR20 -del i filen som inneholder sekvens med 36 byte -lengde binære data. Hver 36 byte er omtrent en ramme, i denne rekkefølgen:

byte | type | beskrivelse ------+--------+---------------------------- 0 -4 | int32 | Ramme nummer 6-8 | int16 | Hastighet i km/t 8-12 | int32 | Lengdegrad (i egendefinert format, se kommentarer) 12-16 | int32 | Latitude (i tilpasset format, se kommentarer) 16- 20 | int32 | Tid (i unix-tidsformat) 20-24 | int32 | kjøreretning (0-359) 24-28 | enkel | G-sensorakse 1 28-32 | enkel | G-sensorakse 2 32-36 | enkel | G sensorakse 3 ------+--------+----------------------------

Lengdegrad og breddegrad i filen er av int32 -typen, og de er ikke ekte breddegrad og lengdegrad, du bør dele dem med 11930464.3017314 flytende tall for å få ekte lat/long i grader. for eksempel hvis du får verdien '612222120' fra byte 8-12, så bør du dele det numerisk med 11930464.3017314, hvilket resultat er:

612222120/11930464.3017314 = 51.31586705

Som er lengdegrad i grader.

Etter de første 36 byte bør du starte på nytt for den andre og så videre til enden slutter. Chunk lengden er multiplisere med 36. Jeg har det samme problemet, men takket være jagabo har jeg svaret mitt her (som fører meg til her):

Eksempel på parser for å finne biter (inkludert GR02) i RIFF -fil pragmatisk med C# er her


Jeg har nylig kjøpt Garmin Dash Cam 35, i håp om at formatet vil være likt. Vel, det er det ikke.

Først av alt: filer er MP4, ikke AVI. GPS -data ser ut til å være lagret i 22 byte SEI -melding. Jeg klarte å trekke det ut ved hjelp av mp4parser i scala:

import com.coremedia.iso.IsoFile import com.googlecode.mp4parser.authoring.samples.DefaultMp4SampleList/*** Opprettet av matemaciek 01.09.2016. */ def decode (track: String) {val GPS_TRACK_IDX = 3 val iso = new IsoFile (track) val samples: DefaultMp4SampleList = new DefaultMp4SampleList (GPS_TRACK_IDX, iso) val csv = (0 til samples.size) .map (samples.get) ) .map (sample => ((0 til sample.getSize.toInt) .map ("%02X" format sample.asByteBuffer.get (_)). mkString, sample.asByteBuffer.getShort (10), sample.asByteBuffer. getInt (14), sample.asByteBuffer.getInt (18), sample.asByteBuffer.getInt (14) / 11930464.711111112, sample.asByteBuffer.getInt (18) / 11930464.711111112)). map (_. productIterator.mkString (",")) ) .mkString (" n") println (csv)} dekode ("E:  DCIM  103UNSVD  GRMN0845.MP4")

Jeg prøver å reversere hva som er hvor - Resultater så langt:

byte | type | beskrivelse ------+--------+---------------------------- 0 -9 | Ukjent | Ukjent (alltid 00 14 50 4E 44 4D 00 00 00 00) 10-11 | int16 | Hastighet i km/t 12-13 | Ukjent | Ukjent (vanligvis 01 00, i tilfelle hendelse 01 01-noen slags flagg?) 14-17 | int32 | Lengdegrad 18-21 | int32 | Breddegrad ------+--------+--------------- -------------

Koordinater er i samme format som i Dash Cam 20, jeg har justert delingsfaktoren, så når GPS -signalet går tapt returnerer det nøyaktig -180 (som Garmins programvare gjør).