Interfejs Recording & Playback API umożliwia jednokrotne nagrywanie danych wideo i AR w danym środowisku oraz używanie tych treści do zastąpienia sesji na żywo z użyciem kamery.
Wymagania wstępne
Zanim przejdziesz dalej, upewnij się, że rozumiesz podstawowe zagadnienia związane z rozszerzoną rzeczywistością oraz że wiesz, jak skonfigurować sesję ARCore.
Zgodność z innymi interfejsami ARCore
Ze względu na sposób przetwarzania danych sesji interfejsy API ARCore mogą dawać inne wyniki podczas odtwarzania niż podczas nagrywania. Mogą też przynieść inne wyniki podczas kolejnych sesji odtwarzania. Podczas odtwarzania może się np. zmieniać liczba wykrytych obiektów śledzenia, dokładny czas ich wykrycia oraz ich pozycje w danym momencie.
Zgodność z Cloud Anchors
Podczas nagrywania lub odtwarzania sesji możesz hostować i rozwiązywać punkty kotwiczenia w chmurze.
Nagrywanie
Rozpoczynanie, zatrzymywanie i sprawdzanie stanu nagrywania sesji ARCore.
Nagrywanie sesji ARCore
Aby nagrać sesję ARCore, skonfiguruj sesję i podaj URI pliku MP4 na potrzeby nagrania. Przed wznowieniem sesji zadzwoń pod numer ARRecordingManager.StartRecording()
. Nagrywanie rozpocznie się automatycznie po wznowieniu sesji. Aby automatycznie zatrzymać nagrywanie po wstrzymaniu sesji, wyślij wywołanie ARRecordingConfig.AutoStopOnPause
. Aby nagrać część sesji, podczas jej trwania naciśnij ARRecordingManager.StartRecording()
.
ARCoreRecordingConfig recordingConfig = ScriptableObject.CreateInstance<ARCoreRecordingConfig>();
Uri datasetUri = new System.Uri("file:///uri/for/dataset.mp4");
recordingConfig.Mp4DatasetUri = datasetUri.AbsoluteUri;
recordingManager.StartRecording(recordingConfig);
Zatrzymywanie nagrywania sesji
Aby zatrzymać nagrywanie bez wstrzymywania bieżącej sesji AR, wybierz ARRecordingManager.StopRecording()
.
recordingManager.StopRecording();
Sprawdzanie stanu nagrywania
ARRecordingManager.RecordingStatus
można używać w dowolnym momencie, aby sprawdzić bieżący stan nagrywania.
Debug.Log("Current Recording Status: " + recordingManager.RecordingStatus);
Odtwarzanie
Odtwarzanie wcześniej nagranych sesji AR. Sesje są odtwarzane w czasie rzeczywistym, a ich odtwarzanie lub szybkość nie mogą być dostosowywane.
Odtwarzanie wcześniej nagranej sesji
Aby odtworzyć wcześniej nagraną sesję, wywołaj funkcję ARPlaybackManager.SetPlaybackDatasetUri()
i podaj URI zbioru danych, który chcesz odtworzyć. Aby użyć tej metody, musisz wstrzymać sesję. Wznów sesję, aby zmiany zaczęły obowiązywać.
Gdy odtwarzanie rozpocznie się z powodu wznowienia sesji, wstrzymanie sesji przez wyłączenie opcji ARSession
spowoduje zawieszenie przetwarzania wszystkich klatek obrazu z kamery i innych zarejestrowanych danych z czujnika w danych. Odrzucone w ten sposób klatki obrazu z kamery i danych z ramki czujnika nie zostaną ponownie przetworzone, gdy sesja zostanie wznowiona. Śledzenie rozszerzonej rzeczywistości w przypadku sesji będzie zazwyczaj nieprawidłowe z powodu przerwy w przetwarzaniu danych.
// Disable the ARSession to pause the current AR session.
session.enabled = false;
// In the next frame, provide a URI for the dataset you wish to play back.
Uri datasetUri = new System.Uri("file:///uri/for/dataset.mp4");
playbackManager.SetPlaybackDatasetUri(datasetUri);
// In the frame after that, re-enable the ARSession to resume the session from
// the beginning of the dataset.
session.enabled = true;
Znane problemy i obejścia
Występuje znany problem polegający na tym, że wywołania ARPlaybackManager.SetPlaybackDatasetUri()
zwracają ErrorPlaybackFailed
.
Dzieje się tak, ponieważ wstrzymanie sesji może wymagać kilku klatek. Jeśli funkcja ARPlaybackManager.SetPlaybackDatasetUri()
zostanie wywołana przed wstrzymaniem sesji, nie będzie ona mieć dostępu do sesji, więc zwróci błąd.
Jako obejście możesz użyć tego kodu:
// Workaround for known issue where `playbackManager.SetPlaybackDatasetUri()`
// returns `ErrorPlaybackFailed` because it can take several frames for a
// session to be paused.
// Reference to the ARSession component in the scene.
ARSession session;
void PlaybackDataset()
{
setPlaybackDataset = true;
// Pause the current AR session.
session.enabled = false;
// Set a timeout for retrying playback retrieval.
timeout = 10f;
}
// Next frame
void Update()
{
...
if (setPlaybackDataset)
{
PlaybackResult result = playbackManager.SetPlaybackDatasetUri(datasetUri);
if (result == PlaybackResult.ErrorPlaybackFailed || result == PlaybackResult.SessionNotReady)
{
// Try to set the dataset again in the next frame.
timeout -= Time.deltaTime;
}
else
{
// Do not set the timeout if the result is something other than ErrorPlaybackFailed.
timeout = -1f;
}
if (timeout < 0.0f)
{
setPlaybackDataset = false;
// If playback is successful, proceed as usual.
// If playback is not successful, handle the error appropriately.
}
}
...
}
Zatrzymywanie odtwarzania
Aby zatrzymać odtwarzanie, wywołaj ARPlaybackManager.SetPlaybackDatasetUri()
i ustaw identyfikator URI zbioru danych na null
.
// Disable the ARSession to pause the current AR session.
session.enabled = false;
// In the next frame, unset the playback dataset URI.
playbackManager.SetPlaybackDatasetUri(null);
// In the frame after that, re-enable the ARSession to resume the session using
// the device camera and other sensors.
session.enabled = true;
Wznowienie odtwarzania od początku
Aby ponownie uruchomić odtwarzanie od początku zbioru danych, wywołaj metodę ARPlaybackManager.SetPlaybackDatasetUri()
i przed wznowieniem sesji określ to samo nagranie MP4.
// Disable the ARSession to pause the current AR session.
session.enabled = false;
// In the next frame, specify the same dataset URI.
playbackManager.SetPlaybackDatasetUri(datasetUri); // Same URI that was previously set.
// In the frame after that, re-enable the ARSession to resume the session from
// the beginning of the dataset.
session.enabled = true;
Odtwórz inną sesję
Aby odtworzyć inny zbiór danych, wstrzymaj sesję i wskaż nowy zbiór danych, zanim ją wznowisz.
// Disable the ARSession to pause the current AR session.
session.enabled = false;
// In the next frame, specify a new dataset URI.
Uri newDatasetUri = new System.Uri("file:///uri/for/different/dataset.mp4");
playbackManager.SetPlaybackDatasetUri(newDatasetUri); // Different URI than was previously set.
// In the frame after that, re-enable the ARSession to resume the session from
// the beginning of the new dataset.
session.enabled = true;
Sprawdzanie stanu odtwarzania
ARPlaybackManager.PlaybackStatus
może być używany w dowolnym momencie do określenia bieżącego stanu odtwarzania.
Debug.Log("Current Playback Status: " + playbackManager.PlaybackStatus);
Co dalej?
- Dowiedz się, jak dodawać dane niestandardowe do nagranych sesji.