Nagrywanie i odtwarzanie sesji AR na Androidzie NDK

Interfejs Logging & Playback API umożliwia jednorazowe nagranie danych wideo i AR w danym środowisku i wykorzystanie ich zamiast sesji kamery na żywo.

Wymagania wstępne

Zanim przejdziesz dalej, upewnij się, że znasz podstawowe pojęcia związane z AR i wiesz, jak skonfigurować sesję ARCore.

Zgodność z innymi interfejsami API ARCore

Ze względu na sposób przetwarzania danych sesji interfejsy ARCore API mogą zwracać inne wyniki podczas odtwarzania niż zaobserwowane podczas nagrywania. Mogą one również przynosić inne wyniki podczas kolejnych sesji odtwarzania. Na przykład liczba wykrytych elementów do śledzenia, dokładny czas wykrycia i pozycje w czasie mogą się różnić podczas odtwarzania.

Zgodność z kotwicami w chmurze

Zakotwiczone w chmurze możesz hostować i rozwiązywać problemy podczas nagrywania lub odtwarzania sesji.

Rejestrowanie

Uruchamiaj, zatrzymuj i sprawdzaj stan nagrywania sesji ARCore.

Nagraj sesję ARCore

Aby nagrać sesję ARCore, skonfiguruj sesję i podaj identyfikator URI nagrania MP4. Zadzwoń pod numer ArSession_startRecording() przed pierwszym połączeniem z numerem ArSession_resume(). Nagrywanie rozpocznie się automatycznie po wznowieniu sesji. Aby automatycznie zatrzymać nagrywanie po wstrzymaniu sesji, zadzwoń pod numer ArRecordingConfig_setAutoStopOnPause(). Aby nagrać częściową sesję, wywołaj ArSession_startRecording() w trakcie jej trwania.

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

Zatrzymywanie nagrywania

Aby zatrzymać nagrywanie bez wstrzymywania trwającej sesji AR, wywołaj ArSession_stopRecording() i ArRecordingConfig_destroy().

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

Sprawdzanie stanu nagrywania

ArSession_getRecordingStatus() można w każdej chwili określić, aby określić bieżącą wartość 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.
}

Odtwarzanie

Odtwarzanie nagranych wcześniej sesji AR. Sesje są odtwarzane w czasie rzeczywistym, a odtwarzanie i szybkość sesji nie mogą zostać zmienione.

Odtwarzanie wcześniej nagranej sesji

Aby odtworzyć wcześniej nagraną sesję, wywołaj ArSession_setPlaybackDatasetUri() przed pierwszym wywołaniem funkcji ArSession_resume().

Po rozpoczęciu odtwarzania z powodu pierwszego wywołania metody ArSession_resume() wstrzymanie sesji za pomocą wywołania ArSession_pause() spowoduje zawieszenie przetwarzania wszystkich klatek obrazu z kamery i innych zapisanych danych z czujnika w zbiorze danych. Odrzucone w ten sposób ramki na zdjęcia z aparatu i przetworzone dane z czujnika nie zostaną przetworzone ponownie po wznowieniu sesji przez wywołanie funkcji ArSession_resume(). Ogólnie rzecz biorąc, śledzenie AR podczas sesji nie będzie działać prawidłowo z powodu luk w przetwarzanych danych.

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

Wznów odtwarzanie od początku

Aby ponownie uruchomić odtwarzanie od początku zbioru danych, wstrzymaj sesję i wywołaj ArSession_setPlaybackDatasetUri(), wskazując to samo nagranie MP4, przed wznowieniem sesji.

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

Odtwarzanie innej sesji

Aby odtworzyć inny zbiór danych, przed wznowieniem sesji wstrzymaj sesję i podaj nowy zbiór danych.

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

Sprawdzanie stanu odtwarzania

W każdej chwili możesz użyć ArSession_getPlaybackStatus(), aby określić bieżącą wartość 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.
}

Co dalej?