Spesifikasi Metadata Gerakan Kamera

Halaman ini menjelaskan spesifikasi yang memungkinkan file MP4 disematkan metadata tentang gerakan kamera selama perekaman video. Perangkat yang merekam video biasanya memiliki sensor yang dapat memberikan informasi tambahan tentang pengambilan gambar. Contoh:

  • Ponsel biasanya memiliki sensor untuk giroskop, akselerometer, magnetometer, dan GPS.
  • Fusi sensor dapat digunakan untuk melacak pose 3 derajat kebebasan (3DoF) perangkat.
  • Pelokalan dan pemetaan simultan (SLAM) dapat digunakan untuk melacak 6 derajat kebebasan (6DoF) pose perangkat (misalnya, Tango).
  • Informasi eksposur dapat digunakan untuk menginterpolasi gerakan per pemindaian.

Metadata ini dapat disimpan di video untuk pascapemrosesan lanjutan di berbagai aplikasi. Contoh:

  • Informasi rotasi tingkat frame dapat digunakan untuk menstabilkan video, dan data gerakan tingkat pemindaian dapat digunakan untuk mengurangi efek shutter bergulir.
  • Pembacaan IMU dan pose 3DoF yang dihasilkan dapat digunakan untuk mengevaluasi keselarasan waktu dan keselarasan geometri antara IMU dan kamera.

Bagian di bawah ini menentukan jalur CAmera Motion Metadata (CAMM), yang mencakup contoh baru entri yang menunjukkan keberadaan {i>track<i} dan format data sampel {i>track<i}.

Contoh entri

File video harus berisi kotak entri contoh berikut untuk menunjukkan metadata kustom lagu, dan subComponentType lagu harus disetel ke 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 data

Trek metadata berisi aliran contoh metadata yang diformat sebagai berikut.

Kolom Unit Deskripsi
uint16 reserved;
Direservasi. Harus 0.
uint16 type;
Jenis paket data (lihat di bawah). Setiap paket memiliki satu jenis data.
switch (type) {
  case 0:
    float angle_axis[3];
  break;
          

Orientasi sumbu sudut dalam radian yang mewakili rotasi dari koordinat kamera lokal ke sistem koordinat dunia. Sistem koordinat dunia ditentukan oleh aplikasi.

Misalkan M adalah matriks rotasi 3x3 yang sesuai dengan vektor sumbu sudut. Untuk setiap sinar X dalam sistem koordinat lokal, arah sinar pada koordinat dunia adalah M * X.

Informasi ini dapat diperoleh dengan menjalankan fusi sensor 3DoF pada perangkat. Setelah mengintegrasikan pembacaan IMU, hanya orientasi global terintegrasi yang perlu direkam.

Ketiga nilai tersebut mewakili vektor sudut-sumbu, sehingga sudut rotasi dalam radian diberikan oleh panjang vektor, dan sumbu rotasi diberikan oleh vektor yang dinormalisasi.

Representasi yang dienkode dapat dibuat dari sumbu dan sudut dengan float[3] angle_axis := angle_radians * normalized_axis_vec3. Sudut positif mewakili rotasi berlawanan arah jarum jam di sekitar sumbu.

Selain itu, representasi yang dienkode dapat diubah kembali ke sumbu dan sudut dengan float[3] axis := normalize(axis_angle) dan float angle_radians := length(angle_axis).

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

Metadata ini adalah per frame video. Waktu penyajian (PTS) metadata ini seharusnya menjadi awal dari paparan pemindai yang pertama kali digunakan dalam {i>frame<i} video.

pixel_exposure_time_ns adalah waktu eksposur untuk satu piksel dalam nanodetik dan rolling_shutter_skew_time_ns adalah penundaan antara paparan dari pemindai yang pertama kali digunakan dan garis pemindaian yang terakhir digunakan. Dapat digunakan untuk menginterpolasi metadata per pemindaian.

PTS dari {i>frame<i} yang sesuai harus dalam pts_of_this_metadata dan pts_of_this_metadata + pixel_exposure_time_ns + rolling_shutter_skew_time_ns.

Jika informasi ini tidak disimpan, perangkat harus melakukan upaya terbaik untuk menyesuaikan PTS frame video agar berada di tengah eksposur frame.

  case 2:
    float gyro[3];
  break;
          
radian/detik

Sinyal giroskop dalam radian/detik di sekitar sumbu XYZ kamera. Rotasi adalah positif dalam arah berlawanan.

Aplikasi menentukan hubungan antara sistem koordinat IMU dan kamera sistem koordinat ini. Sebaiknya Anda menyelaraskannya jika memungkinkan.

Perhatikan bahwa pembacaan giroskop awal ada dalam sistem koordinat IMU yang ditentukan oleh {i>driver-<i}nya, dan transformasi yang tepat diperlukan untuk mengubahnya menjadi sistem koordinat kamera.

Lihat Android Sensor.TYPE_GYROSCOPE.

  case 3:
    float acceleration[3];
  break;
          
meter/detik^2

Pembacaan akselerometer dalam meter/detik^2 di sepanjang sumbu XYZ kamera.

Aplikasi menentukan hubungan antara sistem koordinat IMU dan kamera sistem koordinat ini. Sebaiknya Anda menyelaraskannya jika memungkinkan.

Lihat Android Sensor.TYPE_ACCELEROMETER.

  case 4:
    float position[3];
  break;
          

Posisi 3D kamera. Posisi 3D dan rotasi sumbu sudut bersama-sama menentukan Pose 6DoF kamera, dan berada dalam koordinat umum yang ditentukan aplikasi sistem file.

Anda bisa mendapatkan informasi ini dengan menjalankan pelacakan 6DoF pada perangkat.

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

Koordinat GPS minimal dari sampel.

  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 - Waktu sejak epoch GPS saat pengukuran diambil

gps_fix_type - 0 ( tidak ada perbaikan), 2 (perbaikan 2D), 3 (perbaikan 3D)

lintang - Lintang dalam derajat

bujur - Bujur dalam derajat

ketinggian - Tinggi di atas elipsoid WGS-84

horizontal_accuracy - Akurasi horizontal (lat/long)

vertical_accuracy - Akurasi vertikal (ketinggian)

velocity_east - Kecepatan ke arah timur

velocity_north - Kecepatan ke arah utara

velocity_up - Kecepatan ke arah atas

speed_accuracy - Akurasi kecepatan

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

Medan magnet sekitar.

Lihat Android Sensor.TYPE_MAGNETIC_FIELD.

}

