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