相机运动元数据规范

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">

本页介绍了允许嵌入 MP4 文件的规范 有关拍摄视频期间相机移动的元数据。用于拍摄视频的设备通常 可提供关于拍摄的其他信息的传感器。例如:

  • 手机通常配备有陀螺仪、加速度计、磁力计和 GPS 传感器。
  • 传感器融合可用于跟踪设备的 3 个自由度 (3DoF) 姿势。
  • 可使用同步定位和映射 (SLAM) 来跟踪 6 个自由度 设备的姿势 (6DoF)(例如,Tango)。
  • 曝光信息可用于插入每次扫描的运动。

这些元数据可保存在视频中,以便在各种应用中进行高级后处理。 例如:

  • 帧级旋转信息可用于稳定视频,扫描线级运动数据可用于减少滚动快门效果。
  • IMU 读数和推导的 3DoF 位置方向可用于评估 IMU 与相机之间的时间校准和几何对齐方式。

以下部分指定了 CAmera Motion Metadata (CAMM) 轨道,其中包括一个新样本 条目。

示例条目

视频文件应包含以下示例输入框,以指明自定义元数据 轨道,并且轨道的 subComponentType 应设置为 meta

Camera Motion Metadata Sample Entry (camm)

Definition
Box Type: camm
Container: stsd
A sample entry indicating the data track that saves the camera motion.

Syntax
aligned(8) class CameraMotionMetadataSampleEntry extends SampleEntry('camm') {
}
  

数据格式

元数据轨道包含元数据样本流,其格式如下。

字段 单位 说明
uint16 reserved;
已保留。应为 0。
uint16 type;
数据包的类型(请参阅下文)。每个数据包都有一种数据类型。
switch (type) {
  case 0:
    float angle_axis[3];
  break;
          

角度轴方向(以弧度为单位),表示从局部镜头坐标到世界坐标系的旋转。世界坐标系由应用定义。

让 M 为与角度轴矢量对应的 3x3 旋转矩阵。对于局部坐标系中的任何光线 X,世界坐标中的光线方向均为 M * X。

通过在设备上运行 3DoF 传感器融合可获得此信息。集成 IMU 读数后,只需记录集成的全球朝向。

这三个值表示角度轴矢量,例如:旋转角度(以弧度表示)由矢量的长度给定,旋转轴由归一化矢量给定。

可以使用 float[3] angle_axis := angle_radians * normalized_axis_vec3 根据轴和角度创建编码表示法。正角度表示绕轴逆时针旋转。

编码后的表示法可以使用 float[3] axis := normalize(axis_angle)float angle_radians := length(angle_axis) 转换回某个轴和某个角度。

  case 1:
    int32 pixel_exposure_time;
    int32 rolling_shutter_skew_time;
  break;
          
纳秒

此元数据按视频帧划分。此元数据的呈现时间 (PTS) 是视频帧中第一个使用的扫描线的曝光起点。

pixel_exposure_time_ns 是 纳秒和 rolling_shutter_skew_time_ns 是 首次使用的扫描线和上次使用的扫描线的暴露。它们可用于 插入每次扫描的元数据。

相应帧的 PTS 不应超过 pts_of_this_metadatapts_of_this_metadata + Pixel_exposure_time_ns + deployment_shutter_skew_time_ns

如果这些信息未保存,设备应尽最大努力 调整视频帧的 PTS,使其位于帧曝光的中心。

  case 2:
    float gyro[3];
  break;
          
弧度/秒

绕相机 XYZ 轴的陀螺仪信号(以弧度/秒为单位)。“轮播”现为 为逆时针方向为正值。

应用定义了 IMU 坐标系和相机之间的关系 坐标系我们建议您尽可能将它们对齐。

请注意,初始陀螺仪读数采用其驱动程序定义的 IMU 坐标系, 需要进行适当的转换才能将其转换为镜头坐标系。

请参阅 Android 传感器.TYPE_GYROSCOPE。

  case 3:
    float acceleration[3];
  break;
          
米/秒^2

沿相机 XYZ 轴的加速度计读数(以米/秒^2 为单位)。

应用定义了 IMU 坐标系和相机之间的关系 坐标系我们建议您尽可能将它们对齐。

请参阅 Android 传感器.TYPE_ACCELEROMETER。

  case 4:
    float position[3];
  break;
          

相机的 3D 位置。3D 位置和角度轴同时旋转定义 相机的 6DoF 位置方向,并且位于由应用定义的通用坐标 系统。

您可以通过在设备上运行 6DoF 跟踪来获取此信息。

  case 5:
    double latitude;
    double longitude;
    double altitude;
  break;
          

样本的最小 GPS 坐标。

<ph type="x-smartling-placeholder">
  case 6:
    double time_gps_epoch;
    int gps_fix_type;
    double latitude;
    double longitude;
    float altitude;
    float horizontal_accuracy;
    float vertical_accuracy;
    float velocity_east;
    float velocity_north;
    float velocity_up;
    float speed_accuracy;
  break;
          
seconds

degrees
degrees
meters
meters
meters
meters/seconds
meters/seconds
meters/seconds
meters/seconds
          

time_gps_epoch - 从进行测量的 GPS 纪元开始的时间

gps_fix_type - 0(无修复)、2(2D 修复)、3(3D 修复)

latitude - 纬度(以度为单位)

longitude - 经度(以度为单位)

海拔 - 高于 WGS-84 椭球体的高度

horizontal_accuracy - 水平(纬度/经度)精确度

vertical_accuracy - 垂直(海拔)精确度

velocity_east - 向东方向的速度

velocity_north - 北方向的速度

velocity_up - 向上方向的速度

speed_accuracy - 速度精确度

<ph type="x-smartling-placeholder">
  case 7:
    float magnetic_field[3];
  break;
          
Microtesla

环境磁场。

请参阅 Android 传感器.TYPE_MAGNETIC_FIELD。

}

备注

  • 每个 MP4 文件中应该只有一个 CAMM 音轨,其中包含上述所有类型的数据 进行多路复用
  • 情况 5 和情况 6 中的 GPS 样本必须是传感器生成的原始值。它们不能 当 GPS 没有变化时,采用插值法或重复输入值。
  • 坐标系位于右侧。镜头坐标系定义为 X。 Y 指向右侧,Y 指向下方,Z 指向前。全球地球的 Y 轴 坐标系应沿着重力矢量向下指向。
  • IMU 读数通常存储在单独的 IMU 坐标系中,因此需要旋转 如果两个坐标系不同,则将它们映射到镜头坐标系。
  • 所有字段均采用小端字节序(最低有效字节在前),而 32 位浮点值 点的格式为 IEEE 754-1985。
  • 为了准确同步视频帧和元数据,视频帧的 PTS 也应位于曝光的中心(也可从曝光元数据中推断出)。
  • 对这些数据进行多路复用的应用应选择足够大的时间尺度,以获得 准确得分。

潜在问题

  • 这种设计只允许每个数据样本有一个数据包。嵌入式设备可能会出现写入问题 超高频数据包,因为它会增加 I/O 压力以及标头大小 (例如 stscstsz Atom)。
  • 以不同的延迟时间混合使用不同类型的数据可能会导致 PTS 同时执行 在有数据包写入文件时反向更新不过,您可以通过 缓冲数据包并以单调顺序写入它们。