Catatan

  • Hanya boleh ada satu trek CAMM per file MP4, yang berisi semua jenis data di atas dengan menggabungkan keduanya.
  • Sampel GPS dalam kasus 5 dan 6 harus berupa nilai mentah yang dihasilkan oleh sensor. Tidak dapat berupa diinterpolasi atau diulang saat tidak ada perubahan GPS.
  • Sistem koordinat berada di sisi kanan. Sistem koordinat kamera didefinisikan sebagai X ke kanan, Y menunjuk ke bawah, dan Z menunjuk ke depan. Sumbu Y global sistem koordinat ini harus menunjuk ke bawah di sepanjang vektor gravitasi.
  • Pembacaan IMU biasanya dalam sistem koordinat IMU terpisah, dan rotasi diperlukan untuk memetakan keduanya ke sistem koordinat kamera jika kedua sistem koordinat tersebut berbeda.
  • Semua kolom adalah little-endian (byte yang tidak signifikan terlebih dahulu), dan floating 32-bit poin adalah format IEEE 754-1985.
  • Untuk menyinkronkan frame video dan metadata secara akurat, PTS frame video harus berada di pusat eksposurnya (ini juga dapat disimpulkan dari metadata eksposur).
  • Aplikasi yang menggabungkan data ini harus memilih skala waktu yang cukup besar untuk mendapatkan PTS yang akurat.

Potensi masalah

  • Desain ini hanya mengizinkan satu paket per sampel data. Perangkat tersemat mungkin mengalami masalah saat menulis paket frekuensi yang sangat tinggi karena meningkatkan tekanan I/O, serta ukuran {i>header<i} (misalnya, atom stsc dan stsz) jika ukuran paket bervariasi.
  • Mencampur berbagai jenis data dengan penundaan yang berbeda dapat menyebabkan PTS melangkah maju dan mundur saat paket ditulis ke dalam file tersebut. Namun, hal ini dapat diatasi dengan {i>buffering<i} paket dan menulisnya dalam urutan monoton.