הקלטה והפעלה של סשן AR ב-Android NDK

ההקלטה ו בעזרת ממשק ה-API של ההפעלה אפשר להקליט וידאו ו-AR פעם אחת בתוך סביבה נתונה, ולהשתמש בתוכן הזה כדי להחליף סשן של צילום וידאו בשידור חי.

דרישות מוקדמות

חשוב לוודא שאתם מבינים את המושגים הבסיסיים של AR ואיך להגדיר סשן ARCore לפני שממשיכים.

תאימות לממשקי API אחרים של ARCore

בגלל אופן העיבוד של נתוני סשנים, ממשקי ARCore API עשויים להפיק תוצאות שונות במהלך ההפעלה מאלה שנצפו במהלך ההקלטה. ייתכן שהן גם יפיקו תוצאות שונות בסשנים הבאים של ההפעלה. לדוגמה: יכול להיות שיהיו הבדלים במהלך ההפעלה: מספר הפריטים למעקב שזוהו, התזמון המדויק של הזיהוי שלהם והתנוחה שלהם לאורך זמן.

תאימות לעוגנים בענן

אפשר לארח מודעות עוגן בענן ולפתור אותן בזמן הקלטה או הפעלה של סשן.

מתבצע תיעוד

התחלה, עצירה ובדיקת הסטטוס של הקלטת סשן ב-ARCore.

הקלטה של סשן ARCore

כדי להקליט סשן ARCore, צריך להגדיר את הסשן ולספק URI של MP4 להקלטה. להתקשר למספר ArSession_startRecording() לפני השיחה הראשונה אל ArSession_resume(). ההקלטה תתחיל באופן אוטומטי כשהסשן ימשיך. כדי שההקלטה תיפסק באופן אוטומטי כשהסשן מושהה, צריך להתקשר למספר 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.
}

מה השלב הבא?