ข้อกำหนดเฉพาะของข้อมูลเมตาของกล้อง

หน้านี้อธิบายข้อกำหนดที่อนุญาตให้ฝังไฟล์ MP4 ข้อมูลเมตาเกี่ยวกับการเคลื่อนไหวของกล้องขณะจับภาพวิดีโอ อุปกรณ์ที่บันทึกวิดีโอมัก เซ็นเซอร์ที่สามารถให้ข้อมูลเพิ่มเติมเกี่ยวกับการจับภาพ เช่น

  • โดยทั่วไปโทรศัพท์มือถือจะมีเซ็นเซอร์สำหรับเครื่องวัดการหมุน ตัวตรวจวัดความเร่ง เครื่องวัดค่าความเข้มข้นของสนามแม่เหล็ก และ GPS
  • การผสมผสานเซ็นเซอร์สามารถใช้เพื่อติดตามท่าทาง 3 องศาของอิสระ (3DoF) ของอุปกรณ์
  • สามารถใช้การแปลและการแมปแบบพร้อมกัน (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 คือเวลาเปิดรับแสงสำหรับ 1 พิกเซลใน นาโนวินาทีและ rolling_shutter_skew_time_ns คือความล่าช้าระหว่างแท็ก การสัมผัสกับภาพสแกนบรรทัดแรกที่ใช้และเส้นสแกนที่ใช้ล่าสุด โดยสามารถใช้ เพื่อประมาณข้อมูลเมตาต่อการสแกน

PTS ของเฟรมที่เกี่ยวข้องควรอยู่ภายใน pts_of_this_metadata และ pts_of_this_metadata + pixel_exposure_time_ns + Rolling_shutter_skew_time_ns

เมื่อระบบไม่ได้บันทึกข้อมูลนี้ไว้ อุปกรณ์ควรจะพยายามอย่างเต็มที่เพื่อ ปรับ PTS ของเฟรมวิดีโอให้อยู่ตรงกลางการรับแสงของเฟรม

  case 2:
    float gyro[3];
  break;
          
เรเดียน/วินาที

สัญญาณเครื่องวัดการหมุนเป็นเรเดียน/วินาทีรอบๆ แกน XYZ ของกล้อง การหมุนคือ เป็นบวกในทิศทางทวนเข็มนาฬิกา

แอปพลิเคชันกำหนดความสัมพันธ์ระหว่างระบบพิกัด IMU กับกล้อง ระบบพิกัด เราขอแนะนำให้ปรับให้สอดคล้องกันหากเป็นไปได้

โปรดทราบว่าการอ่านค่า Gyro เริ่มต้นอยู่ในระบบพิกัด IMU ที่กำหนดโดยไดรเวอร์ และมีการปฏิรูปที่เหมาะสมเพื่อแปลงเป็นระบบพิกัดของกล้อง

โปรดดูที่เซ็นเซอร์ AndroidTYPE_GYROSCOPE

  case 3:
    float acceleration[3];
  break;
          
เมตร/วินาที^2

การอ่านตัวตรวจวัดความเร่งในหน่วยเมตร/วินาที^2 ตามแกน XYZ ของกล้อง

แอปพลิเคชันกำหนดความสัมพันธ์ระหว่างระบบพิกัด IMU กับกล้อง ระบบพิกัด เราขอแนะนำให้ปรับให้สอดคล้องกันหากเป็นไปได้

โปรดดู Android Sensor.TYPE_ACCELEROMeter

  case 4:
    float position[3];
  break;
          

ตำแหน่งกล้องแบบ 3 มิติ ตำแหน่งแบบ 3 มิติและการหมุนแกนมุมรวมกันจะกำหนด ท่าทาง 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 (การแก้ไข 2 มิติ), 3 (การแก้ไข 3 มิติ)

latitude - ละติจูด เป็นองศา

longitude - ลองจิจูดเป็นองศา

aheight - ความสูงเหนือรูปทรงรี 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

}

หมายเหตุ

  • ควรมีแทร็ก CAMM เพียงแทร็กเดียวต่อไฟล์ MP4 ซึ่งมีประเภทข้อมูลข้างต้นทั้งหมด โดยการมักซ์เข้าด้วยกัน
  • ตัวอย่าง GPS ในกรณีที่ 5 และ 6 ต้องเป็นค่าดิบที่เซ็นเซอร์สร้างขึ้น และไม่สามารถ แบบสอดประสานหรือแสดงซ้ำเมื่อไม่มีการเปลี่ยนแปลง GPS
  • ระบบพิกัดจะอยู่ด้านขวามือ ระบบพิกัดกล้องกำหนดไว้เป็น X ชี้ไปทางขวา Y ชี้ลง และ Z ชี้ไปข้างหน้า แกน Y ของโลก ระบบพิกัดควรชี้ลงไปตามเวกเตอร์แรงโน้มถ่วง
  • โดยทั่วไปแล้ว การอ่าน IMU จะอยู่ในระบบพิกัด IMU ที่แยกต่างหากและต้องใช้การหมุนเพื่อ จะจับคู่ระบบพิกัดกล้องกับระบบพิกัดกล้องในกรณีที่ระบบพิกัดทั้งสองแตกต่างกัน
  • ทุกช่องจะเป็น Little Endian (ไบต์ที่มีนัยสำคัญน้อยที่สุดก่อน) และแบบ 32 บิตแบบลอย พอยต์จะอยู่ในรูปแบบ IEEE 754-1985
  • PTS ของเฟรมวิดีโอเพื่อซิงค์เฟรมวิดีโอและข้อมูลเมตาอย่างถูกต้อง ควรอยู่ที่จุดกึ่งกลางของจำนวนผู้ที่เห็น (หรืออนุมานจากข้อมูลเมตาของจำนวนผู้ที่เห็นได้ด้วย)
  • แอปพลิเคชันที่มักซ์ข้อมูลนี้ควรเลือกสเกลเวลาที่มีขนาดใหญ่พอที่จะสร้าง PTS ที่แม่นยำ

ปัญหาที่อาจเกิดขึ้น

  • การออกแบบนี้อนุญาตให้มี 1 แพ็กเก็ตต่อตัวอย่างข้อมูลเท่านั้น อุปกรณ์ที่ฝังอาจมีปัญหาในการเขียน แพ็กเก็ตความถี่สูงมากเนื่องจากเพิ่มความดัน I/O รวมถึงขนาดของส่วนหัว (เช่น อะตอม stsc และ stsz) หากขนาดแพ็กเก็ตแตกต่างกัน
  • การรวมข้อมูลประเภทต่างๆ ที่มีความล่าช้าต่างกันอาจทำให้ PTS ดำเนินการไปข้างหน้า และย้อนกลับเมื่อมีการเขียนแพ็กเก็ตลงในไฟล์ อย่างไรก็ตาม คุณสามารถแก้ปัญหานี้ได้โดย การบัฟเฟอร์แพ็กเก็ตและเขียนตามลำดับแบบโมโนนิก