Nagraj i odtwórz sesję AR w aplikacji AR Foundation kierowana na Androida

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?