在 Android 裝置上錄製及播放 AR 工作階段內容

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

必要條件

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

與其他 ARCore API 的相容性

基於工作階段資料的處理方式,ARCore API 可能會在播放過程中產生與記錄期間不同的結果。可能在後續播放工作階段期間產生不同結果。舉例來說,在播放過程中,偵測到的可追蹤項目數量、偵測的確切時間以及姿勢變化可能會有所不同。

與共用相機的相容性

可以錄製使用共用攝影機的工作階段。不過,目前無法播放使用共用攝影機模式的這些工作階段。

與 Cloud Anchors 的相容性

您可以在記錄或播放工作階段時託管及解析 Cloud Anchors

錄影

開始、停止及查看 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.
}

後續步驟