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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. Получите RecordingConfig .
  2. Создайте новый Track с пользовательским UUID . Все пользовательские данные будут сохранены здесь.
  3. Добавьте Track в RecordingConfig , который вы создали во время настройки сеанса.

Джава

// 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.
UUID trackUUID = UUID.fromString("de5ec7a4-09ec-4c48-b2c3-a98b66e71893"); // from UUID generator
Track track = new Track(session).setId(trackUUID);

// Add the Track to the recordingConfig.
// recordingConfig must already be configured.
recordingConfig.addTrack(track);

Котлин

// 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.
val trackUUID = UUID.fromString("de5ec7a4-09ec-4c48-b2c3-a98b66e71893") // from UUID generator
val track = Track(session).setId(trackUUID)

// Add the Track to the recordingConfig.
// recordingConfig must already be configured.
recordingConfig.addTrack(track)

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

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

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

Джава

// Set additional data on this track.
// For example, describe where you recorded the session.
byte[] customTrackData = "airport".getBytes(StandardCharsets.UTF_8);
track.setMetadata(ByteBuffer.wrap(customTrackData));

Котлин

// Set additional data on this track.
// For example, describe where you recorded the session.
val customTrackData: ByteArray = "airport".toByteArray()
track.setMetadata(ByteBuffer.wrap(customTrackData))

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

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

Джава

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

Котлин

// Set a MIME type for compatibility with external tools.
track.setMimeType("text/csv")

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

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

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

Джава

// Place an AR lamp in a room.
if (placeLampButtonWasPressed) {
  Lamp lampProduct = Lamp.FLOOR; // a floor lamp
  // Convert the lamp data into a byte array.
  ByteBuffer lampData = ByteBuffer.wrap(new byte[] {(byte) lampProduct.ordinal()});
  frame.recordTrackData(trackUUID, lampData);
}

Котлин

// Place an AR lamp in a room.
if (placeLampButtonWasPressed) {
  val lampProduct = Lamp.FLOOR // a floor lamp
  // Convert the lamp data into a byte array.
  val lampData = ByteBuffer.wrap(byteArrayOf(lampProduct.ordinal.toByte()))
  frame.recordTrackData(trackUUID, lampData)
}

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

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

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

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

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

Вызовите getUpdatedTrackData() , чтобы получить пользовательские данные, записанные в кадре. Можно получить данные нескольких дорожек из одного и того же кадра. Например, если вы дважды вызвали функцию recordTrackData() для одного и того же кадра во время записи, вы получите два экземпляра TrackData во время воспроизведения.

Джава

// Fetch the data recorded on a select frame and place it in a container object.
Collection<TrackData> trackDataList = frame.getUpdatedTrackData(trackUUID);

Котлин

// Fetch the data recorded on a select frame and place it in a container object.
val trackDataList: Collection<TrackData> = frame.getUpdatedTrackData(trackUUID)

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

Джава

// Extract the bytes of custom data from the list of track data.
for (TrackData trackData : trackDataList) {
  ByteBuffer bytes = trackData.getData();
  Lamp lamp = Lamp.values()[bytes.get()]; // this is the lamp!
}

Котлин

// Extract the bytes of custom data from the list of track data.
for (trackData in trackDataList) {
  val bytes = trackData.data
  val lamp = Lamp.values()[bytes.get().toInt()] // this is the lamp!
}

Что дальше