Enregistrer et lire une session de RA sur Android

L'API Recording & Playback vous permet d'enregistrer des données vidéo et de RA une fois dans un environnement donné et d'utiliser ce contenu pour remplacer une session de caméra en direct.

Conditions préalables

Assurez-vous de bien comprendre les concepts fondamentaux de la RA et de configurer une session ARCore avant de continuer.

Compatibilité avec les autres API ARCore

En raison de la façon dont les données de session sont traitées, les API ARCore peuvent produire pendant la lecture des résultats différents de ceux observés pendant l'enregistrement. Ils peuvent également produire des résultats différents lors des sessions de lecture suivantes. Par exemple, le nombre d'éléments traçables détectés, le moment précis de leur détection et leurs postures au fil du temps peuvent varier lors de la lecture.

Compatibilité avec la caméra partagée

Les sessions avec une caméra partagée peuvent être enregistrées. Toutefois, la lecture de ces sessions à l'aide du mode Appareil photo partagé est actuellement indisponible.

Compatibilité avec les ancres cloud

Vous pouvez héberger et résoudre des ancrages cloud pendant l'enregistrement ou la lecture d'une session.

Enregistrement

Démarrez, arrêtez l'enregistrement d'une session ARCore et vérifiez son état.

Enregistrer une session ARCore

Pour enregistrer une session ARCore, configurez la session et fournissez un URI MP4 pour l'enregistrement. Appelez session.startRecording() avant le premier appel à session.resume(). L'enregistrement démarre automatiquement à la reprise de la séance. Pour arrêter automatiquement l'enregistrement lorsque la session est en pause, appelez RecordingConfig.setAutoStopOnPause(). Pour enregistrer une session partielle, appelez session.startRecording() pendant l'exécution de la session.

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()

Arrêter l'enregistrement d'une session

Pour arrêter l'enregistrement sans suspendre la session de RA en cours d'exécution, appelez session.stopRecording().

Java

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

Kotlin

session.stopRecording()

Vérifier l'état d'enregistrement

Vous pouvez utiliser session.getRecordingStatus() à tout moment pour déterminer la valeur RecordingStatus actuelle.

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.
}

Lecture

Lire des sessions de RA précédemment enregistrées. Les sessions sont lues en temps réel, et la lecture ou la vitesse de la session ne peuvent pas être ajustées.

Lire une session précédemment enregistrée

Pour lire une session précédemment enregistrée, appelez session.setPlaybackDatasetUri() avant le premier appel à session.resume().

Une fois que la lecture a commencé suite au premier appel à session.resume(), la mise en pause de la session en appelant session.pause() suspend le traitement de toutes les images de la caméra et de toutes les autres données de capteurs enregistrées dans l'ensemble de données. Les images de la caméra et les données de frame des capteurs supprimées de cette manière ne seront pas traitées à nouveau lorsque la session reprendra en appelant session.resume(). Le suivi RA pour la session sera généralement affecté en raison de l'écart dans les données traitées.

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()

Relancer la lecture depuis le début

Pour relancer la lecture depuis le début de l'ensemble de données, mettez la session en pause et appelez session.setPlaybackDatasetUri(), en spécifiant le même enregistrement MP4 avant de reprendre la session.

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.

Lire une autre session

Pour lire un autre ensemble de données, mettez la session en pause et spécifiez le nouveau jeu de données avant de la reprendre.

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.

Vérifier l'état de la lecture

Utilisez session.getPlaybackStatus() à tout moment pour déterminer la PlaybackStatus actuelle.

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.
}

Et ensuite ?