Specifica dei metadati di movimento della videocamera

In questa pagina viene descritta una specifica che consente ai file MP4 di incorporare metadati relativi al movimento della videocamera durante l'acquisizione del video. In genere, i dispositivi che acquisiscono video dispongono di sensori che possono fornire informazioni aggiuntive sull'acquisizione. Ad esempio:

  • In genere i telefoni cellulari hanno sensori per giroscopio, accelerometro, magnetometro e GPS.
  • La fusione dei sensori può essere utilizzata per monitorare la posa dei 3 gradi di libertà (3DoF) dei dispositivi.
  • La localizzazione e la mappatura simultanee (SLAM) possono essere utilizzate per monitorare la posa dei 6 gradi di libertà (6DoF) del dispositivo (ad esempio, Bing).
  • Le informazioni sull'esposizione possono essere utilizzate per interpolare un movimento per scansione.

Questi metadati possono essere salvati nel video per la post-elaborazione avanzata in diverse applicazioni. Ad esempio:

  • Le informazioni sulla rotazione a livello di frame possono essere utilizzate per stabilizzare i video e i dati di movimento a livello di scansione per ridurre gli effetti dell'otturatore.
  • Le letture IMU e le posizioni 3DoF derivate possono essere utilizzate per valutare l'allineamento temporale e l'allineamento geometrico tra l'IMU e la videocamera.

Le sezioni seguenti specificano la traccia CAMMa Metadata Motion (CAMMa), che include una nuova voce di esempio che indica l'esistenza della traccia e il formato dei dati degli esempi di traccia.

Voce di esempio

Il file video deve contenere la seguente casella di esempio di esempio per indicare la traccia di metadati personalizzata e il valore subComponentType della traccia deve essere impostato su 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 dei dati

La traccia di metadati contiene un flusso di esempi di metadati che sono formattati nel seguente modo.

Campo Unità Descrizione
uint16 reserved;
Riservato. Deve essere 0.
uint16 type;
Il tipo di pacchetto di dati (vedi di seguito). Ogni pacchetto contiene un tipo di dati.
switch (type) {
  case 0:
    float angle_axis[3];
  break;
          

Orientamento dell'asse: i radianti rappresentano la rotazione dalle coordinate locali della videocamera a un sistema di coordinate globale. Il sistema di coordinate mondo è definito dalle applicazioni.

Lascia che M sia la matrice di rotazione 3x3 corrispondente al vettore dell'asse angolare. Per tutti i raggi X nel sistema di coordinate locali, la direzione dei raggi nella coordinata globale è M * X.

Queste informazioni possono essere ottenute eseguendo la fusione del sensore 3DoF sul dispositivo. Dopo aver integrato le letture IMU, deve essere registrato solo l'orientamento globale integrato.

I tre valori rappresentano il vettore dell'asse angolare, in modo che l'angolo di rotazione in radianti sia dato dalla lunghezza del vettore e l'asse di rotazione sia dato dal vettore normalizzato.

La rappresentazione codificata può essere creata da un asse e da un angolo con float[3] angle_axis := angle_radians * normalized_axis_vec3. Un angolo positivo rappresenta una rotazione in senso antiorario attorno all'asse.

La rappresentazione codificata può essere trasformata di nuovo in un asse e con un angolo con float[3] axis := normalize(axis_angle) e float angle_radians := length(angle_axis).

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

Questi metadati si riferiscono a frame video. La data e l'ora di presentazione (PTS) di questi metadati devono essere l'inizio dell'esposizione della prima riga di scansione utilizzata in un frame video.

pixel_exposure_time_ns è il tempo di esposizione per un singolo pixel in nanosecondi e rolling_Shut_skew_time_ns è il ritardo tra l'esposizione della prima riga di scansione utilizzata e l'ultima riga di scansione utilizzata. Possono essere utilizzate per interpolare i metadati per scansione.

I valori PTS del frame corrispondente devono essere compresi in pts_of_this_metadata e pts_of_this_metadata + pixel_exposure_time_ns + rolling_ott_skew_time_ns.

Quando queste informazioni non vengono salvate, il dispositivo deve compiere il miglior tentativo di modificare i valori PTS del frame video in modo che siano al centro dell'esposizione del frame.

  case 2:
    float gyro[3];
  break;
          
radianti/secondi

Segnale del giroscopio in radianti/secondi attorno agli assi XYZ della fotocamera. La rotazione è positiva in senso antiorario.

Le applicazioni definiscono la relazione tra il sistema di coordinate IMU e il sistema di coordinate della fotocamera. Ti consigliamo di allinearli, se possibile.

Tieni presente che le letture giroscopiche iniziali si trovano nel sistema di coordinate IMU definito dal relativo driver e è necessaria una trasformazione adeguata per convertirlo nel sistema di coordinate della fotocamera.

Fai riferimento ad Android Sensor.TYPE_GYROSCOPE.

  case 3:
    float acceleration[3];
  break;
          
metri/secondi^2

Lettura dell'accelerometro in metri/secondo^2 lungo gli assi XYZ della fotocamera.

Le applicazioni definiscono la relazione tra il sistema di coordinate IMU e il sistema di coordinate della fotocamera. Ti consigliamo di allinearli, se possibile.

Fai riferimento ad Android Sensor.TYPE_ACCELEROMETER.

  case 4:
    float position[3];
  break;
          

Posizione 3D della fotocamera. La posizione 3D e la rotazione dell'asse angolare insieme definiscono la posa 6DoF della videocamera e si trovano in un sistema di coordinate definito dall'applicazione comune.

Puoi ottenere queste informazioni eseguendo il monitoraggio 6DoF sul dispositivo.

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

Coordinata GPS minima del campione.

  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: tempo trascorso dal periodo del GPS quando è stata effettuata la misurazione

gps_fix_type: 0 ( nessuna correzione), 2 (risoluzione 2D), 3 (risoluzione 3D)

latitudine - Latitudine in gradi

longitudine: longitudine in gradi

altitudine: l'altezza sopra l'ellissoide WGS-84

accuratezza_orizzontale - Precisione orizzontale (lat/lunga)

accurata_verticale - Precisione verticale (altitudine)

velocity_east - Velocità in direzione est

velocity_north: la velocità in direzione nord.

velocity_up: la velocità in direzione verticale.

velocità_precisione - Precisione della velocità

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

Campo magnetico ambientale.

Fai riferimento ad Android Sensor.TYPE_MAGNETIC_FIELD.

}

