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

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

  • Мобильные телефоны обычно имеют датчики для гироскопа, акселерометра, магнитометра и GPS.
  • Слияние датчиков можно использовать для отслеживания положения устройств с тремя степенями свободы (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 необходимо записать только интегрированную глобальную ориентацию.

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

Закодированное представление может быть создано из оси и угла с помощью 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 — это время экспозиции для одного пикселя в наносекундах, а roll_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 и системой координат камеры. Мы рекомендуем выровнять их, если это возможно.

Обратите внимание, что начальные показания гироскопа находятся в системе координат 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 положение камеры. 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-исправление)

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

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

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

Возможные проблемы

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