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

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

前提条件

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

他の ARCore API との互換性

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

共有カメラとの互換性

共有カメラを使用するセッションは録画できます。ただし、共有カメラモードでこれらのセッションを再生することはできません。

Cloud Anchors との互換性

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

録画

ARCore セッションの録画を開始、停止、ステータスを確認します。

ARCore セッションを録画する

ARCore セッションを録画するには、セッションを設定し、録画用の MP4 URI を指定します。session.resume() を初めて呼び出す前に session.startRecording() を呼び出します。セッションの再開時に、録音が自動的に開始されます。セッションが一時停止されたときに録音を自動的に停止するには、RecordingConfig.setAutoStopOnPause() を呼び出します。部分的なセッションを録画するには、セッションの実行中に session.startRecording() を呼び出します。

Java

// Configure the ARCore session.
Session session = new Session(context);
Uri destination = Uri.fromFile(new File(context.getFilesDir(), "recording.mp4"));
RecordingConfig recordingConfig =
        new RecordingConfig(session)
        .setMp4DatasetUri(destination)
        .setAutoStopOnPause(true);
try {
  // Prepare the session for recording, but do not start recording yet.
  session.startRecording(recordingConfig);
} catch (RecordingFailedException e) {
  Log.e(TAG, "Failed to start recording", e);
}

// Resume the ARCore session to start recording.
session.resume();

Kotlin

// Configure the ARCore session.
val session = Session(context)
val destination = Uri.fromFile(File(context.getFilesDir(), "recording.mp4"))
val recordingConfig = RecordingConfig(session)
  .setMp4DatasetUri(destination)
  .setAutoStopOnPause(true)
session.startRecording(recordingConfig)

// Resume the ARCore session to start recording.
session.resume()

セッションの録画を停止する

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

Java

try {
  session.stopRecording();  // Stop recording.
} catch (RecordingFailedException e) {
  Log.e(TAG, "Failed to stop recording", e);
}

Kotlin

session.stopRecording()

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

session.getRecordingStatus() いつでも現在の RecordingStatus を判別するために使用できます。

Java

// Use any time to determine current RecordingStatus.
if (session.getRecordingStatus() == RecordingStatus.OK) {
  // Update the UI to show that the session is currently being recorded.
}

Kotlin

// Use any time to determine current RecordingStatus.
if (session.recordingStatus == RecordingStatus.OK) {
  // Update the UI to show that the session is currently being recorded.
}

再生

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

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

以前に録音したセッションを再生するには、session.resume() の最初の呼び出しの前に session.setPlaybackDatasetUri() を呼び出します。

session.resume() の最初の呼び出しにより再生が開始された後、session.pause() を呼び出してセッションを一時停止すると、データセット内のすべてのカメラ画像フレームとその他の記録されたセンサーデータの処理が一時停止します。この方法で破棄されたカメラの画像フレームとセンサー フレームのデータは、session.resume() を呼び出してセッションを再開する際に再処理されません。一般に、セッションの AR トラッキングは、処理されたデータに欠落があるために悪影響を及ぼします。

Java

// Configure the ARCore session.
Session session = new Session(context);

// Specify the previously recorded MP4 file.
Uri recordingUri = Uri.fromFile(new File(context.getFilesDir(), "recording.mp4"));
session.setPlaybackDatasetUri(recordingUri);
…

// Start playback from the beginning of the dataset.
session.resume();
…

// Pause the AR session, but silently continue MP4 playback. Camera frames
// and other recorded sensor data is discarded while the session is paused.
session.pause();
…

// Resume the AR session. Camera frames and other sensor data from the MP4
// that was silently played back while the session was paused is not
// processed by ARCore.
session.resume();

Kotlin

// Configure the ARCore session.
val session = Session(context)

// Specify the previously recorded MP4 file.
val recordingUri = Uri.fromFile(File(context.filesDir, "recording.mp4"))
session.playbackDatasetUri = recordingUri
…

// Start playback from the beginning of the dataset.
session.resume()
…

// Pause the AR session, but silently continue MP4 playback. Camera frames
// and other recorded sensor data is discarded while the session is paused.
session.pause()
…

// Resume the AR session. Camera frames and other sensor data from the MP4
// that was silently played back while the session was paused is not
// processed by ARCore.
session.resume()

最初から再生し直す

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

Java

session.pause();
// Pause and specify the SAME dataset:
session.setPlaybackDatasetUri(previousRecordingUri);
session.resume();  // Playback starts from the BEGINNING of the dataset.

Kotlin

session.pause()
// Pause and specify the SAME dataset:
session.playbackDatasetUri = previousRecordingUri
session.resume()  // Playback starts from the BEGINNING of the dataset.

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

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

Java

// Switch to a different dataset.
session.pause();   // Pause the playback of the first dataset.
// Specify a different dataset to use.
session.setPlaybackDatasetUri(newRecordingUri);
session.resume();  // Start playback from the beginning of the new dataset.

Kotlin

// Switch to a different dataset.
session.pause()   // Pause the playback of the first dataset.
// Specify a different dataset to use.
session.playbackDatasetUri = newRecordingUri
session.resume()  // Start playback from the beginning of the new dataset.

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

session.getPlaybackStatus() を使用して、いつでも PlaybackStatus

Java

// Use any time to determine current PlaybackStatus.
if (session.getPlaybackStatus() != PlaybackStatus.OK) {
  // Update the UI to show that the session playback has finished.
}

Kotlin

// Use any time to determine current PlaybackStatus.
if (session.playbackStatus != PlaybackStatus.OK) {
  // Update the UI to show that the session playback has finished.
}

次のステップ