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 sesiones de reproducción posteriores. Por ejemplo, la cantidad de elementos rastreables detectados, el momento preciso de su detección y sus posiciones 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 una grabación de sesión de ARCore.
Cómo grabar 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();
Verifica 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
Reproducir 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 tenga efecto.
Una vez que se inicie la reproducción debido a que se reanuda la sesión, si se inhabilita ARSession
, se suspenderá el procesamiento de todos los fotogramas de la imagen de la cámara y cualquier otro dato del sensor grabado 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
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 ella, por lo que 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 verificar 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?
- Obtén información para agregar datos personalizados a las sesiones grabadas.