查看原文
其他

全动态视频应用:如何在地图上显示正在播放的视频,并始终正确定位?

少钧 开源情报俱乐部 2024-05-22

说明
本文案例简单概括的来讲,就是如何将空中拍摄的视频,在地图上精准匹配并定位。效果见下面视频
前言

对于许多地理空间从业者来说,遥感数据意味着一件事:正射校正的光栅图像。自上而下的静态图像占据当今使用的遥感数据的大部分。无论图像传感器安装在无人机 (UAV)、机载系统(固定翼或直升机)还是卫星上,交付给遥感专家的产品通常是一幅或多幅离散的正射图像。本文将尝试揭示另一种更难以捉摸的遥感数据类型:全动态视频 (FMV)。

全动态视频(FMV)

全动态视频一词有一些公认的定义。FMV意味着相机传感器可能处于运动状态的视频。视频帧之间存在可辨别运动的任何视频都可以被视为FMV。也有定义FMV指的是视频游戏中的一种技术,其中动作通过视频剪辑发生。

本文涉及前两种意义上的全运动视频:以传感器位置和视频帧观看区域可以始终在地理位置上定位的方式收集,并且可以显示视频帧之间的运动。这种类型的全动态视频在下文中将简称为“视频”。

架空视频并不是一个新概念。平常都看过天气和警用直升机的镜头,并且许多商用无人机默认收集视频。一些商业卫星还收集视频(例如Planet SkySatEarth-i Vivid-iSatellogic Full Motion Video)。地理应用程序中使用数据的能力因数据集和提供商/制造商而异。

为了适合地理分析和显示,需要快速收集的视频内元数据,嵌入视频数据内或旁边。对于尽可能多的时间点,至少应提供或导出以下元数据:时间以及帧角和传感器位置的3D地理坐标。

虽然总体上对于地理视频元数据尚未达成真正的共识,但最流行的机载视频标准是运动图像标准委员会 (MISB) 推荐的标准。此类推荐标准之一是KLV(密钥长度值),它指定兼容的元数据包(在各个时间点嵌入视频文件中的元数据)。如果视频数据不包含KLV数据流,则必须由数据提供商或传感器制造商定义和交付定制元数据。
当前的免费开源地理视频工具生态系统是有限的。这篇文章中使用或参考的主要工具是:
lQGIS FMV插件:了解全动态视频代码的绝佳资源
lklvdata:用于解码KLV元数据的Python模块

lFFmpeg / FFmpeg-python:用于处理视频文件的CLI和关联的Python绑定

这篇文章将概述一个可扩展、标准化、免费和开源的工作流程,用于在地图上准备和显示俯视视频内容。         

 

示例视频

该视频展示了一辆卡车在高速公路上行驶,而机载摄像机在头顶盘旋。

实现效果

如何在地图上显示正在播放的视频,并始终正确定位。

元数据结构

在开始这个项目之前,只知道几个信息:
  • Mapbox GL JSMapLibre将在视频源/图层示例:MapboxMapLibre)内播放视频,以四个地理角坐标为界。可以随时间更新这些坐标,以便将视频与地理位置同步。   
  • 希望这个工作流程是可扩展的,因此需要一个标准化的配置或元数据文件,以提供足够的信息来驱动地图(无论给定任何视频)。
  • 熟悉STAC规范,但没有定义包含视频特定元数据的架构。

新的视频扩展是一组标准化的属性和建议,用于描述包含视频资产的项目。具体来说,该扩展引入了项目级属性,例如像素尺寸、帧计数/速率和文件编码。还将在此工作流程中使用推荐的伴随矢量资源,最重要的是,那些分配的资源角色包含“video:frame_geometries”和“video:sensor_centers”。

理想情况下,几何文件足以启用这样的动画,随着时间的推移正确定位传感器和视频帧:

从视频文件或相关元数据导出所需的几何形状。

数据准备

除了标准视频和音频通道之外,示例视频(MPEG-2传输流,*.ts)在数据通道中还包含KLV 编码的元数据。虽然可以按原样使用视频并在运行时提取KLV流,但它至少很复杂,并且需要一些超出掌握的自定义JavaScript。根据设计,即时使用现场KLV元数据将符合视频扩展。

采取的解决方案是预先提取KLV元数据,并将框架几何形状和传感器中心存储在sidecar geojson文件中。

使用一些免费可用的工具,可以像这样提取和解码帧角坐标:

