Auf dieser Seite wird eine Spezifikation beschrieben, die das Einbetten von MP4-Dateien ermöglicht. Metadaten zur Kamerabewegung während der Videoaufnahme. Geräte, die Videoaufnahmen machen, Sensoren, die zusätzliche Informationen zur Aufnahme liefern können. Beispiel:
- Mobiltelefone verfügen in der Regel über Sensoren für Gyroskop, Beschleunigungsmesser, Magnetometer und GPS.
- Die Sensorfusion kann verwendet werden, um die Position von Geräten über 3 Freiheitsgrade (3DoF) zu erfassen.
- Mit SLAM (Simultane Localization and Mapping) können die sechs Freiheitsgrade erfasst werden. (6DoF) Position des Geräts (z. B. Tango).
- Belichtungsinformationen können verwendet werden, um Bewegungen pro Scanline zu interpolieren.
Diese Metadaten können im Video gespeichert werden, um die Nachbearbeitung in verschiedenen Anwendungen zu verbessern. Beispiel:
- Rotationsinformationen auf Frameebene können verwendet werden, um Videos zu stabilisieren. Bewegungsdaten auf Scanlinienebene können verwendet werden, um Rolling-Auslöser-Effekte zu reduzieren.
- IMU-Messungen und abgeleitete 3DoF-Positionen können verwendet werden, um die zeitliche und geometrische Ausrichtung zwischen IMU und der Kamera zu bewerten.
In den folgenden Abschnitten wird der CAMM-Track (Camera Motion Metadata) angegeben. Er enthält ein neues Beispiel. -Eintrag, der die Existenz des Titels und das Datenformat der Track-Samples angibt.
Beispieleintrag
Die Videodatei sollte das folgende Beispiel-Eingabefeld enthalten, um die benutzerdefinierten Metadaten anzugeben.
Track und subComponentType
des Titels sollte auf meta
gesetzt sein.
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') { }
Datenformat
Der Metadatentrack enthält einen Stream von Metadatenbeispielen, die wie folgt formatiert sind.
Feld | Einheit | Beschreibung |
---|---|---|
uint16 reserved; |
Reserviert. Sollte 0 sein. | |
uint16 type; |
Der Typ des Datenpakets (siehe unten). Jedes Paket enthält einen Datentyp. | |
switch (type) { |
||
case 0: float angle_axis[3]; break; |
Ausrichtung der Winkelachse in Radiant, die die Drehung von lokalen Kamerakoordinaten zu einem Weltkoordinatensystem darstellt. Das Weltkoordinatensystem wird durch Anwendungen definiert. Lass M die 3x3-Rotationsmatrix sein, die dem Winkelachsenvektor entspricht. Für alle Strahlen X im lokalen Koordinatensystem ist die Strahlenrichtung in der Weltkoordinate M * X. Diese Informationen erhalten Sie, indem Sie eine 3DoF-Sensorfusion auf dem Gerät ausführen. Nach der Integration der IMU-Messungen muss nur die integrierte globale Ausrichtung aufgezeichnet werden. Die drei Werte stellen den Winkelachsenvektor dar, wobei der Drehwinkel im Bogenmaß durch die Länge des Vektors und die Drehachse durch den normalisierten Vektor angegeben wird. Die codierte Darstellung kann mit Die codierte Darstellung kann mit |
|
case 1: int32 pixel_exposure_time; int32 rolling_shutter_skew_time; break; |
Nanosekunden |
Diese Metadaten gelten pro Videoframe. Die Präsentationszeit (PKT) dieser Metadaten sollte der Beginn der Belichtung der ersten verwendeten Scanlinie in einem Videoframe ist. pixel_exposure_time_ns ist die Belichtungszeit für ein einzelnes Pixel Nanosekunden und rolling_shutter_skew_time_ns ist die Verzögerung zwischen der Belichtung der ersten und der letzten Scanlinie. Sie können verwendet werden, zur Interpolation pro Scanline-Metadaten. Der PTS des entsprechenden Frames muss innerhalb pts_of_this_metadata und pts_of_this_metadata + pixel_exposure_time_ns + Rolling_shutter_skew_time_ns. Wenn diese Informationen nicht gespeichert werden, versucht das Gerät bestmöglich, stellen Sie den PTS-Wert des Videoframes in der Mitte der Belichtungszeit. |
case 2: float gyro[3]; break; |
Radianten/Sekunden |
Gyroskopsignal in Radianten/Sekunden um XYZ-Achsen der Kamera herum. Rotation ist und umgekehrt. Anwendungen definieren die Beziehung zwischen dem IMU-Koordinatensystem und der Kamera Koordinatensystem. Wir empfehlen, sie nach Möglichkeit anzugleichen. Beachten Sie, dass die ersten Gyroskopwerte im vom Treiber definierten IMU-Koordinatensystem enthalten sind. und eine ordnungsgemäße Transformation ist erforderlich, um sie in das Kamerakoordinatensystem umzuwandeln. Weitere Informationen finden Sie unter „Android Sensor.TYPE_GYROSCOPE“. |
case 3: float acceleration[3]; break; |
Meter/Sekunden^2 |
Beschleunigungsmesseranzeige in Metern/Sekunde^2 entlang XYZ-Achsen der Kamera. Anwendungen definieren die Beziehung zwischen dem IMU-Koordinatensystem und der Kamera Koordinatensystem. Wir empfehlen, sie nach Möglichkeit anzugleichen. Siehe Android Sensor.TYPE_ACCELEROMETER. |
case 4: float position[3]; break; |
3D-Position der Kamera Die Drehung der 3D-Position und der Winkelachse definiert die 6DoF-Position der Kamera und sie befinden sich in einer gemeinsamen anwendungsdefinierten Koordinate System. Sie können diese Informationen abrufen, indem Sie 6DoF-Tracking auf dem Gerät ausführen. |
|
case 5: double latitude; double longitude; double altitude; break; |
Grad |
Minimale GPS-Koordinaten der Stichprobe. <ph type="x-smartling-placeholder"> |
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 – Zeit seit der GPS-Epoche, als die Messung durchgeführt wurde gps_fix_type: 0 ( keine Korrektur), 2 (2D-Korrektur), 3 (3D-Korrektur) latitude – Breitengrad in Grad length – Längengrad in Grad height – Höhe über dem WGS-84-Ellipsoid horizontal_accuracy – horizontale Genauigkeit (lat/long) vertical_accuracy – vertikale Genauigkeit (Höhe) velocity_east – Geschwindigkeit in Ostrichtung velocity_north – Geschwindigkeit in Nordrichtung velocity_up – Geschwindigkeit nach oben speed_accuracy – Genauigkeit der Geschwindigkeit <ph type="x-smartling-placeholder"> |
case 7: float magnetic_field[3]; break; |
Microtesla |
Magnetfeld in der Umgebung. Weitere Informationen finden Sie unter Android Sensor.TYPE_MAGNETIC_FIELD |
} |
Hinweise
- Pro MP4-Datei, die alle oben genannten Datentypen enthält, sollte nur ein CAMM-Track vorhanden sein indem Sie sie gemuxt werden.
- Bei den GPS-Beispielen in den Fällen 5 und 6 muss es sich um Rohwerte handeln, die von Sensoren generiert wurden. Sie dürfen nicht interpoliert oder wiederholt wird, wenn keine GPS-Änderung vorliegt.
- Die Koordinatensysteme befinden sich auf der rechten Seite. Das Koordinatensystem der Kamera ist als X definiert. nach rechts, Y nach unten und Z nach vorne. Auf der Y-Achse des globalen sollte das Koordinatensystem entlang des Gravitationsvektors nach unten zeigen.
- IMU-Messungen erfolgen in der Regel in einem separaten IMU-Koordinatensystem und eine Rotation ist erforderlich, um sie dem Kamerakoordinatensystem zuordnen, wenn sich die beiden Koordinatensysteme unterscheiden.
- Alle Felder sind Little-Endian (das kleinste Byte zuerst) und das 32-Bit-Gleitkomma Punkte haben das Format IEEE 754-1985.
- Für eine genaue Synchronisierung des Videoframes und der Metadaten muss der PTS des Videoframes sollte sich in der Mitte der Belichtung befinden (dies kann auch aus den Kontaktmetadaten abgeleitet werden).
- Die Anwendung, die diese Daten gemuxt, sollte einen ausreichend großen Zeitrahmen wählen, um einen PTS-Wert korrigieren.
Mögliche Probleme
-
Bei diesem Design ist nur ein Paket pro Datenprobe zulässig. Bei eingebetteten Geräten gibt es möglicherweise Probleme beim Schreiben
sehr hohe Frequenz-Pakete, da dies die E/A-Auslastung und die Header-Größe erhöht.
(z. B. die Atome
stsc
undstsz
), wenn die Paketgröße variiert. - Das Vermischen verschiedener Datentypen mit unterschiedlichen Verzögerungen kann dazu führen, dass der PTS beide vorwärts geht. und umgekehrt, wenn Pakete in die Datei geschrieben werden. Dies lässt sich jedoch überwinden, Pakete gepuffert und in monotoner Reihenfolge geschrieben.