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

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 para 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 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 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”.

// 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, 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.

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

Registrar faixas de dados personalizadas

Todos os dados das faixas personalizadas são gravados em ArFrames. As sessões de RA usam ArSession_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 ArFrame_recordTrackData() com o valor "A" em 00:07:02, receberá um "A" de volta na marca 00:07:02 quando a música for tocada.

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

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