Especificaciones de metadatos de movimiento de la cámara

En esta página, se describe una especificación que permite que los archivos MP4 incorporen metadatos sobre el movimiento de la cámara durante la captura de video. Por lo general, los dispositivos que capturan video tienen sensores que pueden proporcionar información adicional sobre la captura. Por ejemplo:

  • Generalmente, los teléfonos celulares tienen sensores para giroscopio, acelerómetro, magnetómetro y GPS.
  • La fusión de sensores se puede utilizar para realizar un seguimiento de los 3 grados de libertad (3DoF) de los dispositivos.
  • Se pueden usar la localización y la asignación simultáneas (SLAM) para hacer un seguimiento de la pose de 6 grados de libertad (6DoF) del dispositivo (por ejemplo, Tango).
  • La información de exposición se puede usar para interpolar el movimiento por escaneo.

Estos metadatos se pueden guardar en el video para su posterior procesamiento avanzado en varias aplicaciones. Por ejemplo:

  • La información de rotación a nivel de marco se puede usar para estabilizar videos y los datos de movimiento a nivel de línea de análisis se pueden usar para reducir los efectos del obturador.
  • Las lecturas de IMU y las poses de 3DoF derivadas se pueden usar para evaluar la alineación del tiempo y la alineación geométrica entre IMU y la cámara.

En las siguientes secciones, se especifica la pista de metadatos de movimiento de la cámara (CAMM), que incluye una nueva entrada de muestra que indica la existencia de la pista y el formato de datos de estas.

Entrada de muestra

El archivo de video debe contener el siguiente cuadro de entrada de muestra para indicar la pista de metadatos personalizados, y el subComponentType de la pista debe establecerse en 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') {
}
  

Formato de los datos

La pista de metadatos contiene un flujo de muestras de metadatos con el siguiente formato.

Campo Unidad Descripción
uint16 reserved;
Reservado. Debe ser 0.
uint16 type;
El tipo de paquete de datos (consulta a continuación). Cada paquete tiene un tipo de datos.
switch (type) {
  case 0:
    float angle_axis[3];
  break;
          

Orientación del eje del ángulo en radianes que representan la rotación de las coordenadas de la cámara local a un sistema de coordenadas mundial Las aplicaciones definen el sistema de coordenadas mundial.

Supongamos que M es la matriz de rotación de 3×3 que corresponde al vector del eje del ángulo. Para cualquier rayo X en el sistema de coordenadas local, la dirección del rayo en las coordenadas mundiales es M * X.

Esta información se puede obtener al ejecutar la fusión de sensores 3DoF en el dispositivo. Después de integrar las lecturas de IMU, solo se debe registrar la orientación global integrada.

Los tres valores representan el vector de ángulo, de modo que el ángulo de rotación en radianes se define por la longitud del vector y el eje de rotación se indica por el vector normalizado.

La representación codificada se puede crear desde un eje y ángulo con float[3] angle_axis := angle_radians * normalized_axis_vec3. Un ángulo positivo representa una rotación a la izquierda alrededor del eje.

Y la representación codificada se puede volver a transformar en un eje y ángulo con float[3] axis := normalize(axis_angle) y float angle_radians := length(angle_axis).

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

Estos metadatos corresponden a cada fotograma de video. El tiempo de presentación (PTS) de estos metadatos debe ser el inicio de la exposición de la primera línea de análisis que se usa en un fotograma de video.

pixel_exposure_time_ns es el tiempo de exposición de un solo píxel en nanosegundos y rolling_shutter_skew_time_ns es el retraso entre la exposición de la primera línea de análisis y la última línea usada. Se pueden usar para interpolar los metadatos por análisis.

El PTS del marco correspondiente debe estar dentro de pts_of_this_metadata y pts_of_this_metadata + pixel_exposure_time_ns +rolling_shutter_skew_time_ns.

Cuando esta información no se guarda, el dispositivo hace su mejor esfuerzo para ajustar los PTS del fotograma del video a fin de que este quede en el centro de la exposición.

  case 2:
    float gyro[3];
  break;
          
radianes/segundos

Señal de giroscopio en radianes/segundos alrededor de los ejes XYZ de la cámara. La rotación es positiva en el sentido antihorario.

Las aplicaciones definen la relación entre el sistema de coordenadas IMU y el sistema de coordenadas de la cámara. Te recomendamos alinearlos si es posible.

Ten en cuenta que las lecturas iniciales del giroscopio están en el sistema de coordenadas IMU definido por su controlador y se requiere una transformación adecuada para convertirla en el sistema de coordenadas de la cámara.

Consulta Android Sensor.TYPE_GYROSCOPE.

  case 3:
    float acceleration[3];
  break;
          
metros/segundos^2

Lectura del acelerómetro en metros/segundo^2 a lo largo de los ejes XYZ de la cámara.

Las aplicaciones definen la relación entre el sistema de coordenadas IMU y el sistema de coordenadas de la cámara. Te recomendamos alinearlos si es posible.

Consulta Android Sensor.TYPE_ACCELEROMETER.

  case 4:
    float position[3];
  break;
          

Posición 3D de la cámara. La posición 3D y la rotación del eje en ángulo definen la posición de 6DoF de la cámara y se encuentran en un sistema de coordenadas común definido por la aplicación.

Para obtener esta información, ejecuta el seguimiento de 6DoF en el dispositivo.

  case 5:
    double latitude;
    double longitude;
    double altitude;
  break;
          
grados

Coordenada mínima de GPS de la muestra.

  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: el tiempo desde el epoch GPS en el que se realizó la medición

gps_fix_type: 0 ( sin corrección), 2 (corrección en 2D) y 3 (corrección en 3D)

latitude: latitud en grados.

longitud: Longitud en grados.

altitude: altura sobre el elipsoide WGS-84.

horizontal_accuracy: Precisión horizontal (lat./long.)

vertical_accuracy: Precisión vertical (altitud)

velocity_east: Velocidad en el este

velocity_north: Velocidad en el norte.

velocity_up: velocidad en dirección ascendente

speed_accuracy: La precisión de la velocidad

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

Campo magnético ambiental

Consulta Android Sensor.TYPE_MAGNETIC_FIELD.

}

