Adicionar dados personalizados durante a gravação no Android

A API Recording & Playback permite gravar uma sessão e usá-la no lugar de um feed de câmera em tempo real. No entanto, essas gravações só contêm dados de vídeo e sensor. Também é possível adicionar dados personalizados a uma gravação de sessão e retornar esses dados durante a reprodução, como se fizessem parte de uma imagem da câmera.

O ARCore não inclui dados personalizados automaticamente nas gravações. Em vez disso, ele permite que você adicione dados personalizados a um frame do ARCore durante a gravação e recupere esses mesmos dados do frame durante a reprodução. Cabe a você programar o app de modo que o usuário receba os dados esperados ao abrir a sessão.

Casos de uso para dados personalizados

Adicionar dados personalizados às gravações aumenta as possibilidades para seus apps de RA. Confira abaixo alguns casos de uso específicos.

Usar RA em qualquer lugar

Antes, os usuários só podiam acessar as experiências de RA no lugar e no momento certos. Se ele quisesse colocar uma lâmpada de RA na sala de estar, precisaria ficar fisicamente no local para ver como seria a lâmpada ali. Com as faixas personalizadas, eles podem gravar a própria sala de estar uma vez e adicionar móveis virtuais à cena sempre que quiserem.

Crie experiências de RA em conjunto

Sem a exigência de uma sessão ao vivo, os usuários têm muitas outras opções de edição de RA, permitindo criar e acessar conteúdo exclusivo de RA a qualquer momento e lugar. Por exemplo, eles podem gravar um determinado ambiente, adicionar efeitos de realidade aumentada e compartilhar com amigos.

Pré-requisitos

Verifique se você entendeu os conceitos fundamentais de RA e como configurar uma sessão do ARCore antes de continuar.

Registrar com dados personalizados

Criar uma gravação de sessão com dados personalizados.

Inicializar uma gravação com dados personalizados

Siga estas etapas para inicializar uma gravação com dados personalizados. Para iniciar, interromper e conferir uma sessão de gravação, consulte Gravar e reproduzir uma sessão de RA.

  1. Extraia um RecordingConfig.
  2. Crie um novo Track com um UUID personalizado. Todos os dados personalizados serão salvos aqui.
  3. Adicione o Track ao RecordingConfig que você criou durante a configuração da sessão.

Java

// 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);

Kotlin

// 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)

Todas as faixas novas são tratadas como gravações separadas, e cada faixa gravada ocupa seu próprio UUID.

Opcional: configurar a faixa com dados adicionais

Se você quiser identificá-la mais tarde, poderá configurar uma faixa com dados adicionais que descrevem a gravação da sessão. Por exemplo, você pode "marcar" uma faixa adicionando uma observação que descreve o local e o horário em que você gravou a sessão: "Esta sessão foi gravada no shopping à tarde".

Java

// 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));

Kotlin

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

Opcional: configurar a faixa com um tipo MIME

Se o app precisar ser compatível com ferramentas externas, configure uma faixa com um tipo MIME que descreva o tipo de dados gravados na faixa. Se você não especificar um tipo, os dados serão categorizados como application/text. O ARCore ignora o tipo MIME ao ler dados.

Java

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

Kotlin

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

Gravar faixas de dados personalizados

Todos os dados das faixas personalizadas são registrados nos Frames. As sessões de RA usam session.update() para receber um frame. O tempo em que você grava dados em um frame é o mesmo em que os dados serão retornados durante a reprodução. Por exemplo, se você chamar recordTrackData() com o valor "A" em 00:07:02, receberá "A" de volta na marca 00:07:02 quando a faixa for tocada.

Para registrar uma faixa de dados personalizada, converta os dados em um ByteBuffer e chame recordTrackData().

Java

// 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);
}

Kotlin

// 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)
}

Tocar faixas de dados personalizadas

Extraia dados personalizados de uma gravação de sessão durante a reprodução.

Inicializar uma reprodução

Inicializar uma reprodução com dados personalizados é o mesmo que inicializar uma reprodução com dados personalizados.

Retornar dados personalizados

Chame getUpdatedTrackData() para extrair os dados personalizados gravados em um frame. É possível recuperar vários dados de faixa do mesmo frame. Por exemplo, se você chamou recordTrackData() duas vezes no mesmo frame durante a gravação, você vai receber duas instâncias de TrackData durante a reprodução.

Java

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

Kotlin

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

Quando o TrackData estiver em um objeto contêiner, extraia os bytes dos dados personalizados.

Java

// 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!
}

Kotlin

// 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!
}

O que vem em seguida?