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

Se pueden grabar las sesiones que usan Cámara compartida. Sin embargo, la reproducción de estas 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 sesión de ARCore.

Cómo grabar 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 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 la sesión esté pausada, llama a RecordingConfig.setAutoStopOnPause(). Para grabar una sesión parcial, llama a session.startRecording() mientras se ejecuta 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()

Comprobar el estado de registro

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

Cómo reproducir una sesión grabada anteriormente

Para reproducir una sesión grabada anteriormente, llama a session.setPlaybackDatasetUri() antes de la primera llamada a session.resume().

Una vez que se inicie la reproducción debido a la primera llamada a session.resume(), pausar la sesión con una llamada a session.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 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 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.

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.

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 valor actual PlaybackStatus

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?