Enregistrer et lire une session de RA sur le NDK 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 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 ArSession_startRecording() avant le premier appel à ArSession_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 ArRecordingConfig_setAutoStopOnPause(). Pour enregistrer une session partielle, appelez ArSession_startRecording() pendant l'exécution de la session.

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

Arrêter un enregistrement

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

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

Vérifier l'état d'enregistrement

Vous pouvez utiliser ArSession_getRecordingStatus() à tout moment pour déterminer la valeur ArRecordingStatus actuelle.

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

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 ArSession_setPlaybackDatasetUri() avant le premier appel à ArSession_resume().

Une fois que la lecture a commencé suite au premier appel à ArSession_resume(), la mise en pause de la session en appelant ArSession_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 ArSession_resume(). Le suivi RA pour la session sera généralement affecté en raison de l'écart dans les données traitées.

// 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));

Relancer la lecture depuis le début

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

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

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 la reprendre.

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

Vérifier l'état de la lecture

Utilisez ArSession_getPlaybackStatus() à tout moment pour déterminer la ArPlaybackStatus actuelle.

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

Et ensuite ?