Спецификация метаданных движения камеры

На этой странице описана спецификация, которая позволяет файлам MP4 внедрять метаданные о движении камеры во время захвата видео. Устройства, записывающие видео, обычно имеют датчики, которые могут предоставить дополнительную информацию о захвате. Например:

  • Мобильные телефоны обычно оснащены датчиками гироскопа, акселерометра, магнитометра и GPS.
  • Совмещение датчиков можно использовать для отслеживания положения устройств с тремя степенями свободы (3DoF).
  • Одновременную локализацию и картографирование (SLAM) можно использовать для отслеживания положения устройства с 6 степенями свободы (6DoF) (например, Tango).
  • Информация об экспозиции может использоваться для интерполяции движения по каждой строке сканирования.

Эти метаданные можно сохранить в видео для расширенной постобработки в различных приложениях. Например:

  • Информацию о повороте на уровне кадра можно использовать для стабилизации видео, а данные о движении на уровне строки развертки можно использовать для уменьшения эффекта роллетного затвора.
  • Показания IMU и полученные позы 3DoF можно использовать для оценки временного и геометрического выравнивания между IMU и камерой.

В разделах ниже указана дорожка метаданных движения CAmera (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 необходимо записать только интегрированную глобальную ориентацию.

Эти три значения представляют вектор оси угла, так что угол поворота в радианах задается длиной вектора, а ось вращения задается нормализованным вектором.

Закодированное представление может быть создано из оси и угла с помощью 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 +rolling_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

Показания акселерометра в метрах/секунду^2 по осям XYZ камеры.

Приложения определяют взаимосвязь между системой координат IMU и системой координат камеры. Мы рекомендуем по возможности выровнять их.

См. Android Sensor.TYPE_ACCELEROMETER.

  case 4:
    float position[3];
  break;
          

3D-положение камеры. Трехмерное положение и вращение угловой оси вместе определяют положение камеры с 6 степенями свободы, и они находятся в общей системе координат, определяемой приложением.

Вы можете получить эту информацию, запустив на устройстве отслеживание 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-исправление)

широта - Широта в градусах

долгота - Долгота в градусах

height - Высота над эллипсоидом WGS-84.

Horizontal_accuracy — Точность по горизонтали (широта/долгота)

вертикальная_точность — точность по вертикали (высоте)

Velocity_east — Скорость в восточном направлении.

Velocity_north — Скорость в северном направлении.

Velocity_up — Скорость вверх.

Speed_accuracy - Точность скорости

  case 7:
    float magnetic_field[3];
  break;
          
микротесла

Окружающее магнитное поле.

См. Android Sensor.TYPE_MAGNETIC_FIELD.

}

Примечания

  • В каждом файле MP4 должна быть только одна дорожка CAMM, которая содержит все вышеперечисленные типы данных путем их мультиплексирования.
  • Выборки GPS в случаях 5 и 6 должны представлять собой необработанные значения, генерируемые датчиками. Их нельзя интерполировать или повторить, если нет изменений GPS.
  • Системы координат правосторонние. Система координат камеры определяется так: X указывает вправо, Y указывает вниз и Z указывает вперед. Ось Y глобальной системы координат должна указывать вниз вдоль вектора силы тяжести.
  • Показания IMU обычно находятся в отдельной системе координат IMU, и для сопоставления их с системой координат камеры необходимо вращение, если две системы координат различны.
  • Все поля имеют прямой порядок байтов (сначала младший байт), а 32-битные числа с плавающей запятой имеют формат IEEE 754-1985.
  • Чтобы точно синхронизировать видеокадр и метаданные, PTS видеокадра должен находиться в центре его экспозиции (это также можно сделать из метаданных экспозиции).
  • Приложение, мультиплексирующее эти данные, должно выбрать достаточно большой временной масштаб, чтобы получить точный PTS.

Потенциальные проблемы

  • Эта конструкция допускает только один пакет на выборку данных. У встроенных устройств могут возникнуть проблемы с записью пакетов с очень высокой частотой, поскольку это увеличивает нагрузку ввода-вывода, а также размер заголовка (например, атомы stsc и stsz ), если размер пакета меняется.
  • Смешивание разных типов данных с разными задержками может привести к тому, что PTS будет двигаться как вперед, так и назад при записи пакетов в файл. Однако эту проблему можно преодолеть, буферизовав пакеты и записав их в монотонном порядке.