Dodawanie niestandardowych danych podczas nagrywania na Androidzie

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 RecordingConfig.
  2. Utwórz nowy identyfikator Track z niestandardowym identyfikatorem UUID. Tutaj będą zapisywane wszystkie dane niestandardowe.
  3. Dodaj Track do RecordingConfig utworzonego podczas konfiguracji sesji.

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)

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

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

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.

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

Rejestrowanie niestandardowych ścieżek danych

Wszystkie dane ścieżek niestandardowych są rejestrowane w systemach Frame. Sesje AR pobierają klatkę za pomocą session.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ę 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, przekonwertuj dane na format ByteBuffer i wywołaj 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)
}

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 metodę getUpdatedTrackData(), aby pobrać dane niestandardowe zarejestrowane w ramce. Możesz pobrać dane wielu ścieżek z tej samej ramki. Jeśli na przykład wywołasz funkcję recordTrackData() 2 razy na tej samej klatce podczas nagrywania, podczas odtwarzania otrzymasz 2 wystąpienia kodu TrackData.

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)

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

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

Co dalej?