หน้านี้อธิบายข้อกำหนดที่อนุญาตให้ฝังไฟล์ 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 แล้ว จำเป็นต้องบันทึกเฉพาะการวางแนวทั่วโลกที่ผสานรวมเท่านั้น ค่าทั้งสามแสดงเวกเตอร์ของแกนมุม กล่าวคือมุมการหมุนเป็นเรเดียนนั้นพิจารณาจากความยาวของเวกเตอร์ และแกนหมุนจะกำหนดโดยเวกเตอร์ปกติ การนำเสนอที่เข้ารหัสสามารถสร้างจากแกนและมุมที่มี และการนำเสนอที่เข้ารหัสจะเปลี่ยนรูปแบบกลับไปเป็นแกนและมุมด้วย |
|
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 ดำเนินการไปข้างหน้า และย้อนกลับเมื่อมีการเขียนแพ็กเก็ตลงในไฟล์ อย่างไรก็ตาม คุณสามารถแก้ปัญหานี้ได้โดย การบัฟเฟอร์แพ็กเก็ตและเขียนตามลำดับแบบโมโนนิก