Nagrywanie i odtwarzanie sesji AR na Androidzie

Nagranie Odtwarzanie API pozwala jednorazowo nagrać dane wideo i AR w danym środowisku i wykorzystać te treści do zastąpienia sesji kamery na żywo.

Wymagania wstępne

Zanim przejdziesz dalej, upewnij się, że rozumiesz podstawowe zagadnienia związane z rozszerzoną rzeczywistością oraz że wiesz, jak skonfigurować sesję ARCore.

Zgodność z innymi interfejsami API ARCore

Ze względu na sposób przetwarzania danych sesji interfejsy ARCore API mogą podczas odtwarzania uzyskiwać inne wyniki niż zaobserwowane podczas nagrywania. Mogą też przynieść inne wyniki podczas kolejnych sesji odtwarzania. Na przykład liczba wykrytych elementów możliwych do śledzenia, dokładny czas wykrycia i ich pozycje w czasie mogą być inne podczas odtwarzania.

Zgodność ze współdzielonym aparatem

Sesje wykorzystujące udostępnioną kamerę można nagrywać. Jednak odtwarzanie tych sesji w trybie wspólnego aparatu jest obecnie niedostępne.

Zgodność z Cloud Anchors

Zakotwiczone elementy Cloud możesz hostować i rozwiązywać podczas nagrywania lub odtwarzania sesji.

Nagrywanie

Rozpoczynanie i zatrzymywanie nagrywania sesji ARCore oraz sprawdzanie ich stanu.

Nagrywanie sesji ARCore

Aby nagrać sesję ARCore, skonfiguruj sesję i podaj identyfikator URI nagrania w formacie MP4. Zadzwoń pod numer session.startRecording() przed pierwszym połączeniem z numerem session.resume(). Nagrywanie rozpocznie się automatycznie, gdy sesja zostanie wznowiona. Aby automatycznie przerwać nagrywanie po wstrzymaniu sesji, zadzwoń pod numer RecordingConfig.setAutoStopOnPause(). Aby nagrać część sesji, podczas jej trwania naciśnij session.startRecording().

Java

// Configure the ARCore session.
Session session = new Session(context);
Uri destination = Uri.fromFile(new File(context.getFilesDir(), "recording.mp4"));
RecordingConfig recordingConfig =
        new RecordingConfig(session)
        .setMp4DatasetUri(destination)
        .setAutoStopOnPause(true);
try {
  // Prepare the session for recording, but do not start recording yet.
  session.startRecording(recordingConfig);
} catch (RecordingFailedException e) {
  Log.e(TAG, "Failed to start recording", e);
}

// Resume the ARCore session to start recording.
session.resume();

Kotlin

// Configure the ARCore session.
val session = Session(context)
val destination = Uri.fromFile(File(context.getFilesDir(), "recording.mp4"))
val recordingConfig = RecordingConfig(session)
  .setMp4DatasetUri(destination)
  .setAutoStopOnPause(true)
session.startRecording(recordingConfig)

// Resume the ARCore session to start recording.
session.resume()

Zatrzymywanie nagrywania sesji

Aby zatrzymać nagrywanie bez wstrzymania aktualnie uruchomionej sesji AR, wywołaj session.stopRecording().

Java

try {
  session.stopRecording();  // Stop recording.
} catch (RecordingFailedException e) {
  Log.e(TAG, "Failed to stop recording", e);
}

Kotlin

session.stopRecording()

Sprawdź stan nagrywania

session.getRecordingStatus() może być używany w dowolnym momencie do określania bieżącego RecordingStatus.

Java

// Use any time to determine current RecordingStatus.
if (session.getRecordingStatus() == RecordingStatus.OK) {
  // Update the UI to show that the session is currently being recorded.
}

Kotlin

// Use any time to determine current RecordingStatus.
if (session.recordingStatus == RecordingStatus.OK) {
  // Update the UI to show that the session is currently being recorded.
}

Odtwarzanie

