بث مباشر

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

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

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

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

يتم استخدام المصطلحات التالية في جميع أنحاء الدليل:

  • نافذة قابلة للبحث: نطاق البث المباشر الذي يمكن للمستخدمين البحث ضمنه
  • Live Edge - أحدث جزء من البث المباشر المتاح للمشغّل.
  • تشغيل الرأس - طابع زمني لواجهة المستخدم لموضع التشغيل الحالي.

إرسال بث مباشر

تتوفّر طريقتان لضبط "حزمة SDK لمستقبل الويب" من أجل استخدام واجهة برمجة تطبيقات البث المباشر للمحتوى:

  1. باستخدام اعتراض رسائل LOAD في تطبيق Web Host. (يُنصح بها)
  2. باستخدام طلب تحميل من إنشاء المُرسِل أو المُستلِم.

ويوفّر برنامج الاعتراض أداة LoadRequestData تحتوي على جميع البيانات الوصفية المهمة المتعلّقة بطلب التحميل. للإشارة إلى أن طلب التحميل مخصّص للبث المباشر، ما عليك سوى ضبط streamType على الكائن mediaInformation على StreamType.LIVE. يجب أن تكون السمة MediaInformation.duration هي -1 لأنّ أمثلة المشغّل تقع على عاتق المستخدم مسؤولية احتسابها عندما يكون المحتوى LIVE.

/*
* This interceptor is called before your content is loaded by a Cast device
*/
playerManager.setMessageInterceptor(
   cast.framework.messages.MessageType.LOAD,
   request => { /* cast.framework.messages.LoadRequestData */
       request.media.streamType = cast.framework.messages.StreamType.LIVE;
   return request;
});

إضافة بيانات دليل البرامج

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

يمكنك تهيئة بيانات الدليل الأولي لمجموعة بث في اعتراض رسالة التحميل، بالطريقة نفسها التي أشرنا بها إلى أن البث كان بثًا مباشرًا في المثال السابق. يتم تمثيل الأقسام أو البرامج الفردية في البث المباشر ككائنات MediaMetadata يتم تخزينها بعد ذلك في قائمة انتظار. هناك فئة MediaMetadata مختلفة لأنواع مختلفة من البرامج، مثل TvShowMediaMetadata وMovieMediaMetadata وMusicTrackMediaMetadata وغير ذلك.

في مقتطف الرمز التالي، نستخدم الكائن MediaMetadata لتحديد وقت بدء كل عرض باستخدام طابع زمني لـ UNIX مع الخاصية sectionStartAbsoluteTime. يتم تمثيل مدة البرنامج بالثواني.

// The metadata for a single TV show
const currentShow = new cast.framework.messages.TvShowMediaMetadata();
currentShow.episode = 15;
currentShow.seriesTitle = 'The Odyssey';
currentShow.title = 'Scylla and Charybdis';
currentShow.sectionStartAbsoluteTime = toUnixTimestamp('9:00 PM');
currentShow.sectionDuration = HOUR_IN_SECONDS;

const previousShow = new ...;
const nextShow = new ...;

const containerMetadata = new cast.framework.messages.ContainerMetadata();
containerMetadata.title = 'My TV Channel';
containerMetadata.sections = [previousShow, currentShow, nextShow];

playerManager.getQueueManager().setContainerMetadata(containerMetadata);

النطاق المباشر القابل للبحث

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

وتمثل القيمة LiveSeekableRange النطاق الزمني في البث الذي يمكن للمستخدم البحث فيه. في جهاز استقبال الويب، يمكنك الوصول إلى معلومات عن النطاق الذي يمكن البحث عنه من خلال PlayerManager.getLiveSeekableRange()، الذي يعرض عنصر LiveSeekableRange. السمات الأساسية على العنصر المطلوب الانتباه إليها هي:

  • start — وقت البدء (بالثواني) للنطاق المرتبط ببداية البث بالثواني.
  • end — أقصى وقت ممكن (بالثواني) يمكن للمشغّل السعي إليه، بناءً على الشرائح المتاحة، بالنسبة إلى بداية البث.
  • ismoveWindow — قيمة منطقية تشير إلى ما إذا كان النطاق القابل للبحث يتحرك (أي تتم إزالة الشرائح القديمة من البيان) مع البث، ويجب أن يكون ذلك true لجميع مجموعات البث المباشر.
  • isLiveDone - قيمة منطقية تشير إلى ما إذا كان البث المباشر قد انتهى، مما يعني عدم إنشاء أي مقاطع جديدة.

