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?
- Saiba como adicionar dados personalizados às sessões gravadas.