相機動態中繼資料規格

本頁說明允許嵌入 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 +roll_shutter_skew_time_ns.

若未儲存這些資訊,裝置會盡可能嘗試 將影片影格的 PTS 調整為影格曝光中心的位置。

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

相機 XYZ 軸周圍的陀螺儀訊號 (以弧度/秒為單位)。旋轉為 以逆時針方向指向正值

應用程式會定義 IMU 座標系統和相機之間的關係 座標系統建議您盡量採用一致的規則。

請注意,初始陀螺儀讀數位於其驅動程式定義的 IMU 座標系統。 需要進行適當的轉換,才能將其轉換成相機座標系統。

請參閱 Android Sensor.TYPE_GYROSCOPE。

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

沿著相機 XYZ 軸移動的加速計讀數 (單位為公尺/秒^2)。

應用程式會定義 IMU 座標系統和相機之間的關係 座標系統建議您盡量採用一致的規則。

請參閱「Android Sensor.TYPE_ACCELEROMETER」。

  case 4:
    float position[3];
  break;
          

相機的 3D 位置。3D 位置和角度軸的旋轉角度會共同定義 6DoF 的姿勢,以及常見的應用程式定義座標 有些人會將 Cloud Storage 視為檔案系統 但實際上不是

只要在裝置上執行 6DoF 追蹤功能,就能取得這項資訊。

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

樣本的最小 GPS 座標。

  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 - 緯度度數

經度 - 經度,以度為單位

海拔高度 - 高於 WGS-84 橢球體的高度

horizontal_accuracy - 水平 (經緯度) 準確性

vertical_accuracy:產業 (海拔高度) 準確性

velocity_east - 往東方向的速率

velocity_north - 北方的速率

velocity_up - 往上速度的速率

speed_accuracy - 速度準確度

  case 7:
    float magnetic_field[3];
  break;
          
微特拉

環境磁場。

請參閱 Android Sensor.TYPE_MAGNETIC_FIELD。

}

附註

  • 每個 MP4 檔案只能有一個 CAMM 音軌,其中包含上述所有資料類型 多工處理即可
  • 在案件 5 和 6 的情況下,GPS 樣本必須是感應器產生的原始值。換句話說 在沒有 GPS 變更時插入或重複。
  • 座標系統位於右側。相機座標系統定義為 X 也就是 Y 指向向下、Z 方向指向前方全球衛星定位系統的 Y 軸 座標系統應沿著重心向量向下指向。
  • IMU 讀數通常位於獨立的 IMU 座標系統,必須旋轉 如果兩個座標系統不同,則將其對應至相機座標系統。
  • 所有欄位均為小由小到大排列 (優先度最低的位元組),以及 32 位元的浮動值 點的格式為 IEEE 754-1985。
  • 為了準確同步處理影片影格和中繼資料,影片影格的 PTS 資料 需位於曝光中心 (也可透過曝光中繼資料推斷)。
  • 混合這項資料的應用程式應選擇夠長的時間量, 取得精確的 PTS

潛在問題

  • 採用這項設計時,每個資料樣本只能有一個封包。內嵌裝置可能會有寫入問題 頻率偏高的封包,因為這樣會增加 I/O 壓力和標頭大小 (例如 stscstsz Atom)。
  • 混合不同類型的資料並具有不同的延遲時間,可能會導致 PTS 持續 並在封包寫入檔案時反向。不過,只要達成這個目標 緩衝封包,並按單調順序寫入。