相機動態中繼資料規格

本頁面說明允許 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 + scroll_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 姿勢,且位於通用的應用程式定義的座標系統中。

如要取得這項資訊,請在裝置上執行 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 修正)

緯度 - 緯度度數

經度 - 經度 (以度為單位)

height - 高於 WGS-84 橢圓的高度

horizontal_accuracy - 水平 (經緯度) 的正確性

vertical_accuracy - 垂直 (高度) 準確率

velocity_east - 往東的速度

velocity_north:北方速度

velocity_up - 向上移動的速度

speed_accuracy - 速度準確率

  case 7:
    float magnetic_field[3];
  break;
          
microtesla

環境磁場,

請參閱 Android Sensor.TYPE_MAGNETIC_FIELD。

}

附註

  • 每個 MP4 檔案只能有一個 CAMM 播放軌,其中包含互相混合在一起的上述所有資料類型。
  • 案例 5 和 6 的 GPS 樣本必須是感應器產生的原始值。即使全球衛星定位系統沒有變更,就無法進行內插或重複處理。
  • 座標系統為右側。相機座標系統定義為 X 指向 Y、Y 朝下,以及 Z 朝向。全球座標系統的 Y 軸應指向重力向量。
  • IMU 讀數通常位於獨立的 IMU 座標系統。如果兩個座標系統不同,就必須旋轉相片才能將相機對應到相機座標系統。
  • 所有欄位均以小端數字 (最低位元組) 為準,32 位元浮點的格式則採用 IEEE 754-1985。
  • 如要準確同步處理影片畫面和中繼資料,影片影格的 PTS 應在曝光位置置中 (從曝光中繼資料推論得出)。
  • 多工傳輸這項資料的應用程式應選擇夠大的時段,才能獲得準確的 PTS。

潛在問題

  • 這個設計只允許每個資料樣本一個封包。如果內嵌裝置會增加 I/O 壓力,以及標頭大小 (例如 stscstsz Atom),如果封包大小不同,則嵌入的裝置可能會發生問題。
  • 將不同類型的資料混用不同延遲可能會導致 PTS 在檔案寫入檔案時往前或向前前進。不過,您可以藉由緩衝區的方式寫入封包,並以單向順序寫入資料。