Adicionar dados personalizados durante a gravação no Android

A série A API Playback permite gravar uma sessão e usá-la no lugar de uma transmissão de câmera em tempo real. No entanto, essas gravações contêm apenas dados de vídeo e do sensor. Você também pode adicionar dados personalizados à gravação de uma sessão e retorná-los a você durante a reprodução, como se fizessem parte da imagem de uma 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 jogar a sessão.

Casos de uso de dados personalizados

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

Use a RA em qualquer lugar

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

Cocriar experiências de RA

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

Pré-requisitos

Entenda os conceitos fundamentais de RA. e como configurar uma sessão do ARCore antes de continuar.

Gravar com dados personalizados

Crie 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, parar e verificar uma sessão de gravação, consulte Gravar e reproduzir uma sessão de RA.

  1. Consiga 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 uma delas ocupa o próprio UUID.

Opcional: configurar a faixa com dados adicionais

Caso queira identificá-la mais tarde, você poderá configurar uma faixa com dados adicionais que descrevem a gravação da sessão. Por exemplo, você pode “marcar” uma trilha adicionando uma observação que descreva o local e o horário em que a sessão foi gravada: “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, você poderá configurar uma faixa com um tipo MIME que descreva o tipo dos 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")

Registrar faixas de dados personalizadas

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

Para gravar 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)
}

Reproduzir 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 de uma sessão normal.

Retornar dados personalizados

Chame getUpdatedTrackData() para recuperar os dados personalizados gravados em um frame. É possível recuperar vários dados de faixas no mesmo frame. Por exemplo, se você chamar recordTrackData() duas vezes no mesmo frame durante a gravação, 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 TrackData estiver em um objeto de 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?