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.
- Uzyskaj
RecordingConfig
. - Utwórz nowy identyfikator
Track
z niestandardowym identyfikatorem UUID. Tutaj będą zapisywane wszystkie dane niestandardowe. - Dodaj
Track
do polaRecordingConfig
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.
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”.
// 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.
// 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()
.
// 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
.
// 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.
// 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?
- Dowiedz się, jak stworzyć własną aplikację za pomocą funkcji Nagrywanie Aby odtworzyć, przejdź do sekcji Nagrywanie Ćwiczenie z programowania dotyczące odtwarzania