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