Recording & Playback API ช่วยให้คุณบันทึกวิดีโอและข้อมูล AR ได้ครั้งเดียวภายในสภาพแวดล้อมหนึ่งๆ และใช้เนื้อหานั้นแทนเซสชันกล้องสด
ข้อกำหนดเบื้องต้น
โปรดทำความเข้าใจแนวคิดพื้นฐานของ AR และวิธีกำหนดค่าเซสชัน ARCore ก่อนดำเนินการต่อ
ความเข้ากันได้กับ ARCore API อื่นๆ
ARCore API อาจให้ผลลัพธ์ที่แตกต่างออกไประหว่างการเล่นกับที่สังเกตเห็นระหว่างการบันทึก เนื่องจากวิธีการประมวลผลข้อมูลเซสชัน และอาจให้ผลลัพธ์ที่แตกต่างกันในเซสชันการเล่นที่ตามมา ตัวอย่างเช่น จำนวนรายการที่ติดตามได้ เวลาที่ตรวจพบอย่างแม่นยำ และท่าทางของรายการเมื่อเวลาผ่านไปอาจแตกต่างกันไประหว่างการเล่น
ใช้งานร่วมกับ Cloud Anchors ได้
คุณโฮสต์และแก้ปัญหา Cloud Anchor ขณะบันทึกหรือเล่นเซสชันได้
กำลังบันทึก
เริ่ม หยุด และตรวจสอบสถานะของการบันทึกเซสชัน ARCore
บันทึกเซสชัน ARCore
หากต้องการบันทึกเซสชัน ARCore ให้กำหนดค่าเซสชันและระบุ URI ของ MP4 สำหรับการบันทึก โทรหา ARRecordingManager.StartRecording()
ก่อนกลับมาที่เซสชัน การบันทึกจะเริ่มขึ้นโดยอัตโนมัติเมื่อเซสชันกลับมาทำงานอีกครั้ง หากต้องการหยุดบันทึกโดยอัตโนมัติเมื่อหยุดเซสชันชั่วคราว ให้โทรหา ARRecordingConfig.AutoStopOnPause
หากต้องการบันทึกเซสชันบางส่วน ให้โทรหา ARRecordingManager.StartRecording()
ขณะที่เซสชันดำเนินอยู่
ARCoreRecordingConfig recordingConfig = ScriptableObject.CreateInstance<ARCoreRecordingConfig>();
Uri datasetUri = new System.Uri("file:///uri/for/dataset.mp4");
recordingConfig.Mp4DatasetUri = datasetUri.AbsoluteUri;
recordingManager.StartRecording(recordingConfig);
หยุดการบันทึกเซสชัน
หากต้องการหยุดบันทึกโดยไม่หยุดเซสชัน AR ที่ใช้งานอยู่ชั่วคราว ให้โทรหา ARRecordingManager.StopRecording()
recordingManager.StopRecording();
ตรวจสอบสถานะการบันทึก
คุณใช้ ARRecordingManager.RecordingStatus
ได้ทุกเมื่อเพื่อดูสถานะการบันทึกปัจจุบัน
Debug.Log("Current Recording Status: " + recordingManager.RecordingStatus);
การเล่น
เล่นเซสชัน AR ที่บันทึกไว้ก่อนหน้านี้ เซสชันจะเล่นแบบเรียลไทม์ และไม่สามารถปรับการเล่นหรือความเร็วเซสชันได้
เล่นเซสชันที่บันทึกไว้ก่อนหน้านี้
หากต้องการเล่นเซสชันที่บันทึกไว้ก่อนหน้านี้ ให้เรียกใช้ ARPlaybackManager.SetPlaybackDatasetUri()
และระบุ URI ของชุดข้อมูลที่ต้องการเล่น คุณต้องหยุดเซสชันชั่วคราวเพื่อใช้วิธีนี้ ดำเนินเซสชันต่อเพื่อให้การเปลี่ยนแปลงมีผล
เมื่อเริ่มเล่นเนื่องจากมีการกลับมาทำงานต่อของเซสชัน การหยุดเซสชันชั่วคราวโดยการปิดใช้ARSession
จะระงับการประมวลผลเฟรมรูปภาพจากกล้องทั้งหมดและข้อมูลเซ็นเซอร์อื่นๆ ที่บันทึกไว้ในชุดข้อมูล เฟรมรูปภาพของกล้องและข้อมูลเฟรมเซ็นเซอร์ที่ถูกทิ้งด้วยวิธีนี้จะไม่ถูกประมวลผลใหม่เมื่อเซสชันกลับมาทำงานอีกครั้งด้วยการกลับมาเริ่มเซสชันอีกครั้ง โดยทั่วไปแล้ว การติดตาม AR สำหรับเซสชันจะได้รับผลกระทบเนื่องจากช่องว่างของข้อมูลที่ประมวลผล
// Disable the ARSession to pause the current AR session.
session.enabled = false;
// In the next frame, provide a URI for the dataset you wish to play back.
Uri datasetUri = new System.Uri("file:///uri/for/dataset.mp4");
playbackManager.SetPlaybackDatasetUri(datasetUri);
// In the frame after that, re-enable the ARSession to resume the session from
// the beginning of the dataset.
session.enabled = true;
ปัญหาที่ทราบและวิธีแก้ปัญหา
ปัญหาที่ทราบคือเมื่อเรียกใช้ ARPlaybackManager.SetPlaybackDatasetUri()
ระบบจะแสดงผล ErrorPlaybackFailed
ปัญหานี้เกิดขึ้นเนื่องจากเซสชันอาจใช้เวลาหลายเฟรมในการหยุดชั่วคราว หากเรียกใช้ ARPlaybackManager.SetPlaybackDatasetUri()
ก่อนหยุดเซสชันไว้ชั่วคราว ระบบจะเข้าถึงเซสชันไม่ได้ จึงจะแสดงข้อผิดพลาด
สามารถใช้โค้ดต่อไปนี้เป็นวิธีแก้ปัญหาชั่วคราวได้
// Workaround for known issue where `playbackManager.SetPlaybackDatasetUri()`
// returns `ErrorPlaybackFailed` because it can take several frames for a
// session to be paused.
// Reference to the ARSession component in the scene.
ARSession session;
void PlaybackDataset()
{
setPlaybackDataset = true;
// Pause the current AR session.
session.enabled = false;
// Set a timeout for retrying playback retrieval.
timeout = 10f;
}
// Next frame
void Update()
{
...
if (setPlaybackDataset)
{
PlaybackResult result = playbackManager.SetPlaybackDatasetUri(datasetUri);
if (result == PlaybackResult.ErrorPlaybackFailed || result == PlaybackResult.SessionNotReady)
{
// Try to set the dataset again in the next frame.
timeout -= Time.deltaTime;
}
else
{
// Do not set the timeout if the result is something other than ErrorPlaybackFailed.
timeout = -1f;
}
if (timeout < 0.0f)
{
setPlaybackDataset = false;
// If playback is successful, proceed as usual.
// If playback is not successful, handle the error appropriately.
}
}
...
}
หยุดการเล่น
หากต้องการหยุดการเล่น ให้เรียกใช้ ARPlaybackManager.SetPlaybackDatasetUri()
และตั้งค่า URI ของชุดข้อมูลเป็น null
// Disable the ARSession to pause the current AR session.
session.enabled = false;
// In the next frame, unset the playback dataset URI.
playbackManager.SetPlaybackDatasetUri(null);
// In the frame after that, re-enable the ARSession to resume the session using
// the device camera and other sensors.
session.enabled = true;
เริ่มเล่นใหม่ตั้งแต่ต้น
หากต้องการเริ่มเล่นอีกครั้งจากจุดเริ่มต้นของชุดข้อมูล ให้เรียกใช้ ARPlaybackManager.SetPlaybackDatasetUri()
และระบุการบันทึก MP4 เดียวกันก่อนที่จะเล่นเซสชันต่อ
// Disable the ARSession to pause the current AR session.
session.enabled = false;
// In the next frame, specify the same dataset URI.
playbackManager.SetPlaybackDatasetUri(datasetUri); // Same URI that was previously set.
// In the frame after that, re-enable the ARSession to resume the session from
// the beginning of the dataset.
session.enabled = true;
เล่นเซสชันอื่น
หากต้องการเล่นชุดข้อมูลอื่น ให้หยุดเซสชันชั่วคราวและระบุชุดข้อมูลใหม่ก่อนเล่นเซสชันต่อ
// Disable the ARSession to pause the current AR session.
session.enabled = false;
// In the next frame, specify a new dataset URI.
Uri newDatasetUri = new System.Uri("file:///uri/for/different/dataset.mp4");
playbackManager.SetPlaybackDatasetUri(newDatasetUri); // Different URI than was previously set.
// In the frame after that, re-enable the ARSession to resume the session from
// the beginning of the new dataset.
session.enabled = true;
ตรวจสอบสถานะการเล่น
ARPlaybackManager.PlaybackStatus
ใช้ได้ทุกเมื่อเพื่อระบุสถานะการเล่นปัจจุบัน
Debug.Log("Current Playback Status: " + playbackManager.PlaybackStatus);
สิ่งที่จะเกิดขึ้นหลังจากนี้
- ดูวิธีเพิ่มข้อมูลที่กำหนดเองลงในเซสชันที่บันทึกไว้