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 Quay và phát cho phép bạn quay video và dữ liệu AR một lần trong một môi trường nhất định, đồng thời sử dụng nội dung đó để thay thế phiên máy ảnh trực tiếp.

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

Hãy đảm bảo rằng bạn hiểu các khái niệm cơ bản về AR và cách định cấu hình 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, các API ARCore có thể tạo ra kết quả khác trong khi phát so với kết quả quan sát được trong khi ghi. Các kết quả này cũng có thể khác nhau trong các phiên phát tiếp theo. Ví dụ: số lượng đối tượng có thể theo dõi được phát hiện, thời điểm phát hiện chính xác và tư thế của đối tượng theo thời gian có thể khác nhau trong khi phát.

Khả năng tương thích với Điểm neo trên đám mây

Bạn có thể lưu trữ và phân giải Mốc 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 của bản 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 cho bản ghi. 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 họp tiếp tục. Để tự động dừng ghi khi phiên bị tạm dừng, hãy gọi ARRecordingConfig.AutoStopOnPause. Để ghi một phần phiên, hãy gọi ARRecordingManager.StartRecording() trong 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 quay mà không tạm dừng phiên AR đang chạy, hãy gọi ARRecordingManager.StopRecording().

recordingManager.StopRecording();

Kiểm tra trạng thái ghi

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

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

Phát

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

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.

Sau 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 quá trình xử lý tất cả khung hình ảnh của máy ảnh và mọi dữ liệu cảm biến được ghi lại 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 tiếp tục được tiếp tục bằng cách tiếp tục phiên. Tính năng theo dõi AR cho phiên thường sẽ bị ảnh hưởng do khoảng trống trong dữ liệu đã 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;

Vấn đề đã 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 vài khung hình để tạm dừng một phiên. Nếu ARPlaybackManager.SetPlaybackDatasetUri() được gọi trước khi phiên bị tạm dừng, thì phương thức này sẽ không thể truy cập vào phiên, do đó sẽ trả về lỗi.

Bạn có thể sử dụng mã sau làm giải pháp khắc phục.

// 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 lại quá trình phát từ đầu

Để bắt đầu lại quá trình phát 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