Suite

Comment extraire les informations GPS des fichiers vidéo Garmin Cam 20


Je viens de recevoir une Garmin Dash Cam 20 et d'enregistrer des vidéos avec, et j'ai également confirmé que le propre lecteur de Garmin peut afficher les informations GPS sur une carte.

Je n'arrive pas à trouver d'informations techniques sur l'endroit où les informations GPS sont stockées (en supposant que dans le fichier AVI à ce stade) contrairement à une autre caméra d'action Garmin que j'ai qui stocke le GPS séparément dans un fichier GPX. J'ai besoin de m'intégrer à un système, donc utiliser manuellement le lecteur de Garmin pour l'extraire n'est pas une option.

Quelqu'un a-t-il des indications sur l'endroit où les informations GPS pourraient être stockées ?

Il y a aussi de l'audio sur la vidéo, il ne semble donc pas qu'il soit encodé dans le flux audio.


Les fichiers vidéo enregistrés avec la garmin dash cam 20 sont des fichiers RIFF AVI. Il y a un morceau GR20 dans le fichier qui contient une séquence de données binaires de 36 octets. Chaque 36 octet correspond à environ une trame, dans cet ordre :

octets |type |description ------+--------+--------------------------- 0 -4 |int32 |Numéro de trame 6-8 |int16 |Vitesse en Km/h 8-12 |int32 |Longitude (au format personnalisé, voir les commentaires) 12-16 |int32 |Latitude (au format personnalisé, voir les commentaires) 16- 20 |int32 |Heure (au format horaire unix) 20-24 |int32 |sens de déplacement (0-359) 24-28 |single |G sensor axe 1 28-32 |single |G sensor axe 2 32-36 |single | Capteur G axe 3 ------+--------+----------------------------

La longitude et la latitude dans le fichier sont de type int32 et ne sont pas de vraies latitude et longitude, vous devez les diviser avec 11930464.3017314 nombre flottant pour obtenir de vrais lat/long en degrés. par exemple, si vous obtenez la valeur '612222120' à partir des octets 8 à 12, vous devez la diviser numériquement par 11930464.3017314, ce qui donne :

612222120/11930464.3017314 = 51.31586705

Qui est la longitude en degrés.

Après les 36 premiers octets, vous devez recommencer pour le deuxième et ainsi de suite jusqu'à ce que le morceau se termine. La longueur du morceau est multipliée par 36. J'ai le même problème mais grâce à jagabo, j'ai ma réponse ici (ce qui m'amène ici):

Exemple d'analyseur pour trouver des morceaux (y compris GR02) dans un fichier RIFF de manière pragmatique avec C # est ici


J'ai récemment acheté la Garmin Dash Cam 35, en espérant que ce format sera similaire. Eh bien, ce n'est pas le cas.

Tout d'abord : les fichiers sont MP4, pas AVI. Les données GPS semblent être stockées dans 22 octets de message SEI. J'ai pu l'extraire en utilisant mp4parser en scala :

import com.coremedia.iso.IsoFile import com.googlecode.mp4parser.authoring.samples.DefaultMp4SampleList /** * Créé par matemaciek le 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 jusqu'à samples.size).map(samples.get ).map( sample => ( (0 jusqu'à 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("
") println(csv) } decode("E:DCIM103UNSVDGRMN0845.MP4")

J'essaie de faire de l'ingénierie inverse pour savoir où se trouve - Résultats jusqu'à présent :

octets |type |description ------+--------+--------------------------- 0 -9 |Inconnu |Inconnu (toujours 00 14 50 4E 44 4D 00 00 00 00) 10-11 |int16 |Vitesse en Km/h 12-13 |Inconnu |Inconnu (généralement 01 00, en cas d'événement 01 01 - certains genre de drapeaux ?) 14-17 |int32 |Longitude 18-21 |int32 |Latitude ------+--------+--------------- -------------

Les coordonnées sont au même format que dans la Dash Cam 20, j'ai ajusté le facteur de division de sorte que lorsque le signal GPS est perdu, il renvoie exactement -180 (comme le fait le logiciel de Garmin).