Merekam dan memutar sesi AR di Android NDK

Perekaman & 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 dasar AR dan cara mengonfigurasi sesi ARCore sebelum melanjutkan.

Kompatibilitas dengan ARCore API lainnya

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

Kompatibilitas dengan Cloud Anchor

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

Merekam

Memulai, menghentikan, dan memeriksa status rekaman sesi ARCore.

Merekam sesi ARCore

Untuk merekam sesi ARCore, konfigurasikan sesi dan berikan URI MP4 untuk rekaman. Panggil ArSession_startRecording() sebelum panggilan pertama ke ArSession_resume(). Perekaman dimulai secara otomatis saat sesi dilanjutkan. Untuk otomatis berhenti merekam saat sesi dijeda, panggil ArRecordingConfig_setAutoStopOnPause(). Untuk merekam sesi parsial, 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 perekaman

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 direkam sebelumnya. Sesi diputar kembali secara real time, dan pemutaran atau kecepatan sesi tidak dapat disesuaikan.

Memutar sesi yang 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 frame sensor yang dihapus dengan cara ini tidak akan diproses ulang saat sesi dilanjutkan kembali dengan memanggil ArSession_resume(). Pelacakan AR untuk sesi 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 {i>dataset<i}, jeda sesi dan panggilan telepon ArSession_setPlaybackDatasetUri(), menentukan perekaman 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 {i>dataset<i} yang berbeda, jeda sesi dan tentukan {i>dataset<i} 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.

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