Android NDK で AR セッションを録画して再生する

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

前提条件

AR の基礎的なコンセプトを理解しておいてください。 と ARCore セッションを構成する方法を確認してください。

他の ARCore API との互換性

セッション データの処理方法により、ARCore API は再生中に記録中に観測された結果と異なる結果を生成する場合があります。また、その後の再生セッションでも異なる結果が得られる可能性があります。たとえば、検出された追跡対象の数、検出の正確なタイミング、時間の経過に伴うポーズは、再生中に異なる場合があります。

Cloud Anchors との互換性

セッションの記録中または再生中に Cloud Anchors をホストして解決できます。

録画

ARCore セッション記録の開始、停止、ステータスの確認。

ARCore セッションを録画する

ARCore セッションを録画するには、セッションを設定し、録画用の MP4 URI を指定します。ArSession_resume() への最初の呼び出しの前に ArSession_startRecording() を呼び出します。セッションの再開時に、録音が自動的に開始されます。セッションの一時停止時に録画を自動的に停止するには、ArRecordingConfig_setAutoStopOnPause() を呼び出します。部分的なセッションを録画するには、セッションの実行中に ArSession_startRecording() を呼び出します。

ArRecordingConfig* recording_config = nullptr;
ArRecordingConfig_create(ar_session, &recording_config);
ArRecordingConfig_setMp4DatasetUri(ar_session, recording_config,
                                   mp4_dataset_uri);
ArRecordingConfig_setAutoStopOnPause(ar_session, recording_config, true);

CHECK(ArSession_startRecording(ar_session, recording_config));
// …
// Resume ARCore session to start recording.
CHECK(ArSession_resume(ar_session));
// …
// Recording ends.
CHECK(ArSession_pause(ar_session));

録画を停止する

現在実行中の AR セッションを一時停止せずに録画を停止するには、次の関数を呼び出します。 ArSession_stopRecording()ArRecordingConfig_destroy()

ArStatus status = ArSession_stopRecording(ar_session);
ArRecordingConfig_destroy(recording_config);

録音ステータスを確認する

ArSession_getRecordingStatus() いつでも現在の ArRecordingStatus を判別するために使用できます。

ArRecordingStatus recording_status;
// Can be called at any time.
ArSession_getRecordingStatus(ar_session, &recording_status);
if (recording_status == AR_RECORDING_NONE) {
  // The dataset recorder is not recording.
} else if (recording_status == AR_RECORDING_OK) {
  // The dataset recorder is recording normally.
} else if (recording_status == AR_RECORDING_IO_ERROR) {
  // The dataset recorder encountered an error while recording.
}

再生

以前に録画した AR セッションを再生する。セッションはリアルタイムで再生されますが、セッションの再生や速度の調整はできません。

以前に録画したセッションを再生する

以前に録音したセッションを再生するには、 ArSession_setPlaybackDatasetUri() 最初の呼び出しの前に ArSession_resume()

ArSession_resume() の最初の呼び出しによって再生が開始された後、ArSession_pause() を呼び出してセッションを一時停止すると、すべてのカメラ画像フレームとデータセット内のすべての記録済みセンサーデータの処理が一時停止します。この方法で破棄されたカメラの画像フレームとセンサー フレームのデータは、ArSession_resume() を呼び出してセッションを再開する際に再処理されません。一般に、セッションの AR トラッキングは、処理されたデータに差異が生じるため、問題が発生します。

// Specify previously recorded MP4 file.
CHECK(ArSession_setPlaybackDatasetUri(ar_session, mp4_dataset_uri));
// …
// Playback starts from the beginning of the dataset.
CHECK(ArSession_resume(ar_session));
// …
// Pause AR session, but allow playback to silently continue.
CHECK(ArSession_pause(ar_session));
// …
// Resume AR session. Playback continues with gap to paused session.
CHECK(ArSession_resume(ar_session));

最初から再生し直す

データセットの先頭から再生を再開するには、セッションを一時停止して、 発信 ArSession_setPlaybackDatasetUri() 同じ MP4 録音を指定してから、セッションを再開します。

CHECK(ArSession_pause(ar_session));
// Pause and specify the *same* dataset:
CHECK(ArSession_setPlaybackDatasetUri(ar_session, mp4_dataset_uri));
// Playback starts from the *beginning* of the dataset.
CHECK(ArSession_resume(ar_session));

別のセッションを再生する

別のデータセットを再生するには、セッションを一時停止して新しいデータセットを指定してください セッションを再開できます。

CHECK(ArSession_pause(ar_session));
// Pause and specify a *different* dataset:
CHECK(ArSession_setPlaybackDatasetUri(ar_session, other_mp4_dataset_uri));
// Playback starts from the *beginning* of the new dataset.
CHECK(ArSession_resume(ar_session));

再生ステータスを確認する

使用 ArSession_getPlaybackStatus() でいつでも確認できます。 ArPlaybackStatus

ArPlaybackStatus playback_status;
// Can be called at any time.
ArSession_getPlaybackStatus(ar_session, &playback_status);
if (playback_status == AR_PLAYBACK_NONE) {
  // The session is not playing back an MP4 dataset file.
} else if (playback_status == AR_PLAYBACK_OK) {
  // Playback is in process without issues.
} else if (playback_status == AR_PLAYBACK_IO_ERROR) {
  // Playback has stopped due to an error.
} else if (playback_status == AR_PLAYBACK_FINISHED) {
  // Playback has finished successfully.
}

次のステップ