카메라 모션 메타데이터 사양

이 페이지에서는 동영상 캡처 중에 MP4 파일에 카메라 모션에 대한 메타데이터를 삽입할 수 있는 사양을 설명합니다. 일반적으로 동영상을 캡처하는 기기에는 캡처에 관한 추가 정보를 제공할 수 있는 센서가 있습니다. 예를 들면 다음과 같습니다.

  • 휴대전화에는 일반적으로 자이로스코프, 가속도계, 자기계, GPS의 센서가 있습니다.
  • 센서 퓨전을 사용하여 3도 자유 (3DoF) 자세를 추적할 수 있습니다.
  • 동시 현지화 및 매핑 (SLAM)을 사용하여 기기(예: 탱고)의 자유도 (6DoF) 포즈를 6도 추적할 수 있습니다.
  • 노출 정보를 사용하여 스캔한 각 모션을 보간할 수 있습니다.

메타데이터를 다양한 애플리케이션에서 고급 후처리할 수 있도록 동영상에 저장할 수 있습니다. 예를 들면 다음과 같습니다.

  • 프레임 수준의 회전 정보는 동영상을 안정화하는 데 사용될 수 있으며 스캔라인 수준의 모션 데이터는 롤링 셔터 효과를 줄이는 데 사용될 수 있습니다.
  • IMU 측정값과 파생된 3DoF 자세를 사용하여 IMU와 카메라 간의 시간 정렬 및 기하학적 정렬을 평가할 수 있습니다.

아래 섹션에는 CAMM (CAmera Motion Metadata) 트랙이 지정되어 있습니다. 이 트랙에는 트랙의 존재와 트랙 샘플의 데이터 형식을 나타내는 새로운 샘플 항목이 포함되어 있습니다.

샘플 항목

동영상 파일에는 커스텀 메타데이터 트랙을 나타내는 다음 샘플 항목 상자가 포함되어야 하며 트랙의 subComponentTypemeta로 설정해야 합니다.

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는 단일 픽셀의 노출 시간(나노초)이고 rolling_shutter_skew_time_ns는 처음 사용한 스캔라인과 마지막으로 사용된 스캔라인 간의 노출 사이의 지연 시간입니다. 스캔당 메타데이터를 보간하는 데 사용할 수 있습니다.

상응하는 프레임의 PTS는 pts_of_this_metadata, pts_of_this_metadata + pixel_exposure_time_ns + rollout_shutter_skew_time_ns 내에 있어야 합니다.

이 정보가 저장되지 않으면 기기는 프레임 노출의 중앙에 위치하도록 동영상 프레임의 PTS를 조정하기 위해 최선을 다해야 합니다.

  case 2:
    float gyro[3];
  break;
          
라디안/초

카메라의 XYZ 축을 중심으로 한 라디안/초 단위의 자이로스코프 신호입니다. 회전은 시계 반대 방향에서 양수입니다.

애플리케이션은 IMU 좌표계와 카메라 좌표계 간의 관계를 정의합니다. 가능한 경우 정렬하는 것이 좋습니다.

초기 자이로 판독값은 드라이버가 정의한 IMU 좌표계에 있으며 이를 카메라 좌표계로 변환하려면 적절한 변환이 필요합니다.

Android Sensor.TYPE_GYROSCOPE를 참조하세요.

  case 3:
    float acceleration[3];
  break;
          
미터/초^2

카메라의 XYZ 축을 따라 미터/초^2로 가속도계를 읽습니다.

애플리케이션은 IMU 좌표계와 카메라 좌표계 간의 관계를 정의합니다. 가능한 경우 정렬하는 것이 좋습니다.

Android Sensor.TYPE_ACCELEROMETER를 참조하세요.

  case 4:
    float position[3];
  break;
          

카메라의 3D 위치입니다. 3D 위치 및 각도 축 회전은 카메라의 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 (2D 수정), 3 (3D 수정)

위도 - 위도

경도 - 경도

고도 - 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를 참고하세요.

}

참고

  • MP4 파일당 CAMM 트랙이 하나만 있어야 하며, 이 데이터에는 위의 모든 데이터 유형이 함께 혼합되어 포함됩니다.
  • 사례 5와 6의 GPS 샘플은 센서에 의해 생성된 원시 값이어야 합니다. GPS 변경이 없으면 보간되거나 반복될 수 없습니다.
  • 좌표계는 오른쪽에 있습니다. 카메라 좌표계는 오른쪽을 가리키는 X, 아래쪽을 가리키는 Y, 앞으로 가리키는 Z로 정의됩니다. 전역 좌표계의 Y축이 중력 벡터를 따라 아래로 향해야 합니다.
  • IMU 판독값은 일반적으로 별도의 IMU 좌표계에 있으며 두 좌표계가 다른 경우 회전을 카메라 좌표계에 매핑해야 합니다.
  • 모든 필드는 Little Endian (최소 바이트 우선)이며 32비트 부동 소수점은 IEEE 754-1985 형식입니다.
  • 동영상 프레임과 메타데이터를 정확하게 동기화하려면 동영상 프레임의 PTS가 노출의 중앙에 위치해야 합니다 (노출 메타데이터에서도 추론될 수 있음).
  • 이 데이터를 다중화하는 애플리케이션은 정확한 PTS를 얻을 수 있는 충분한 시간 범위를 선택해야 합니다.

잠재적 문제

  • 이 설계에서는 데이터 샘플당 하나의 패킷만 허용합니다. 삽입된 기기는 I/O 압력은 물론 패킷 크기가 다양한 경우 헤더 크기(예: stscstsz Atom)가 증가하므로 빈도가 높은 패킷을 작성하는 데 문제가 발생할 수 있습니다.
  • 서로 다른 유형의 데이터를 서로 다른 지연 시간으로 혼합하면 패킷이 파일에 기록될 때 PTS가 앞뒤로 이동할 수 있습니다. 그러나 패킷을 버퍼링하고 단조 순서대로 작성하면 문제를 해결할 수 있습니다.