Caractéristiques des métadonnées de mouvement de la caméra

Cette page décrit une spécification permettant aux fichiers MP4 d'intégrer des métadonnées sur les mouvements de caméra lors de la capture vidéo. Les appareils qui enregistrent des vidéos disposent généralement de capteurs capables de fournir des informations supplémentaires. Exemple :

  • Les téléphones mobiles sont généralement équipés de capteurs pour le gyroscope, l'accéléromètre, le magnétomètre et le GPS.
  • La fusion des capteurs permet de suivre la position des appareils à 3 degrés de liberté (3DoF).
  • La localisation et la cartographie simultanées (SLAM) peuvent être utilisées pour suivre la pose à 6 degrés de liberté de l'appareil (par exemple, TalkBack).
  • Les informations d'exposition peuvent être utilisées pour interpoler les mouvements par scanline.

Ces métadonnées peuvent être enregistrées dans la vidéo pour un post-traitement avancé dans diverses applications. Exemple :

  • Les informations de rotation au niveau de l'image peuvent être utilisées pour stabiliser les vidéos, et les données de mouvement au niveau de l'exploration peuvent servir à réduire les effets de l'obturateur glissant.
  • Les mesures de la IMU et les postures dérivées de 3DoF peuvent être utilisées pour évaluer l'alignement temporel et l'alignement géométrique entre la IMU et l'appareil photo.

Les sections ci-dessous indiquent la piste CAMMA (Motion Motion Metadata), qui inclut un nouvel exemple d'entrée indiquant l'existence de cette piste et le format des données de son échantillon.

Exemple d'entrée

Le fichier vidéo doit contenir l'exemple de champ d'entrée suivant pour indiquer la piste de métadonnées personnalisées, et la propriété subComponentType de la piste doit être définie sur 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') {
}
  

Format des données

La piste de métadonnées contient un flux d'exemples de métadonnées au format suivant.

Champ Unité Description
uint16 reserved;
Réservé. Doit être 0.
uint16 type;
Type de paquet de données (voir ci-dessous). Chaque paquet contient un type de données.
switch (type) {
  case 0:
    float angle_axis[3];
  break;
          

Orientation de l'axe des angles en radians représentant la rotation entre les coordonnées de la caméra locale et un système de coordonnées mondiales. Le système de coordonnées mondiales est défini par des applications.

M correspond à la matrice de rotation 3x3 correspondant au vecteur d'axe d'angle. Pour toute rayon X dans le système de coordonnées locales, la direction du rayon dans le monde correspond à M * X.

Ces informations peuvent être obtenues en exécutant la fusion du capteur 3DoF sur l'appareil. Après avoir intégré les lectures de la IMU, seule l'orientation globale intégrée doit être enregistrée.

Les trois valeurs représentent le vecteur d'axe de l'angle : l'angle de rotation en radians est donné par la longueur du vecteur, et l'axe de rotation par le vecteur normalisé.

Vous pouvez créer la représentation encodée à partir d'un axe et d'un angle avec float[3] angle_axis := angle_radians * normalized_axis_vec3. Un angle positif représente une rotation dans le sens inverse des aiguilles d'une montre autour de l'axe.

La représentation encodée peut être reconvertie en axe et en angle avec float[3] axis := normalize(axis_angle) et float angle_radians := length(angle_axis).

  case 1:
    int32 pixel_exposure_time;
    int32 rolling_shutter_skew_time;
  break;
          
nanosecondes

Ces métadonnées sont définies par image vidéo. Le temps de présentation (PTS) de ces métadonnées doit correspondre au début de l'exposition de la première ligne de scan utilisée dans une image vidéo.

pixel_exposure_time_ns est la durée d'exposition d'un seul pixel en nanosecondes, et rolling_shutdown_skew_time_ns est le délai entre l'exposition de la première et de la dernière utilisation. Vous pouvez les utiliser pour interpoler des métadonnées par scanner.

Le PTS du cadre correspondant doit être compris entre pts_of_this_metadata et pts_of_this_metadata + pixel_exposure_time_ns + rolling_Shutter_skew_time_ns.

Lorsque ces informations ne sont pas enregistrées, l'appareil tente au mieux d'ajuster le PTS de l'image vidéo pour qu'il soit au centre de l'exposition de l'image.

  case 2:
    float gyro[3];
  break;
          
radians/secondes

Signal de gyroscope en radians/secondes autour des axes XYZ de la caméra. La rotation est positive dans le sens inverse des aiguilles d'une montre.

Les applications définissent la relation entre le système de coordonnées de la IMU et celui de la caméra. Nous vous recommandons de les aligner si possible.

Notez que les premières lectures de gyroscopes se trouvent dans le système de coordonnées de la IMU défini par son pilote. Une transformation adéquate est nécessaire pour le convertir en système de coordonnées de la caméra.

Voir Android Sensor.TYPE_GYROSCOPE.

  case 3:
    float acceleration[3];
  break;
          
mètres/secondes^2

Accéléromètre en mètres/seconde^2 le long des axes XYZ de la caméra.

Les applications définissent la relation entre le système de coordonnées de la IMU et celui de la caméra. Nous vous recommandons de les aligner si possible.

Voir Android Sensor.TYPE_ACCELEROMETER.

  case 4:
    float position[3];
  break;
          

Position 3D de la caméra. La rotation des positions 3D et des axes des angles définit la pose 6DoF de la caméra. Elles se trouvent dans un système de coordonnées commun défini par l'application.

Vous pouvez obtenir ces informations en exécutant le suivi 6DoF sur l'appareil.

  case 5:
    double latitude;
    double longitude;
    double altitude;
  break;
          
degrés

Coordonnée GPS minimale de l'échantillon.

  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 : temps écoulé depuis l'époque du GPS, lorsque la mesure a été effectuée

gps_fix_type : 0 ( aucun correctif), 2 (correctif en 2D), 3 (correctif 3D)

latitude : latitude en degrés

longitude : longitude en degrés

altitude : hauteur au-dessus de l'ellipsoïde WGS-84

horizontal_accuracy : précision horizontale (lat/long)

vertical_accuracy : précision verticale (altitude)

velocity_east : vélocité dans la direction est

velocity_north : vélocité dans la direction nord

velocity_up : vélocité dans la direction vers le haut

speed_accuracy : précision de la vitesse

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

Champ magnétique d'ambiance.

Voir Android Sensor.TYPE_MAGNETIC_FIELD.

}

