Android NDK에서 AR 세션 녹화 및 재생

녹화 및 Playback API를 사용하면 특정 환경 내에서 동영상 및 AR 데이터를 한 번 녹화하고 해당 콘텐츠를 사용하여 라이브 카메라 세션을 대체할 수 있습니다.

기본 요건

기본 AR 개념을 이해합니다. ARCore 세션을 구성하는 방법을 알아보세요.

다른 ARCore API와의 호환성

세션 데이터가 처리되는 방식으로 인해 ARCore API는 재생 중에 녹화 중에 관찰된 것과 다른 결과를 생성할 수 있습니다. 또한 후속 재생 세션에서 다른 결과를 생성할 수도 있습니다. 예를 들어 감지된 추적 가능 항목 수, 감지 정확한 시점, 시간 경과에 따른 포즈가 재생 중에는 다를 수 있습니다.

클라우드 앵커와의 호환성

세션을 녹화하거나 재생하는 동안 클라우드 앵커를 호스팅하고 해결할 수 있습니다.

녹화

ARCore 세션 녹화를 시작, 중지, 확인합니다.

ARCore 세션 기록

ARCore 세션을 녹화하려면 세션을 구성하고 녹화 파일의 MP4 URI를 제공하세요. 첫 번째 ArSession_resume() 호출 전에 ArSession_startRecording()를 호출합니다. 세션이 재개되면 녹화가 자동으로 시작됩니다. 세션이 일시중지될 때 녹화를 자동으로 중지하려면 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()를 호출하여 세션이 다시 재개될 때 다시 처리되지 않습니다. 일반적으로 처리된 데이터의 차이로 인해 세션의 AR 추적이 원활하지 않습니다.

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

다음 단계