Android를 타겟팅하는 AR Foundation에 관한 AR 세션 녹화 및 재생

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

기본 요건

계속 진행하기 전에 기본 AR 개념ARCore 세션 구성 방법을 이해해야 합니다.

다른 ARCore API와의 호환성

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

클라우드 앵커와의 호환성

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

녹화

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

ARCore 세션 기록

ARCore 세션을 녹화하려면 세션을 구성하고 녹화에 사용할 MP4 URI를 제공합니다. 세션을 재개하기 전에 ARRecordingManager.StartRecording()를 호출합니다. 세션이 재개되면 녹화가 자동으로 시작됩니다. 세션이 일시중지될 때 녹화를 자동으로 중지하려면 ARRecordingConfig.AutoStopOnPause를 호출합니다. 부분 세션을 녹화하려면 세션이 실행되는 동안 ARRecordingManager.StartRecording()를 호출합니다.

ARCoreRecordingConfig recordingConfig = ScriptableObject.CreateInstance<ARCoreRecordingConfig>();
Uri datasetUri = new System.Uri("file:///uri/for/dataset.mp4");
recordingConfig.Mp4DatasetUri = datasetUri.AbsoluteUri;

recordingManager.StartRecording(recordingConfig);

세션 녹음 중지

현재 실행 중인 AR 세션을 일시중지하지 않고 녹화를 중지하려면 ARRecordingManager.StopRecording()를 호출합니다.

recordingManager.StopRecording();

녹화 상태 확인

ARRecordingManager.RecordingStatus를 언제든지 사용하여 현재 녹화 상태를 확인할 수 있습니다.

Debug.Log("Current Recording Status: " + recordingManager.RecordingStatus);

재생

이전에 녹화된 AR 세션 재생 세션은 실시간으로 재생되며 세션 재생 또는 속도는 조정할 수 없습니다.

이전에 녹화된 세션 재생

이전에 녹화된 세션을 재생하려면 ARPlaybackManager.SetPlaybackDatasetUri()를 호출하고 재생하려는 데이터 세트의 URI를 제공합니다. 이 메서드를 사용하려면 세션을 일시중지해야 합니다. 변경사항이 적용되려면 세션을 재개하세요.

세션 재개로 재생이 시작된 후 ARSession를 사용 중지하여 세션을 일시중지하면 모든 카메라 이미지 프레임 및 데이터 세트에 기록된 기타 센서 데이터의 처리가 정지됩니다. 이러한 방식으로 삭제되는 카메라 이미지 프레임과 센서 프레임 데이터는 세션을 재개하여 세션이 다시 재개될 때 재처리되지 않습니다. 일반적으로 세션의 AR 추적은 처리된 데이터의 차이로 인해 문제가 발생합니다.

// Disable the ARSession to pause the current AR session.
session.enabled = false;

// In the next frame, provide a URI for the dataset you wish to play back.
Uri datasetUri = new System.Uri("file:///uri/for/dataset.mp4");
playbackManager.SetPlaybackDatasetUri(datasetUri);

// In the frame after that, re-enable the ARSession to resume the session from
// the beginning of the dataset.
session.enabled = true;

알려진 문제 및 해결 방법

ARPlaybackManager.SetPlaybackDatasetUri() 호출이 ErrorPlaybackFailed를 반환하는 알려진 문제가 있습니다. 세션이 일시중지되는 데 여러 프레임이 걸릴 수 있기 때문입니다. 세션이 일시중지되기 전에 ARPlaybackManager.SetPlaybackDatasetUri()를 호출하면 세션에 액세스할 수 없으므로 오류가 반환됩니다.

다음 코드를 해결 방법으로 사용할 수 있습니다.

// Workaround for known issue where `playbackManager.SetPlaybackDatasetUri()`
// returns `ErrorPlaybackFailed` because it can take several frames for a
// session to be paused.

// Reference to the ARSession component in the scene.
ARSession session;

void PlaybackDataset()
{
    setPlaybackDataset = true;

    // Pause the current AR session.
    session.enabled = false;

    // Set a timeout for retrying playback retrieval.
    timeout = 10f;
}

// Next frame
void Update()
{
    ...

    if (setPlaybackDataset)
    {
        PlaybackResult result = playbackManager.SetPlaybackDatasetUri(datasetUri);
        if (result == PlaybackResult.ErrorPlaybackFailed || result == PlaybackResult.SessionNotReady)
        {
            // Try to set the dataset again in the next frame.
            timeout -= Time.deltaTime;
        }
        else
        {
            // Do not set the timeout if the result is something other than ErrorPlaybackFailed.
            timeout = -1f;
        }

        if (timeout < 0.0f)
        {
            setPlaybackDataset = false;
            // If playback is successful, proceed as usual.
            // If playback is not successful, handle the error appropriately.
        }
    }

    ...
}

재생 중지

재생을 중지하려면 ARPlaybackManager.SetPlaybackDatasetUri()를 호출하고 데이터 세트 URI를 null로 설정합니다.

// Disable the ARSession to pause the current AR session.
session.enabled = false;

// In the next frame, unset the playback dataset URI.
playbackManager.SetPlaybackDatasetUri(null);

// In the frame after that, re-enable the ARSession to resume the session using
// the device camera and other sensors.
session.enabled = true;

처음부터 재생 다시 시작

데이터 세트의 시작 부분부터 재생을 다시 시작하려면 ARPlaybackManager.SetPlaybackDatasetUri()를 호출하고 동일한 MP4 녹화를 지정한 후 세션을 재개합니다.

// Disable the ARSession to pause the current AR session.
session.enabled = false;

// In the next frame, specify the same dataset URI.
playbackManager.SetPlaybackDatasetUri(datasetUri); // Same URI that was previously set.

// In the frame after that, re-enable the ARSession to resume the session from
// the beginning of the dataset.
session.enabled = true;

다른 세션 재생

다른 데이터 세트를 재생하려면 세션을 재개하기 전에 세션을 일시 중지하고 새 데이터 세트를 지정합니다.

// Disable the ARSession to pause the current AR session.
session.enabled = false;

// In the next frame, specify a new dataset URI.
Uri newDatasetUri = new System.Uri("file:///uri/for/different/dataset.mp4");
playbackManager.SetPlaybackDatasetUri(newDatasetUri); // Different URI than was previously set.

// In the frame after that, re-enable the ARSession to resume the session from
// the beginning of the new dataset.
session.enabled = true;

재생 상태 확인

ARPlaybackManager.PlaybackStatus를 언제든지 사용하여 현재 재생 상태를 확인할 수 있습니다.

Debug.Log("Current Playback Status: " + playbackManager.PlaybackStatus);

다음 단계