錄製及播放指定 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);

後續步驟