Ghi và phát lại một phiên thực tế tăng cường (AR) trên Nền tảng thực tế tăng cường (AR) nhắm đến Android

API ghi và phát cho phép bạn quay video và dữ liệu thực tế tăng cường một lần trong một môi trường cụ thể và sử dụng nội dung đó để thay thế một phiên quay camera trực tiếp.

Điều kiện tiên quyết

Hãy đảm bảo bạn hiểu rõ các khái niệm cơ bản về AR và cách định cấu hình một phiên ARCore trước khi tiếp tục.

Khả năng tương thích với các API ARCore khác

Do cách xử lý dữ liệu phiên, API ARCore có thể tạo ra kết quả khác trong quá trình phát so với quan sát được trong quá trình ghi. Chúng cũng có thể tạo ra các kết quả khác nhau trong các phiên phát tiếp theo. Ví dụ: số lượng thiết bị có thể theo dõi được phát hiện, thời gian chính xác phát hiện chúng và tư thế của chúng theo thời gian có thể khác nhau trong khi phát.

Khả năng tương thích với Cloud Neo

Bạn có thể lưu trữ và phân giải Cloud Anchors (Neo trên đám mây) trong khi ghi hoặc phát lại một phiên.

Đang ghi

Bắt đầu, dừng và kiểm tra trạng thái ghi phiên ARCore.

Ghi lại phiên ARCore

Để ghi lại một phiên ARCore, hãy định cấu hình phiên đó và cung cấp URI MP4 để ghi lại. Hãy gọi ARRecordingManager.StartRecording() trước khi tiếp tục phiên. Quá trình ghi sẽ tự động bắt đầu khi phiên tiếp tục. Để tự động dừng quay khi phiên bị tạm dừng, hãy gọi ARRecordingConfig.AutoStopOnPause. Để ghi lại một phần của phiên, hãy gọi ARRecordingManager.StartRecording() khi phiên đó đang chạy.

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

recordingManager.StartRecording(recordingConfig);

Dừng ghi phiên

Để dừng ghi mà không tạm dừng phiên thực tế tăng cường hiện đang chạy, hãy gọi ARRecordingManager.StopRecording().

recordingManager.StopRecording();

Kiểm tra trạng thái ghi

Bạn có thể dùng ARRecordingManager.RecordingStatus bất cứ lúc nào để xác định trạng thái ghi hiện tại.

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

Phát

Phát lại các phiên thực tế tăng cường đã ghi trước đó. Các phiên sẽ phát lại theo thời gian thực, và không thể điều chỉnh tốc độ hay cách phát lại phiên.

Phát lại một phiên đã ghi trước đó

Để phát lại một phiên đã ghi trước đó, hãy gọi ARPlaybackManager.SetPlaybackDatasetUri() và cung cấp URI cho tập dữ liệu mà bạn muốn phát lại. Bạn phải tạm dừng phiên để sử dụng phương thức này. Tiếp tục phiên để thay đổi có hiệu lực.

Khi quá trình phát đã bắt đầu do tiếp tục phiên, việc tạm dừng phiên bằng cách tắt ARSession sẽ tạm ngừng xử lý tất cả khung hình ảnh của máy ảnh và mọi dữ liệu cảm biến đã ghi khác trong tập dữ liệu. Khung hình ảnh của máy ảnh và dữ liệu khung cảm biến bị loại bỏ theo cách này sẽ không được xử lý lại khi phiên được tiếp tục bằng cách tiếp tục phiên. Hoạt động theo dõi thực tế tăng cường cho phiên thường sẽ bị ảnh hưởng do khoảng trống trong dữ liệu được xử lý.

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

Sự cố đã biết và cách giải quyết

Có một vấn đề đã biết, đó là các lệnh gọi đến ARPlaybackManager.SetPlaybackDatasetUri() trả về ErrorPlaybackFailed. Điều này xảy ra vì có thể mất một vài khung hình để một phiên tạm dừng. Nếu ARPlaybackManager.SetPlaybackDatasetUri() được gọi trước khi phiên bị tạm dừng, thì nó sẽ không thể truy cập vào phiên, vì vậy, trả về một lỗi.

Bạn có thể sử dụng mã sau đây làm giải pháp tạm thời.

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

    ...
}

Dừng phát

Để dừng phát, hãy gọi ARPlaybackManager.SetPlaybackDatasetUri() và đặt URI tập dữ liệu thành 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;

Bắt đầu phát lại từ đầu

Để bắt đầu phát lại từ đầu tập dữ liệu, hãy gọi ARPlaybackManager.SetPlaybackDatasetUri() và chỉ định cùng một bản ghi MP4 trước khi tiếp tục phiên.

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

Phát lại một phiên khác

Để phát lại một tập dữ liệu khác, hãy tạm dừng phiên và chỉ định tập dữ liệu mới trước khi tiếp tục phiên.

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

Kiểm tra trạng thái phát

Bạn có thể sử dụng ARPlaybackManager.PlaybackStatus bất cứ lúc nào để xác định trạng thái phát hiện tại.

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

Bước tiếp theo