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

Entenda os conceitos básicos de RA e como configurar uma sessão do ARCore antes de continuar.

Compatibilidade com outras APIs do ARCore

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

Compatibilidade com as âncoras do Cloud

É possível hospedar e resolver âncoras do Cloud ao gravar ou reproduzir uma sessão.

Gravando

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 sessão e forneça um URI MP4 para a gravação. Chame ARRecordingManager.StartRecording() antes de retomar a sessão. A gravação começa 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);

Interromper a gravação de uma 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 atual da gravação.

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 não é possível ajustar a reprodução ou a velocidade delas.

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. É necessário pausar a sessão para usar esse método. Retome a sessão para que a mudança entre em vigor.

Depois que a reprodução for iniciada devido à retomada da sessão, a pausa da sessão desativando o ARSession vai suspender o processamento de todos os frames de imagem da câmera e de todos os outros dados de sensores gravados no conjunto de dados. Os frames de imagem da câmera e os dados de frame do sensor descartados dessa forma não serão processados novamente quando a sessão for retomada. O rastreamento de RA para a sessão geralmente é afetado pela 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 as chamadas para ARPlaybackManager.SetPlaybackDatasetUri() retornam ErrorPlaybackFailed. Isso acontece porque pode levar vários frames para uma sessão ser pausada. Se ARPlaybackManager.SetPlaybackDatasetUri() for chamado antes que a sessão seja pausada, ele não poderá acessar a sessão, retornando um erro.

O código abaixo 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 do 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 uma sessão diferente

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;

Verificar o status da reprodução

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

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

O que vem em seguida?