Добавляйте пользовательские данные во время записи на 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!
}

Что дальше