कैमरा मोशन मेटाडेटा की खास जानकारी

इस पेज में एक खास जानकारी के बारे में बताया गया है, जिसमें MP4 फ़ाइलों को एम्बेड करने की अनुमति है वीडियो कैप्चर करने के दौरान कैमरे के मोशन के बारे में मेटाडेटा. आम तौर पर, वीडियो कैप्चर करने वाले डिवाइसों में ये तस्वीरें कैप्चर करने के बारे में ज़्यादा जानकारी दे सकते हैं. उदाहरण के लिए:

  • मोबाइल फ़ोन में आम तौर पर जाइरोस्कोप, एक्सलरोमीटर, मैग्नेटोमीटर और GPS के लिए सेंसर होते हैं.
  • सेंसर फ़्यूज़न का इस्तेमाल, डिवाइसों की 3 डिग्री ऑफ़ फ़्रीडम (3DoF) स्थिति को ट्रैक करने के लिए किया जा सकता है.
  • 6 डिग्री की स्वतंत्रता को ट्रैक करने के लिए साथ-साथ लोकलाइज़ेशन और मैपिंग (एसएलएएम) का इस्तेमाल किया जा सकता है डिवाइस (जैसे, टैंगो) का पोज़ (6DoF).
  • एक्सपोज़र की जानकारी का इस्तेमाल हर स्कैन-लाइन की गति का अनुमान लगाने के लिए किया जा सकता है.

इस मेटाडेटा को अलग-अलग ऐप्लिकेशन में बेहतर पोस्ट-प्रोसेसिंग के लिए वीडियो में सेव किया जा सकता है. उदाहरण के लिए:

  • फ़्रेम-लेवल के रोटेशन की जानकारी का इस्तेमाल, वीडियो को स्थिर करने के लिए किया जा सकता है. साथ ही, स्कैनलाइन-लेवल के मोशन डेटा का इस्तेमाल करके, रोलिंग शटर इफ़ेक्ट को कम किया जा सकता है.
  • IMU रीडिंग और निकाले गए 3DoF पोज़ का इस्तेमाल, IMU और कैमरे के बीच टाइम अलाइनमेंट और जियोमेट्रिक अलाइनमेंट का आकलन करने के लिए किया जा सकता है.

यहां दिए गए सेक्शन से, कैमरा मोशन मेटाडेटा (सीएएमएम) ट्रैक के बारे में जानकारी मिलती है. इसमें एक नया सैंपल शामिल है ऐसी एंट्री जो ट्रैक की मौजूदगी और ट्रैक के सैंपल के डेटा फ़ॉर्मैट को दिखाती है.

सैंपल एंट्री

कस्टम मेटाडेटा दिखाने के लिए, वीडियो फ़ाइल में नीचे दिया गया सैंपल एंट्री बॉक्स होना चाहिए और ट्रैक के subComponentType को 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') {
}
  

डेटा फ़ॉर्मैट

मेटाडेटा ट्रैक में मेटाडेटा के सैंपल की एक स्ट्रीम होती है. इस स्ट्रीम को इस तरह से फ़ॉर्मैट किया जाता है.

