In questa pagina viene descritta una specifica che consente di incorporare file MP4 metadati relativi al movimento della videocamera durante l'acquisizione video. I dispositivi che acquisiscono video di solito hanno che possono fornire informazioni aggiuntive sull'acquisizione. Ad esempio:
- I telefoni cellulari in genere sono dotati di sensori per giroscopio, accelerometro, magnetometro e GPS.
- La fusione dei sensori può essere utilizzata per tracciare la posa dei dispositivi sui 3 gradi di libertà (3DoF).
- La localizzazione e la mappatura simultanea (SLAM) possono essere usate per tenere traccia dei 6 gradi di libertà (6DoF) posa del dispositivo (ad esempio, Cast).
- Le informazioni sull'esposizione possono essere utilizzate per interpolare il movimento per scansione.
Questi metadati possono essere salvati nel video per una post-elaborazione avanzata in varie applicazioni. Ad esempio:
- Le informazioni sulla rotazione a livello di fotogramma possono essere utilizzate per stabilizzare i video, mentre i dati sui movimenti a livello di linea di scansione possono essere utilizzati per ridurre gli effetti dell'otturatore.
- Le letture dell'IMU e le pose 3DoF derivate possono essere utilizzate per valutare l'allineamento temporale e l'allineamento geometrico tra l'IMU e la fotocamera.
Le sezioni seguenti specificano la traccia CAmera Motion Metadata (CAMM), che include un nuovo esempio voce che indica l'esistenza della traccia e il formato dei dati dei campioni di traccia.
Esempio di voce
Il file video deve contenere la seguente casella di immissione di esempio per indicare i metadati personalizzati
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 uno stream di esempi di metadati formattati come segue.
Campo | Unità | Descrizione |
---|---|---|
uint16 reserved; |
Riservato. Deve essere 0. | |
uint16 type; |
Il tipo di pacchetto di dati (vedi di seguito). Ogni pacchetto include un tipo di dati. | |
switch (type) { |
||
case 0: float angle_axis[3]; break; |
Orientamento dell'asse dell'asse in radianti che rappresenta la rotazione dalle coordinate della fotocamera locale a un sistema di coordinate del mondo. Il sistema di coordinate mondiali è definito da applicazioni. Sia M la matrice di rotazione 3x3 corrispondente al vettore dell'asse dell'angolo. Per qualsiasi raggio X nel sistema di coordinate locale, la direzione dei raggi nella coordinata mondiale è M * X. Queste informazioni possono essere ottenute eseguendo la tecnologia di fusione dei sensori 3DoF sul dispositivo. Dopo aver integrato le letture dell'IMU, è necessario registrare solo l'orientamento globale integrato. I tre valori rappresentano il vettore dell'asse dell'angolo, in modo che l'angolo di rotazione espresso 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 E la rappresentazione codificata può essere trasformata di nuovo in un asse e un angolo con |
|
case 1: int32 pixel_exposure_time; int32 rolling_shutter_skew_time; break; |
nanosecondi |
Questi metadati sono forniti per singolo fotogramma video. L'ora di presentazione (PTS) di questi metadati deve l'inizio dell'esposizione della prima linea di scansione utilizzata in un fotogramma video. pixel_exposure_time_ns è il tempo di esposizione di un singolo pixel in nanosecondi e rolling_shutter_skew_time_ns è il ritardo tra esposizione della prima e dell'ultima linea di scansione utilizzata. Si possono usare per interpolare i metadati per scansione. Il PTS del frame corrispondente deve essere compreso tra pts_of_this_metadata e pts_of_this_metadata + pixel_exposure_time_ns + rolling_shutter_skew_time_ns. Se queste informazioni non vengono salvate, il dispositivo dovrebbe fare il possibile per regola il PTS del fotogramma video in modo che sia al centro dell'esposizione del fotogramma. |
case 2: float gyro[3]; break; |
radianti/secondi |
Segnale del giroscopio in radianti/secondi intorno a XYZ assi della fotocamera. La rotazione è positivo in senso antiorario. Le applicazioni definiscono la relazione tra il sistema di coordinate IMU e la telecamera sistema di coordinate di rete. Ti consigliamo di allinearli, se possibile. Tieni presente che le letture iniziali del giroscopio sono nel sistema di coordinate IMU definito dal conducente, ed è necessaria una trasformazione adeguata per convertirlo nel sistema di coordinate della fotocamera. Fai riferimento a 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 la telecamera sistema di coordinate di rete. Ti consigliamo di allinearli, se possibile. Fai riferimento a Android Sensor.TYPE_ACCELEROMETER. |
case 4: float position[3]; break; |
Posizione 3D della fotocamera. La rotazione della posizione 3D e dell'asse angolare insieme definisce la Posizione 6DoF della fotocamera e si trovano in una coordinata comune definita dall'applicazione di un sistema operativo completo. 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 dall'epoca GPS in cui è stata effettuata la misurazione gps_fix_type: 0 ( nessuna correzione), 2 (correzione 2D), 3 (correzione 3D) latitude - Latitudine in gradi longitude - Longitudine in gradi altitudine: l'altezza sopra l'ellissoide WGS-84. horizontal_accuracy: precisione orizzontale (lat/long) vertical_accuracy: precisione verticale (altitudine) velocity_east - Velocità nella direzione est velocity_north - Velocità in direzione nord velocity_up - Velocità in direzione dell'alto speed_accuracy - Precisione della velocità |
case 7: float magnetic_field[3]; break; |
microtesla |
Campo magnetico ambientale. Fai riferimento a Android Sensor.TYPE_MAGNETIC_FIELD. |
} |
Note
- Deve esserci una sola traccia CAMM per ogni file MP4, che contiene tutti i tipi di dati sopra indicati. unendoli.
- I campioni GPS nei casi 5 e 6 devono essere valori grezzi generati dai sensori. Non possono essere interpolati o ripetuti quando non vi è alcuna modifica del GPS.
- I sistemi di coordinate sono sul lato destro. Il sistema di coordinate della fotocamera è definito come X rivolta a destra, Y rivolta verso il basso e Z rivolta in avanti. L'asse Y del piano globale sistema di coordinate dovrebbe puntare verso il basso lungo il vettore di gravità.
- Le letture IMU avvengono in genere in un sistema di coordinate IMU separato ed è necessaria una rotazione per mapparle al sistema di coordinate della fotocamera se i due sistemi di coordinate sono diversi.
- Tutti i campi sono Litt-endian (prima il byte meno significativo) e il formato mobile a 32 bit sono nel formato IEEE 754-1985.
- Per sincronizzare con precisione il fotogramma video e i metadati, il PTS del fotogramma video dovrebbe trovarsi al centro della sua esposizione (questo può essere dedotto anche dai metadati di esposizione).
- L'applicazione che esegue il mux di questi dati dovrebbe scegliere una scala di tempo sufficientemente grande per ottenere un PTS preciso.
Problemi potenziali
-
Questa progettazione consente un solo pacchetto per campione di dati. I dispositivi incorporati potrebbero presentare problemi di scrittura
a frequenza molto elevata perché aumenta la pressione di I/O, oltre alla dimensione dell'intestazione
(ad esempio,
stsc
estsz
atomi) se la dimensione del pacchetto varia. - La combinazione di tipi di dati diversi con ritardi differenti può causare l'avanzamento del PTS e indietro, man mano che i pacchetti vengono scritti nel file. Tuttavia, questo può essere risolto il buffering dei pacchetti e li scrive in ordine monotonico.