Adicionar dados personalizados durante a gravação no Android NDK

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 ArRecordingConfig.
  2. Crie um novo ArTrack com um UUID personalizado. Todos os dados personalizados serão salvos aqui.
  3. Adicione o ArTrack ao ArRecordingConfig que você criou durante a configuração da sessão.
// 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.
ArTrack* track = NULL;
ArTrack_create(ar_session, &track);
// String from UUID generator: de5ec7a4-09ec-4c48-b2c3-a98b66e71893
uint8_t uuid_byte_array[16] = {0xde, 0x5e, 0xc7, 0xa4, 0x09, 0xec,
                               0x4c, 0x48, 0xb2, 0xc3, 0xa9, 0x8b,
                               0x66, 0xe7, 0x18, 0x93};
ArTrack_setId(ar_session, track, uuid_byte_array);

// Add the ArTrack to the recording_config.
// recording_config must already be configured.
ArRecordingConfig_addTrack(ar_session, recording_config, track);
ArTrack_destroy(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".

// Set additional data on this track.
// For example, describe where you recorded the session.
uint8_t metadata_size = 4;
uint8_t metadata[5] = "HOME";
ArTrack_setMetadata(ar_session, track, metadata, metadata_size);

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.

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

Gravar faixas de dados personalizados

Todos os dados das faixas personalizadas são registrados nos ArFrames. As sessões de RA usam ArSession_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 ArFrame_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, chame ArFrame_recordTrackData().

// Place an AR lamp in a room.
if (place_lamp_button_was_pressed) {
  uint8_t lamp_data[1] = {lamp_id};
  ArFrame_recordTrackData(ar_session, frame, uuid_byte_array, lamp_data,
                          /*payload_size=*/1);
}

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 ArFrame_getUpdatedTrackData() para recuperar os dados personalizados registrados em um ArFrame. É possível recuperar vários dados de faixa do mesmo frame. Por exemplo, se você chamou ArFrame_recordTrackData() duas vezes no mesmo frame durante a gravação, você vai receber duas instâncias de ArTrackData durante a reprodução.

// Create the container to hold the track data retrieved from the frame.
ArTrackDataList* fetched_track_data_list;
ArTrackDataList_create(ar_session, &fetched_track_data_list);

// Fetch the track data from the frame into the created container.
ArFrame_getUpdatedTrackData(ar_session, frame, uuid_byte_array,
                            fetched_track_data_list);

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

// Fetch the size of the track data list.
int32_t fetched_track_data_list_size;
ArTrackDataList_getSize(ar_session, fetched_track_data_list,
                        &fetched_track_data_list_size);

// Iterate through the list.
for (int i = 0; i < fetched_track_data_list_size; i++) {
  ArTrackData* fetched_track_data;
  ArTrackDataList_acquireItem(ar_session, fetched_track_data_list, i,
                              &fetched_track_data);
  // Process "fetched_track_data->sample" as desired
  ArTrackData_release(fetched_track_data);
}
ArTrackDataList_destroy(fetched_track_data_list);

O que vem em seguida?