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.
JavaKotlin
// 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);
// 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”.

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

JavaKotlin
// Set a MIME type for compatibility with external tools.
track
.setMimeType("text/csv");
// 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().

JavaKotlin
// 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);
}
// 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.

JavaKotlin
// Fetch the data recorded on a select frame and place it in a container object.
Collection<TrackData> trackDataList = frame.getUpdatedTrackData(trackUUID);
// 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.

JavaKotlin
// 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!
}
// 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?