Thông số siêu dữ liệu chuyển động của máy ảnh

Trang này mô tả một thông số kỹ thuật cho phép các tệp MP4 nhúng siêu dữ liệu về chuyển động của máy ảnh trong khi quay video. Các thiết bị quay video thường có cảm biến có thể cung cấp thêm thông tin về quá trình quay. Ví dụ:

  • Điện thoại di động thường có cảm biến cho con quay hồi chuyển, gia tốc kế, từ kế và GPS.
  • Bạn có thể dùng phản ứng kết hợp cảm biến để theo dõi tư thế 3 bậc tự do (3DoF) của thiết bị.
  • Bạn có thể sử dụng đồng thời bản địa hoá và ánh xạ (SLAM) để theo dõi tư thế 6 độ tự do (6DoF) của thiết bị (ví dụ: Daydream).
  • Thông tin tiếp xúc có thể được dùng để nội suy chuyển động trên mỗi lần quét.

Siêu dữ liệu này có thể được lưu trong video để xử lý hậu kỳ nâng cao trong nhiều ứng dụng. Ví dụ:

  • Thông tin về chế độ xoay ở cấp khung hình có thể dùng để ổn định video và dùng dữ liệu chuyển động ở cấp độ quét để giảm hiệu ứng cửa chớp lăn.
  • Các chỉ số IMU và tư thế 3DoF được dẫn xuất có thể được dùng để đánh giá căn chỉnh thời gian và căn chỉnh hình học giữa IMU và máy ảnh.

Các phần dưới đây chỉ định kênh siêu dữ liệu chuyển động CAmera (CAMM), bao gồm một mục mẫu mới cho biết sự tồn tại của kênh và định dạng dữ liệu của các mẫu kênh.

Mục nhập mẫu

Tệp video phải chứa hộp nhập mẫu sau đây để cho biết kênh siêu dữ liệu tuỳ chỉnh và subComponentType của kênh phải được đặt thành 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') {
}
  

Định dạng dữ liệu

Kênh siêu dữ liệu chứa một luồng mẫu siêu dữ liệu được định dạng như sau.

Trường Đơn vị Nội dung mô tả
uint16 reserved;
Dành riêng. Giá trị này phải bằng 0.
uint16 type;
Loại gói dữ liệu (xem bên dưới). Mỗi gói có một loại dữ liệu.
switch (type) {
  case 0:
    float angle_axis[3];
  break;
          

Hướng trục góc (tính bằng radian) thể hiện chế độ xoay từ các tọa độ máy ảnh cục bộ đến một hệ toạ độ thế giới. Hệ thống toạ độ thế giới được các ứng dụng xác định.

Gọi M là ma trận xoay 3x3 tương ứng với vectơ trục góc. Đối với bất kỳ tia X nào trong hệ tọa độ cục bộ, hướng tia trên thế giới là M * X.

Thông tin này có thể được thu thập bằng cách chạy phản ứng kết hợp cảm biến 3DoF trên thiết bị. Sau khi tích hợp các chỉ số IMU, bạn chỉ cần ghi lại hướng toàn cục được tích hợp.

Ba giá trị này biểu thị vectơ trục quay. Do đó, góc xoay bằng rađian được tính bằng độ dài của vectơ và trục xoay được cho là vectơ chuẩn hoá.

Bạn có thể tạo giá trị biểu diễn đã mã hoá từ một trục và góc bằng float[3] angle_axis := angle_radians * normalized_axis_vec3. Góc dương biểu thị chế độ xoay ngược chiều kim đồng hồ quanh trục.

Và cách biểu diễn đã mã hoá có thể được chuyển đổi về trục và góc bằng float[3] axis := normalize(axis_angle)float angle_radians := length(angle_axis).

  case 1:
    int32 pixel_exposure_time;
    int32 rolling_shutter_skew_time;
  break;
          
nano giây

Siêu dữ liệu này tương ứng với từng khung hình video. Thời gian trình bày (PTS) của siêu dữ liệu này phải là thời điểm bắt đầu hiển thị dòng quét được sử dụng lần đầu tiên trong khung video.

pixel_exposure_time_ns là thời gian phơi sáng của một pixel tính bằng nano giây và rolling_Shutter_skew_time_ns là độ trễ giữa thời điểm phơi sáng của dòng quét được sử dụng lần đầu và dòng quét được sử dụng gần đây nhất. Bạn có thể sử dụng các công cụ này để nội suy siêu dữ liệu theo mỗi lần quét.

PTS của khung hình tương ứng phải nằm trong phạm vi pts_of_this_metadatapts_of_this_metadata + pixel_exposure_time_ns + roll_Shutter_skew_time_ns.

Khi thông tin này không được lưu, thiết bị phải cố gắng hết sức để điều chỉnh PTS của khung hình video sao cho trung tâm của việc phơi sáng khung hình.

  case 2:
    float gyro[3];
  break;
          
radian/giây

Tín hiệu con quay hồi chuyển tính bằng radian/giây xung quanh trục XYZ của máy ảnh. Xoay theo chiều dương ngược chiều kim đồng hồ.

Các ứng dụng xác định mối quan hệ giữa hệ toạ độ IMU và hệ toạ độ máy ảnh. Bạn nên căn chỉnh nếu có thể.

Xin lưu ý rằng các giá trị gyro ban đầu nằm trong hệ thống toạ độ IMU do trình điều khiển của nó xác định, và bạn cần phải có phép biến đổi phù hợp để chuyển đổi hệ thống đó sang hệ thống toạ độ máy ảnh.

Tham khảo Android Sensor.TYPE_GYROSCOPE.

  case 3:
    float acceleration[3];
  break;
          
số mét/giây^2

Đọc gia tốc kế theo mét/giây^2 dọc theo các trục XYZ của máy ảnh.

Các ứng dụng xác định mối quan hệ giữa hệ toạ độ IMU và hệ toạ độ máy ảnh. Bạn nên căn chỉnh nếu có thể.

Tham khảo Android Sensor.TYPE_ACCELEROMETER.

  case 4:
    float position[3];
  break;
          

Vị trí 3D của máy ảnh. Vị trí 3D và độ xoay trục góc cùng nhau xác định tư thế 6DoF của máy ảnh, đồng thời chúng nằm trong một hệ toạ độ do ứng dụng xác định chung.

Bạn có thể nhận thông tin này bằng cách chạy tính năng theo dõi 6DoF trên thiết bị.

  case 5:
    double latitude;
    double longitude;
    double altitude;
  break;
          
độ

Toạ độ GPS tối thiểu của mẫu.

  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 – Thời gian kể từ thời gian bắt đầu của hệ thống GPS khi đo lường

gps_fix_type – 0 ( không có bản sửa lỗi), 2 (bản sửa lỗi 2D), 3 (bản sửa lỗi 3D)

vĩ độ - Vĩ độ theo độ

kinh độ - Kinh độ theo độ

elevation – Chiều cao trên hình elip WGS-84

horizontal_Accuracy – Độ chính xác của chiều ngang (vĩ độ/kinh độ)

vertical_Accuracy – Độ chính xác theo chiều dọc (độ cao)

velocity_east – Tốc độ theo hướng đông

velocity_north – Vận tốc ở hướng bắc

velocity_up – Tốc độ theo hướng lên

speed_Accuracy - Độ chính xác về tốc độ

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

Từ trường xung quanh.

Tham khảo Android Sensor.TYPE_MAGNETIC_FIELD.

}

