Gravar e reproduzir uma sessão de RA no Android NDK

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 ArSession_startRecording() antes da primeira para ArSession_resume(). A gravação é iniciada automaticamente quando a sessão é retomada. Para interromper a gravação automaticamente quando a sessão for pausada, chame ArRecordingConfig_setAutoStopOnPause(). Para gravar uma sessão parcial, chame ArSession_startRecording() enquanto a sessão estiver em execução.

ArRecordingConfig* recording_config = nullptr;
ArRecordingConfig_create(ar_session, &recording_config);
ArRecordingConfig_setMp4DatasetUri(ar_session, recording_config,
                                   mp4_dataset_uri);
ArRecordingConfig_setAutoStopOnPause(ar_session, recording_config, true);

CHECK(ArSession_startRecording(ar_session, recording_config));
// …
// Resume ARCore session to start recording.
CHECK(ArSession_resume(ar_session));
// …
// Recording ends.
CHECK(ArSession_pause(ar_session));

Parar uma gravação

Para interromper a gravação sem pausar a sessão de RA em execução, chame ArSession_stopRecording() e ArRecordingConfig_destroy().

ArStatus status = ArSession_stopRecording(ar_session);
ArRecordingConfig_destroy(recording_config);

Verificar o status da gravação

ArSession_getRecordingStatus() pode ser usado a qualquer momento para determinar o ArRecordingStatus atual.

ArRecordingStatus recording_status;
// Can be called at any time.
ArSession_getRecordingStatus(ar_session, &recording_status);
if (recording_status == AR_RECORDING_NONE) {
  // The dataset recorder is not recording.
} else if (recording_status == AR_RECORDING_OK) {
  // The dataset recorder is recording normally.
} else if (recording_status == AR_RECORDING_IO_ERROR) {
  // The dataset recorder encountered an error while recording.
}

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.

Tocar uma sessão gravada anteriormente

Para reproduzir uma sessão gravada anteriormente, chame ArSession_setPlaybackDatasetUri() antes da primeira chamada para ArSession_resume().

Quando a reprodução tiver começado devido à primeira chamada para ArSession_resume(), pausar a sessão chamando ArSession_pause() suspende o processamento de todos os frames de imagem da câmera e de 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 novamente chamando ArSession_resume(). Geralmente, o rastreamento de RA da sessão será prejudicado devido à lacuna nos dados processados.

// Specify previously recorded MP4 file.
CHECK(ArSession_setPlaybackDatasetUri(ar_session, mp4_dataset_uri));
// …
// Playback starts from the beginning of the dataset.
CHECK(ArSession_resume(ar_session));
// …
// Pause AR session, but allow playback to silently continue.
CHECK(ArSession_pause(ar_session));
// …
// Resume AR session. Playback continues with gap to paused session.
CHECK(ArSession_resume(ar_session));

Reiniciar a reprodução desde o início

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

CHECK(ArSession_pause(ar_session));
// Pause and specify the *same* dataset:
CHECK(ArSession_setPlaybackDatasetUri(ar_session, mp4_dataset_uri));
// Playback starts from the *beginning* of the dataset.
CHECK(ArSession_resume(ar_session));

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.

CHECK(ArSession_pause(ar_session));
// Pause and specify a *different* dataset:
CHECK(ArSession_setPlaybackDatasetUri(ar_session, other_mp4_dataset_uri));
// Playback starts from the *beginning* of the new dataset.
CHECK(ArSession_resume(ar_session));

Conferir o status de reprodução

Use ArSession_getPlaybackStatus() a qualquer momento para determinar o ArPlaybackStatus atual.

ArPlaybackStatus playback_status;
// Can be called at any time.
ArSession_getPlaybackStatus(ar_session, &playback_status);
if (playback_status == AR_PLAYBACK_NONE) {
  // The session is not playing back an MP4 dataset file.
} else if (playback_status == AR_PLAYBACK_OK) {
  // Playback is in process without issues.
} else if (playback_status == AR_PLAYBACK_IO_ERROR) {
  // Playback has stopped due to an error.
} else if (playback_status == AR_PLAYBACK_FINISHED) {
  // Playback has finished successfully.
}

O que vem em seguida?