Merekam dan memutar sesi AR di AR Foundation yang menargetkan Android

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 ARRecordingManager.StartRecording() sebelum melanjutkan sesi. Perekaman otomatis dimulai saat sesi dilanjutkan. Untuk otomatis berhenti merekam saat sesi dijeda, panggil ARRecordingConfig.AutoStopOnPause. Untuk merekam sesi sebagian, panggil ARRecordingManager.StartRecording() saat sesi sedang 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 berhenti merekam 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 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 sesi dilanjutkan, menjeda sesi dengan menonaktifkan ARSession akan menangguhkan pemrosesan semua frame gambar kamera dan data sensor lainnya yang direkam dalam set data. Bingkai gambar kamera dan data bingkai sensor yang dibuang dengan cara ini tidak akan diproses ulang ketika sesi dilanjutkan lagi dengan melanjutkan sesi. Pelacakan AR untuk sesi tersebut umumnya akan terpengaruh karena 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 diperlukan beberapa frame untuk menjeda sebuah sesi. Jika ARPlaybackManager.SetPlaybackDatasetUri() dipanggil sebelum sesi dijeda, sesi tidak akan dapat diakses sehingga akan menampilkan error.

Kode berikut dapat digunakan sebagai solusi.

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

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

Putar sesi lain

Untuk memutar ulang 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