Запись и воспроизведение сеанса AR на Android NDK

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

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

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

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

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

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

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

Запись

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Что дальше