Dodawanie niestandardowych danych podczas nagrywania na Androidzie

Nagranie Interfejs Odtwarzanie API pozwala na nagrywanie sesji i używanie ich zamiast przesyłania obrazu z kamery w czasie rzeczywistym. Nagrania zawierają jednak tylko dane wideo i dane z czujnika. Możesz też dodać do nagrania sesji dane niestandardowe, które będą wyświetlane podczas odtwarzania tak, jakby były częścią obrazu z kamery.

ARCore nie uwzględnia automatycznie żadnych danych niestandardowych w nagraniach. Umożliwia ona dodawanie danych niestandardowych do ramki ARCore podczas nagrywania i pobieranie tych samych danych z ramki podczas odtwarzania. To Ty zaprogramujesz aplikację w taki sposób, aby po odtworzeniu sesji użytkownik odzyskał oczekiwane dane.

Przypadki użycia danych niestandardowych

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

Używaj AR z dowolnego miejsca

W przeszłości użytkownicy mogli korzystać z funkcji AR tylko we właściwym miejscu i czasie. Jeśli chcieli ustawić lampę AR w salonie, musieli stanąć w danym miejscu, aby zobaczyć, jak lampa będzie wyglądać. Dzięki spersonalizowanym ścieżkom audio mogą raz nagrać swój salon i dodać wirtualne meble do sceny w odpowiednim momencie.

Współtworzyć wrażenia AR

Użytkownicy, którzy nie mają wymogu sesji na żywo, mają do dyspozycji znacznie więcej opcji edycji AR, dzięki którym mogą tworzyć i otwierać niepowtarzalne treści AR 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

Upewnij się, że znasz podstawowe pojęcia związane z AR. i dowiedz się, jak skonfigurować sesję ARCore, zanim przejdziesz dalej.

Nagrywanie z danymi niestandardowymi

Utwórz nagranie sesji z danymi niestandardowymi.

Inicjowanie nagrania z użyciem danych niestandardowych

Aby zainicjować nagrywanie za pomocą danych niestandardowych, 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 pola 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 utwory są traktowane jako osobne nagrania, przy czym każda z nich ma własny identyfikator UUID.

Opcjonalnie: skonfiguruj ścieżkę z dodatkowymi danymi

Jeśli zechcesz zidentyfikować ją później, możesz skonfigurować ścieżkę z dodatkowymi danymi opisującymi nagranie sesji. Możesz na przykład „otagować” ścieżkę, dodając notatkę z opisem lokalizacji i czasu 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: skonfiguruj ścieżkę z typem MIME.

Jeśli Twoja aplikacja musi być zgodna z narzędziami zewnętrznymi, możesz skonfigurować ścieżkę z typem MIME, który opisuje typ danych rejestrowanych na niej. Jeśli nie określisz typu, dane zostaną sklasyfikowane jako application/text. ARCore ignoruje typ MIME podczas odczytywania danych.

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żki niestandardowej są rejestrowane w Frame. Sesje AR używają klatki session.update(). Moment zarejestrowania danych w klatce jest tym samym czasem, w którym są one zwracane podczas odtwarzania. Jeśli na przykład wywołasz recordTrackData() z wartością „A” w 00:07:02, to przy odtworzeniu utworu otrzymasz „A” w miejscu 00:07:02.

Aby zarejestrować niestandardową ścieżkę danych, przekształć dane w 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 w sesji podczas odtwarzania.

Inicjowanie odtwarzania

Inicjowanie odtwarzania z danymi niestandardowymi jest takie samo jak inicjowanie odtwarzania zwykłego nagrania sesji.

Zwróć dane niestandardowe

Wywołaj getUpdatedTrackData(), aby pobrać dane niestandardowe zarejestrowane w ramce. Z tej samej ramki można pobrać dane wielu ścieżek. Jeśli na przykład wywołasz recordTrackData() 2 razy w tej samej klatce podczas nagrywania, podczas odtwarzania otrzymasz 2 wystąpienia 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 obiekt TrackData znajdzie się w kontenerze, 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?