Cette page décrit une spécification qui permet aux fichiers MP4 d'être intégrés des métadonnées sur le mouvement de la caméra pendant l'enregistrement vidéo. Les appareils qui enregistrent des vidéos ont généralement qui peuvent fournir des informations supplémentaires sur la capture. Exemple :
- Les téléphones mobiles sont généralement équipés de capteurs pour gyroscope, accéléromètre, magnétomètre et GPS.
- La fusion des capteurs peut être utilisée pour suivre la posture des appareils à trois degrés de liberté (3DoF).
- La localisation et la cartographie simultanées (SLAM) peuvent être utilisées pour suivre les 6 degrés de liberté. (6DoF) de l'appareil (tango, par exemple).
- Les informations d'exposition peuvent être utilisées pour interpoler un mouvement par ligne de balayage.
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 la ligne de balayage peuvent être utilisées pour réduire les effets de l'obturateur roulant.
- Les mesures de l'IMU et les poses 3DoF dérivées peuvent être utilisées pour évaluer l'alignement temporel et géométrique entre l'IMU et l'appareil photo.
Les sections ci-dessous spécifient la piste CAMM (CAmera Motion Metadata), qui inclut un nouvel échantillon qui indique l'existence du titre et le format des données des échantillons de titres.
Exemple d'entrée
Le fichier vidéo doit contenir l'exemple de champ d'entrée suivant pour indiquer les métadonnées personnalisées
piste, et son subComponentType
doit être défini 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'échantillons de métadonnées formatés comme suit.
Champ | Unité | Description |
---|---|---|
uint16 reserved; |
Réservé. Doit être égal à 0. | |
uint16 type; |
Type du 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 de l'angle en radians représentant la rotation entre les coordonnées locales de la caméra et un système de coordonnées mondiales. Le système de coordonnées mondiales est défini par les applications. Soit M la matrice de rotation 3x3 correspondant au vecteur de l'axe de l'angle. Pour tout rayon X situé dans le système de coordonnées local, la direction du rayon dans les coordonnées mondiales est M * X. Pour obtenir ces informations, lancez la fusion des capteurs 3DoF sur l'appareil. Après l'intégration des lectures de l'IMU, seule l'orientation globale intégrée doit être enregistrée. Les trois valeurs représentent le vecteur de l'axe de l'angle, de sorte que l'angle de rotation en radians est donné par la longueur du vecteur, et l'axe de rotation est donné par le vecteur normalisé. La représentation encodée peut être créée à partir d'un axe et d'un angle avec De plus, la représentation encodée peut être reconvertie en axe et en angle avec |
|
case 1: int32 pixel_exposure_time; int32 rolling_shutter_skew_time; break; |
nanosecondes |
Ces métadonnées sont définies par image vidéo. L'heure de présentation (PTS) de ces métadonnées doit le début de l'exposition de la première ligne de balayage utilisée dans une image vidéo. pixel_exposure_time_ns est le temps d'exposition d'un seul pixel dans nanosecondes, et rolling_shutter_skew_time_ns est le délai entre l'exposition de la première et de la dernière utilisée. Ils peuvent être utilisés pour interpoler les métadonnées par ligne de balayage. Le PTS de la trame correspondante doit se situer dans 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 doit s'efforcer au mieux de Ajustez le PTS de l'image vidéo pour qu'il se trouve au centre de l'exposition de l'image. |
case 2: float gyro[3]; break; |
radians/seconde |
Signal du gyroscope en radians/seconde autour des axes XYZ de la caméra. La valeur Rotation est positif dans le sens inverse des aiguilles d'une montre. Les applications définissent la relation entre le système de coordonnées IMU et l'appareil photo. le système de coordonnées. Si possible, nous vous recommandons de les aligner. Notez que les relevés initiaux du gyroscope sont dans le système de coordonnées IMU défini par le conducteur. et une transformation correcte est nécessaire pour le convertir en système de coordonnées de la caméra. Reportez-vous à Android Sensor.TYPE_GYROSCOPE. |
case 3: float acceleration[3]; break; |
mètres/secondes^2 |
Relevé de l'accéléromètre en mètres/seconde^2 le long des axes XYZ de l'appareil photo. Les applications définissent la relation entre le système de coordonnées IMU et l'appareil photo. le système de coordonnées. Si possible, nous vous recommandons de les aligner. Reportez-vous à Android Sensor.TYPE_ACCELEROMETER. |
case 4: float position[3]; break; |
Position 3D de la caméra. La position en 3D et la rotation de l'axe de l'angle définissent Position 6DoF de l'appareil photo, à une position commune définie par l'application du système d'exploitation. 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. <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 : temps écoulé depuis l'epoch GPS à laquelle la mesure a été effectuée gps_fix_type - 0 ( pas de correction), 2 (correction 2D), 3 (correction 3D) latitude : latitude en degrés. longitude : longitude en degrés altitude : hauteur au-dessus de l'ellipsoïde WGS84 horizontal_accuracy : précision horizontale (lat/long) vertical_accuracy : précision de la verticale (altitude) velocity_east : vitesse vers l'est velocity_north : vitesse vers le nord velocity_up : vitesse ascendante speed_accuracy : précision de la vitesse. <ph type="x-smartling-placeholder"> |
case 7: float magnetic_field[3]; break; |
Microtesla |
Champ magnétique ambiant. Reportez-vous à 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 combinant.
- Dans les cas 5 et 6, les échantillons GPS doivent être des valeurs brutes générées par les capteurs. Elles ne peuvent pas être interpolées ou répétées en l'absence de changement GPS.
- Les systèmes de coordonnées sont à droite. Le système de coordonnées de la caméra est défini sur X. pointant vers la droite, Y vers le bas et le Z vers l'avant. L'axe Y de l'échelle le système de coordonnées doit pointer vers le bas le long du vecteur de gravité.
- Les relevés de l'IMU se trouvent généralement dans un système de coordonnées IMU distinct, et 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 small-endian (l'octet de poids est le moins important en premier) et le nombre flottant de 32 bits sont au format IEEE 754-1985.
- Pour synchroniser avec précision l'image vidéo et les métadonnées, le PTS de l'image vidéo doivent être au centre de son exposition (elle peut également être déduite des métadonnées d'exposition).
- L'application qui combine ces données doit choisir une échelle de temps suffisamment grande pour obtenir une PTS précis.
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 d'écriture
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
etstsz
) si la taille des paquets varie. - La combinaison de différents types de données avec des délais différents peut faire avancer le PTS à la fois. et vers l'arrière à mesure que des paquets sont écrits dans le fichier. Cependant, cela peut être remédié par la mise en mémoire tampon des paquets et leur écriture dans un ordre monotone.