Registrare e riprodurre una sessione AR su Android NDK

L'API Recording & Playback consente di registrare dati video e AR una sola volta all'interno di un determinato ambiente e di utilizzare questi contenuti per sostituire una sessione in diretta della videocamera.

Prerequisiti

Assicurati di aver compreso i concetti fondamentali di AR e di configurare una sessione ARCore prima di procedere.

Compatibilità con altre API ARCore

A causa del modo in cui i dati delle sessioni vengono elaborati, le API ARCore potrebbero produrre risultati diversi durante la riproduzione rispetto a quelli osservati durante la registrazione. Inoltre, potrebbero produrre risultati diversi durante sessioni di riproduzione successive. Ad esempio, il numero di elementi tracciabili rilevati, la tempistica precisa del loro rilevamento e le relative pose nel tempo potrebbero essere diversi durante la riproduzione.

Compatibilità con gli ancoraggi Cloud

Puoi ospitare e risolvere gli ancoraggi Cloud durante la registrazione o la riproduzione di una sessione.

Registrazione in corso…

Avvia, interrompi e controlla lo stato della registrazione di una sessione ARCore.

Registrare una sessione ARCore

Per registrare una sessione ARCore, configurala e fornisci un URI MP4 per la registrazione. Chiama il numero ArSession_startRecording() prima della prima chiamata al numero ArSession_resume(). La registrazione inizia automaticamente quando la sessione riprende. Per interrompere automaticamente la registrazione quando la sessione è in pausa, chiama il numero ArRecordingConfig_setAutoStopOnPause(). Per registrare una sessione parziale, chiama ArSession_startRecording() mentre la sessione è in esecuzione.

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

Interrompere una registrazione

Per interrompere la registrazione senza sospendere la sessione AR attualmente in esecuzione, chiama ArSession_stopRecording() e ArRecordingConfig_destroy().

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

Controllare lo stato della registrazione

ArSession_getRecordingStatus() può essere utilizzato in qualsiasi momento per determinare l'attuale ArRecordingStatus.

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

Riproduzione

Riprodurre le sessioni AR registrate in precedenza. Le sessioni vengono riprodotte in tempo reale e la riproduzione o la velocità della sessione non possono essere regolate.

Riprodurre una sessione registrata in precedenza

Per riprodurre una sessione registrata in precedenza, chiama il numero ArSession_setPlaybackDatasetUri() prima della prima chiamata al numero ArSession_resume().

Una volta avviata la riproduzione a causa della prima chiamata al numero ArSession_resume(), se metti in pausa la sessione chiamando ArSession_pause(), verrà sospesa l'elaborazione di tutti i fotogrammi delle immagini della videocamera e di tutti gli altri dati dei sensori registrati nel set di dati. Le cornici delle immagini della videocamera e i dati dei fotogrammi del sensore eliminati in questo modo non verranno rielaborati quando la sessione verrà ripresa di nuovo chiamando ArSession_resume(). Il monitoraggio AR della sessione è generalmente interessato dalla carenza di dati elaborati.

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

Riavvia la riproduzione dall'inizio

Per riavviare una riproduzione dall'inizio del set di dati, metti in pausa la sessione e chiama ArSession_setPlaybackDatasetUri(), specificando la stessa registrazione MP4, prima di riprendere la sessione.

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

Riprodurre una sessione diversa

Per riprodurre un set di dati diverso, metti in pausa la sessione e specifica il nuovo set di dati prima di riprendere la sessione.

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

Controllare lo stato della riproduzione

Utilizza ArSession_getPlaybackStatus() in qualsiasi momento per determinare l'attuale 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.
}

Passaggi successivi