Graba y reproduce una sesión de RA en 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 la cámara compartida

Las sesiones que usan la Cámara compartida se pueden grabar. Sin embargo, la reproducción de esas sesiones con el modo de cámara compartida no está disponible en este momento.

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 session.startRecording() antes de la primera llamada a session.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 RecordingConfig.setAutoStopOnPause(). Para grabar una sesión parcial, llama a session.startRecording() mientras se esté ejecutando la sesión.

Java

// Configure the ARCore session.
Session session = new Session(context);
Uri destination = Uri.fromFile(new File(context.getFilesDir(), "recording.mp4"));
RecordingConfig recordingConfig =
        new RecordingConfig(session)
        .setMp4DatasetUri(destination)
        .setAutoStopOnPause(true);
try {
  // Prepare the session for recording, but do not start recording yet.
  session.startRecording(recordingConfig);
} catch (RecordingFailedException e) {
  Log.e(TAG, "Failed to start recording", e);
}

// Resume the ARCore session to start recording.
session.resume();

Kotlin

// Configure the ARCore session.
val session = Session(context)
val destination = Uri.fromFile(File(context.getFilesDir(), "recording.mp4"))
val recordingConfig = RecordingConfig(session)
  .setMp4DatasetUri(destination)
  .setAutoStopOnPause(true)
session.startRecording(recordingConfig)

// Resume the ARCore session to start recording.
session.resume()

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 session.stopRecording().

Java

try {
  session.stopRecording();  // Stop recording.
} catch (RecordingFailedException e) {
  Log.e(TAG, "Failed to stop recording", e);
}

Kotlin

session.stopRecording()

Cómo comprobar el estado de la grabación

session.getRecordingStatus() se puede usar en cualquier momento para determinar el RecordingStatus actual.

Java

// Use any time to determine current RecordingStatus.
if (session.getRecordingStatus() == RecordingStatus.OK) {
  // Update the UI to show that the session is currently being recorded.
}

Kotlin

// Use any time to determine current RecordingStatus.
if (session.recordingStatus == RecordingStatus.OK) {
  // Update the UI to show that the session is currently being recorded.
}

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 session.setPlaybackDatasetUri() antes de la primera llamada a session.resume().

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

Java

// Configure the ARCore session.
Session session = new Session(context);

// Specify the previously recorded MP4 file.
Uri recordingUri = Uri.fromFile(new File(context.getFilesDir(), "recording.mp4"));
session.setPlaybackDatasetUri(recordingUri);
…

// Start playback from the beginning of the dataset.
session.resume();
…

// Pause the AR session, but silently continue MP4 playback. Camera frames
// and other recorded sensor data is discarded while the session is paused.
session.pause();
…

// Resume the AR session. Camera frames and other sensor data from the MP4
// that was silently played back while the session was paused is not
// processed by ARCore.
session.resume();

Kotlin

// Configure the ARCore session.
val session = Session(context)

// Specify the previously recorded MP4 file.
val recordingUri = Uri.fromFile(File(context.filesDir, "recording.mp4"))
session.playbackDatasetUri = recordingUri
…

// Start playback from the beginning of the dataset.
session.resume()
…

// Pause the AR session, but silently continue MP4 playback. Camera frames
// and other recorded sensor data is discarded while the session is paused.
session.pause()
…

// Resume the AR session. Camera frames and other sensor data from the MP4
// that was silently played back while the session was paused is not
// processed by ARCore.
session.resume()

Reiniciar la reproducción desde el principio

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

Java

session.pause();
// Pause and specify the SAME dataset:
session.setPlaybackDatasetUri(previousRecordingUri);
session.resume();  // Playback starts from the BEGINNING of the dataset.

Kotlin

session.pause()
// Pause and specify the SAME dataset:
session.playbackDatasetUri = previousRecordingUri
session.resume()  // Playback starts from the BEGINNING of the dataset.

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.

Java

// Switch to a different dataset.
session.pause();   // Pause the playback of the first dataset.
// Specify a different dataset to use.
session.setPlaybackDatasetUri(newRecordingUri);
session.resume();  // Start playback from the beginning of the new dataset.

Kotlin

// Switch to a different dataset.
session.pause()   // Pause the playback of the first dataset.
// Specify a different dataset to use.
session.playbackDatasetUri = newRecordingUri
session.resume()  // Start playback from the beginning of the new dataset.

Cómo comprobar el estado de reproducción

Usa session.getPlaybackStatus() en cualquier momento para determinar el PlaybackStatus actual.

Java

// Use any time to determine current PlaybackStatus.
if (session.getPlaybackStatus() != PlaybackStatus.OK) {
  // Update the UI to show that the session playback has finished.
}

Kotlin

// Use any time to determine current PlaybackStatus.
if (session.playbackStatus != PlaybackStatus.OK) {
  // Update the UI to show that the session playback has finished.
}

¿Qué sigue?