Notas

  • Debería haber solo una pista de CAMM por archivo MP4, que contenga todos los tipos de datos anteriores al combinarlos.
  • Las muestras GPS en los casos 5 y 6 deben ser valores sin procesar generados por sensores. No se pueden interpolar ni repetir cuando no hay un cambio de GPS.
  • Los sistemas de coordenadas tienen la derecha. El sistema de coordenadas de la cámara se define como X apuntando hacia la derecha, Y apuntando hacia abajo y Z apuntando hacia adelante. El eje Y del sistema de coordenadas global debe apuntar hacia abajo a lo largo del vector de gravedad.
  • Las lecturas de IMU suelen estar en un sistema de coordenadas de IMU independiente, y se necesita rotación para asignarlas al sistema de coordenadas de la cámara si los dos sistemas de coordenadas son diferentes.
  • Todos los campos son de formato little-endian (con el byte menos importante primero) y los puntos flotantes de 32 bits tienen el formato IEEE 754-1985.
  • Para sincronizar con precisión el marco de video y los metadatos, el PTS del marco de video debe estar en el centro de su exposición (también se puede inferir de los metadatos de exposición).
  • La aplicación que combina estos datos debe elegir una escala de tiempo lo suficientemente grande para obtener un PTS preciso.

Posibles problemas

  • Este diseño solo permite un paquete por muestra de datos. Los dispositivos incorporados pueden tener problemas para escribir paquetes de alta frecuencia porque aumentan la presión de E/S, así como el tamaño del encabezado (por ejemplo, los átomos stsc y stsz) si el tamaño del paquete varía.
  • La combinación de diferentes tipos de datos con diferentes retrasos puede hacer que la PTS avance y retroceda a medida que se escriben los paquetes en el archivo. Sin embargo, esto se puede solucionar al almacenar en búfer paquetes y escribirlos en orden monótono.