Specyfikacja metadanych ruchu kamery

Na tej stronie znajduje się specyfikacja, która pozwala na umieszczanie plików MP4 metadane dotyczące ruchu kamery podczas nagrywania filmu. Urządzenia, które nagrywają filmy, mają zwykle które mogą dostarczyć dodatkowe informacje o rejestrowaniu. Na przykład:

  • Telefony komórkowe są zwykle wyposażone w czujniki żyroskopu, akcelerometru, magnetometru i GPS.
  • Technologia Sensor fusion może być używana do śledzenia 3 stopni swobody (3DoF) urządzeń.
  • Do śledzenia 6 stopni swobody można używać jednoczesnej lokalizacji i mapowania (SLAM). pozycja urządzenia (6DoF) (np. Tango).
  • Informacje o ekspozycji mogą być wykorzystywane do interpolowania poszczególnych ruchów skanujących.

Metadane te można zapisać w filmie na potrzeby zaawansowanego przetwarzania w różnych aplikacjach. Na przykład:

  • Informacje o obróceniu na poziomie klatki mogą posłużyć do stabilizacji filmów, a dane o ruchu na poziomie linii skanowania można wykorzystać do zredukowania efektów ruchomej migawki.
  • Odczyty z kolumny IMU i wyedytowane pozycje 3DoF mogą być wykorzystane do oceny wyrównania czasu i dopasowania geometrycznego między czujnikiem IMU i kamerą.

W poniższych sekcjach znajdziesz ścieżkę CAmera Motion Metadata (CAMM), która zawiera nową próbkę , który wskazuje istnienie ścieżki i format danych próbek utworów.

Przykładowy wpis

Plik wideo powinien zawierać następujące pole przykładowego wpisu, które pozwala wskazać niestandardowe metadane ścieżka, a subComponentType ścieżki powinna mieć wartość 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') {
}
  

Format danych

Ścieżka metadanych zawiera strumień próbek metadanych w poniższym formacie.

Pole Jednostka Opis
uint16 reserved;
Zarezerwowane. Wartość powinna wynosić 0.
uint16 type;
Typ pakietu danych (patrz poniżej). Każdy pakiet zawiera jeden typ danych.
switch (type) {
  case 0:
    float angle_axis[3];
  break;
          

Orientacja osi kąta w radianach, która reprezentuje obrót od współrzędnych lokalnych aparatu do globalnego układu współrzędnych. Światowy układ współrzędnych jest definiowany przez aplikacje.

Niech M będzie macierzą obrotu 3 x 3 odpowiadającą wektorowi osi kąta. W przypadku dowolnego promienia X w lokalnym układzie współrzędnych kierunek promienia na świecie to M * X.

Te informacje można uzyskać, uruchamiając na urządzeniu czujnik 3DoF fusion. Po zintegrowaniu odczytów IMU należy zarejestrować tylko zintegrowaną orientację globalną.

Te trzy wartości odpowiadają wektorowi osi kąta, w którym kąt obrotu w radianach jest określony przez długość wektora, a oś obrotu – przez znormalizowany wektor.

Zakodowaną reprezentację można utworzyć na podstawie osi i kąta za pomocą funkcji float[3] angle_axis := angle_radians * normalized_axis_vec3. Kąt dodatni oznacza obrót wokół osi w lewo.

Zakodowana reprezentacja może zostać przekształcona z powrotem do osi i kąta za pomocą funkcji float[3] axis := normalize(axis_angle) i float angle_radians := length(angle_axis).

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

Te metadane dotyczą poszczególnych klatek wideo. Czas prezentacji (PTS) metadanych powinien jest początkiem ekspozycji na pierwszą linię skanowania użytej w klatce wideo.

pixel_exposure_time_ns to czas ekspozycji pojedynczego piksela w nanosekundy, a rolling_shutter_skew_time_ns to opóźnienie między ekspozycja pierwszej i ostatniej wykorzystanej linii skanowania. Można ich używać do interpolowania metadanych w poszczególnych skanach.

Wartość PTS odpowiedniej klatki powinna się znajdować w zakresie pts_of_this_metadata i pts_of_this_metadata + pixel_exposure_time_ns + roll_shutter_skew_time_ns.

Jeśli te informacje nie zostaną zapisane, urządzenie powinno podjąć próbę ustaw PTS klatki wideo w taki sposób, aby znajdowała się w środkowej części ekspozycji klatki.

  case 2:
    float gyro[3];
  break;
          
radiany/sekundy

Sygnał żyroskopowy w radianach/sekundach wokół osi XYZ aparatu. Obecna rotacja w kierunku przeciwnym do ruchu wskazówek zegara.

Aplikacje definiują relację między układem współrzędnych IMU a kamerą układ współrzędnych. Zalecamy wyrównanie tych ustawień, jeśli to możliwe.

Zwróć uwagę, że początkowe odczyty żyroskopu są w układzie współrzędnych IMU zdefiniowanym przez jego sterownik i wymagane jest odpowiednie przekształcenie, żeby przekształcić go w układ współrzędnych kamery.

Zapoznaj się z informacjami o Android Sensor.TYPE_GYROSCOPE.

  case 3:
    float acceleration[3];
  break;
          
metry/sekundy^2

Odczyt akcelerometru w metrach/s^2 wzdłuż osi XYZ aparatu.

Aplikacje definiują relację między układem współrzędnych IMU a kamerą układ współrzędnych. Zalecamy wyrównanie tych ustawień, jeśli to możliwe.

Zobacz: Android Sensor.TYPE_ACCELEROMETER.

  case 4:
    float position[3];
  break;
          

Położenie kamery w 3D. Położenie w 3D i obrót osi kąta określają Pozycja kamery 6DoF umiejscowiona we wspólnej współrzędnej określonej przez aplikację. systemu.

Te informacje można uzyskać, uruchamiając na urządzeniu śledzenie 6DoF.

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

Minimalna współrzędna GPS próbki.

  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 – czas od początku epoki GPS podczas wykonywania pomiaru.

gps_fix_type – 0 ( brak poprawki), 2 (poprawka 2D), 3 (poprawka 3D)

latitude – szerokość geograficzna w stopniach

długość geograficzna – długość geograficzna w stopniach.

wysokość – wysokość powyżej elipsoidy WGS-84.

horizontal_accuracy – dokładność w poziomie (długość i szerokość geograficzna)

vertical_accuracy – dokładność pionu (wysokość)

velocity_east – prędkość w kierunku wschodnim

velocity_north – prędkość w kierunku północnym

velocity_up – prędkość w górę;

speed_accuracy – dokładność prędkości

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

Pole magnetyczne otoczenia.

Zobacz Android Sensor.TYPE_MAGNETIC_FIELD.

}

