Spesifikasi Metadata Gerakan Kamera

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

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

Metadata ini dapat disimpan dalam video untuk pasca-pemrosesan 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 bergilir.
  • Pembacaan IMU dan pose 3DoF turunan dapat digunakan untuk mengevaluasi penyelarasan waktu dan penyelarasan geometri antara IMU dan kamera.

Bagian di bawah ini menentukan trek CAmera Motion Metadata (CAMM), yang mencakup entri sampel baru yang menunjukkan adanya trek dan format data sampel trek.

Contoh entri

File video harus berisi contoh kotak entri untuk menunjukkan trek metadata kustom, dan subComponentType dari trek 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 sampel metadata yang diformat sebagai berikut.

Kolom Satuan Deskripsi
uint16 reserved;
Direservasi. Seharusnya 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.

Biarkan M menjadi matriks rotasi 3x3 yang sesuai dengan vektor sumbu sudut. Untuk setiap sinar X dalam sistem koordinat lokal, arah sinar dalam 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.

Tiga nilai ini mewakili vektor sumbu sudut, 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.

Dan representasi yang dienkode dapat diubah kembali menjadi 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 presentasi (PTS) metadata ini harus berupa awal paparan pemindaian yang pertama kali digunakan dalam frame video.

pixel_exposure_time_ns adalah waktu eksposur untuk satu piksel dalam nanodetik dan rolling_shutter_skew_time_ns adalah penundaan antara eksposur saluran pemindaian pertama dan yang terakhir digunakan. Kolom ini dapat digunakan untuk menginterpolasi metadata per pemindaian.

PTS dari frame terkait harus berada dalam pts_of_this_metadata dan pts_of_this_metadata + pixel_exposure_time_ns + lint_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 positif ke arah berlawanan.

Aplikasi menentukan hubungan antara sistem koordinat IMU dan sistem koordinat kamera. Jika memungkinkan, sebaiknya Anda menyesuaikannya.

Perhatikan bahwa pembacaan gyro awal ada dalam sistem koordinat IMU yang ditentukan oleh pengemudinya, dan transformasi yang tepat diperlukan untuk mengonversinya ke sistem koordinat kamera.

Lihat Android Sensor.TYPE_GYROSCOPE.

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

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

Aplikasi menentukan hubungan antara sistem koordinat IMU dan sistem koordinat kamera. Jika memungkinkan, sebaiknya Anda menyesuaikannya.

Lihat Android Sensor.TYPE_ACCELEROMETER.

  case 4:
    float position[3];
  break;
          

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

Anda dapat memperoleh informasi ini dengan menjalankan pelacakan 6DoF pada perangkat.

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

Koordinat GPS sampel minimum.

  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 ( tanpa perbaikan), 2 (perbaikan 2D), 3 (perbaikan 3D)

lintang - Lintang dalam derajat

bujur - Bujur dalam derajat

ketinggian - Tinggi di atas elipsoid WGS-84

horizontal_akurasi - Akurasi horizontal (lintang/panjang)

vertical_accuracy - Akurasi vertikal (ketinggian)

velocity_east - Kecepatan di arah timur

velocity_north - Kecepatan di 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 melakukan muting semuanya.
  • Sampel GPS dalam kasus 5 dan 6 harus berupa nilai mentah yang dihasilkan oleh sensor. Parameter tidak dapat diinterpolasi atau diulang jika tidak ada perubahan GPS.
  • Sistem koordinat berada di sisi kanan. Sistem koordinat kamera didefinisikan sebagai X yang mengarah ke kanan, Y yang mengarah ke bawah, dan Z yang mengarah ke depan. Sumbu Y dari sistem koordinat global harus mengarah ke sepanjang vektor gravitasi.
  • Pembacaan IMU biasanya berada dalam sistem koordinat IMU yang terpisah, dan rotasi diperlukan untuk memetakannya ke sistem koordinat kamera jika kedua sistem koordinat tersebut berbeda.
  • Semua kolom menggunakan sedikit end-end (paling sedikit byte signifikan pertama), dan floating point 32-bit adalah format IEEE 754-1985.
  • Untuk menyinkronkan frame video dan metadata secara akurat, PTS frame video harus berada di tengah eksposurnya (ini juga dapat disimpulkan dari metadata eksposur).
  • Aplikasi yang mengubah 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 sematan mungkin mengalami masalah penulisan paket frekuensi yang sangat tinggi karena meningkatkan tekanan I/O, serta ukuran header (misalnya atom stsc dan stsz) jika ukuran paket bervariasi.
  • Menggabungkan berbagai jenis data dengan penundaan yang berbeda dapat menyebabkan PTS maju dan mundur saat paket ditulis ke file. Namun, hal ini dapat diatasi dengan buffering paket dan menulisnya dalam urutan monoton.