Android'i hedefleyen AR Foundation'da AR oturumu kaydetme ve oynatma

Kaydetme ve Oynatma API'si, video ve AR verilerini belirli bir ortamda bir kez kaydetmenizi ve bu içeriği bir canlı kamera oturumunun yerine kullanmanızı sağlar.

Ön koşullar

Devam etmeden önce temel AR kavramlarını ve ARCore oturumunu nasıl yapılandıracağınızı anladığınızdan emin olun.

Diğer ARCore API'leriyle uyumluluk

ARCore API'leri, oturum verilerinin işlenme şekli nedeniyle oynatma sırasında kayıt sırasında gözlemlenenden farklı sonuçlar üretebilir. Sonraki oynatma oturumlarında da farklı sonuçlar üretebilirler. Örneğin, algılanan izlenebilirlerin sayısı, algılanma zamanının tam zamanı ve pozları, oynatma sırasında zaman içinde farklı olabilir.

Cloud Anchor'larla uyumluluk

Cloud Anchor'ı, bir oturum kaydederken veya oynatırken barındırabilir ve çözebilirsiniz.

Kayıt

ARCore oturum kaydını başlatabilir, durdurabilir ve durumunu kontrol edebilirsiniz.

ARCore oturumu kaydet

ARCore oturumu kaydetmek için oturumu yapılandırın ve kayıt için bir MP4 URI'si sağlayın. Oturumu devam ettirmeden önce ARRecordingManager.StartRecording() numaralı telefonu arayın. Kayıt, oturum devam ettiğinde otomatik olarak başlar. Oturum duraklatıldığında kaydı otomatik olarak durdurmak için ARRecordingConfig.AutoStopOnPause numaralı telefonu arayın. Kısmi bir oturumu kaydetmek için oturum devam ederken ARRecordingManager.StartRecording() numaralı telefonu arayın.

ARCoreRecordingConfig recordingConfig = ScriptableObject.CreateInstance<ARCoreRecordingConfig>();
Uri datasetUri = new System.Uri("file:///uri/for/dataset.mp4");
recordingConfig.Mp4DatasetUri = datasetUri.AbsoluteUri;

recordingManager.StartRecording(recordingConfig);

Oturum kaydını durdurma

Şu anda çalışan AR oturumunu duraklatmadan kaydı durdurmak için ARRecordingManager.StopRecording() numaralı telefonu arayın.

recordingManager.StopRecording();

Kayıt durumunu kontrol edin

ARRecordingManager.RecordingStatus aracını, geçerli kayıt durumunu belirlemek için istediğiniz zaman kullanabilirsiniz.

Debug.Log("Current Recording Status: " + recordingManager.RecordingStatus);

Oynatma

Önceden kaydedilmiş AR oturumlarını oynatın. Oturumlar gerçek zamanlı olarak oynatılır. Oturum oynatma veya hız ayarlanamaz.

Önceden kaydedilmiş bir oturumu oynatma

Daha önce kaydedilmiş bir oturumu oynatmak için ARPlaybackManager.SetPlaybackDatasetUri() çağrısı yapın ve oynatmak istediğiniz veri kümesine ait bir URI sağlayın. Bu yöntemi kullanmak için oturumu duraklatmanız gerekir. Değişikliğin geçerli olması için oturumu devam ettirin.

Oturum devam ettirilmesi nedeniyle oynatma başladıktan sonra, ARSession hizmetini devre dışı bırakarak oturumu duraklatmak, tüm kamera görüntü karelerinin ve veri kümesinde kayıtlı diğer sensör verilerinin işlenmesini askıya alır. Bu şekilde silinen kamera görüntü çerçeveleri ve sensör çerçevesi verileri, oturum devam ettirilerek tekrar devam ettirildiğinde yeniden işlenmez. Oturumla ilgili AR takibi genellikle işlenen verilerdeki boşluktan dolayı sorun yaşar.

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

Bilinen sorun ve geçici çözüm

ARPlaybackManager.SetPlaybackDatasetUri() çağrısının ErrorPlaybackFailed yapılmasıyla ilgili bilinen bir sorun vardır. Bunun nedeni, bir oturumun duraklatılmasının birkaç kare sürebilmesidir. ARPlaybackManager.SetPlaybackDatasetUri() oturum duraklatılmadan önce çağrılırsa oturuma erişemez, bu nedenle bir hata döndürür.

Geçici bir çözüm olarak aşağıdaki kod kullanılabilir.

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

    ...
}

Oynatmayı durdurma

Oynatmayı durdurmak için ARPlaybackManager.SetPlaybackDatasetUri() yöntemini çağırın ve veri kümesi URI'sini null olarak ayarlayın.

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

Oynatmayı baştan başlat

Bir oynatmayı veri kümesinin başından yeniden başlatmak için ARPlaybackManager.SetPlaybackDatasetUri() numaralı telefonu arayın ve oturumu devam ettirmeden önce aynı MP4 kaydını belirtin.

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

Farklı bir oturum oynat

Farklı bir veri kümesini oynatmak için oturumu devam ettirmeden önce oturumu duraklatın ve yeni veri kümesini belirtin.

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

Oynatma durumunu kontrol etme

Mevcut oynatma durumunu belirlemek için istediğiniz zaman ARPlaybackManager.PlaybackStatus kullanılabilir.

Debug.Log("Current Playback Status: " + playbackManager.PlaybackStatus);

Sonraki adımlar