API записи и воспроизведения позволяет записывать сеанс и использовать его вместо видео с камеры в реальном времени. Однако эти записи содержат только данные видео и датчиков. Вы также можете добавить пользовательские данные в запись сеанса, и данные будут возвращены вам во время воспроизведения, как если бы они были частью изображения с камеры.
ARCore не включает автоматически какие-либо пользовательские данные в записи. Скорее, он позволяет добавлять пользовательские данные в кадр ARCore во время записи и извлекать те же данные из кадра во время воспроизведения. Вы должны запрограммировать приложение таким образом, чтобы пользователь возвращал ожидаемые данные при воспроизведении сеанса.
Варианты использования пользовательских данных
Добавление пользовательских данных в записи расширяет возможности ваших приложений AR. Ниже приведены некоторые конкретные случаи использования.
Используйте AR на ходу
Раньше пользователи могли получить доступ к AR-возможностям только в нужном месте и в нужное время. Если они хотели разместить лампу AR в своей гостиной, им приходилось физически стоять на этом месте, чтобы посмотреть, как лампа может там выглядеть. С помощью пользовательских треков они могут один раз записать свою гостиную и добавить в сцену виртуальную мебель, когда захотят.
Совместное создание AR-опыта
Без необходимости сеанса в реальном времени у пользователей появляется гораздо больше возможностей для редактирования AR, что позволяет им создавать уникальный AR-контент и получать к нему доступ в любом месте и в любое время. Например, они могут записывать заданную среду, добавлять эффекты дополненной реальности и делиться ими с друзьями.
Предварительные условия
Прежде чем продолжить, убедитесь, что вы понимаете фундаментальные концепции AR и то, как настроить сеанс ARCore .
Запись с пользовательскими данными
Создайте запись сеанса с пользовательскими данными.
Инициализация записи с пользовательскими данными
Выполните следующие действия, чтобы инициализировать запись с пользовательскими данными. Чтобы начать, остановить и проверить сеанс записи, см. раздел Запись и воспроизведение сеанса AR .
- Получите
RecordingConfig
. - Создайте новый
Track
с пользовательским UUID . Все пользовательские данные будут сохранены здесь. - Добавьте
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! }
Что дальше
- Узнайте, как создать собственное приложение с функцией записи и воспроизведения, изучив кодовую лабораторию записи и воспроизведения .