Gravar e reproduzir uma sessão de RA no 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 a câmera compartilhada

As sessões que usam a câmera compartilhada podem ser gravadas. No entanto, a reprodução dessas sessões usando o modo de câmera compartilhada não está disponível no momento.

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

Java

// Configure the ARCore session.
Session session = new Session(context);
Uri destination = Uri.fromFile(new File(context.getFilesDir(), "recording.mp4"));
RecordingConfig recordingConfig =
        new RecordingConfig(session)
        .setMp4DatasetUri(destination)
        .setAutoStopOnPause(true);
try {
  // Prepare the session for recording, but do not start recording yet.
  session.startRecording(recordingConfig);
} catch (RecordingFailedException e) {
  Log.e(TAG, "Failed to start recording", e);
}

// Resume the ARCore session to start recording.
session.resume();

Kotlin

// Configure the ARCore session.
val session = Session(context)
val destination = Uri.fromFile(File(context.getFilesDir(), "recording.mp4"))
val recordingConfig = RecordingConfig(session)
  .setMp4DatasetUri(destination)
  .setAutoStopOnPause(true)
session.startRecording(recordingConfig)

// Resume the ARCore session to start recording.
session.resume()

Parar uma gravação de sessão

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

Java

try {
  session.stopRecording();  // Stop recording.
} catch (RecordingFailedException e) {
  Log.e(TAG, "Failed to stop recording", e);
}

Kotlin

session.stopRecording()

Verificar o status da gravação

session.getRecordingStatus() pode ser usado a qualquer momento para determinar o RecordingStatus atual.

Java

// Use any time to determine current RecordingStatus.
if (session.getRecordingStatus() == RecordingStatus.OK) {
  // Update the UI to show that the session is currently being recorded.
}

Kotlin

// Use any time to determine current RecordingStatus.
if (session.recordingStatus == RecordingStatus.OK) {
  // Update the UI to show that the session is currently being recorded.
}

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

Se quiser reproduzir uma sessão gravada anteriormente, ligue para session.setPlaybackDatasetUri() antes da primeira chamada para session.resume().

Quando a reprodução tiver começado devido à primeira chamada para session.resume(), pausar a sessão chamando session.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 session.resume(). Geralmente, o rastreamento de RA da sessão será prejudicado devido à lacuna nos dados processados.

Java

// Configure the ARCore session.
Session session = new Session(context);

// Specify the previously recorded MP4 file.
Uri recordingUri = Uri.fromFile(new File(context.getFilesDir(), "recording.mp4"));
session.setPlaybackDatasetUri(recordingUri);
…

// Start playback from the beginning of the dataset.
session.resume();
…

// Pause the AR session, but silently continue MP4 playback. Camera frames
// and other recorded sensor data is discarded while the session is paused.
session.pause();
…

// Resume the AR session. Camera frames and other sensor data from the MP4
// that was silently played back while the session was paused is not
// processed by ARCore.
session.resume();

Kotlin

// Configure the ARCore session.
val session = Session(context)

// Specify the previously recorded MP4 file.
val recordingUri = Uri.fromFile(File(context.filesDir, "recording.mp4"))
session.playbackDatasetUri = recordingUri
…

// Start playback from the beginning of the dataset.
session.resume()
…

// Pause the AR session, but silently continue MP4 playback. Camera frames
// and other recorded sensor data is discarded while the session is paused.
session.pause()
…

// Resume the AR session. Camera frames and other sensor data from the MP4
// that was silently played back while the session was paused is not
// processed by ARCore.
session.resume()

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 session.setPlaybackDatasetUri(), especificando a mesma gravação MP4 antes de retomar a sessão.

Java

session.pause();
// Pause and specify the SAME dataset:
session.setPlaybackDatasetUri(previousRecordingUri);
session.resume();  // Playback starts from the BEGINNING of the dataset.

Kotlin

session.pause()
// Pause and specify the SAME dataset:
session.playbackDatasetUri = previousRecordingUri
session.resume()  // Playback starts from the BEGINNING of the dataset.

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.

Java

// Switch to a different dataset.
session.pause();   // Pause the playback of the first dataset.
// Specify a different dataset to use.
session.setPlaybackDatasetUri(newRecordingUri);
session.resume();  // Start playback from the beginning of the new dataset.

Kotlin

// Switch to a different dataset.
session.pause()   // Pause the playback of the first dataset.
// Specify a different dataset to use.
session.playbackDatasetUri = newRecordingUri
session.resume()  // Start playback from the beginning of the new dataset.

Conferir o status de reprodução

Use session.getPlaybackStatus() a qualquer momento para determinar o PlaybackStatus atual.

Java

// Use any time to determine current PlaybackStatus.
if (session.getPlaybackStatus() != PlaybackStatus.OK) {
  // Update the UI to show that the session playback has finished.
}

Kotlin

// Use any time to determine current PlaybackStatus.
if (session.playbackStatus != PlaybackStatus.OK) {
  // Update the UI to show that the session playback has finished.
}

O que vem em seguida?