本页介绍了允许嵌入 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 读数后,只需记录集成的全球朝向。 这三个值表示角度轴矢量,例如:旋转角度(以弧度表示)由矢量的长度给定,旋转轴由归一化矢量给定。 可以使用 编码后的表示法可以使用 |
|
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_metadata 和 pts_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 压力以及标头大小
(例如
stsc
和stsz
Atom)。 - 以不同的延迟时间混合使用不同类型的数据可能会导致 PTS 同时执行 在有数据包写入文件时反向更新不过,您可以通过 缓冲数据包并以单调顺序写入它们。