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?
- Saiba como adicionar dados personalizados a sessões gravadas.
- Faça o codelab Introdução à API ARCore Recording and Playback.