Android をターゲットとする AR Foundation で AR セッションを録画して再生する

Recording & Playback API を使用すると、特定の環境内で動画と AR データを 1 回だけ録画し、そのコンテンツを使用してライブ カメラ セッションを置き換えることができます。

前提条件

続行する前に、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);

次のステップ