ข้อมูลจําเพาะของข้อมูลเมตาการเคลื่อนไหวของกล้อง

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

  • โดยปกติ โทรศัพท์มือถือจะมีเซ็นเซอร์สําหรับเครื่องวัดการหมุน ตัวตรวจวัดความเร่ง เครื่องวัดค่าความเข้มข้นของสนามแม่เหล็ก และ GPS
  • การใช้เซ็นเซอร์ฟิวชันสามารถใช้ติดตามท่าแสดงอิสระของอุปกรณ์ 3 องศา (3DoF) ได้
  • ใช้การแปลและการแมป (SLAM) พร้อมกันเพื่อติดตามตําแหน่งอิสระ (6DoF) ของอุปกรณ์ 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;
ประเภทของแพ็กเก็ตข้อมูล (ดูด้านล่าง) แต่ละแพ็กเก็ตจะมีข้อมูล 1 ประเภท
switch (type) {
  case 0:
    float angle_axis[3];
  break;
          

การวางแนวแกนมุมเป็นเรเดียนที่แสดงถึงการหมุนจากพิกัดกล้องในเครื่องไปยังระบบพิกัดโลก ระบบพิกัดโลกกําหนดโดยแอปพลิเคชัน

ให้ M เป็นเมทริกซ์การหมุนแบบ 3x3 ที่ตรงกับเวกเตอร์ของแกนมุม สําหรับรังสี X ในระบบพิกัดท้องถิ่น ทิศทางของรังสีในพิกัดโลกคือ ก * X

ข้อมูลนี้ได้รับโดยการเรียกใช้เซ็นเซอร์เซ็นเซอร์ 3DoF ในอุปกรณ์ หลังจากผสานรวมค่าที่อ่านได้ของ IMU แล้ว ระบบจะบันทึกเฉพาะการวางแนวโลกแบบรวมเท่านั้น

ค่า 3 ค่าแสดงถึงเวกเตอร์ของแกนมุม นั่นคือมุมในแกนเรเดียนจะกําหนดโดยระยะเวลาของเวกเตอร์ และแกนหมุนจะได้มาจากเวกเตอร์มาตรฐาน

การสร้างตัวแทนที่เข้ารหัสจะสร้างจากแกนและมุมได้โดยใช้ 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 และระบบพิกัดของกล้อง เราขอแนะนําให้คุณจัดเรียงข้อความเหล่านั้นหากเป็นไปได้

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

ดูเซ็นเซอร์ AndroidTYPE_GYROSCOPE

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

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

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

ดูเซ็นเซอร์ AndroidTYPE_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 มิติ)

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

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

ระดับความสูง - ความสูงเหนือวงรี WGS-84

horizontal_accuracy - ความแม่นยําแนวนอน (ละติจูด/ลองจิจูด)

vertical_accuracy - ความถูกต้องของประเภทธุรกิจ (ระดับความสูง)

velocity_east - อัตราความเร็วในทิศทางตะวันออก

velocity_north - อัตราความเร็วในทิศเหนือ

velocity_up - อัตราความเร็วในทิศทางขึ้น

speed_accuracy - ความแม่นยําด้านความเร็ว

  case 7:
    float magnetic_field[3];
  break;
          
Microtesla

สนามแม่เหล็กบรรยากาศ

โปรดดูเซ็นเซอร์ AndroidTYPE_MAGNETIC_FIELD

}

หมายเหตุ

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

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

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