Odtwarzanie wcześniej nagranych sesji AR. Sesje są odtwarzane w czasie rzeczywistym. Nie można też dostosować odtwarzania ani szybkości transmisji w sesji.

Odtwarzanie wcześniej nagranej sesji

Aby odtworzyć nagraną wcześniej sesję, zadzwoń pod numer session.setPlaybackDatasetUri() przed pierwszym wywołaniem session.resume().

Po rozpoczęciu odtwarzania w związku z pierwszym wywołaniem funkcji session.resume() wstrzymanie sesji przez wywołanie metody session.pause() spowoduje zawieszenie przetwarzania wszystkich klatek zdjęć z aparatu i wszelkich innych danych z czujnika zarejestrowanych w zbiorze danych. Ramki obrazu z kamery i dane ramki czujnika, które zostały w ten sposób odrzucone, nie zostaną ponownie przetworzone, gdy sesja zostanie wznowiona przez wywołanie funkcji session.resume(). W przypadku śledzenia AR w trakcie sesji zazwyczaj występuje luka w przetwarzanych danych.

Java

// Configure the ARCore session.
Session session = new Session(context);

// Specify the previously recorded MP4 file.
Uri recordingUri = Uri.fromFile(new File(context.getFilesDir(), "recording.mp4"));
session.setPlaybackDatasetUri(recordingUri);
…

// Start playback from the beginning of the dataset.
session.resume();
…

// Pause the AR session, but silently continue MP4 playback. Camera frames
// and other recorded sensor data is discarded while the session is paused.
session.pause();
…

// Resume the AR session. Camera frames and other sensor data from the MP4
// that was silently played back while the session was paused is not
// processed by ARCore.
session.resume();

Kotlin

// Configure the ARCore session.
val session = Session(context)

// Specify the previously recorded MP4 file.
val recordingUri = Uri.fromFile(File(context.filesDir, "recording.mp4"))
session.playbackDatasetUri = recordingUri
…

// Start playback from the beginning of the dataset.
session.resume()
…

// Pause the AR session, but silently continue MP4 playback. Camera frames
// and other recorded sensor data is discarded while the session is paused.
session.pause()
…

// Resume the AR session. Camera frames and other sensor data from the MP4
// that was silently played back while the session was paused is not
// processed by ARCore.
session.resume()

Wznów odtwarzanie od początku

Aby ponownie uruchomić odtwarzanie od początku zbioru danych, wstrzymaj sesję i wywołaj session.setPlaybackDatasetUri(), zanim wznowisz sesję, określając to samo nagranie MP4.

Java

session.pause();
// Pause and specify the SAME dataset:
session.setPlaybackDatasetUri(previousRecordingUri);
session.resume();  // Playback starts from the BEGINNING of the dataset.

Kotlin

session.pause()
// Pause and specify the SAME dataset:
session.playbackDatasetUri = previousRecordingUri
session.resume()  // Playback starts from the BEGINNING of the dataset.

Odtwórz inną sesję

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

Java

// Switch to a different dataset.
session.pause();   // Pause the playback of the first dataset.
// Specify a different dataset to use.
session.setPlaybackDatasetUri(newRecordingUri);
session.resume();  // Start playback from the beginning of the new dataset.

Kotlin

// Switch to a different dataset.
session.pause()   // Pause the playback of the first dataset.
// Specify a different dataset to use.
session.playbackDatasetUri = newRecordingUri
session.resume()  // Start playback from the beginning of the new dataset.

Sprawdzanie stanu odtwarzania

W dowolnym momencie możesz użyć funkcji session.getPlaybackStatus(), aby sprawdzić aktualną wartość parametru PlaybackStatus.

Java

// Use any time to determine current PlaybackStatus.
if (session.getPlaybackStatus() != PlaybackStatus.OK) {
  // Update the UI to show that the session playback has finished.
}

Kotlin

// Use any time to determine current PlaybackStatus.
if (session.playbackStatus != PlaybackStatus.OK) {
  // Update the UI to show that the session playback has finished.
}

Co dalej?