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

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

기본 요건

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

다른 ARCore API와의 호환성

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

Cloud Anchors와의 호환성

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

녹화

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

다음 단계