फ़ील्ड इकाई ब्यौरा
uint16 reserved;
रिज़र्व किया गया. 0 होना चाहिए.
uint16 type;
डेटा पैकेट का टाइप (नीचे देखें). हर पैकेट में एक तरह का डेटा होता है.
switch (type) {
  case 0:
    float angle_axis[3];
  break;
          

रेडियन में एंगल ऐक्सिस की दिशा. यह, स्थानीय कैमरे के निर्देशांक से वर्ल्ड निर्देशांक सिस्टम में किए गए घूमने को दिखाता है. वर्ल्ड निर्देशांक सिस्टम, ऐप्लिकेशन से तय होता है.

मान लें कि एंगल ऐक्सिस वेक्टर के हिसाब से M को 3x3 का रोटेशन मैट्रिक्स होना चाहिए. स्थानीय निर्देशांक प्रणाली में किसी भी किरण X के लिए, विश्व निर्देशांक में किरण की दिशा M * X है.

यह जानकारी, डिवाइस पर 3DoF सेंसर फ़्यूज़न चलाकर ली जा सकती है. IMU रीडिंग को इंटिग्रेट करने के बाद, सिर्फ़ इंटिग्रेट किए गए ग्लोबल ओरिएंटेशन को रिकॉर्ड करने की ज़रूरत होती है.

तीन वैल्यू, ऐंगल-ऐक्सिस वेक्टर को दिखाती हैं. जैसे, रेडियन में रोटेशन एंगल, वेक्टर की लंबाई से दिया जाता है, और रोटेशन ऐक्सिस नॉर्मलाइज़ किए गए वेक्टर से दिया जाता है.

कोड में बदले गए तरीके को, float[3] angle_axis := angle_radians * normalized_axis_vec3 की मदद से ऐक्सिस और ऐंगल से बनाया जा सकता है. पॉज़िटिव ऐंगल, ऐक्सिस के चारों ओर घड़ी की उलटी दिशा में घूमता है.

साथ ही, कोड में बदले गए तरीके को float[3] axis := normalize(axis_angle) और float angle_radians := length(angle_axis) की मदद से, फिर से ऐक्सिस और ऐंगल में बदला जा सकता है.

  case 1:
    int32 pixel_exposure_time;
    int32 rolling_shutter_skew_time;
  break;
          
नैनोसेकंड

यह मेटाडेटा हर वीडियो फ़्रेम के मुताबिक है. इस मेटाडेटा को दिखाए जाने का समय (पीटीएस) ऐसा होना चाहिए किसी वीडियो फ़्रेम में पहली बार इस्तेमाल की गई स्कैनलाइन के एक्सपोज़र की शुरुआत हो.

pixel_exposure_time_ns, एक पिक्सल के एक्सपोज़र का समय है nanoseconds और rolling_shutter_skew_time_ns सबसे पहले इस्तेमाल की गई स्कैनलाइन और आखिरी बार इस्तेमाल की गई स्कैनलाइन का एक्सपोज़र. इन रणनीतियों का इस्तेमाल किया जा सकता है हर स्कैन-लाइन मेटाडेटा को इंटरपोलेट करने के लिए.

मिलते-जुलते फ़्रेम के पीटीएस यहां होने चाहिए pts_of_this_metadata और pts_of_this_metadata + pixel_exposure_time_ns + रोलिंग_shutter_skew_time_ns.

जब यह जानकारी सेव नहीं की जाती है, तो डिवाइस को कोशिश करनी चाहिए कि वह वीडियो फ़्रेम के PTS को फ़्रेम एक्सपोज़र के केंद्र में सेट करें.

  case 2:
    float gyro[3];
  break;
          
रेडियन/सेकंड

कैमरे के XYZ ऐक्सिस के आस-पास, रेडियन/सेकंड में जाइरोस्कोप सिग्नल. घुमाव है पॉज़िटिव नंबर को घड़ी की उलटी दिशा में पॉज़िटिव रखें.

ऐप्लिकेशन, IMU निर्देशांक सिस्टम और कैमरे के बीच संबंध तय करते हैं निर्देशांक सिस्टम. हमारा सुझाव है कि अगर हो सके, तो इन्हें अलाइन करें.

ध्यान दें कि शुरुआती जाइरो रीडिंग, उसके ड्राइवर से तय किए गए IMU निर्देशांक सिस्टम में होती है, और इसे कैमरा कोऑर्डिनेट सिस्टम में बदलने के लिए, इसमें बदलाव की ज़रूरत है.

Android सेंसर देखें.TYPE_GYROSCOPE.

  case 3:
    float acceleration[3];
  break;
          
मीटर/सेकंड^2

कैमरे के XYZ ऐक्सिस से, मीटर/सेकंड^2 में एक्सलरोमीटर की रीडिंग.

ऐप्लिकेशन, IMU निर्देशांक सिस्टम और कैमरे के बीच संबंध तय करते हैं निर्देशांक सिस्टम. हमारा सुझाव है कि अगर हो सके, तो इन्हें अलाइन करें.

Android सेंसर देखें.TYPE_ACCELEROMETER.

  case 4:
    float position[3];
  break;
          

कैमरे की 3D स्थिति. 3D स्थिति और कोण अक्ष का रोटेशन एक साथ कैमरे के 6DoF पोज़ वाले मॉडल और वे सभी ऐप्लिकेशन के तय किए हुए कोऑर्डिनेट में मौजूद हैं सिस्टम.

आपको डिवाइस पर 6DoF ट्रैकिंग की सुविधा चलाकर यह जानकारी मिल सकती है.

  case 5:
    double latitude;
    double longitude;
    double altitude;
  break;
          
डिग्री

सैंपल का कम से कम GPS निर्देशांक.

  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 - माप लिए जाने के समय जीपीएस Epoch के हिसाब से समय के बाद का समय

gps_fix_type - 0 ( कोई समस्या ठीक नहीं की गई), 2 (2D समाधान), 3 (3D समाधान)

अक्षांश - डिग्री में अक्षांश

देशांतर - डिग्री में देशांतर

height - WGS-84 दीर्घवृत्त से ऊपर की ऊंचाई

horizontal_accuracy - हॉरिज़ॉन्टल (अक्षांश/देशांतर) कितना सटीक है

vertical_accuracy - वर्टिकल (ऊंचाई) कितना सटीक है

velocity_east - पूर्व दिशा में वेलोसिटी

velocity_north - उत्तर दिशा में वेलोसिटी

velocity_up - ऊपर की दिशा में वेलोसिटी

speed_accuracy - रफ़्तार की सटीक जानकारी

  case 7:
    float magnetic_field[3];
  break;
          
माइक्रोटेस्ला

ऐंबियंट मैग्नेटिक फ़ील्ड.

Android Sensor.TYPE_MAGNETIC_FIELD देखें.

}

