Enregistrer et lire une session de RA sur Android

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

Prérequis

Avant de continuer, assurez-vous de bien comprendre les concepts fondamentaux de la RA et de savoir configurer une session ARCore.

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 des résultats pendant la lecture différents de ceux observés lors de l'enregistrement. Elles peuvent également produire des résultats différents lors des sessions de lecture ultérieures. Par exemple, le nombre de détectables, le moment précis de leur détection et leurs poses au fil du temps peuvent être différents lors de la lecture.

Compatibilité avec la caméra partagée

Les sessions qui utilisent une caméra partagée peuvent être enregistrées. Toutefois, la lecture pour ces sessions à l'aide du mode Appareil photo partagé n'est actuellement pas disponible.

Compatibilité avec les ancres cloud

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

Enregistrement

Démarrer et arrêter l'enregistrement d'une session ARCore, et vérifier son état

Enregistrer une session ARCore

Pour enregistrer une session ARCore, configurez-la et fournissez un URI MP4 pour l'enregistrement. Appelez session.startRecording() avant le premier appel à session.resume(). L'enregistrement démarre automatiquement lorsque la session reprend. Pour arrêter automatiquement l'enregistrement lorsque la session est suspendue, 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 mettre en pause la session de RA en cours, 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

session.getRecordingStatus() peut être utilisée à 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 les sessions de RA précédemment enregistrées. Les sessions sont lues en temps réel, et la lecture ou la vitesse des sessions ne peuvent pas être ajustées.

Lire une session précédemment enregistrée

Pour lire une session déjà enregistrée, appelez session.setPlaybackDatasetUri() avant le premier appel à session.resume().

Une fois que la lecture a démarré en raison du premier appel à session.resume(), la mise en pause de la session en appelant session.pause() suspend le traitement de toutes les images de l'appareil photo et de toutes les autres données de capteur enregistrées dans l'ensemble de données. Les images de caméra et les données de cadre du capteur supprimées de cette manière ne seront pas traitées à nouveau lorsque la session sera à nouveau réactivée en appelant session.resume(). Le suivi de la RA pour la session sera généralement affecté par le manque de 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()

Redémarrer la lecture depuis le début

Pour relancer une lecture à partir du 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 nouvel ensemble de données avant de reprendre la session.

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

Étapes suivantes