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

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

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

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

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

בקטעים הבאים מצוין הטראק של CAmera Motion Metadata (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;
          

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

מגדירים את 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;
          
ננו-שניות

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

pixel_exposure_time_ns הוא זמן החשיפה של פיקסל יחיד ביחידות nanoseconds ו-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 Sensor.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 (תיקון תלת-ממדי)

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

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

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

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

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