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 La rappresentazione codificata può essere trasformata di nuovo in un asse e con un angolo con |
|
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
estsz
), 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.