在 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.
}

後續步驟