Remarques

  • Il ne doit y avoir qu'une seule piste CAMM par fichier MP4, qui contient tous les types de données ci-dessus en les associant.
  • Dans les cas 5 et 6, les échantillons GPS doivent être des valeurs brutes générées par les capteurs. Ils ne peuvent pas être interpolés ni répétés en l'absence de changement de GPS.
  • Les systèmes de coordonnées sont situés à droite. Le système de coordonnées de la caméra est défini comme suit : X pointant vers la droite, Y pointant vers le bas et Z pointant vers l'avant. L'axe Y du système de coordonnées global doit être orienté vers le bas le long du vecteur de gravité.
  • Les mesures de la IMU sont généralement effectuées dans un système de coordonnées IMU distinct. Une rotation est nécessaire pour les mapper au système de coordonnées de la caméra si les deux systèmes de coordonnées sont différents.
  • Tous les champs sont en mode end-end (le octet le moins significatif en premier), et les points flottants 32 bits sont au format IEEE 754-1985.
  • Pour synchroniser avec précision le cadre vidéo et les métadonnées, le PTS du cadre vidéo doit être au centre de son exposition (il peut également être déduit des métadonnées d'exposition).
  • L'application utilisant ces données doit choisir une période suffisamment longue pour obtenir une valeur PTS précise.

Problèmes potentiels

  • Cette conception n'autorise qu'un seul paquet par échantillon de données. Les appareils intégrés peuvent rencontrer des problèmes pour écrire des paquets à très haute fréquence, car cela augmente la pression d'E/S, ainsi que la taille de l'en-tête (par exemple, les atomes stsc et stsz) si la taille du paquet varie.
  • En mélangeant différents types de données avec différents retards, le PTS peut à la fois avancer et reculer à mesure que des paquets sont écrits dans le fichier. Toutefois, vous pouvez résoudre ce problème en mettant en mémoire tampon les paquets et en les écrivant dans un ordre monotone.