Graba y reproduce una sesión de RA en una Base de RA orientada a Android

La API de Recording & Playback te permite grabar datos de video y de RA una vez en un entorno determinado y usar ese contenido para reemplazar la sesión de una cámara en vivo.

Requisitos previos

Asegúrate de comprender los conceptos fundamentales de RA y cómo configurar una sesión de ARCore antes de continuar.

Compatibilidad con otras APIs de ARCore

Debido a la forma en que se procesan los datos de la sesión, las APIs de ARCore pueden producir resultados diferentes durante la reproducción de los observados durante la grabación. También pueden producir resultados diferentes en sesiones de reproducción posteriores. Por ejemplo, la cantidad de elementos rastreables detectados, el momento preciso de su detección y sus poses con el tiempo pueden variar durante la reproducción.

Compatibilidad con Cloud Anchors

Puedes alojar y resolver Cloud Anchors mientras grabas o reproduces una sesión.

Grabación

Inicia, detén y verifica el estado de una grabación de una sesión de ARCore.

Graba una sesión de ARCore

Para grabar una sesión de ARCore, configúrala y proporciona un URI de MP4 para la grabación. Llama a ARRecordingManager.StartRecording() antes de reanudar la sesión. La grabación comienza automáticamente cuando se reanuda la sesión. Para detener la grabación automáticamente cuando se pause la sesión, llama a ARRecordingConfig.AutoStopOnPause. Para grabar una sesión parcial, llama a ARRecordingManager.StartRecording() mientras se esté ejecutando la sesión.

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

recordingManager.StartRecording(recordingConfig);

Cómo detener la grabación de una sesión

Para detener la grabación sin pausar la sesión de RA que se está ejecutando, llama a ARRecordingManager.StopRecording().

recordingManager.StopRecording();

Cómo comprobar el estado de la grabación

ARRecordingManager.RecordingStatus se puede usar en cualquier momento para determinar el estado de grabación actual.

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

Reproducción

Reproduce sesiones de RA grabadas anteriormente. Las sesiones se reproducen en tiempo real y no se pueden ajustar la velocidad ni la reproducción de las sesiones.

Reproducir una sesión grabada anteriormente

Para reproducir una sesión grabada previamente, llama a ARPlaybackManager.SetPlaybackDatasetUri() y proporciona un URI para el conjunto de datos que deseas reproducir. Debes pausar la sesión para usar este método. Reanuda la sesión para que se aplique el cambio.

Una vez que se haya iniciado la reproducción debido a la reanudación de la sesión, si se pausa la sesión mediante la inhabilitación de ARSession, se suspenderá el procesamiento de todos los marcos de imagen de la cámara y cualquier otro dato de sensor registrado en el conjunto de datos. Los marcos de imagen de la cámara y los datos de fotogramas del sensor que se descarten de esta manera no se volverán a procesar cuando se reanude la sesión. Por lo general, el seguimiento de RA de la sesión se verá afectado debido a la brecha en los datos procesados.

// 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 conocido y solución alternativa

Existe un problema conocido en el que las llamadas a ARPlaybackManager.SetPlaybackDatasetUri() muestran ErrorPlaybackFailed. Esto sucede porque puede demorar varios fotogramas para que se pause una sesión. Si se llama a ARPlaybackManager.SetPlaybackDatasetUri() antes de que se detenga la sesión, no podrá acceder a ella, por lo que mostrará un error.

El siguiente código se puede usar como solución 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.
        }
    }

    ...
}

Cómo detener una reproducción

Para detener una reproducción, llama a ARPlaybackManager.SetPlaybackDatasetUri() y establece el URI del conjunto de datos en 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;

Reiniciar la reproducción desde el principio

Para reiniciar la reproducción desde el principio del conjunto de datos, llama a ARPlaybackManager.SetPlaybackDatasetUri() y especifica la misma grabación en MP4 antes de reanudar la sesión.

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

Reproducir otra sesión

Para reproducir un conjunto de datos diferente, pausa la sesión y especifica el nuevo conjunto de datos antes de reanudar la sesión.

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

Cómo comprobar el estado de reproducción

ARPlaybackManager.PlaybackStatus se puede usar en cualquier momento para determinar el estado de reproducción actual.

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

¿Qué sigue?