Enregistrer et lire une session de RA sur le NDK Android

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

Prérequis

Assurez-vous de bien maîtriser les concepts fondamentaux de la RA. et comment 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 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 traceurs détectés, le moment précis de leur détection et leurs postures au fil du temps peuvent varier pendant la lecture.

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 ArSession_startRecording() avant le premier appel à ArSession_resume(). L'enregistrement démarre automatiquement lorsque la session reprend. Pour arrêter automatiquement l'enregistrement lorsque la session est suspendue, 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 mettre en pause la session de RA en cours, appelez ArSession_stopRecording() et ArRecordingConfig_destroy().

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

Vérifier l'état d'enregistrement

ArSession_getRecordingStatus() peut être utilisée à 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 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 ArSession_setPlaybackDatasetUri() avant le premier appel vers ArSession_resume()

Une fois que la lecture a démarré en raison du premier appel à ArSession_resume(), la mise en pause de la session en appelant ArSession_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 ArSession_resume(). Le suivi de la RA pour la session sera généralement affecté par le manque de 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 reprendre la lecture à partir du début de l'ensemble de données, mettez la session en pause et appel ArSession_setPlaybackDatasetUri(), 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 reprendre la session.

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 ArPlaybackStatus

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

Étapes suivantes