錄製及播放指定 Android 的 AR Foundation 體驗課程

錄製與播放 API 可讓您在特定環境中錄製一次影片和 AR 資料,並利用該內容取代即時攝影機工作階段。

必要條件

請務必先瞭解基本 AR 概念,以及如何設定 ARCore 工作階段,然後再繼續操作。

與其他 ARCore API 的相容性

根據工作階段資料的處理方式,ARCore API 在播放期間產生的結果可能會與錄製期間所觀察到的結果不同。也可能會在後續的播放工作階段產生不同的結果。舉例來說,在播放期間,偵測到的可追蹤項目數量、偵測結果的確切時間,以及姿勢的長期姿勢都可能不同。

與 Cloud Anchor 的相容性

您可以在錄製或播放工作階段時託管及解析 Cloud Anchors

正在記錄

開始、停止及檢查 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);

後續步驟