全动态视频应用:如何在地图上显示正在播放的视频,并始终正确定位?
对于许多地理空间从业者来说,遥感数据意味着一件事:正射校正的光栅图像。自上而下的静态图像占据当今使用的遥感数据的大部分。无论图像传感器安装在无人机 (UAV)、机载系统(固定翼或直升机)还是卫星上,交付给遥感专家的产品通常是一幅或多幅离散的正射图像。本文将尝试揭示另一种更难以捉摸的遥感数据类型:全动态视频 (FMV)。
全动态视频(FMV)
本文涉及前两种意义上的全运动视频:以传感器位置和视频帧观看区域可以始终在地理位置上定位的方式收集,并且可以显示视频帧之间的运动。这种类型的全动态视频在下文中将简称为“视频”。
架空视频并不是一个新概念。平常都看过天气和警用直升机的镜头,并且许多商用无人机默认收集视频。一些商业卫星还收集视频(例如Planet SkySat、Earth-i Vivid-i和Satellogic Full Motion Video)。地理应用程序中使用数据的能力因数据集和提供商/制造商而异。
为了适合地理分析和显示,需要快速收集的视频内元数据,嵌入视频数据内或旁边。对于尽可能多的时间点,至少应提供或导出以下元数据:时间以及帧角和传感器位置的3D地理坐标。
lFFmpeg / FFmpeg-python:用于处理视频文件的CLI和关联的Python绑定
这篇文章将概述一个可扩展、标准化、免费和开源的工作流程,用于在地图上准备和显示俯视视频内容。
示例视频
该视频展示了一辆卡车在高速公路上行驶,而机载摄像机在头顶盘旋。
实现效果
元数据结构
Mapbox GL JS和MapLibre将在视频源/图层(示例:Mapbox、MapLibre)内播放视频,以四个地理角坐标为界。可以随时间更新这些坐标,以便将视频与地理位置同步。 希望这个工作流程是可扩展的,因此需要一个标准化的配置或元数据文件,以提供足够的信息来驱动地图(无论给定任何视频)。 熟悉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
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 预签名URL或Azure SAS 令牌)。最后,可以使用生成的url 来请求和使用地图中的资产数据。临时URL并不能解决所有的访问问题,但至少链接会在给定的时间后过期,并且在 API 级别获得了一些访问控制。
FMV 使用文章中介绍的工作流程生成,包括插值帧坐标和自由浮动相机。
使用Mapbox GL JS FreeCamera API,以及要点中的相同代码,设置 `sync_camera=true`,还可以从原始传感器的角度观看视频:
FMV使用本博客文章中介绍的工作流程生成,包括插值帧坐标和同步相机。