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

L'API Registrazione e riproduzione ti consente di registrare video e dati AR una volta in un determinato ambiente e di utilizzare questi contenuti per sostituire una sessione della videocamera in diretta.

Prerequisiti

Prima di procedere, assicurati di conoscere i concetti fondamentali dell'AR e come configurare una sessione ARCore.

Compatibilità con altre API ARCore

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

Compatibilità con Cloud Anchors

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

Registrazione

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

Registrare una sessione ARCore

Per registrare una sessione ARCore, configura la sessione e fornisci un URI MP4 per la registrazione. Chiama 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 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 mettere in pausa la sessione AR in esecuzione, chiama ARRecordingManager.StopRecording().

recordingManager.StopRecording();

Controllare lo stato della registrazione

ARRecordingManager.RecordingStatus può essere utilizzato in qualsiasi momento per determinare lo stato corrente della registrazione.

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

Riproduzione

Riproduci le sessioni AR registrate in precedenza. Le sessioni vengono riprodotte in tempo reale e non è possibile regolarne la velocità o la riproduzione.

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 della ripresa della sessione, la messa in pausa della sessione disattivando il pulsanteARSession sospende l'elaborazione di tutti i frame delle immagini della fotocamera e di qualsiasi altro dato del sensore registrato nel set di dati. I frame delle immagini della videocamera e i dati dei frame del sensore eliminati in questo modo non verranno sottoposti a nuovo trattamento quando la sessione viene riavviata. In genere, il rilevamento AR per la sessione ne risentirà a causa del vuoto nei 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

Esiste un problema noto per cui le chiamate a ARPlaybackManager.SetPlaybackDatasetUri() resistono ErrorPlaybackFailed. Questo accade perché possono essere necessari diversi frame per mettere in pausa una sessione. Se ARPlaybackManager.SetPlaybackDatasetUri() viene chiamato prima che la sessione sia stata messa in pausa, non potrà accedere alla sessione, quindi restituirà 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;

Riavviare la riproduzione dall'inizio

Per riavviare la 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 corrente della riproduzione.

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

Passaggi successivi