Specyfikacja metadanych ruchu w kamerze

Ta strona opisuje specyfikację, która pozwala na umieszczanie w plikach MP4 metadanych dotyczących ruchu kamery podczas nagrywania filmu. Urządzenia do nagrywania filmów zwykle mają czujniki, które mogą podawać dodatkowe informacje o przechwytywaniu. Przykład:

  • Telefony komórkowe mają zazwyczaj czujniki żyroskopowe, akcelerometr, magnetometr i GPS.
  • Z czujnika czujnika można korzystać w celu śledzenia 3 stopni swobody (3DoF) urządzeń.
  • Lokalizacja i mapowanie (SLAM) jednocześnie można używać do śledzenia 6 stopni swobody (6DoF) urządzenia (na przykład Tango).
  • Informacje o narażeniu na kontakt można wykorzystać do interpolowania ruchu po skanowaniu.

Te metadane można zapisać w filmie na potrzeby zaawansowanego przetwarzania w różnych aplikacjach. Przykład:

  • Informacje o obrótach na poziomie klatki można wykorzystać do stabilizacji filmów, a dane o ruchu na poziomie skanowania można zastosować do ograniczenia efektów migawki.
  • Odczyty IMU i pozycje 3DoF mogą służyć do wyrównania czasu i dopasowania geometrycznego między IMU a aparatem.

W sekcjach poniżej określono ścieżkę CAmera Motion Metadata (CAMM), która zawiera nowy przykładowy wpis wskazujący istnienie ścieżki i format danych próbek ścieżki.

Przykładowy wpis

Plik wideo powinien zawierać przykładowe pole wpisu wskazujące, że ścieżka niestandardowych metadanych ma być określona, 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 taki sposób:

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

Orientacja osi kąta w radianach reprezentujących obroty z lokalnych współrzędnych kamery do układu współrzędnych świata. Światowy system współrzędnych jest określany przez aplikacje.

Pozwól M na macierze obrotu 3 x 3 odpowiadające wektorowi osi kąta. W przypadku dowolnego promienia X w lokalnym układzie współrzędnych obowiązuje kierunek promienia M * X.

Te informacje można uzyskać, używając na urządzeniu czujnika 3DoF. Po zintegrowaniu odczytów IMU musi być zarejestrowana tylko zintegrowana orientacja globalna.

Trzy wartości reprezentują wektor osi kąta, tak więc kąt obrotu w radianach jest równy długości wektora, a oś obrotu jest podana przez znormalizowany wektor.

Zakodowana reprezentacja może zostać utworzona z osi i kąta w narzędziu float[3] angle_axis := angle_radians * normalized_axis_vec3. Kąt dodatniy wskazuje obrót wokół osi w lewo.

Zakodowana reprezentacja może zostać przekształcona z powrotem w oś i kąt o 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) tych metadanych powinien być punktem wyjścia do wyświetlenia pierwszego w skale wideo zastosowanego skanera.

pixel_exposure_time_ns to czas ekspozycji pojedynczego piksela nanosekundy, a rolling_shutter_skew_time_ns to opóźnienie między narażeniem na użycie pierwszego a skalowania. Można z nich korzystać do interpolowania metadanych w ramach skanowania.

Wskaźnik PTS odpowiedniej klatki powinien mieścić się w zakresie pts_of_this_metadata oraz pts_of_this_metadata + piksel_exposure_time_ns + roll_shutter_skew_time_ns.

Jeśli te informacje nie są zapisane, dokładamy wszelkich starań, aby dopasować PTS klatki wideo do środka ekspozycji.

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

Sygnał żyroskopowy w radianach/sekundach wokół osi XYZ kamery. Rotacja jest dodatnia w kierunku przeciwnym do ruchu wskazówek zegara.

Aplikacje definiują relacje między systemem współrzędnych IMU a systemem współrzędnych kamery. Zalecamy ich wyrównanie.

Pamiętaj, że początkowe odczyty żyroskopowe są dostępne w systemie współrzędnych IMU zdefiniowanym przez sterownika. Aby przekonwertować je na układ współrzędnych kamery, konieczne jest poprawne przekształcenie.

Więcej informacji znajdziesz w sekcji Czujnik Androida.TYPE_GYROSCOPE.

  case 3:
    float acceleration[3];
  break;
          
m/s^2

Odczyt akcelerometru w metrach/sekundach^2 wzdłuż osi XYZ kamery.

Aplikacje definiują relacje między systemem współrzędnych IMU a systemem współrzędnych kamery. Zalecamy ich wyrównanie.

Używaj czujnika Android.TYPE_ACCELEROMETER.

  case 4:
    float position[3];
  break;
          

Pozycja 3D aparatu. Obrót pozycji 3D i osi kąta powoduje ustawienie pozycji kamery 6DoF i wspólny układ współrzędnych jest zdefiniowany w aplikacji.

Te informacje możesz uzyskać, śledzą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 pomiaru GPS,

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

width – szerokość w stopniach

length – długość geograficzna w stopniach

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

horizontal_accuracy – dokładność pozioma (lata/długa)

vertical_accuracy – dokładność branży (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ść szybkości

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

Pole magnetyczne otoczenia.

Więcej informacji znajdziesz w sekcji Czujnik Androida.TYPE_MAGNETIC_FIELD.

}

Uwagi

  • Każdy plik MP4 powinien zawierać tylko 1 ścieżkę CAMM, która zawiera wszystkie wymienione powyżej typy danych.
  • Próbki GPS w punktach 5 i 6 muszą być nieprzetworzonymi wartościami wygenerowanymi przez czujniki. Nie można ich interpolować ani powtarzać, jeśli nie ma zmiany GPS.
  • Systemy współrzędnych są prawostronne. System współrzędnych kamery jest określany jako osi X skierowany w prawo, Y w dół i Z do przodu. Oś Y globalnego układu współrzędnych powinna kierować w dół wzdłuż wektora grawitacji.
  • Odczyty IMU zwykle znajdują się w osobnym systemie współrzędnych IMU. Aby odwzorować je w systemie współrzędnych kamery, konieczne jest ustawienie obrotu.
  • Wszystkie pola muszą być małe (najpierw najmniejszy bajt), a 32-bitowe punkty zmiennoprzecinkowe mają format IEEE 754-1985.
  • Aby dokładnie zsynchronizować ramkę wideo i metadane, obiekt PTS ramki wideo powinien znaleźć się w środkowej części ekspozycji (możesz to też ustalić na podstawie metadanych ekspozycji).
  • Aplikacja łącząca te dane powinna wybrać wystarczająco dużą skalę, aby uzyskać dokładny PTS.

Potencjalne problemy

  • W tym projekcie dozwolone jest tylko 1 pakiet na próbkę danych. W przypadku umieszczonych urządzeń mogą występować problemy z pisaniem pakietów o dużej częstotliwości, ponieważ zwiększa to ciśnienie I/O, a także rozmiar nagłówka (np. atomy stsc i stsz), jeśli rozmiar pakietu się różni.
  • Łączenie różnych typów danych z różnymi opóźnieniami może spowodować, że zespół PTS będzie przekierowywał się do przodu i do tyłu, gdy pakiety zostaną zapisane w pliku. Możesz to jednak osiągnąć, buforując pakiety i zapisując je w kolejności monotonicznej.