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