Добавляйте пользовательские данные во время записи на Android NDK

API записи и воспроизведения позволяет записывать сеанс и использовать его вместо видео с камеры в реальном времени. Однако эти записи содержат только данные видео и датчиков. Вы также можете добавить пользовательские данные в запись сеанса, и данные будут возвращены вам во время воспроизведения, как если бы они были частью изображения с камеры.

ARCore не включает автоматически какие-либо пользовательские данные в записи. Скорее, он позволяет добавлять пользовательские данные в кадр ARCore во время записи и извлекать те же данные из кадра во время воспроизведения. Вы должны запрограммировать приложение таким образом, чтобы пользователь возвращал ожидаемые данные при воспроизведении сеанса.

Варианты использования пользовательских данных

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

Используйте AR на ходу

Раньше пользователи могли получить доступ к AR-возможностям только в нужном месте и в нужное время. Если они хотели разместить лампу AR в своей гостиной, им приходилось физически стоять на этом месте, чтобы увидеть, как лампа может там выглядеть. С помощью пользовательских треков они могут один раз записать свою гостиную и добавить в сцену виртуальную мебель, когда захотят.

Совместное создание AR-опыта

Без необходимости сеанса в реальном времени у пользователей появляется гораздо больше возможностей для редактирования AR, что позволяет им создавать уникальный AR-контент и получать к нему доступ в любом месте и в любое время. Например, они могут записывать заданную среду, добавлять эффекты дополненной реальности и делиться ими с друзьями.

Предварительные условия

Прежде чем продолжить, убедитесь, что вы понимаете фундаментальные концепции AR и то, как настроить сеанс ARCore .

Запись с пользовательскими данными

Создайте запись сеанса с пользовательскими данными.

Инициализация записи с пользовательскими данными

Выполните следующие действия, чтобы инициализировать запись с пользовательскими данными. Чтобы начать, остановить и проверить сеанс записи, см. раздел Запись и воспроизведение сеанса AR .

  1. Получите ArRecordingConfig .
  2. Создайте новый ArTrack с собственным UUID . Все пользовательские данные будут сохранены здесь.
  3. Добавьте ArTrack в ArRecordingConfig , который вы создали во время настройки сеанса.
// Initialize a new track with a custom UUID.
// Make sure to save the UUID because it is the ID that you will use to get
// your data back during playback.
ArTrack* track = NULL;
ArTrack_create(ar_session, &track);
// String from UUID generator: de5ec7a4-09ec-4c48-b2c3-a98b66e71893
uint8_t uuid_byte_array[16] = {0xde, 0x5e, 0xc7, 0xa4, 0x09, 0xec,
                               0x4c, 0x48, 0xb2, 0xc3, 0xa9, 0x8b,
                               0x66, 0xe7, 0x18, 0x93};
ArTrack_setId(ar_session, track, uuid_byte_array);

// Add the ArTrack to the recording_config.
// recording_config must already be configured.
ArRecordingConfig_addTrack(ar_session, recording_config, track);
ArTrack_destroy(track);

Все новые треки рассматриваются как отдельные записи, причем каждый записанный трек занимает свой собственный UUID.

Необязательно: настройте трек с дополнительными данными.

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

// Set additional data on this track.
// For example, describe where you recorded the session.
uint8_t metadata_size = 4;
uint8_t metadata[5] = "HOME";
ArTrack_setMetadata(ar_session, track, metadata, metadata_size);

Необязательно: настройте трек с типом MIME.

Если ваше приложение должно быть совместимо с внешними инструментами, вы можете настроить дорожку с типом MIME , который описывает тип данных, записанных на дорожке. Если вы не укажете тип, данные будут отнесены к категории application/text . ARCore игнорирует тип MIME при чтении данных.

// Set a MIME type for compatibility with external tools.
ArTrack_setMimeType(ar_session, track, "text/csv");

Запись треков пользовательских данных

Все данные пользовательского трека записываются в ArFrame . Сеансы AR используют ArSession_update() для получения кадра. Время записи данных в кадр совпадает с временем, когда данные будут возвращены во время воспроизведения. Например, если вы вызовете ArFrame_recordTrackData() со значением «A» в 00:07:02 , вы получите «A» обратно на отметке 00:07:02 при воспроизведении дорожки.

Чтобы записать пользовательскую дорожку данных, вызовите ArFrame_recordTrackData() .

// Place an AR lamp in a room.
if (place_lamp_button_was_pressed) {
  uint8_t lamp_data[1] = {lamp_id};
  ArFrame_recordTrackData(ar_session, frame, uuid_byte_array, lamp_data,
                          /*payload_size=*/1);
}

Воспроизведение дорожек пользовательских данных

Извлекайте пользовательские данные из записи сеанса во время воспроизведения.

Инициализация воспроизведения

Инициализация воспроизведения с пользовательскими данными аналогична инициализации воспроизведения обычной записи сеанса .

Возврат пользовательских данных

Вызовите ArFrame_getUpdatedTrackData() , чтобы получить пользовательские данные, записанные в ArFrame . Можно получить данные нескольких дорожек из одного и того же кадра. Например, если вы дважды вызвали ArFrame_recordTrackData() для одного и того же кадра во время записи, вы получите два экземпляра ArTrackData во время воспроизведения.

// Create the container to hold the track data retrieved from the frame.
ArTrackDataList* fetched_track_data_list;
ArTrackDataList_create(ar_session, &fetched_track_data_list);

// Fetch the track data from the frame into the created container.
ArFrame_getUpdatedTrackData(ar_session, frame, uuid_byte_array,
                            fetched_track_data_list);

Как только ArTrackData окажется в объекте-контейнере, извлеките байты пользовательских данных.

// Fetch the size of the track data list.
int32_t fetched_track_data_list_size;
ArTrackDataList_getSize(ar_session, fetched_track_data_list,
                        &fetched_track_data_list_size);

// Iterate through the list.
for (int i = 0; i < fetched_track_data_list_size; i++) {
  ArTrackData* fetched_track_data;
  ArTrackDataList_acquireItem(ar_session, fetched_track_data_list, i,
                              &fetched_track_data);
  // Process "fetched_track_data->sample" as desired
  ArTrackData_release(fetched_track_data);
}
ArTrackDataList_destroy(fetched_track_data_list);

Что дальше