このページでは、MP4 ファイルの埋め込みを可能にする仕様について説明します。 動画キャプチャ中のカメラの動きに関するメタデータ。動画をキャプチャするデバイスでは通常、 センサーがあります。次に例を示します。
- スマートフォンには通常、ジャイロスコープ、加速度計、磁力計、GPS のセンサーが搭載されています。
- センサー フュージョンは、デバイスの 3 自由度(3DoF)ポーズを追跡するために使用できます。
- 同時ローカライズとマッピング(SLAM)を使用して 6 自由度を追跡できる デバイスのポーズ(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; |
角度軸の向き。ローカルのカメラ座標からワールド座標系への回転をラジアンで表します。ワールド座標系はアプリケーションによって定義されます。 角度軸ベクトルに対応する 3x3 回転行列を M とします。ローカル座標系の光線 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 + 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 位置。3 次元の位置と角度軸の回転を組み合わせて カメラの 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 - 経度(度単位) altitude - 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; |
ミクロテスラ |
周囲磁場。 Android Sensor.TYPE_MAGNETIC_FIELD を参照してください。 |
} |
メモ
- MP4 ファイルごとに、上記のデータタイプをすべて含む CAMM トラックを 1 つだけ含めてください。 多重化されます。
- ケース 5 と 6 の GPS サンプルは、センサーによって生成された未加工の値である必要があります。以下の行為は許可されません。 GPS の変化がないときに、補間または繰り返します。
- 座標系は右側です。カメラの座標系は X で定義されます。 それぞれ右向き、Y 下向き、Z 範囲が前向きです。地球儀の Y 軸は 座標系は重力ベクトルに沿って下を向く必要があります。
- IMU の読み取り値は、通常、個別の IMU 座標系になります。そのためには回転が必要です。 2 つの座標系が異なる場合は、それらをカメラの座標系にマッピングします。
- すべてのフィールドはリトル エンディアン(最下位バイトが最初)で、32 ビット浮動小数点は IEEE 754-1985 形式です。
- 動画フレームとメタデータを正確に同期させるため、動画フレームの PTS (露出メタデータからも推測できます)。
- このデータを多重化するアプリケーションでは、100 ミリ秒未満になるのに十分な時間スケールを選択する必要があります。 トレーニングされます。
可能性のある問題
-
この設計では、データサンプルごとに 1 つのパケットのみが許可されます。組み込みデバイスで書き込み中に問題が発生する可能性があります
I/O 負荷が増加し、ヘッダーサイズが増大するため、非常に高頻度なパケットが
(たとえば、
stsc
およびstsz
Atoms)を指定します。 - さまざまな種類のデータを異なる遅延で混在させると、PTS が両方とも進行する可能性がある パケットがファイルに書き込まれるにつれてただしこれは パケットをバッファリングし、単調な順序で書き込みます。