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é, puis d'utiliser ce contenu pour remplacer une session d'appareil photo en direct.

Prérequis

Avant de continuer, assurez-vous de bien maîtriser les concepts fondamentaux de la RA et de savoir comment configurer une session ARCore.

Compatibilité avec d'autres API ARCore

En raison de la manière dont les données de session sont traitées, les API ARCore peuvent produire des résultats différents lors de la lecture que lors de l'enregistrement. Ils peuvent également produire des résultats différents lors des sessions de lecture suivantes. Par exemple, le nombre de détectables, le moment précis de leur détection et leurs poses au fil du temps peuvent être différents lors de la lecture.

Compatibilité avec Cloud Anchors

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

Enregistrement

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

Enregistrer une session ARCore

Pour enregistrer une session ARCore, configurez-la et fournissez un URI MP4 pour l'enregistrement. Appelez ARRecordingManager.StartRecording() avant de reprendre la session. L'enregistrement commence automatiquement lorsque la session reprend. Pour arrêter automatiquement l'enregistrement lorsque la session est mise 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 mettre en pause la session de RA en cours, appelez ARRecordingManager.StopRecording().

recordingManager.StopRecording();

Vérifier l'état de l'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 AR précédemment enregistrées Les sessions sont lues en temps réel, et la vitesse de 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 mettre la session en pause pour utiliser cette méthode. Relancez la session pour que le changement prenne effet.

Une fois la lecture lancée en raison de la reprise de la session, la mise en pause de la session en désactivant leARSession suspend le traitement de tous les frames d'image de la caméra et de toutes les autres données de capteur enregistrées dans l'ensemble de données. Les images de la caméra et les données des images du capteur qui sont supprimées de cette manière ne seront pas réanalysées lorsque la session sera reprise. Le suivi de la RA pour la session sera généralement affecté par l'écart entre 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, l'arrêt d'une session peut prendre plusieurs images. Si ARPlaybackManager.SetPlaybackDatasetUri() est appelé avant que la session ne soit suspendue, il ne pourra pas y accéder et renverra une erreur.

Vous pouvez utiliser le code suivant comme solution de contournement.

// 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 une lecture

Pour arrêter une lecture, appelez ARPlaybackManager.SetPlaybackDatasetUri() et 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;

Redémarrer la lecture depuis le début

Pour redémarrer 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 nouvel ensemble 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

ARPlaybackManager.PlaybackStatus peut être utilisé à tout moment pour déterminer l'état de lecture actuel.

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

Étapes suivantes