מפרט המטא-נתונים של תנועה במצלמה

הדף הזה מפרט מפרט שמאפשר לקובצי MP4 להטמיע מטא-נתונים על תנועת המצלמה במהלך צילום הסרטון. לרוב, במכשירים שמצלמים סרטונים יש חיישנים שיכולים לספק עוד מידע לגבי הצילום. למשל:

  • בטלפונים ניידים יש בדרך כלל חיישנים לג'ירוסקופ, מד תאוצה, מגנטומטר ו-GPS.
  • אפשר להשתמש בסינון באמצעות חיישנים כדי לעקוב אחר תנוחת החופש (3DoF) של מכשירים.
  • אפשר להשתמש בלוקליזציה ובמיפוי בו-זמנית (SLA) כדי לעקוב אחר תנוחת החופש של 6 הדרגות במכשיר (לדוגמה, Tango).
  • אפשר להשתמש בפרטי החשיפה כדי למזג בין סריקה לסריקה.

אפשר לשמור את המטא-נתונים בסרטון לצורך עיבוד מתקדם לאחר עיבוד באפליקציות שונות. למשל:

  • אפשר להשתמש בפרטי סיבוב ברמת הפריים כדי לייצב סרטונים, ולהשתמש בנתוני תנועה ברמת הסריקה כדי לצמצם אפקטים של תריס מתגלגל.
  • אפשר להשתמש בקריאות של IMU ובתנוחות 3DoF נגזרות כדי להעריך את התאמת הזמן והיישור הגיאומטרי בין IMU לבין המצלמה.

הקטעים הבאים מציינים את מסלול המטא-נתונים של CAmera Motion (CAMM), שכולל רשומה חדשה שמציינת את נוכחות הטראק ואת פורמט הנתונים של דגימות מסלול.

ערך לדוגמה

קובץ הסרטון צריך להכיל את תיבת רשומת הדוגמה הבאה כדי לציין את מסלול המטא-נתונים המותאם אישית, ואת 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;
          

כיוון ציר הזווית ברדיאנים שמייצג את הסיבוב מקואורדינטות של מצלמה מקומית למערכת קואורדינטות בעולם. מערכת הקואורדינטות העולמית מוגדרת על ידי אפליקציות.

נניח שהמטריצת הסיבוב של 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;
          
ננו-שניות

המטא-נתונים הם לפי מסגרת וידאו. זמן ההצגה (PTS) של המטא-נתונים הזה צריך להתחיל בתחילת החשיפה של הסריקה הראשונה שנעשה בה שימוש במסגרת וידאו.

המדד pixel_exposure_time_ns מייצג את זמן החשיפה של פיקסל יחיד בננו-שניות, ואת הערך של rolling_shutter_skew_time_ns בין החשיפה לסריקה שנעשה בה שימוש בפעם הראשונה לבין הסריקה האחרונה שנעשה בה שימוש. אפשר להשתמש בהם כדי לשבץ מטא-נתונים לכל סריקה.

נקודות ה-PTS של המסגרת המתאימה צריכות להיות בטווח pts_of_this_metadata וב-pts_of_this_metadata + pixel_exposure_time_ns +roll_shutter_skew_time_ns.

כאשר המידע הזה לא נשמר, המכשיר צריך לנסות לבצע שינוי מותאם ביותר של ה-PTS של מסגרת הווידאו כדי להופיע במרכז החשיפה של הפריים.

  case 2:
    float gyro[3];
  break;
          
רדיאנים/שניות

אות ג'ירוסקופ ברדיאנים/שניות בסביבות ציר ה-XYZ של המצלמה. הסיבוב הוא חיובי בכיוון נגד כיוון השעון.

אפליקציות מגדירות את הקשר בין מערכת הקואורדינטות IMU לבין מערכת הקואורדינטות של המצלמה. אם אפשר, מומלץ להתאים אותן.

לתשומת ליבך, קריאות גירוי ראשוניות נמצאות במערכת הקואורדינטות IMU המוגדרת על ידי הנהג שלה, ויש צורך בטרנספורמציה נכונה כדי להמיר אותה למערכת הקואורדינטות של המצלמה.

