Enregistrer et lire une session de RA sur AR Foundation ciblant Android

L'API Recording & Playback vous permet d'enregistrer des données vidéo et de RA une fois dans un environnement donné et d'utiliser ce contenu pour remplacer une session de caméra en direct.

Conditions préalables

Assurez-vous de bien comprendre les concepts fondamentaux de la RA et de configurer une session ARCore avant de continuer.

Compatibilité avec les autres API ARCore

En raison de la façon dont les données de session sont traitées, les API ARCore peuvent produire pendant la lecture des résultats différents de ceux observés pendant l'enregistrement. Ils peuvent également produire des résultats différents lors des sessions de lecture suivantes. Par exemple, le nombre d'éléments traçables détectés, le moment précis de leur détection et leurs postures au fil du temps peuvent varier lors de la lecture.

Compatibilité avec les ancres cloud

Vous pouvez héberger et résoudre des ancrages cloud pendant l'enregistrement ou la lecture d'une session.

Enregistrement

Démarrez, arrêtez l'enregistrement d'une session ARCore et vérifiez son état.

Enregistrer une session ARCore

Pour enregistrer une session ARCore, configurez la session et fournissez un URI MP4 pour l'enregistrement. Appelez ARRecordingManager.StartRecording() avant de reprendre la session. L'enregistrement démarre automatiquement à la reprise de la séance. Pour arrêter automatiquement l'enregistrement lorsque la session est en pause, appelez ARRecordingConfig.AutoStopOnPause. Pour enregistrer une session partielle, appelez ARRecordingManager.StartRecording() pendant l'exécution de la session.

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

recordingManager.StartRecording(recordingConfig);

Arrêter l'enregistrement d'une session

Pour arrêter l'enregistrement sans suspendre la session de RA en cours d'exécution, appelez ARRecordingManager.StopRecording().

recordingManager.StopRecording();

Vérifier l'état d'enregistrement

Vous pouvez utiliser ARRecordingManager.RecordingStatus à tout moment pour déterminer l'état d'enregistrement actuel.

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

Lecture

Lire des sessions de RA précédemment enregistrées. Les sessions sont lues en temps réel, et la lecture ou la vitesse de la session ne peuvent pas être ajustées.

Lire une session précédemment enregistrée

Pour lire une session précédemment enregistrée, appelez ARPlaybackManager.SetPlaybackDatasetUri() et fournissez un URI pour l'ensemble de données que vous souhaitez lire. Vous devez suspendre la session pour utiliser cette méthode. Reprenez la session pour que la modification prenne effet.

Une fois que la lecture a commencé après la reprise de la session, la mise en pause de la session en désactivant ARSession suspend le traitement de toutes les images de l'appareil photo et de toutes les autres données de capteurs enregistrées dans l'ensemble de données. Les images de la caméra et les données de frame des capteurs supprimées de cette manière ne seront pas traitées à nouveau lorsque la session sera réactivée. Le suivi RA pour la session sera généralement affecté en raison de l'écart dans les données traitées.

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

Problème connu et solution

Il existe un problème connu où les appels à ARPlaybackManager.SetPlaybackDatasetUri() renvoient ErrorPlaybackFailed. En effet, plusieurs images peuvent être nécessaires pour qu'une session soit mise en pause. Si ARPlaybackManager.SetPlaybackDatasetUri() est appelé avant la suspension de la session, il ne pourra pas accéder à la session. Une erreur sera donc renvoyée.

Le code suivant peut être utilisé pour contourner ce problème.

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

    ...
}

Arrêter la lecture

Pour arrêter une lecture, appelez ARPlaybackManager.SetPlaybackDatasetUri(), puis définissez l'URI de l'ensemble de données sur 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;

Relancer la lecture depuis le début

Pour relancer la lecture à partir du début de l'ensemble de données, appelez ARPlaybackManager.SetPlaybackDatasetUri() et spécifiez le même enregistrement MP4 avant de reprendre la session.

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

Lire une autre session

Pour lire un autre ensemble de données, mettez la session en pause et spécifiez le nouveau jeu de données avant de la reprendre.

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

Vérifier l'état de la lecture

Vous pouvez utiliser ARPlaybackManager.PlaybackStatus à tout moment pour déterminer l'état de lecture actuel.

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

Et ensuite ?