AR-Sitzungen auf dem Android NDK aufzeichnen und abspielen

Mit der Recording & Playback API kannst du in einer bestimmten Umgebung Video- und AR-Daten aufzeichnen und diese Inhalte dann als Ersatz für eine Live-Kamerasitzung verwenden.

Voraussetzungen

Machen Sie sich mit den grundlegenden AR-Konzepten und zur Konfiguration einer ARCore-Sitzung vertraut, bevor Sie fortfahren.

Kompatibilität mit anderen ARCore APIs

Aufgrund der Art und Weise, wie Sitzungsdaten verarbeitet werden, können ARCore APIs während der Wiedergabe andere Ergebnisse liefern als bei der Aufzeichnung. Auch bei nachfolgenden Wiedergabesitzungen können sie unterschiedliche Ergebnisse liefern. Beispielsweise können die Anzahl der erkannten Trackables, der genaue Zeitpunkt ihrer Erkennung und ihre Positionen im Laufe der Zeit während der Wiedergabe variieren.

Kompatibilität mit Cloud Anchors

Sie können Cloud-Anchors hosten und auflösen, während Sie eine Sitzung aufzeichnen oder abspielen.

Aufzeichnung

Sie können die Aufzeichnung einer ARCore-Sitzung starten und stoppen und ihren Status prüfen.

ARCore-Sitzung aufzeichnen

Wenn Sie eine ARCore-Sitzung aufzeichnen möchten, konfigurieren Sie die Sitzung und geben Sie einen MP4-URI für die Aufzeichnung an. Rufen Sie ArSession_startRecording() vor dem ersten Aufruf von ArSession_resume() auf. Die Aufzeichnung beginnt automatisch, wenn sie fortgesetzt wird. Wenn die Aufzeichnung automatisch beendet werden soll, wenn die Sitzung pausiert wird, rufen Sie ArRecordingConfig_setAutoStopOnPause() an. Wenn Sie eine Teilsitzung aufzeichnen möchten, rufen Sie ArSession_startRecording() auf, während die Sitzung läuft.

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

Aufzeichnung beenden

Wenn Sie die Aufzeichnung beenden möchten, ohne die aktuell laufende AR-Sitzung zu unterbrechen, rufen Sie ArSession_stopRecording() und ArRecordingConfig_destroy() auf.

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

Aufzeichnungsstatus prüfen

ArSession_getRecordingStatus() kann jederzeit verwendet werden, um den aktuellen ArRecordingStatus zu ermitteln.

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

Wiedergabe

Zuvor aufgezeichnete AR-Sitzungen abspielen. Sitzungen werden in Echtzeit wiedergegeben und die Wiedergabe oder Geschwindigkeit einer Sitzung kann nicht angepasst werden.

Eine zuvor aufgezeichnete Sitzung wiedergeben

Zur Wiedergabe einer zuvor aufgezeichneten Sitzung rufen Sie ArSession_setPlaybackDatasetUri() vor dem ersten Aufruf von ArSession_resume() auf.

Wenn die Wiedergabe aufgrund des ersten Aufrufs von ArSession_resume() gestartet wurde und die Sitzung durch Aufrufen von ArSession_pause() pausiert wird, werden alle Kamerabilder und anderen aufgezeichneten Sensordaten im Datensatz nicht mehr verarbeitet. Bilderrahmen- und Sensorrahmendaten, die auf diese Weise verworfen werden, werden nicht noch einmal verarbeitet, wenn die Sitzung durch Aufrufen von ArSession_resume() wieder aufgenommen wird. Das AR-Tracking für die Sitzung wird in der Regel aufgrund der Lücke in den verarbeiteten Daten leiden.

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

Wiedergabe von vorn beginnen

Wenn Sie eine Wiedergabe am Anfang des Datasets neu starten möchten, halten Sie die Sitzung an und rufen Sie ArSession_setPlaybackDatasetUri() auf. Geben Sie dabei dieselbe MP4-Aufzeichnung an, bevor Sie die Sitzung fortsetzen.

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

Eine andere Sitzung wiedergeben

Halten Sie die Sitzung an und geben Sie das neue Dataset an, bevor Sie die Sitzung fortsetzen, um ein anderes Dataset wiederzugeben.

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

Wiedergabestatus prüfen

Sie können jederzeit ArSession_getPlaybackStatus() verwenden, um den aktuellen ArPlaybackStatus zu ermitteln.

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

Nächste Schritte