یک جلسه AR را در بنیاد AR با هدف اندروید ضبط و پخش کنید

Recording & Playback API به شما این امکان را می دهد که یک بار در یک محیط معین داده های ویدئویی و AR را ضبط کنید و از آن محتوا برای جایگزینی یک جلسه دوربین زنده استفاده کنید.

پیش نیازها

قبل از ادامه، مطمئن شوید که مفاهیم اساسی AR و نحوه پیکربندی یک جلسه ARCore را درک کرده اید.

سازگاری با سایر API های ARCore

با توجه به نحوه پردازش داده‌های جلسه، ARCore API ممکن است نتایج متفاوتی در حین پخش نسبت به نتایجی که در هنگام ضبط مشاهده می‌شود تولید کند. آنها همچنین ممکن است نتایج متفاوتی را در طول جلسات پخش بعدی ایجاد کنند. به عنوان مثال، تعداد ردیابی‌های شناسایی شده، زمان دقیق تشخیص آنها و وضعیت آنها در طول زمان ممکن است در حین پخش متفاوت باشد.

سازگاری با Cloud Anchors

می‌توانید هنگام ضبط یا پخش یک جلسه، Cloud Anchors را میزبانی و حل کنید.

در حال ضبط

شروع، توقف و بررسی وضعیت ضبط جلسه 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);

بعدش چی