在 Android NDK 上錄製及播放 AR 工作階段

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

必要條件

請務必先瞭解基本 AR 概念,以及如何設定 ARCore 工作階段,然後再繼續操作。

與其他 ARCore API 的相容性

根據工作階段資料的處理方式,ARCore API 在播放期間產生的結果可能會與錄製期間所觀察到的結果不同。也可能會在後續的播放工作階段產生不同的結果。舉例來說,在播放期間,偵測到的可追蹤項目數量、偵測結果的確切時間,以及姿勢的長期姿勢都可能不同。

與 Cloud Anchor 的相容性

您可以在錄製或播放工作階段時託管及解析 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_resume() 前呼叫 ArSession_setPlaybackDatasetUri()

因第一次呼叫 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.
}

後續步驟