บันทึกและเล่นเซสชัน AR บน AR Foundation ที่กำหนดเป้าหมายเป็น Android

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

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

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

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

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

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

คุณสามารถโฮสต์และแก้ไข 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);

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