Note

  • Dovrebbe esserci solo una traccia CAMM per file MP4, che contiene tutti i tipi di dati sopra riportati unendoli insieme.
  • I campioni GPS nei casi 5 e 6 devono essere valori non elaborati generati dai sensori. Non possono essere interpolati o ripetuti in assenza di modifica al GPS.
  • I sistemi di coordinate sono orientati verso destra. Il sistema di coordinate della videocamera è definito come X che punta a destra, Y che punta verso il basso e Z che punta in avanti. L'asse Y del sistema di coordinate globale deve puntare verso il basso lungo il vettore gravitazionale.
  • Le letture IMU si trovano in genere in un sistema di coordinate IMU separato ed è necessaria la rotazione per mapparle al sistema di coordinate della fotocamera se i due sistemi di coordinate sono diversi.
  • Tutti i campi sono di piccole dimensioni (il meno significativo è il primo byte) e i punti mobili a 32 bit sono nel formato IEEE 754-1985.
  • Per sincronizzare con precisione il frame video e i metadati, il PTS del frame video deve essere al centro della sua esposizione (può essere dedotto anche dai metadati dell'esposizione).
  • L'applicazione che combina questi dati dovrebbe scegliere una scala temporale sufficientemente ampia per ottenere una PTS precisa.

Potenziali problemi

  • Questo progetto consente solo un pacchetto per campione di dati. I dispositivi incorporati potrebbero presentare problemi durante la scrittura di pacchetti con frequenze molto alte perché aumentano la pressione I/O, nonché la dimensione dell'intestazione (ad esempio, gli atomi stsc e stsz), se le dimensioni dei pacchetti variano.
  • Mescolare diversi tipi di dati con ritardi diversi può causare il avanzamento dei valori PTS e l'indietro man mano che i pacchetti vengono scritti nel file. Tuttavia, questo può essere superato eseguendo il buffering dei pacchetti e scrivendoli in ordine monotonico.