このページでは、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; |
データパケットのタイプ(下記参照)。各パケットには 1 種類のデータがあります。 | |
switch (type) { |
||
case 0: float angle_axis[3]; break; |
ローカルカメラの座標からワールド座標系への回転を表すラジアンの角度軸方向。世界座標系はアプリケーションによって定義されます。 M は、角度軸のベクトルに対応する 3x3 回転行列とします。ローカル座標系の光線 X の場合、ワールド座標の光線方向は M * X になります。 この情報は、デバイスで 3DoF センサー フュージョンを実行することによって取得できます。IMU 測定値の統合後は、統合されるグローバルな向きのみを記録する必要があります。 この 3 つの値は角度軸のベクトルを表します。ラジアンの回転角度はベクトルの長さで、回転軸は正規化されたベクトルです。 エンコードされた表現は、 エンコードされた表現は、 |
|
case 1: int32 pixel_exposure_time; int32 rolling_shutter_skew_time; break; |
ナノ秒 |
このメタデータは動画フレーム単位です。このメタデータの表示時間(PTS)は、動画フレーム内で最初に使用されるスキャンラインの露出の開始時刻にする必要があります。 pixel_exposure_time_ns は 1 ピクセルのナノ秒単位の露出時間、rolling_shutter_skew_time_ns は最初に使用されたスキャンラインと最後に使用されたスキャンラインの露出間の遅延です。スキャンごとにメタデータを補間するために使用できます。 対応するフレームの PTS は、pts_of_this_metadata と pts_of_this_metadata + pixel_exposure_time_ns +ローリング_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 座標。 |
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 センサー.TYPE_MAGNETIC_FIELD をご覧ください。 |
} |
備考
- CAMP トラックは MP4 ファイルごとに 1 つのみとし、上記のデータタイプをすべてまとめて多重化します。
- ケース 5 と 6 の GPS サンプルは、センサーによって生成される未加工の値でなければなりません。GPS の変更がない限り、補間や繰り返しを行うことはできません。
- 座標系は右側です。カメラ座標系は、X が右を指し、Y が下向き、Z が前方を指すように定義されます。グローバル座標系の Y 軸は、重力ベクトルを下向きにする必要があります。
- 通常、IMU 読み取り値は別の IMU 座標系にあり、2 つの座標系が異なる場合は、回転をカメラ座標系にマッピングする必要があります。
- すべてのフィールドはリトル エンディアン(最下位バイト)であり、32 ビット浮動小数点数は IEEE 754-1985 形式です。
- 動画フレームとメタデータを正確に同期させるには、動画フレームの PTS を露出の中心に置く必要があります(露出メタデータから推測することもできます)。
- このデータを多重化するアプリは、正確な PTS を取得するのに十分な時間スケールを選択する必要があります。
発生しうる問題
-
この設計では、データサンプルごとに 1 つのパケットのみが許可されます。埋め込みデバイスでは、I/O の負荷が増大し、ヘッダーサイズ(
stsc
やstsz
原子など)が変動するため、非常に高い頻度のパケットの書き込みで問題が発生する可能性があります。 - さまざまな種類のデータを異なる遅延で混合すると、パケットがファイルに書き込まれる際に PTS が前後に行く場合があります。ただし、パケットをバッファリングして単調な順序で書き込むと、この問題を解決できます。