नोट

  • हर MP4 फ़ाइल में सिर्फ़ एक सीएएमएम ट्रैक होना चाहिए. इसमें ऊपर दिए गए सभी डेटा टाइप शामिल होने चाहिए उन्हें एक साथ मर्ज करके.
  • केस 5 और 6 में जीपीएस सैंपल, सेंसर से जनरेट की गई रॉ वैल्यू होनी चाहिए. ये काम नहीं किए जा सकते GPS में बदलाव न होने पर इंटरपोलेट या दोहराया गया.
  • निर्देशांक सिस्टम दाईं ओर होते हैं. कैमरे कोऑर्डिनेट सिस्टम को X के तौर पर दिखाया गया है Y आपकी ओर से नीचे की ओर, और Z की ओर से आगे की ओर. द Y-ऐक्सिस ऑफ़ द ग्लोबल निर्देशांक सिस्टम को गुरुत्वाकर्षण सदिश के साथ, नीचे की ओर पॉइंट करना चाहिए.
  • IMU रीडिंग आम तौर पर एक अलग IMU निर्देशांक सिस्टम में होती हैं, और घूमने के लिए रोटेशन की ज़रूरत होती है अगर दोनों निर्देशांक सिस्टम अलग-अलग हैं, तो उन्हें कैमरा निर्देशांक सिस्टम से मैप किया जा सकता है.
  • सभी फ़ील्ड लिटिल एंडियन हैं (सबसे कम महत्वपूर्ण बाइट पहले), और 32-बिट फ़्लोटिंग पॉइंट आईईईई 754-1985 फ़ॉर्मैट में होते हैं.
  • वीडियो फ़्रेम और मेटाडेटा को सटीक सिंक करने के लिए, वीडियो फ़्रेम के PTS एक्सपोज़र के बीच में होना चाहिए (इसका अनुमान एक्सपोज़र मेटाडेटा से भी लगाया जा सकता है).
  • इस डेटा को मर्ज करने वाले ऐप्लिकेशन को सटीक पीटीएस.

संभावित समस्याएं

  • इस डिज़ाइन में, डेटा के हर सैंपल के लिए सिर्फ़ एक पैकेट की अनुमति है. एम्बेड किए गए डिवाइसों में, लिखने में समस्याएं हो सकती हैं बहुत ज़्यादा फ़्रीक्वेंसी वाले पैकेट, क्योंकि इससे I/O दबाव के साथ-साथ हेडर का साइज़ भी बढ़ता है (उदाहरण के लिए, stsc और stsz ऐटम). पैकेट का साइज़ अलग-अलग है.
  • अलग-अलग तरह के डेटा को अलग-अलग देरी के साथ मिलाने पर, पीटीएस आगे बढ़ सकता है फ़ाइल में पैकेट लिखे जाते हैं और उन्हें पीछे की ओर ले जाते हैं. हालांकि, इससे समस्या हल की जा सकती है बफ़रिंग पैकेट और उन्हें एक ही क्रम में लिखना.