En esta página, se describe una especificación que permite incorporar archivos MP4 metadatos sobre el movimiento de la cámara durante la captura de video. Los dispositivos que capturan video suelen tener que pueden proporcionar información adicional sobre la captura. Por ejemplo:
- Los teléfonos celulares suelen tener sensores para el giroscopio, el acelerómetro, el magnetómetro y el GPS.
- La fusión de sensores se puede usar para rastrear la pose de los 3 grados de libertad (3DoF) de los dispositivos.
- Se puede utilizar localización y mapeo simultáneo (SLAM) para hacer un seguimiento de los 6 grados de libertad. (6DoF) del dispositivo (por ejemplo, Tango).
- La información de exposición se puede usar para interpolar el movimiento por línea de escaneo.
Estos metadatos se pueden guardar en el video para un procesamiento posterior avanzado en varias aplicaciones. Por ejemplo:
- La información de rotación a nivel de los fotogramas se puede usar para estabilizar videos y los datos de movimiento a nivel de la 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 temporal y geométrica entre el 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 muestra nueva. que indique la existencia de la pista y el formato de datos de las muestras de seguimiento.
Entrada de muestra
El archivo de video debe contener la siguiente casilla de entrada de ejemplo para indicar los metadatos personalizados.
segmento. El subComponentType
del segmento 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 una transmisión de muestras de metadatos con el siguiente formato.
Campo | Unidad | Descripción |
---|---|---|
uint16 reserved; |
Reservado. Debe ser 0. | |
uint16 type; |
Es 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 angular en radianes que representa la rotación de las coordenadas locales de la cámara a un sistema de coordenadas mundiales. Las aplicaciones definen el sistema de coordenadas mundiales. Deja que M sea la matriz de rotación de 3x3 correspondiente 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 ejecutando la fusión de sensores 3DoF en el dispositivo. Después de integrar las lecturas del IMU, solo se debe grabar la orientación global integrada. Los tres valores representan el vector de eje de ángulo, de modo que el ángulo de rotación en radianes se obtiene por la longitud del vector y el eje de rotación se obtiene mediante el vector normalizado. La representación codificada se puede crear desde un eje y un ángulo con Y la representación codificada se puede volver a transformar en un eje y un ángulo con |
|
case 1: int32 pixel_exposure_time; int32 rolling_shutter_skew_time; break; |
nanosegundos |
Estos metadatos son por fotograma. El tiempo de presentación (PTS) de estos metadatos debe Es el inicio de la exposición de la primera línea de escaneo usada en un fotograma de video. pixel_exposure_time_ns es el tiempo de exposición de un solo píxel en nanoseconds y rolling_shutter_skew_time_ns es el retraso entre la línea de análisis que se usó primero y la última. Pueden usarse para interpolar metadatos por línea de análisis. El PTS de la trama correspondiente debe estar dentro de pts_of_this_metadata y pts_of_this_metadata + pixel_exposure_time_ns + rollsing_shtter_skew_time_ns. Si no se guarda esta información, el dispositivo debe hacer todo lo posible ajusta los PTS del fotograma para que estén en el centro de la exposición. |
case 2: float gyro[3]; break; |
radianes/segundo |
Señal del giroscopio en radianes/segundos alrededor de los ejes XYZ de la cámara. La rotación es positivo en sentido antihorario. Las aplicaciones definen la relación entre el sistema de coordenadas del IMU y la cámara de coordenadas. Recomendamos alinearlos si es posible. Ten en cuenta que las lecturas iniciales del giroscopio se encuentran en el sistema de coordenadas del IMU definido por su controlador. y se requiere una transformación adecuada para convertirlo al 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 del IMU y la cámara de coordenadas. 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 de ángulo definen en conjunto la 6DoF de la cámara y en una coordenada común definida por la aplicación en un sistema de archivos. 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: Es el tiempo transcurrido desde el ciclo de entrenamiento del GPS en el que se realizó la medición. gps_fix_type: 0 ( sin corrección), 2 (corrección 2D), 3 (corrección 3D) latitude: La latitud en grados. length: Es la longitud en grados. altitud: altura superior al elipsoide WGS-84 horizontal_accuracy: Precisión horizontal (lat./long). vertical_accuracy: Precisión vertical (altitud). velocity_east: Velocidad en dirección este. velocity_north: velocidad en la dirección norte. velocity_up: velocidad en dirección ascendente speed_accuracy: Precisión de la velocidad |
case 7: float magnetic_field[3]; break; |
microteslas |
Campo magnético ambiental. Consulta Android Sensor.TYPE_MAGNETIC_FIELD. |
} |
Notas
- Debe haber una sola pista de CAMM por archivo MP4 que contenga todos los tipos de datos mencionados anteriormente. si los combinas.
- Las muestras de GPS de los casos 5 y 6 deben ser valores sin procesar generados por sensores. No pueden se interpola o se repite cuando no hay cambio de GPS.
- Los sistemas de coordenadas están a la derecha. El sistema de coordenadas de la cámara se define como X apuntando hacia la derecha, Y apuntando hacia abajo y Z hacia adelante. En el eje Y de la tabla de coordenadas debe apuntar hacia abajo a lo largo del vector de gravedad.
- Por lo general, las lecturas del IMU están en un sistema de coordenadas del IMU independiente y se necesita la rotación para asignarlos al sistema de coordenadas de la cámara si ambos sistemas son diferentes.
- Todos los campos son “little endian” (el byte menos significativo primero) y el byte flotante de 32 bits. están en formato IEEE 754-1985.
- Para sincronizar con precisión el fotograma y los metadatos, el PTS del fotograma debería estar en el centro de su exposición (esto también se puede inferir de los metadatos de exposición).
- La aplicación que combina estos datos debería elegir una escala de tiempo lo suficientemente grande para obtener una PTS precisos.
Posibles problemas
-
Este diseño solo permite un paquete por muestra de datos. Es posible que los dispositivos incorporados tengan problemas para escribir
paquetes de muy alta frecuencia porque aumenta la presión de E/S y el tamaño del encabezado
(por ejemplo, los átomos
stsc
ystsz
) si el tamaño del paquete varía. - Mezclar diferentes tipos de datos con diferentes retrasos puede hacer que los PTS avancen y hacia atrás a medida que se escriben los paquetes en el archivo. Sin embargo, esto se puede superar almacenar en búfer paquetes y escribirlos en orden monótono.