Uwagi

  • W każdym pliku MP4 powinna być tylko 1 ścieżka CAMM, która zawiera wszystkie powyższe typy danych przez połączenie ich ze sobą.
  • Próbki danych GPS w przypadkach 5 i 6 muszą być nieprzetworzone wartości wygenerowane przez czujniki. Nie mogą być jest interpolowana lub powtarzana, gdy nie zarejestrowano żadnych zmian GPS.
  • Układy współrzędnych są po prawej stronie. Układ współrzędnych kamery jest określony jako X jest skierowany w prawo, Y jest skierowany w dół, a Z – do przodu. Oś Y zmiennej globalnej układ współrzędnych powinien być skierowany w dół wzdłuż wektora grawitacji.
  • Odczyty IMU są zazwyczaj w osobnym układzie współrzędnych IMU i obrót jest potrzebny, i mapować je na układ współrzędnych kamery, jeśli te dwa układy są różne.
  • Wszystkie pola są małe, a 32-bitowy ma format zmiennoprzecinkowy. punkty mają format IEEE 754-1985.
  • Aby dokładnie zsynchronizować klatkę wideo i metadane, PTS klatki wideo powinna znajdować się w centrum ekspozycji (można to również wywnioskować na podstawie metadanych ekspozycji).
  • Aplikacja łącząca te dane powinna wybrać wystarczająco dużą skalę czasu, aby uzyskać dokładne PTS.

Potencjalne problemy

  • W tym projekcie dozwolony jest tylko 1 pakiet na próbkę danych. Umieszczone urządzenia mogą mieć problemy z pisaniem pakietów o bardzo dużej częstotliwości, ponieważ zwiększa to ciśnienie wejścia/wyjścia oraz rozmiar nagłówka. (na przykład atomy stsc i stsz), jeśli rozmiar pakietu jest różny.
  • Łączenie różnych typów danych z różnymi opóźnieniami może spowodować, że PTS będzie działać obiecująco. i wstecz w miarę zapisywania pakietów w pliku. Można to jednak pokonać, stosując do buforowania pakietów i zapisywania ich w kolejności monotonnej.