إضافة بيانات مخصّصة أثناء التسجيل على جهاز Android

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

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

حالات استخدام البيانات المخصصة

تؤدي إضافة بيانات مخصّصة إلى التسجيلات إلى توسيع إمكانيات تطبيقات الواقع المعزّز. في ما يلي بعض حالات الاستخدام المحدَّدة.

استخدام الواقع المعزّز أثناء التنقّل

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

التعاون في إنشاء تجارب الواقع المعزّز

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

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

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

التسجيل باستخدام بيانات مخصّصة

إنشاء تسجيل جلسة باستخدام بيانات مخصّصة

إعداد تسجيل باستخدام البيانات المخصَّصة

اتّبِع الخطوات التالية لإعداد تسجيل باستخدام البيانات المخصَّصة. لبدء جلسة تسجيل وإيقافها والتحقّق منها، يُرجى الاطّلاع على مقالة تسجيل جلسة في الواقع المعزّز وتشغيلها.

  1. احصل على RecordingConfig.
  2. أنشئ Track جديدًا مع معرّف فريد عالمي (UUID). سيتم حفظ جميع البيانات المخصصة هنا.
  3. أضِف Track إلى RecordingConfig التي أنشأتها أثناء ضبط الجلسة.

Java

// Initialize a new track with a custom UUID.
// Make sure to save the UUID because it is the ID that you will use
// to get your data back during playback.
UUID trackUUID = UUID.fromString("de5ec7a4-09ec-4c48-b2c3-a98b66e71893"); // from UUID generator
Track track = new Track(session).setId(trackUUID);

// Add the Track to the recordingConfig.
// recordingConfig must already be configured.
recordingConfig.addTrack(track);

Kotlin

// Initialize a new track with a custom UUID.
// Make sure to save the UUID because it is the ID that you will use
// to get your data back during playback.
val trackUUID = UUID.fromString("de5ec7a4-09ec-4c48-b2c3-a98b66e71893") // from UUID generator
val track = Track(session).setId(trackUUID)

// Add the Track to the recordingConfig.
// recordingConfig must already be configured.
recordingConfig.addTrack(track)

يتم التعامل مع جميع المقاطع الصوتية الجديدة كتسجيلات منفصلة، ويشغل كل مقطع صوتي مسجَّل معرّف المستخدم الفريد الخاص به.

اختياري: ضبط المقطع الصوتي ببيانات إضافية

إذا أردت التعرّف عليه لاحقًا، يمكنك ضبط مسار يتضمّن بيانات إضافية تصف تسجيل الجلسة. على سبيل المثال، يمكنك "وضع علامة" على مقطع صوتي عن طريق إضافة ملاحظة تصف الموقع والوقت اللذين سجّلت فيهما الجلسة: "تم تسجيل هذه الجلسة في مركز التسوق بعد الظهر".

Java

// Set additional data on this track.
// For example, describe where you recorded the session.
byte[] customTrackData = "airport".getBytes(StandardCharsets.UTF_8);
track.setMetadata(ByteBuffer.wrap(customTrackData));

Kotlin

// Set additional data on this track.
// For example, describe where you recorded the session.
val customTrackData: ByteArray = "airport".toByteArray()
track.setMetadata(ByteBuffer.wrap(customTrackData))

اختياري: ضبط المقطع الصوتي باستخدام نوع MIME

إذا أردت أن يكون تطبيقك متوافقًا مع أدوات خارجية، يمكنك ضبط مسار باستخدام نوع MIME يصف نوع البيانات المسجّلة في قناة الإصدار. إذا لم تحدّد نوعًا، سيتم تصنيف البيانات على أنّها application/text. يتجاهل ARCore نوع MIME عند قراءة البيانات.

Java

// Set a MIME type for compatibility with external tools.
track.setMimeType("text/csv");

Kotlin

// Set a MIME type for compatibility with external tools.
track.setMimeType("text/csv")

تسجيل مسارات البيانات المخصّصة

يتم تسجيل جميع بيانات المقاطع الصوتية المخصّصة في Frame. تستخدم جلسات الواقع المعزّز session.update() للحصول على إطار. الوقت الذي تسجل فيه البيانات على إطار هو نفس الوقت الذي سيتم فيه إرجاع البيانات أثناء التشغيل. على سبيل المثال، إذا اتصلت بـ recordTrackData() باستخدام القيمة "A" على 00:07:02، فستحصل على الحرف "A" عند علامة 00:07:02 عند تشغيل المقطع الصوتي.

لتسجيل مسار بيانات مخصّص، حوِّل البيانات إلى ByteBuffer واطلب recordTrackData().

Java

// Place an AR lamp in a room.
if (placeLampButtonWasPressed) {
  Lamp lampProduct = Lamp.FLOOR; // a floor lamp
  // Convert the lamp data into a byte array.
  ByteBuffer lampData = ByteBuffer.wrap(new byte[] {(byte) lampProduct.ordinal()});
  frame.recordTrackData(trackUUID, lampData);
}

Kotlin

// Place an AR lamp in a room.
if (placeLampButtonWasPressed) {
  val lampProduct = Lamp.FLOOR // a floor lamp
  // Convert the lamp data into a byte array.
  val lampData = ByteBuffer.wrap(byteArrayOf(lampProduct.ordinal.toByte()))
  frame.recordTrackData(trackUUID, lampData)
}

تشغيل مسارات البيانات المخصّصة

استخراج البيانات المخصّصة من تسجيل جلسة أثناء التشغيل.

تهيئة عملية تشغيل

تتشابه عملية بدء التشغيل باستخدام البيانات المخصصة مع إعداد تشغيل تسجيل جلسة عادية.

عرض البيانات المخصّصة

يمكنك طلب الرمز getUpdatedTrackData() لاسترداد البيانات المخصّصة المسجّلة في إطار. من الممكن استرداد بيانات مسارات متعددة من الإطار نفسه. على سبيل المثال، إذا اتصلت بـ recordTrackData() مرتين على الإطار نفسه أثناء التسجيل، فستعود إلى نسختين من TrackData أثناء التشغيل.

Java

// Fetch the data recorded on a select frame and place it in a container object.
Collection<TrackData> trackDataList = frame.getUpdatedTrackData(trackUUID);

Kotlin

// Fetch the data recorded on a select frame and place it in a container object.
val trackDataList: Collection<TrackData> = frame.getUpdatedTrackData(trackUUID)

بعد إدراج TrackData في كائن حاوية، استخرِج وحدات البايت من البيانات المخصّصة.

Java

// Extract the bytes of custom data from the list of track data.
for (TrackData trackData : trackDataList) {
  ByteBuffer bytes = trackData.getData();
  Lamp lamp = Lamp.values()[bytes.get()]; // this is the lamp!
}

Kotlin

// Extract the bytes of custom data from the list of track data.
for (trackData in trackDataList) {
  val bytes = trackData.data
  val lamp = Lamp.values()[bytes.get().toInt()] // this is the lamp!
}

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