AR-Sitzungen auf dem Android NDK aufzeichnen und abspielen

Die Aufzeichnung & Mit der Wiedergabe-API können Sie Video- und AR-Daten einmal in einer bestimmten Umgebung aufzeichnen und diese Inhalte verwenden, um eine Live-Kamerasitzung zu ersetzen.

Vorbereitung

Machen Sie sich mit den grundlegenden AR-Konzepten vertraut. und Konfigurieren einer ARCore-Sitzung beschrieben, bevor du fortfährst.

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 während der Aufzeichnung. Sie können auch bei nachfolgenden Wiedergabesitzungen zu anderen Ergebnissen führen. So können beispielsweise die Anzahl der erkannten Trackables, der genaue Zeitpunkt ihrer Erkennung und ihre Positionen im Laufe der Zeit während der Wiedergabe unterschiedlich sein.

Kompatibilität mit Cloud-Anchors

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

Aufzeichnung

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

ARCore-Sitzung aufzeichnen

Wenn du eine ARCore-Sitzung aufzeichnen möchtest, konfiguriere die Sitzung und gib einen MP4-URI für die Aufzeichnung an. Rufe ArSession_startRecording() vor dem ersten Aufruf von ArSession_resume() auf. Die Aufzeichnung beginnt automatisch, wenn sie fortgesetzt wird. Wenn die Aufzeichnung beim Pausieren der Sitzung automatisch beendet werden soll, rufen Sie ArRecordingConfig_setAutoStopOnPause() an. Wenn Sie eine Teilsitzung aufzeichnen möchten, rufen Sie während der Sitzung ArSession_startRecording() auf.

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 gerade laufende AR-Sitzung zu pausieren, rufen Sie ArSession_stopRecording() und ArRecordingConfig_destroy()

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 wiedergeben. Sitzungen werden in Echtzeit wiedergegeben und können nicht angepasst werden.

Eine zuvor aufgezeichnete Sitzung abspielen

Um eine zuvor aufgezeichnete Sitzung wiederzugeben, rufen Sie ArSession_setPlaybackDatasetUri() vor dem ersten Aufruf von ArSession_resume()

Sobald die Wiedergabe aufgrund des ersten Aufrufs von ArSession_resume() gestartet wurde, wird durch das Pausieren der Sitzung durch Aufrufen von ArSession_pause() die Verarbeitung aller Kamera-Bildframes und aller anderen aufgezeichneten Sensordaten im Datensatz unterbrochen. Kamera-Bildframes und Sensor-Frame-Daten, die auf diese Weise verworfen werden, werden nicht noch einmal verarbeitet, wenn die Sitzung durch den Aufruf von ArSession_resume() wieder fortgesetzt wird. Im Allgemeinen leidet das AR-Tracking für die Sitzung aufgrund der Lücke in den verarbeiteten Daten.

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

Um eine Wiedergabe vom Anfang des Datasets neu zu starten, halten Sie die Sitzung an und Anruf ArSession_setPlaybackDatasetUri(), und lege dieselbe MP4-Aufnahme fest, bevor du die Sitzung fortsetzt.

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 abspielen

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

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

Verwenden Sie ArSession_getPlaybackStatus(), um den aktuellen 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.
}

Weiteres Vorgehen