Graba y reproduce una sesión de RA en el NDK de 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 ArSession_startRecording() antes de la primera llamada a ArSession_resume(). 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_setAutoStopOnPause(). Para grabar una sesión parcial, llama a ArSession_startRecording() mientras se esté ejecutando la sesión.

ArRecordingConfig* recording_config = nullptr;
ArRecordingConfig_create(ar_session, &recording_config);
ArRecordingConfig_setMp4DatasetUri(ar_session, recording_config,
                                   mp4_dataset_uri);
ArRecordingConfig_setAutoStopOnPause(ar_session, recording_config, true);

CHECK(ArSession_startRecording(ar_session, recording_config));
// …
// Resume ARCore session to start recording.
CHECK(ArSession_resume(ar_session));
// …
// Recording ends.
CHECK(ArSession_pause(ar_session));

Detener una grabación

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

ArStatus status = ArSession_stopRecording(ar_session);
ArRecordingConfig_destroy(recording_config);

Cómo comprobar el estado de la grabación

ArSession_getRecordingStatus() se puede usar en cualquier momento para determinar el ArRecordingStatus actual.

ArRecordingStatus recording_status;
// Can be called at any time.
ArSession_getRecordingStatus(ar_session, &recording_status);
if (recording_status == AR_RECORDING_NONE) {
  // The dataset recorder is not recording.
} else if (recording_status == AR_RECORDING_OK) {
  // The dataset recorder is recording normally.
} else if (recording_status == AR_RECORDING_IO_ERROR) {
  // The dataset recorder encountered an error while recording.
}

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.

Cómo reproducir una sesión grabada anteriormente

Para reproducir una sesión grabada previamente, llama a ArSession_setPlaybackDatasetUri() antes de la primera llamada a ArSession_resume().

Una vez que haya comenzado la reproducción debido a la primera llamada a ArSession_resume(), si pausas la sesión con una llamada a ArSession_pause(), 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 con una llamada a ArSession_resume(). Por lo general, el seguimiento de RA de la sesión se verá afectado debido a la brecha en los datos procesados.

// Specify previously recorded MP4 file.
CHECK(ArSession_setPlaybackDatasetUri(ar_session, mp4_dataset_uri));
// …
// Playback starts from the beginning of the dataset.
CHECK(ArSession_resume(ar_session));
// …
// Pause AR session, but allow playback to silently continue.
CHECK(ArSession_pause(ar_session));
// …
// Resume AR session. Playback continues with gap to paused session.
CHECK(ArSession_resume(ar_session));

Reiniciar la reproducción desde el principio

Para reiniciar una reproducción desde el comienzo del conjunto de datos, pausa la sesión y llama a ArSession_setPlaybackDatasetUri() (especificando la misma grabación MP4) antes de reanudar la sesión.

CHECK(ArSession_pause(ar_session));
// Pause and specify the *same* dataset:
CHECK(ArSession_setPlaybackDatasetUri(ar_session, mp4_dataset_uri));
// Playback starts from the *beginning* of the dataset.
CHECK(ArSession_resume(ar_session));

Reproducir otra sesión

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

CHECK(ArSession_pause(ar_session));
// Pause and specify a *different* dataset:
CHECK(ArSession_setPlaybackDatasetUri(ar_session, other_mp4_dataset_uri));
// Playback starts from the *beginning* of the new dataset.
CHECK(ArSession_resume(ar_session));

Cómo comprobar el estado de reproducción

Usa ArSession_getPlaybackStatus() en cualquier momento para determinar el ArPlaybackStatus actual.

ArPlaybackStatus playback_status;
// Can be called at any time.
ArSession_getPlaybackStatus(ar_session, &playback_status);
if (playback_status == AR_PLAYBACK_NONE) {
  // The session is not playing back an MP4 dataset file.
} else if (playback_status == AR_PLAYBACK_OK) {
  // Playback is in process without issues.
} else if (playback_status == AR_PLAYBACK_IO_ERROR) {
  // Playback has stopped due to an error.
} else if (playback_status == AR_PLAYBACK_FINISHED) {
  // Playback has finished successfully.
}

¿Qué sigue?