1、将数据流复制到临时二进制文件,并为输入 .ts 文件 ($fname) 和输出 .bin 文件 ($outbin) 设置变量:    

$ ffmpeg -i $fname -map d -codec copy -f data $outbin

2、在Python中,安装/导入klvdata模块后,可以像下面这样解析二进制文件。元数据的每个实例都是一个包含所有KLV字段的字典,包括角坐标、传感器坐标和时间戳值,这些字段可以写入asset geojson 文件中:
with open(outbin, 'rb') as f: for packet in klvdata.StreamParser(f): metadata=packet.MetadataList() # extract desired metadata and write to geojson here

3、还可以将传输流视频文件转换为mp4格式,其中我为 $fname 和 $outmp4 设置了变量:

$ ffmpeg -i $fname -c:v libx264 -crf 0 -c:a copy $outmp4 -y

4、最后一步是创建一个实现视频扩展的STAC项目。可以在此处找到示例。请注意视频属性以及资产的组织方式(视频和geojson文件的资产,按资产角色指示和分组)。

  • 可选:不保证每个视频帧都有相应的KLV编码元数据包。在示例视频中,有4441个帧,但只有711个元数据数据包,这意味着视频帧数大约是已知帧位置的六倍。其结果是视频看起来以明显停止的方式移动,在每个位置停滞6帧。此问题的解决方案是在已知位置之间插入帧位置,可以通过在已知角坐标之间插入中间帧角坐标来实现:

插入帧角坐标以在从元数据包提取的已知角坐标之间平滑过渡。

最终地图

最后,在地图上加载并播放视频。最基本的架构如下所示,其中UI直接引用单个视频文件,并在播放期间循环浏览帧几何图形:    

稍微复杂一点的架构如下所示,其中UI向STAC API(规范,示例实现)发出请求,以获取存储在数据库中的单个STAC项。然后,可以使用STAC项中的href来请求与s3中存储的视频和geojson资产相对应的短期URL(例如AWS 预签名URLAzure SAS 令牌)。最后,可以使用生成的url 来请求和使用地图中的资产数据。临时URL并不能解决所有的访问问题,但至少链接会在给定的时间后过期,并且在 API 级别获得了一些访问控制。

可以在gist中看到采用上述架构的地图UI的代码。
 gist链接:https://gist.github.com/darrenwiens/2efce0f9c13860399f03361cb4de4099
带有移动视频的最终地图如下所示:

FMV 使用文章中介绍的工作流程生成,包括插值帧坐标和自由浮动相机。

使用Mapbox GL JS FreeCamera API,以及要点中的相同代码,设置 `sync_camera=true`,还可以从原始传感器的角度观看视频:

 FMV使用本博客文章中介绍的工作流程生成,包括插值帧坐标和同步相机。

参考资料
KLV:https://en.wikipedia.org/wiki/KLV
示例视频:https://www.arcgis.com/home/item.html?id=55ec6f32d5e342fcbfba376ca2cc409a
STAC目录:https://github.com/stac-extensions/video    
STAC API规范:https://github.com/radiantearth/stac-api-spec/
STAC示例实现:https://github.com/stac-utils/stac-fastapi 
FreeCamera APIhttps://docs.mapbox.com/mapbox-gl-js/api/properties/#freecameraoptions



往期文章
一个有关境外国家军队、警察和国防部队的免费开源数据库【值得收藏】
单位机构如何快速培养专业的网络情报分析师人才?
几款免费查看历史地图图像的数据源
如何利用开源网络情报进行室内地理定位?【情报案例】
如何定位乌克兰巴拉克利亚酷刑室的具体位置【案例学习】
地理定位俄罗斯试图阻止瓦格纳集团反叛车队前往莫斯科的挖掘机位置【情报案例】
一文让你全面了解地理空间和地理空间情报(Geoint)
如何快速精准定位乌克兰炼油厂火灾中爆炸的具体储油罐?
【网络情报高阶实战案例】如何使用开源卫星数据进行情报项目调查
照片信息非常有限情况下,如何通过结构化分析方法来进行精准地理定位?
网络地理定位美国宇航局肯尼迪航天中心附近美国白头鹰巢穴【情报案例】
值得收藏的网络情报海外调查昵称帐号的几款调查工具【情报工具】
经典干货案例,国际记者如何利用开源网络情报追踪国际毒枭飞机下落及秘密机场【情报案例】
继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存