Registrare e riprodurre una sessione AR su AR Foundation che ha come target Android

L'API Recording & Playback consente di registrare dati video e AR una sola volta all'interno di un determinato ambiente e di utilizzare questi contenuti per sostituire una sessione in diretta della videocamera.

Prerequisiti

Assicurati di aver compreso i concetti fondamentali di AR e di configurare una sessione ARCore prima di procedere.

Compatibilità con altre API ARCore

A causa del modo in cui i dati delle sessioni vengono elaborati, le API ARCore potrebbero produrre risultati diversi durante la riproduzione rispetto a quelli osservati durante la registrazione. Inoltre, potrebbero produrre risultati diversi durante sessioni di riproduzione successive. Ad esempio, il numero di elementi tracciabili rilevati, la tempistica precisa del loro rilevamento e le relative pose nel tempo potrebbero essere diversi durante la riproduzione.

Compatibilità con gli ancoraggi Cloud

Puoi ospitare e risolvere gli ancoraggi Cloud durante la registrazione o la riproduzione di una sessione.

Registrazione in corso…

Avvia, interrompi e controlla lo stato della registrazione di una sessione ARCore.

Registrare una sessione ARCore

Per registrare una sessione ARCore, configurala e fornisci un URI MP4 per la registrazione. Chiama il numero ARRecordingManager.StartRecording() prima di riprendere la sessione. La registrazione inizia automaticamente quando la sessione riprende. Per interrompere automaticamente la registrazione quando la sessione è in pausa, chiama il numero ARRecordingConfig.AutoStopOnPause. Per registrare una sessione parziale, chiama ARRecordingManager.StartRecording() mentre la sessione è in esecuzione.

ARCoreRecordingConfig recordingConfig = ScriptableObject.CreateInstance<ARCoreRecordingConfig>();
Uri datasetUri = new System.Uri("file:///uri/for/dataset.mp4");
recordingConfig.Mp4DatasetUri = datasetUri.AbsoluteUri;

recordingManager.StartRecording(recordingConfig);

Interrompere la registrazione di una sessione

Per interrompere la registrazione senza sospendere la sessione AR attualmente in esecuzione, chiama il numero ARRecordingManager.StopRecording().

recordingManager.StopRecording();

Controllare lo stato della registrazione

È possibile utilizzare ARRecordingManager.RecordingStatus in qualsiasi momento per determinare lo stato di registrazione attuale.

Debug.Log("Current Recording Status: " + recordingManager.RecordingStatus);

Riproduzione

Riprodurre le sessioni AR registrate in precedenza. Le sessioni vengono riprodotte in tempo reale e la riproduzione o la velocità della sessione non possono essere regolate.

Riprodurre una sessione registrata in precedenza

Per riprodurre una sessione registrata in precedenza, chiama ARPlaybackManager.SetPlaybackDatasetUri() e fornisci un URI per il set di dati che vuoi riprodurre. Per utilizzare questo metodo devi mettere in pausa la sessione. Riprendi la sessione per applicare la modifica.

Una volta avviata la riproduzione a causa del ripristino della sessione, se metti in pausa la sessione disattivando ARSession, sospenderai l'elaborazione di tutti i fotogrammi delle immagini della videocamera e di tutti gli altri dati del sensore registrati nel set di dati. I fotogrammi delle immagini della videocamera e i relativi dati dei sensori eliminati in questo modo non verranno rielaborati quando la sessione viene ripresa e ripresa. Il monitoraggio AR della sessione è generalmente interessato dalla carenza di dati elaborati.

// 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;

Problema noto e soluzione alternativa

Si è verificato un problema noto a causa del quale le chiamate a ARPlaybackManager.SetPlaybackDatasetUri() restituiscono ErrorPlaybackFailed. Questo accade perché una sessione può richiedere diversi frame per essere messa in pausa. Se ARPlaybackManager.SetPlaybackDatasetUri() viene chiamato prima della pausa della sessione, non sarà in grado di accedere alla sessione e verrà restituito un errore.

Il seguente codice può essere utilizzato come soluzione alternativa.

// 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.
        }
    }

    ...
}

Interrompere una riproduzione

Per interrompere una riproduzione, chiama ARPlaybackManager.SetPlaybackDatasetUri() e imposta l'URI del set di dati su 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;

Riavvia la riproduzione dall'inizio

Per riavviare una riproduzione dall'inizio del set di dati, chiama ARPlaybackManager.SetPlaybackDatasetUri() e specifica la stessa registrazione MP4 prima di riprendere la sessione.

// 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;

Riprodurre una sessione diversa

Per riprodurre un set di dati diverso, metti in pausa la sessione e specifica il nuovo set di dati prima di riprendere la sessione.

// 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;

Controllare lo stato della riproduzione

ARPlaybackManager.PlaybackStatus può essere utilizzato in qualsiasi momento per determinare lo stato di riproduzione attuale.

Debug.Log("Current Playback Status: " + playbackManager.PlaybackStatus);

Passaggi successivi