Graba y reproduce una sesión de RA en el NDK de Android

Las sesiones de grabación y La API de Playback te permite grabar datos de video y de RA 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 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 sesión, las APIs de ARCore pueden producir resultados diferentes durante la reproducción que los observados durante el registro. 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 Cloud Anchors 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, configura la sesión 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 la sesión esté pausada, llama a ArRecordingConfig_setAutoStopOnPause(). Para grabar una sesión parcial, llama a ArSession_startRecording() mientras se ejecuta 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));

Cómo detener una grabación

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

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

Comprobar el estado de registro

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

Cómo reproducir una sesión grabada anteriormente

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

Una vez que se inicie la reproducción debido a la primera llamada a ArSession_resume(), pausar la sesión con una llamada a ArSession_pause() 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 marco del sensor que se descarten de esta manera no se volverán a procesar cuando se reanude la sesión llamando 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 principio del conjunto de datos, pausa la sesión y llamar ArSession_setPlaybackDatasetUri(): especificar 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));

Cómo reproducir otra sesión

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

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 ArPlaybackStatus

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?