يتم تحديد حجم النطاق القابل للبحث، الذي يمثله الوقت بين start و end، من خلال عدد الشرائح المتاحة في ساحة المشاركات وسيتحرك مع البث. على سبيل المثال، إذا كان النطاق المطلوب البحث عنه في بداية البث هو {start:0, end: 600, isMovingWindow: false, isLiveDone: false}، يمكن أن يصبح {start: 10, end: 610, isMovingWindow: true, isLiveDone: false} بعد عشر ثوانٍ من بدء البث. ومن المهم ملاحظة أوقات البدء والانتهاء في النطاق المطلوب للبحث استنادًا إلى الوقت المستغرق لإنشاء شريحة جديدة. وبالتالي، إذا كانت مدة المقطع العادي للبث تبلغ 10 ثوانٍ، سيتم تعديل وقتي البدء والانتهاء تقريبًا كل 10 ثوانٍ.

إيقاف البحث

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

// disable seeking in the LOAD messageInterceptor
playerManager.removeSupportedMediaCommands(cast.framework.messages.Command.SEEK, true);

تؤدي إزالة أوامر الوسائط المتوافقة مع إشارات SEEK إلى تطبيقات المُرسِل والمس الشاشات لإيقاف البحث، ولكن بدون إيقاف الطلبات الصوتية، مثل "Ok Google، البحث عن للخلف لمدة 30 ثانية". اطّلِع على دليل أوامر الوسائط المتوافقة بالصوت للحصول على تفاصيل حول طريقة إيقاف أوامر الوسائط للصوت.

أحداث إطار العمل المباشر

تم تضمين حدثين، LIVE_ENDED وLIVE_IS_MOVING_WINDOW_CHANGED، في Live API. يتم تمرير كل من الحدثين كائن LiveStatusEvent، الذي يحتوي على النطاق المباشر الحالي القابل للبحث.

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

سيناريوهات البث المباشر

تتوفّر ثمانية أنواع محتملة من السيناريوهات للبث المباشر، يتمّ ضبط كلّ منها من خلال ضبط ثلاثة إعدادات أساسية:

  • وقت بدء البث
  • وقت انتهاء البث المباشر
  • يُسمح للمستخدمين بالبحث ضمن النافذة القابلة للبحث في البث المباشر

انظر إضافة بيانات دليل البرنامج للتعرف على كيفية تهيئة تلك القيم.

في ما يلي وصف ولقطات شاشة للسيناريوهات المتوافقة مع واجهة برمجة التطبيقات Live. يتم استخدام المتغيرين T1 وT2 لتمثيل الطابع الزمني على يمين ويسار واجهة المستخدم على التوالي.

وقت البدء وقت الانتهاء قابل للبحث T1 المستوى 2
السيناريو الأول لا لا لا رأس اللعب غير معروض
السيناريو الثاني لا لا نعم تشغيل الرأس غير معروض
السيناريو الثالث لا نعم لا تشغيل الرأس غير معروض
السيناريو 4 لا نعم نعم تشغيل الرأس غير معروض
السيناريو الخامس نعم لا لا عرض توقيت البدء تشغيل الرأس
السيناريو 6 نعم لا نعم عرض توقيت البدء تشغيل الرأس
السيناريو 7 نعم نعم لا إظهار وقت البدء إظهار وقت الانتهاء
السيناريو 8 نعم نعم نعم إظهار وقت البدء إظهار وقت الانتهاء

السيناريو الأول

