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 Zakodowana reprezentacja może zostać przekształcona z powrotem do osi i kąta za pomocą funkcji |
|
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
istsz
), 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.