سجِّل جلسة الواقع المعزّز وشغِّلها على Android Foundation باستخدام تقنية الواقع المعزّز

تتيح لك Recording & Playback API تسجيل بيانات الفيديو والواقع المعزّز مرة واحدة في بيئة معيّنة واستخدام هذا المحتوى لاستبدال جلسة كاميرا مباشرة.

المتطلبات الأساسية

احرص على فهم مفاهيم الواقع المعزّز الأساسية وكيفية ضبط جلسة ARCore قبل المتابعة.

التوافق مع واجهات برمجة تطبيقات ARCore الأخرى

بسبب طريقة معالجة بيانات الجلسة، قد تؤدي واجهات برمجة التطبيقات ARCore إلى ظهور نتائج مختلفة أثناء التشغيل مقارنةً بما تم تسجيله. وقد تؤدي أيضًا إلى نتائج مختلفة خلال جلسات التشغيل اللاحقة. على سبيل المثال، قد يختلف عدد العناصر التي يمكن تتبُّعها والتوقيت الدقيق لرصدها ووضعها بمرور الوقت أثناء التشغيل.

التوافق مع ميزة "تثبيت العناصر في السحابة الإلكترونية"

يمكنك استضافة نقاط تثبيت السحابة الإلكترونية وحلّها أثناء تسجيل جلسة أو تشغيلها.

جارٍ التسجيل

بدء تسجيل جلسة ARCore وإيقافه والتحقّق من حالته

تسجيل جلسة ARCore

لتسجيل جلسة ARCore، عليك ضبط الجلسة وتوفير عنوان URL لملف 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);

إيقاف تسجيل جلسة

لإيقاف التسجيل بدون إيقاف جلسة الواقع المعزّز التي تعمل حاليًا مؤقتًا، اضغط على ARRecordingManager.StopRecording().

recordingManager.StopRecording();

التحقّق من حالة التسجيل

يمكن استخدام ARRecordingManager.RecordingStatus في أي وقت لتحديد حالة التسجيل الحالية.

Debug.Log("Current Recording Status: " + recordingManager.RecordingStatus);

التشغيل

إعادة تشغيل جلسات الواقع المعزّز المسجّلة سابقًا تتم إعادة تشغيل الجلسات في الوقت الفعلي، ولا يمكن ضبط سرعة تشغيل الجلسة أو إعادة تشغيلها.

تشغيل جلسة مسجّلة سابقًا

لتشغيل جلسة مسجّلة سابقًا، اتصل بالخدمة ARPlaybackManager.SetPlaybackDatasetUri() وقدِّم عنوان URL لمجموعة البيانات التي تريد تشغيلها. يجب إيقاف الجلسة مؤقتًا لاستخدام هذه الطريقة. استئنِف الجلسة لكي يسري التغيُّر.

بعد بدء التشغيل بسبب استئناف الجلسة، سيؤدي إيقاف الجلسة عن طريق إيقافARSession إلى تعليق معالجة جميع لقطات صور الكاميرا وأي بيانات أخرى مسجّلة من أجهزة الاستشعار في مجموعة البيانات. لن تتم إعادة معالجة بيانات إطارات الصور من الكاميرا وإطارات بيانات أجهزة الاستشعار التي يتم تجاهلها بهذه الطريقة عند استئناف الجلسة مرة أخرى. سيتأثر تتبُّع الواقع المعزّز للجلسة بشكل عام بسبب الفجوة في البيانات التي تمت معالجتها.

// 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;

المشكلة المعروفة والحلّ البديل

هناك مشكلة معروفة تؤدي إلى عرض ErrorPlaybackFailed عند إجراء مكالمات إلى ARPlaybackManager.SetPlaybackDatasetUri(). ويحدث ذلك لأنّه قد يستغرق الأمر عدة لقطات لتوقُّف جلسة مؤقتًا. إذا تمّت الدعوة إلى 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);

الخطوات التالية