Запишите и воспроизведите сеанс AR на Android

API записи и воспроизведения позволяет вам записывать видео и данные AR один раз в определенной среде и использовать этот контент для замены сеанса прямой трансляции с камеры.

Предварительные условия

Прежде чем продолжить, убедитесь, что вы понимаете фундаментальные концепции AR и то, как настроить сеанс ARCore .

Совместимость с другими API ARCore.

Из-за способа обработки данных сеанса API ARCore могут давать во время воспроизведения результаты, отличные от тех, которые наблюдаются во время записи. Они также могут давать разные результаты во время последующих сеансов воспроизведения. Например, количество обнаруженных объектов отслеживания, точное время их обнаружения и их положение во времени могут различаться во время воспроизведения.

Совместимость с общей камерой

Сеансы, в которых используется общая камера, могут быть записаны. Однако воспроизведение этих сеансов в режиме общей камеры в настоящее время недоступно.

Совместимость с облачными якорями

Вы можете размещать и разрешать облачные привязки во время записи или воспроизведения сеанса.

Запись

Запускайте, останавливайте и проверяйте состояние записи сеанса ARCore.

Запись сеанса ARCore

Чтобы записать сеанс ARCore, настройте сеанс и укажите URI MP4 для записи. Вызовите session.startRecording() перед первым вызовом session.resume() . Запись начинается автоматически при возобновлении сеанса. Чтобы автоматически остановить запись при приостановке сеанса, вызовите RecordingConfig.setAutoStopOnPause() . Чтобы записать частичный сеанс, вызовите session.startRecording() во время работы сеанса.

Джава

// 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();

Котлин

// 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()

Остановить запись сеанса

Чтобы остановить запись, не приостанавливая текущий сеанс AR, вызовите session.stopRecording() .

Джава

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

Котлин

session.stopRecording()

Проверить статус записи

session.getRecordingStatus() можно использовать в любое время для определения текущего RecordingStatus .

Джава

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

Котлин

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

Воспроизведение

Воспроизведение ранее записанных сеансов AR. Сеансы воспроизводятся в реальном времени, при этом воспроизведение или скорость сеанса нельзя регулировать.

Воспроизведение ранее записанного сеанса

Чтобы воспроизвести ранее записанный сеанс, вызовите session.setPlaybackDatasetUri() перед первым вызовом session.resume() .

Как только воспроизведение началось из-за первого вызова session.resume() , приостановка сеанса путем вызова session.pause() приостановит обработку всех кадров изображения камеры и любых других записанных данных датчиков в наборе данных. Кадры изображения камеры и данные кадров датчика, которые отбрасываются таким образом, не будут повторно обработаны, когда сеанс снова возобновляется путем вызова session.resume() . Отслеживание сеанса в дополненной реальности обычно страдает из-за пробелов в обработанных данных.

Джава

// 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();

Котлин

// 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()

Возобновить воспроизведение с начала

Чтобы возобновить воспроизведение с начала набора данных, приостановите сеанс и вызовите session.setPlaybackDatasetUri() , указав ту же запись MP4, прежде чем возобновить сеанс.

Джава

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

Котлин

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

Воспроизвести другой сеанс

Чтобы воспроизвести другой набор данных, приостановите сеанс и укажите новый набор данных перед возобновлением сеанса.

Джава

// 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.

Котлин

// 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.

Проверьте статус воспроизведения

Используйте session.getPlaybackStatus() в любое время, чтобы определить текущий PlaybackStatus .

Джава

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

Котлин

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

Что дальше