وقت البدء وقت الانتهاء قابل للبحث T1 المستوى 2
لا لا لا رأس اللعب غير معروض

السيناريو الأول لا يتضمن وقت بدء أو وقت انتهاء، ولا يمكن للمستخدمين البحث ضمن ساحة المشاركات. عندما يوقف أحد المستخدمين البث، سيتم استئناف التشغيل من الحافة المباشرة بدلاً من الموضع الذي تم فيه إيقاف البث مؤقتًا.

السيناريو السابع

تلفزيون يعرض واجهة مستخدم Chromecast المباشرة للسيناريو 7 مع وقت الساعة هاتف جوّال يعرض واجهة المستخدم المباشرة للسيناريو 7 مع وقت الساعة

وقت البدء وقت الانتهاء قابل للبحث T1 المستوى 2
نعم نعم لا رأس اللعب مدة البرنامج

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

السيناريو الثامن

تلفزيون يعرض واجهة مستخدم Chromecast المباشرة للسيناريو 8 مع وقت الساعة هاتف جوّال يعرض واجهة المستخدم المباشرة للسيناريو 8 مع وقت الساعة

وقت البدء وقت الانتهاء قابل للبحث T1 المستوى 2
نعم نعم نعم رأس اللعب مدة البرنامج

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

تهيئة سيناريو

يتم ضبط إعدادات البث كسيناريو مباشر محدّد على ثلاثة أجزاء:

  1. تعيين نوع البث - حدد البث المباشر على أنه بث مباشر.
  2. إضافة بيانات دليل البرامج - عيّن وقت بدء ومدة في كائن MediaMetadata.
  3. تهيئة وظيفة البحث - مكّن البحث أو عطّله.

سلوك التشغيل

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

ساحات المشاركات القابلة للبحث

عند استئناف بث قابل للبحث:

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

الانتقال إلى LiveSeekableRange.end لاستئناف التشغيل على الحافة بعد إلغاء الإيقاف المؤقت

let playerManager = cast.framework.CastReceiverContext.getInstance().getPlayerManager();
// Intercept the message to PLAY
playerManager.setMessageInterceptor(cast.framework.messages.MessageType.PLAY, (requestData) => {
  ...
  if (playerManager.getLiveSeekableRange()) {
    // Resume playback at the live edge
    playerManager.seek(playerManager.getLiveSeekableRange().end);
  } else {
    return requestData;
  }
  ...
});

أحداث البث غير القابلة للبحث

عند استئناف بث غير قابل للبحث:

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

تغييرات في واجهة برمجة التطبيقات وتخصيص واجهة المستخدم المباشرة

يتوفر في Cast SDK دعم مضمّن لإنشاء واجهات مستخدم مخصصة بدلاً من استخدام واجهة المستخدم الجاهزة. ولكن من المهم اتّباع قائمة التحقق من تصميم تجربة المُستخدِم في Cast عند تخصيص الواجهة.

مستقبِل الويب

أمّا على مستقبِل الويب، فيتضمّن PlayerData الحقول التالية للسماح لمطوّري البرامج بتمديد الواجهات المخصّصة لأحداث البث المباشر:

  • isLive - علامة تشير إلى ما إذا كان البث الحالي بثًا مباشرًا بدلاً من VOD.
  • liveSeekableRange - النطاق الذي يمكن البحث عنه ليتم عرضه على الشاشة مع تحديد نافذة DVR.
  • mediaStart المطلق - - عندما يبدأ القسم في الوقت المطلق (حقبة UNIX).
  • sectionStartTimeInMedia - وقت بدء القسم بالثواني بالنسبة إلى وقت بدء الوسائط.
  • sectionDuration - مدة القسم بالثواني.

احرص أيضًا على مراعاة الحدثين المباشرين عند تخصيص واجهة المستخدم.

حزمة تطوير البرامج (SDK) لنظام التشغيل Android

في إطار استخدام ميزة "البث المباشر"، تم إيقاف استخدام أداة Android Seekbar Widget في UIMediaController، بدلاً من استخدام CastSeekBar.