Lưu ý

  • Chỉ nên có một bản nhạc CAMM cho mỗi tệp MP4, trong đó có chứa tất cả các loại dữ liệu ở trên bằng cách kết hợp các loại dữ liệu đó với nhau.
  • Các mẫu GPS trong trường hợp 5 và 6 phải là giá trị thô do cảm biến tạo ra. Bạn không thể nội suy hoặc lặp lại quy trình này khi không có sự thay đổi về GPS.
  • Hệ thống toạ độ ở bên phải. Hệ toạ độ máy ảnh được xác định là X hướng sang phải, Y hướng xuống dưới và Z hướng về phía trước. Trục Y của hệ toạ độ toàn cục phải trỏ xuống dọc theo vectơ trọng lực.
  • Các bài đọc IMU thường nằm trong một hệ toạ độ IMU riêng biệt và bạn phải xoay để ánh xạ các hệ thống đó với hệ thống toạ độ máy ảnh nếu hai hệ toạ độ khác nhau.
  • Tất cả các trường đều là Little-endian (ít nhất đáng kể byte đầu tiên) và dấu phẩy động 32 bit có định dạng IEEE 754-1985.
  • Để đồng bộ hoá chính xác khung video và siêu dữ liệu, PTS của khung hình video phải nằm ở trung tâm của mức phơi sáng (điều này cũng có thể suy ra từ siêu dữ liệu về độ phơi sáng).
  • Việc ứng dụng kết hợp dữ liệu này nên chọn một khoảng thời gian đủ lớn để có được một PTS chính xác.

Các vấn đề tiềm ẩn

  • Thiết kế này chỉ cho phép một gói cho mỗi mẫu dữ liệu. Các thiết bị được nhúng có thể gặp vấn đề khi viết gói tần số rất cao vì làm tăng áp suất I/O cũng như kích thước tiêu đề (ví dụ: nguyên tử stscstsz) nếu kích thước gói thay đổi.
  • Việc kết hợp nhiều loại dữ liệu với độ trễ khác nhau có thể khiến PTS bị tua đi và tua lại khi các gói được ghi vào tệp. Tuy nhiên, bạn có thể khắc phục vấn đề này bằng cách lưu các gói bộ đệm vào và viết các gói đó theo thứ tự đơn điệu.