Dodawaj własne dane podczas nagrywania na Androidzie NDK

Interfejs nagrywania i odtwarzania umożliwia nagranie sesji i używanie jej zamiast obrazu przesyłanego w czasie rzeczywistym z kamery. Nagrania te zawierają jednak tylko obraz i dane z czujników. Do nagrania sesji możesz też dodać niestandardowe dane, które będą Ci zwracane podczas odtwarzania, tak jakby były częścią obrazu z aparatu.

ARCore nie uwzględnia automatycznie w nagraniach żadnych danych niestandardowych. Zamiast tego możesz dodawać do ramki ARCore dane niestandardowe podczas nagrywania i pobierać te same dane z klatki podczas odtwarzania. Do Ciebie należy zaprogramowanie aplikacji w taki sposób, aby użytkownik odzyskał oczekiwane dane podczas odtwarzania sesji.

Przypadki użycia danych niestandardowych

Dodawanie niestandardowych danych do nagrań zwiększa możliwości aplikacji AR. Poniżej przedstawiamy kilka konkretnych przypadków użycia.

Używaj AR, gdziekolwiek jesteś

W przeszłości użytkownicy mogli korzystać z funkcji AR tylko w odpowiednim miejscu i czasie. Aby umieścić w salonie lampę AR, musieli stać na miejscu, żeby sprawdzić, jak ta lampa może wyglądać. Dzięki ścieżkom szyfru spersonalizowanym mogą nagrać swój salon raz i w dowolnej chwili dodać do sceny wirtualne meble.

Wspólne tworzenie doświadczeń AR

Użytkownicy, którzy nie wymagają sesji na żywo, mają znacznie więcej opcji edycji AR, dzięki czemu mogą tworzyć wyjątkowe treści AR oraz uzyskiwać do nich dostęp w dowolnym miejscu i czasie. Mogą na przykład nagrywać dane otoczenie, dodawać efekty rzeczywistości rozszerzonej i udostępniać je znajomym.

Wymagania wstępne

Zanim przejdziesz dalej, upewnij się, że znasz podstawowe pojęcia związane z AR i wiesz, jak skonfigurować sesję ARCore.

Rejestruj z użyciem danych niestandardowych

Utworzyć nagranie sesji z danymi niestandardowymi.

Inicjowanie nagrania z użyciem danych niestandardowych

Aby zainicjować nagranie z danymi niestandardowymi, wykonaj te czynności. Informacje o rozpoczynaniu, zatrzymywaniu i sprawdzaniu sesji nagrywania znajdziesz w artykule Nagrywanie i odtwarzanie sesji AR.

  1. Uzyskaj ArRecordingConfig.
  2. Utwórz nowy identyfikator ArTrack z niestandardowym identyfikatorem UUID. Tutaj będą zapisywane wszystkie dane niestandardowe.
  3. Dodaj ArTrack do ArRecordingConfig utworzonego podczas konfiguracji sesji.
// 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);

Wszystkie nowe ścieżki są traktowane jako osobne nagrania, a każda z nich ma własny identyfikator UUID.

Opcjonalnie: konfigurowanie ścieżki z dodatkowymi danymi

Jeśli chcesz później zidentyfikować tę ścieżkę, możesz skonfigurować ścieżkę z dodatkowymi danymi opisującymi rejestrowanie sesji. Możesz na przykład otagować ścieżkę, dodając notatkę opisującą miejsce i czas nagrania sesji: „Ta sesja została zarejestrowana w centrum handlowym po południu”.

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

Opcjonalnie: konfigurowanie ścieżki z typem MIME

Jeśli aplikacja musi być zgodna z narzędziami zewnętrznymi, możesz skonfigurować ścieżkę z typem MIME opisującym typ danych zarejestrowanych na ścieżce. Jeśli nie określisz typu, dane zostaną sklasyfikowane jako application/text. Podczas odczytywania danych ARCore ignoruje typ MIME.

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

Rejestrowanie niestandardowych ścieżek danych

Wszystkie dane ścieżek niestandardowych są rejestrowane w systemach ArFrame. Sesje AR pobierają klatkę za pomocą ArSession_update(). Godzina zarejestrowania danych w klatce to ten sam czas, w którym dane zostaną zwrócone podczas odtwarzania. Jeśli na przykład wywołasz funkcję ArFrame_recordTrackData() z wartością „A” w miejscu 00:07:02, podczas odtwarzania utworu otrzymasz znak „A” w miejscu oznaczenia 00:07:02.

Aby zarejestrować niestandardową ścieżkę danych, wywołaj 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);
}

Odtwarzanie niestandardowych ścieżek danych

Wyodrębnianie danych niestandardowych z nagrania sesji podczas odtwarzania.

Inicjowanie odtwarzania

Inicjowanie odtwarzania z użyciem danych niestandardowych wygląda tak samo jak inicjowanie odtwarzania nagrania w zwykłej sesji.

Zwracanie danych niestandardowych

Wywołaj ArFrame_getUpdatedTrackData(), aby pobrać dane niestandardowe zarejestrowane w ArFrame. Możesz pobrać dane wielu ścieżek z tej samej ramki. Jeśli na przykład wywołasz funkcję ArFrame_recordTrackData() 2 razy na tej samej klatce podczas nagrywania, podczas odtwarzania otrzymasz 2 wystąpienia kodu ArTrackData.

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

Gdy ArTrackData znajdzie się w obiekcie kontenera, wyodrębnij bajty danych niestandardowych.

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

Co dalej?