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

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

پیش نیازها

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

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

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

سازگاری با Cloud Anchors

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

در حال ضبط

شروع، توقف و بررسی وضعیت ضبط جلسه ARCore.

یک جلسه ARCore را ضبط کنید

برای ضبط یک جلسه ARCore، جلسه را پیکربندی کنید و یک URI MP4 برای ضبط ارائه دهید. قبل از اولین تماس با ArSession_resume() ArSession_startRecording() فراخوانی کنید. ضبط به طور خودکار با از سرگیری جلسه شروع می شود. برای توقف خودکار ضبط هنگامی که جلسه متوقف می شود، 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.
}

بعدش چی