כדאי לעיין בחיישן Android.TYPE_GYROSCOPE.

  case 3:
    float acceleration[3];
  break;
          
מטרים לשנייה^2

מד מד תאוצה קורא במטרים לשנייה. לשנייה ב-2 צירי ציר ה-XYZ של המצלמה.

אפליקציות מגדירות את הקשר בין מערכת הקואורדינטות IMU לבין מערכת הקואורדינטות של המצלמה. אם אפשר, מומלץ להתאים אותן.

יש לעיין בחיישן Android.TYPE_ACCELEROMETER.

  case 4:
    float position[3];
  break;
          

המיקום בתלת-ממד של המצלמה. סיבוב תלת-ממד של מיקום וציר הזווית בתלת-ממד מגדיר את עמדת 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 – הזמן שעבר מאז ה-GPS ועד לביצוע המדידה

gps_fix_type – 0 ( ללא תיקון), 2 (תיקון דו-ממדי), 3 (תיקון תלת-ממדי)

קו רוחב - קו רוחב במעלות

קו אורך – קו אורך במעלות

height – הגובה מעל האליפסה WGS-84

horizontal_accuracy - דיוק אופקי (לאורך/ארוך)

vertical_accuracy - דיוק (גובה) אנכי

velogity_east – מהירות בכיוון מזרח

velogity_north – המהירות בכיוון הצפוני

velogity_up – המהירות בכיוון מעלה

speed_accuracy - דיוק המהירות

  case 7:
    float magnetic_field[3];
  break;
          
מיקרוטסלה

שדה מגנטי באווירה.

צריך לעיין בחיישן Android.TYPE_MAGNETIC_FIELD.

}

הערות

  • קובץ MP4 צריך להכיל מסלול CAMM אחד בלבד, שמכיל את כל סוגי הנתונים שלמעלה על ידי שילוב שלהם.
  • דגימות GPS במקרים 5 ו-6 חייבות להיות ערכים גולמיים שנוצרו על ידי חיישנים. אי אפשר לבצע אינטרפולציה או לחזור עליהן כשאין שינוי ב-GPS.
  • מערכות הקואורדינטות הן צד ימין. מערכת הקואורדינטות של המצלמה מוגדרת כ-X פונה ימינה, Y פונה למטה ו-Z פונה קדימה. ציר ה-Y של מערכת הקואורדינטות הגלובלית אמור להצביע לאורך וקטור המשיכה.
  • מדידות IMU הן בדרך כלל במערכת קואורדינטות נפרדת של IMU. יש צורך בסבב כדי למפות אותן למערכת הקואורדינטות של המצלמה אם שתי מערכות הקואורדינטות שונות.
  • כל השדות הם מעט קטנים (בפורמט בייט ראשון לפחות), והנקודות הצפות ב-32 ביט הן בפורמט IEEE 754-1985.
  • כדי לסנכרן בצורה מדויקת את מסגרת הסרטון והמטא-נתונים, ה-PTS של מסגרת הווידאו צריך להופיע במרכז החשיפה (ניתן להסיק זאת על פי המטא-נתונים של החשיפה).
  • האפליקציה הממליצה את הנתונים האלה צריכה לבחור קנה מידה גדול מספיק כדי לקבל נתוני PTS מדויקים.

בעיות אפשריות

  • העיצוב הזה מאפשר חבילה אחת בלבד לכל דגימת נתונים. במכשירים מוטמעים עשויות להיות בעיות בכתיבה של חבילות בתדר גבוה מאוד, מאחר שהן גורמות ללחץ על I/O, וגם לגודל הכותרת (לדוגמה, האטומים של stsc ו-stsz) אם גודל החבילה משתנה.
  • שילוב של סוגי נתונים שונים עם עיכובים שונים עלול לגרום ל-PTS לעבור קדימה ואחורה ככל שחבילות נכתבות בקובץ. עם זאת, אפשר להתגבר על כך באמצעות אחסון נתונים בחבילות וכתיבתם בסדר מונוטוני.