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 RA y video una vez en un entorno determinado y usar ese contenido para reemplazar una sesión de cámara en vivo.

Requisitos previos

Asegúrate de comprender los conceptos fundamentales de la 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 que los observados durante la grabación. También pueden producir resultados diferentes durante las sesiones de reproducción posteriores. Por ejemplo, la cantidad de elementos rastreables detectados, la sincronización precisa de su detección y sus poses a lo largo del tiempo pueden ser diferentes durante la reproducción.

Compatibilidad con Cloud Anchors

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

Grabación

Inicia, detén y verifica el estado de la 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 automáticamente la grabación cuando se pausa la sesión, llama a ARRecordingConfig.AutoStopOnPause. Para grabar una sesión parcial, llama a ARRecordingManager.StartRecording() mientras la sesión se está ejecutando.

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 en ejecución, llama a ARRecordingManager.StopRecording().

recordingManager.StopRecording();

Comprobar el estado de registro

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 puede ajustar la velocidad ni la reproducción de las sesiones.

Cómo reproducir una sesión grabada anteriormente

Para reproducir una sesión grabada anteriormente, 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 el cambio surta efecto.

Una vez que se inicie la reproducción debido a que se reanudó 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 fotogramas 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 por el que las llamadas a ARPlaybackManager.SetPlaybackDatasetUri() muestran ErrorPlaybackFailed. Esto sucede porque una sesión puede tardar varios fotogramas en pausarse. Si se llama a ARPlaybackManager.SetPlaybackDatasetUri() antes de que se detenga la sesión, no podrá acceder a la sesión, por lo que se mostrará un error.

Puedes usar el siguiente código 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.
        }
    }

    ...
}

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 una reproducción desde el principio del conjunto de datos, llama a ARPlaybackManager.SetPlaybackDatasetUri() y especifica la misma grabación 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;

Cómo reproducir una sesión diferente

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

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