gps - 将行车记录仪 .MOV 文件中的十六进制转换为纬度经度

标签 gps hex latitude-longitude

我有一个 OEM 行车记录仪,可以将视频保存为 .MOV 格式。我想以编程方式从视频文件中提取嵌入的 GPS 数据。在十六进制编辑器中打开 .mov 文件后,我发现带有 freeGPS header 的数据包,我可以确认我的 7 秒示例视频有 7 个数据包,因此我知道 GPS 数据来自哪里。

我已经找到了日期和时间,但我无法将十六进制值转换为纬度经度。以下是使用 Registrator Viewer 提取时的十六进制值及其等效坐标。

273108AC1C7996404E,0D022B873EA3C74045 - 14.637967,121.041475 516B9A771C7996404E,0D022B873EA3C74045 - 14.637963,121.041475 B9FC87F41B7996404E,52499D803EA3C74045 - 14.637955,121.041472 B9FC87F41B7996404E,52499D803EA3C74045 - 14.637955,121.041472 B459F5B91A7996404E,C442AD693EA3C74045 - 14.637935,121.041460 1DEBE2361A7996404E,ACADD85F3EA3C74045 - 14.637927,121.041455 08CE19511A7996404E,4FD1915C3EA3C74045 - 14.637928,121.041453

粗体字节直接转换为@N和@E,所以我认为它们不是转换的一部分。我已经尝试过以下答案,但没有成功获得正确的坐标。

How to convert GPS Longitude and latitude from hex

How to convert my binary (hex) data to latitude and longitude?

我已经向行车记录仪提供商发送了一封电子邮件,要求他们提供协议(protocol)文档,但他们似乎没有协议(protocol)文档,因为当我要求他们提供自己的视频播放器时,他们发送了 Registrator Viewer。

我还将包含第一个 freeGPS 数据包,以防我看错地方。

00 00 80 00 66 72 65 65 47 50 53 20 98 00 00 00 78 2E 78 78 00 00 00 00 00 00 00 00 00 00 00 00 30 30 30 30 30 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 03 00 00 00 27 00 00 00 41 00 00 00 27 31 08 AC 1C 79 96 40 4E 00 00 00 00 00 00 00 0D 02 2B 87 3E A3 C7 40 45 00 00 00 00 00 00 00 8F C2 F5 28 5C 8F E2 3F 48 E1 7A 14 AE 07 68 40 11 00 00 00 06 00 00 00 14 00 00 00 76 00 00 00 88 00 00 00 DE 00 00 00 4D 00 00 00 49 00 00 00 4F 00 00 00 2D 00 00 00 2B 00 00 00 00 00 00 00

按顺序提取的粗体数据:freeGPS、时间、纬度@N?、经度@E?、日期

我可以确认时间和日期是正确的。速度应该是 1km/h,但我也找不到。

提前感谢那些可以提供帮助的人。

编辑: 这是测试视频的链接。 Test Video

最佳答案

不确定这有多大帮助,但如果您将十六进制字符串(包括末尾的 0x40)转换为小端 IEEE-754 double 实数,那么您将获得大约 100 倍的纬度/经度。

在C中,我做了类似的事情

printf( "%f\n", *(double*)"\x27\x31\x08\xAC\x1C\x79\x96\x40" );
printf( "%f\n", *(double*)"\x0D\x02\x2B\x87\x3E\xA3\xC7\x40" );

然后就出来了

1438.278000
12102.488500

更新感谢@ TDG

如果 1438.278 被解释为 14 度 38.278 分钟,那么您将得到十进制值 14.6379666666666667。如果 12102.4885 被解释为 121 度 2.4885 分钟,则十进制等效值是 121.041475

执行此操作的一些示例 C 代码

#include<stdio.h>
double convert( double input ) {
  int i = input/100;
  return ( input - i*100 ) / 60 + i;
}
int main(){
  printf( "%f\n", convert( *(double*)"\x27\x31\x08\xAC\x1C\x79\x96\x40" ) );
  printf( "%f\n", convert( *(double*)"\x0D\x02\x2B\x87\x3E\xA3\xC7\x40" ) );
}

关于gps - 将行车记录仪 .MOV 文件中的十六进制转换为纬度经度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45473204/

相关文章:

安卓2点间GPS导航

android - ACCESS_COARSE_LOCATION 权限可在 Android 上提供手机信号塔精度

javascript - 如何循环每个可能的十六进制数字 (00 - FF)

mysql - Wordpress 距离搜索 SQL

c# - 将纬度经度坐标转换为图像 map 坐标

php - Mysql,复杂的Where子句会减慢查询速度

android - 检测 phonegap 中的假/模拟位置?

iphone - 根据设备 iPhone 或 iPod touch 关闭功能

c - 如何从 C 中的文本文件中读取十六进制数据

python - Python中的整数到十六进制的转换