บันทึกและเล่นเซสชัน AR บน Android NDK

การบันทึกและ Play API ให้คุณบันทึกวิดีโอและข้อมูล AR ครั้งเดียวภายในสภาพแวดล้อมที่กำหนด และใช้เนื้อหาดังกล่าวแทนที่เซสชันกล้องแบบสด

ข้อกำหนดเบื้องต้น

ตรวจสอบว่าคุณเข้าใจแนวคิด AR พื้นฐาน และวิธีกําหนดค่าเซสชัน ARCore ก่อนดำเนินการต่อ

ความเข้ากันได้กับ ARCore API อื่นๆ

เนื่องด้วยวิธีการประมวลผลข้อมูลเซสชัน ARCore API อาจให้ผลลัพธ์ที่แตกต่างกันระหว่างการเล่นเมื่อเทียบกับที่สังเกตขณะบันทึก นอกจากนี้ยังอาจทำให้เกิดผลลัพธ์ที่แตกต่างกันในระหว่างเซสชันการเล่นครั้งต่อๆ ไป ตัวอย่างเช่น จำนวนรายการที่ติดตามได้ที่ตรวจพบ เวลาที่แม่นยำของการตรวจจับ และท่าทางของคอมโพเนนต์ในช่วงเวลาต่างๆ ระหว่างการเล่นอาจแตกต่างออกไป

ความเข้ากันได้กับ Cloud Anchor

คุณโฮสต์และแก้ปัญหา Cloud Anchor ขณะบันทึกหรือเล่นเซสชันได้

กำลังบันทึก

เริ่ม หยุด และตรวจสอบสถานะของการบันทึกเซสชัน ARCore

บันทึกเซสชัน ARCore

หากต้องการบันทึกเซสชัน ARCore ให้กำหนดค่าเซสชันและระบุ URI ของ MP4 สำหรับการบันทึก โปรดติดต่อ ArSession_startRecording() ก่อนโทรหา ArSession_resume() เป็นครั้งแรก การบันทึกจะเริ่มต้นโดยอัตโนมัติเมื่อเซสชันกลับมาทำงานอีกครั้ง หากต้องการหยุดบันทึกโดยอัตโนมัติเมื่อเซสชันหยุดชั่วคราว ให้โทรหา 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.
}

สิ่งที่จะเกิดขึ้นหลังจากนี้