Merekam dan memutar sesi AR di Android NDK

Recording & Playback API memungkinkan Anda merekam video dan data AR sekali dalam lingkungan tertentu dan menggunakan konten tersebut untuk menggantikan sesi kamera live.

Prasyarat

Pastikan Anda memahami konsep AR dasar dan cara mengonfigurasi sesi ARCore sebelum melanjutkan.

Kompatibilitas dengan ARCore API lainnya

Karena cara pemrosesan data sesi, API ARCore dapat memberikan hasil yang berbeda selama pemutaran dibandingkan dengan yang diamati selama perekaman. Iklan juga dapat memberikan hasil yang berbeda selama sesi pemutaran berikutnya. Misalnya, jumlah item yang dapat dilacak, waktu yang tepat dari deteksinya, dan posenya dari waktu ke waktu mungkin berbeda selama pemutaran.

Kompatibilitas dengan Cloud Anchors

Anda dapat menghosting dan me-resolve Cloud Anchor saat merekam atau memutar sesi.

Mencatat

Mulai, hentikan, dan periksa status perekaman sesi ARCore.

Merekam sesi ARCore

Untuk merekam sesi ARCore, konfigurasikan sesi dan berikan URI MP4 untuk perekaman. Panggil ArSession_startRecording() sebelum panggilan pertama ke ArSession_resume(). Perekaman otomatis dimulai saat sesi dilanjutkan. Untuk otomatis berhenti merekam saat sesi dijeda, panggil ArRecordingConfig_setAutoStopOnPause(). Untuk merekam sesi sebagian, panggil ArSession_startRecording() saat sesi sedang berjalan.

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

Menghentikan rekaman

Untuk berhenti merekam tanpa menjeda sesi AR yang sedang berjalan, panggil ArSession_stopRecording() dan ArRecordingConfig_destroy().

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

Memeriksa status perekaman

ArSession_getRecordingStatus() dapat digunakan kapan saja untuk menentukan ArRecordingStatus saat ini.

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

Pemutaran

Memutar sesi AR yang telah direkam sebelumnya. Sesi diputar secara real time, dan pemutaran atau kecepatan sesi tidak dapat disesuaikan.

Memutar kembali sesi yang telah direkam sebelumnya

Untuk memutar sesi yang direkam sebelumnya, panggil ArSession_setPlaybackDatasetUri() sebelum panggilan pertama ke ArSession_resume().

Setelah pemutaran dimulai karena panggilan pertama ke ArSession_resume(), menjeda sesi dengan memanggil ArSession_pause() akan menangguhkan pemrosesan semua frame gambar kamera dan data sensor lainnya yang direkam dalam set data. Bingkai gambar kamera dan data bingkai sensor yang dihapus dengan cara ini tidak akan diproses ulang saat sesi dilanjutkan kembali dengan memanggil ArSession_resume(). Pelacakan AR untuk sesi tersebut umumnya akan terpengaruh karena kesenjangan dalam data yang diproses.

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

Mulai ulang pemutaran dari awal

Untuk memulai ulang pemutaran dari awal set data, jeda sesi dan panggil ArSession_setPlaybackDatasetUri(), dengan menentukan rekaman MP4 yang sama, sebelum melanjutkan sesi.

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

Putar sesi lain

Untuk memutar set data yang berbeda, jeda sesi dan tentukan set data baru sebelum melanjutkan sesi.

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

Memeriksa status pemutaran

Gunakan ArSession_getPlaybackStatus() kapan saja untuk menentukan ArPlaybackStatus saat ini.

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

Langkah selanjutnya