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

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

必要條件

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

與其他 ARCore API 的相容性

由於 ARCore API 會以特定方式處理工作階段資料,因此在播放時產生的結果,可能與錄製時產生的結果不同。可能在後續播放工作階段期間產生不同結果。舉例來說,在播放期間,偵測到的追蹤物數量、偵測的確切時間,以及追蹤物隨時間變化的姿勢可能會有所不同。

與 Cloud Anchors 的相容性

您可以在錄製或播放工作階段時,代管及解析 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);

後續步驟