Recording & Playback API memungkinkan Anda merekam data video dan 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 data sesi diproses, ARCore API dapat menghasilkan hasil yang berbeda selama pemutaran dibandingkan dengan yang diamati selama perekaman. Keduanya juga dapat menghasilkan hasil yang berbeda selama sesi pemutaran berikutnya. Misalnya, jumlah objek yang dapat dilacak yang terdeteksi, waktu yang tepat untuk mendeteksinya, dan posenya dari waktu ke waktu mungkin berbeda selama pemutaran.
Kompatibilitas dengan Cloud Anchors
Anda dapat menghosting dan me-resolve Cloud Anchors saat merekam atau memutar sesi.
Merekam
Memulai, menghentikan, dan memeriksa status perekaman sesi ARCore.
Merekam sesi ARCore
Untuk merekam sesi ARCore, konfigurasikan sesi dan berikan URI MP4 untuk perekaman. Panggil ARRecordingManager.StartRecording()
sebelum melanjutkan sesi. Perekaman akan otomatis dimulai saat sesi dilanjutkan. Untuk otomatis menghentikan perekaman saat sesi dijeda, panggil ARRecordingConfig.AutoStopOnPause
. Untuk merekam sesi sebagian, panggil ARRecordingManager.StartRecording()
saat sesi berjalan.
ARCoreRecordingConfig recordingConfig = ScriptableObject.CreateInstance<ARCoreRecordingConfig>();
Uri datasetUri = new System.Uri("file:///uri/for/dataset.mp4");
recordingConfig.Mp4DatasetUri = datasetUri.AbsoluteUri;
recordingManager.StartRecording(recordingConfig);
Menghentikan perekaman sesi
Untuk menghentikan perekaman tanpa menjeda sesi AR yang sedang berjalan, panggil ARRecordingManager.StopRecording()
.
recordingManager.StopRecording();
Memeriksa status perekaman
ARRecordingManager.RecordingStatus
dapat digunakan kapan saja untuk menentukan status perekaman saat ini.
Debug.Log("Current Recording Status: " + recordingManager.RecordingStatus);
Pemutaran
Memutar sesi AR yang telah direkam sebelumnya. Sesi diputar secara real time, dan pemutaran atau kecepatan sesi tidak dapat disesuaikan.
Memutar sesi yang telah direkam sebelumnya
Untuk memutar sesi yang telah direkam sebelumnya, panggil
ARPlaybackManager.SetPlaybackDatasetUri()
dan berikan URI untuk set data yang ingin Anda putar. Anda harus menjeda
sesi untuk menggunakan metode ini. Lanjutkan sesi agar perubahan diterapkan.
Setelah pemutaran dimulai karena melanjutkan sesi, menjeda sesi dengan menonaktifkanARSession
akan menangguhkan pemrosesan semua frame gambar kamera dan data sensor lain yang direkam dalam set data. Frame gambar kamera dan data frame sensor yang dihapus dengan cara ini tidak akan diproses ulang saat sesi dilanjutkan lagi dengan melanjutkan sesi. Pelacakan AR untuk sesi umumnya akan terganggu karena adanya kesenjangan dalam data yang diproses.
// Disable the ARSession to pause the current AR session.
session.enabled = false;
// In the next frame, provide a URI for the dataset you wish to play back.
Uri datasetUri = new System.Uri("file:///uri/for/dataset.mp4");
playbackManager.SetPlaybackDatasetUri(datasetUri);
// In the frame after that, re-enable the ARSession to resume the session from
// the beginning of the dataset.
session.enabled = true;
Masalah umum dan solusinya
Ada masalah umum saat panggilan ke
ARPlaybackManager.SetPlaybackDatasetUri()
menampilkan
ErrorPlaybackFailed
.
Hal ini terjadi karena perlu waktu beberapa frame untuk menjeda sesi. Jika
ARPlaybackManager.SetPlaybackDatasetUri()
dipanggil sebelum sesi dijeda, sesi tersebut tidak akan dapat mengakses
sesi, sehingga akan menampilkan error.
Kode berikut dapat digunakan sebagai solusi penggantian.
// Workaround for known issue where `playbackManager.SetPlaybackDatasetUri()`
// returns `ErrorPlaybackFailed` because it can take several frames for a
// session to be paused.
// Reference to the ARSession component in the scene.
ARSession session;
void PlaybackDataset()
{
setPlaybackDataset = true;
// Pause the current AR session.
session.enabled = false;
// Set a timeout for retrying playback retrieval.
timeout = 10f;
}
// Next frame
void Update()
{
...
if (setPlaybackDataset)
{
PlaybackResult result = playbackManager.SetPlaybackDatasetUri(datasetUri);
if (result == PlaybackResult.ErrorPlaybackFailed || result == PlaybackResult.SessionNotReady)
{
// Try to set the dataset again in the next frame.
timeout -= Time.deltaTime;
}
else
{
// Do not set the timeout if the result is something other than ErrorPlaybackFailed.
timeout = -1f;
}
if (timeout < 0.0f)
{
setPlaybackDataset = false;
// If playback is successful, proceed as usual.
// If playback is not successful, handle the error appropriately.
}
}
...
}
Menghentikan pemutaran
Untuk menghentikan pemutaran, panggil ARPlaybackManager.SetPlaybackDatasetUri()
dan tetapkan
URI set data ke null
.
// Disable the ARSession to pause the current AR session.
session.enabled = false;
// In the next frame, unset the playback dataset URI.
playbackManager.SetPlaybackDatasetUri(null);
// In the frame after that, re-enable the ARSession to resume the session using
// the device camera and other sensors.
session.enabled = true;
Memulai ulang pemutaran dari awal
Untuk memulai ulang pemutaran dari awal set data, panggil ARPlaybackManager.SetPlaybackDatasetUri()
dan tentukan rekaman MP4 yang sama sebelum melanjutkan sesi.
// Disable the ARSession to pause the current AR session.
session.enabled = false;
// In the next frame, specify the same dataset URI.
playbackManager.SetPlaybackDatasetUri(datasetUri); // Same URI that was previously set.
// In the frame after that, re-enable the ARSession to resume the session from
// the beginning of the dataset.
session.enabled = true;
Memutar sesi lain
Untuk memutar set data yang berbeda, jeda sesi dan tentukan set data baru sebelum melanjutkan sesi.
// Disable the ARSession to pause the current AR session.
session.enabled = false;
// In the next frame, specify a new dataset URI.
Uri newDatasetUri = new System.Uri("file:///uri/for/different/dataset.mp4");
playbackManager.SetPlaybackDatasetUri(newDatasetUri); // Different URI than was previously set.
// In the frame after that, re-enable the ARSession to resume the session from
// the beginning of the new dataset.
session.enabled = true;
Memeriksa status pemutaran
ARPlaybackManager.PlaybackStatus
dapat digunakan kapan saja untuk menentukan status pemutaran saat ini.
Debug.Log("Current Playback Status: " + playbackManager.PlaybackStatus);
Langkah selanjutnya
- Pelajari cara menambahkan data kustom ke sesi yang direkam.