Gravar e reproduzir uma sessão de RA na AR Foundation destinada ao Android

A API Recording & Playback permite gravar dados de vídeo e RA uma vez em um determinado ambiente e usar esse conteúdo para substituir uma sessão de câmera ao vivo.

Pré-requisitos

Verifique se você entendeu os conceitos fundamentais de RA e como configurar uma sessão do ARCore antes de continuar.

Compatibilidade com outras APIs ARCore

Devido à maneira como os dados da sessão são processados, as APIs do ARCore podem produzir resultados diferentes durante a reprodução do que os observados durante a gravação. Elas também podem produzir resultados diferentes nas sessões de reprodução subsequentes. Por exemplo, o número de itens rastreáveis detectados, o tempo preciso da detecção e as poses deles ao longo do tempo podem ser diferentes durante a reprodução.

Compatibilidade com o Cloud Anchors

Você pode hospedar e resolver Cloud Anchors ao gravar ou reproduzir uma sessão.

Gravação

Iniciar, interromper e verificar o status de uma gravação de sessão do ARCore.

Gravar uma sessão do ARCore

Para gravar uma sessão do ARCore, configure-a e forneça um URI MP4 para a gravação. Chame ARRecordingManager.StartRecording() antes de retomar a sessão. A gravação é iniciada automaticamente quando a sessão é retomada. Para interromper a gravação automaticamente quando a sessão for pausada, chame ARRecordingConfig.AutoStopOnPause. Para gravar uma sessão parcial, chame ARRecordingManager.StartRecording() enquanto a sessão estiver em execução.

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

recordingManager.StartRecording(recordingConfig);

Parar uma gravação de sessão

Para interromper a gravação sem pausar a sessão de RA em execução, chame ARRecordingManager.StopRecording().

recordingManager.StopRecording();

Verificar o status da gravação

ARRecordingManager.RecordingStatus pode ser usado a qualquer momento para determinar o status da gravação atual.

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

Reprodução

Reproduza sessões de RA gravadas anteriormente. As sessões são reproduzidas em tempo real, e a reprodução ou a velocidade da sessão não podem ser ajustadas.

Reproduzir uma sessão gravada anteriormente

Para reproduzir uma sessão gravada anteriormente, chame ARPlaybackManager.SetPlaybackDatasetUri() e forneça um URI para o conjunto de dados que você quer reproduzir. É preciso pausar a sessão para usar esse método. Reinicie a sessão para que a mudança entre em vigor.

Quando a reprodução começar devido à retomada da sessão, pausar a sessão desativando a ARSession suspenderá o processamento de todos os frames de imagem da câmera e todos os outros dados do sensor gravados no conjunto de dados. Os frames de imagem da câmera e os dados do frame do sensor descartados dessa forma não serão reprocessados quando a sessão for retomada de novo. Geralmente, o rastreamento de RA da sessão será prejudicado devido à lacuna nos dados processados.

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

Problema conhecido e solução alternativa

Há um problema conhecido em que chamadas para ARPlaybackManager.SetPlaybackDatasetUri() retornam ErrorPlaybackFailed. Isso acontece porque uma sessão pode levar vários frames para ser pausada. Se o método ARPlaybackManager.SetPlaybackDatasetUri() for chamado antes da pausa da sessão, ele não poderá acessar a sessão, então retornará um erro.

O código a seguir pode ser usado como solução alternativa.

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

    ...
}

Parar uma reprodução

Para interromper uma reprodução, chame ARPlaybackManager.SetPlaybackDatasetUri() e defina o URI do conjunto de dados como 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;

Reiniciar a reprodução desde o início

Para reiniciar uma reprodução desde o início do conjunto de dados, chame ARPlaybackManager.SetPlaybackDatasetUri() e especifique a mesma gravação MP4 antes de retomar a sessão.

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

Reproduzir outra sessão

Para reproduzir um conjunto de dados diferente, pause a sessão e especifique o novo conjunto de dados antes de retomar a sessão.

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

Conferir o status de reprodução

ARPlaybackManager.PlaybackStatus pode ser usado a qualquer momento para determinar o status atual da reprodução.

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

O que vem em seguida?