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 Zakodowana reprezentacja może zostać przekształcona z powrotem w oś i kąt o |
|
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
istsz
), 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.