Merekam dan memutar sesi AR di AR Foundation yang menargetkan Android

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