استخدِم واجهات برمجة التطبيقات الخاصة بتأخير البث في خدمة إدخال التلفزيون للسماح للمستخدمين بإيقاف البرامج المباشرة مؤقتًا وإرجاعها وتقديمها بسرعة في قنوات خدمتك. إذا كان تطبيقك يدعم خاصية تأجيل المشاهدة، فسيحصل المستخدمون على مرونة في كيفية مشاهدة المحتوى الخاص بك:
- يمكن للمستخدمين إيقاف البرامج مؤقتًا عند حدوث انقطاع قصير الأمد، وبالتالي لن تفوتهم اللحظات المهمة.
- يمكن للمستخدمين تخطي المحتوى الذي شاهدوه بالفعل أو المحتوى الذي لا يثير اهتمامهم.
- يمكن للمستخدمين إعادة مشاهدة اللحظات المفضلة في محتوى البرنامج.
تستخدم ميزة "تأخير البث" مقاطع قصيرة ومؤقتة ومسجّلة من بيانات البرنامج لتوفير إمكانية تشغيل البرامج المباشرة. لا يمكن للمستخدمين تشغيل هذه التسجيلات خارج جلسة التشغيل الحالية. وهذا يعني أنه لا يمكنهم استخدام خاصية تأجيل البث لإيقاف برنامج مؤقتًا لمشاهدته في اليوم التالي أو إيقاف برنامج مؤقتًا لمشاهدته لاحقًا أثناء قيامهم بالتبديل إلى قناة مختلفة.
استخدِم واجهات برمجة التطبيقات لتسجيل المحتوى على التلفزيون إذا أردت أن تتيح للمستخدمين تسجيل محتوى البرامج لمشاهدته خارج جلسة التشغيل الحالية.
إضافة ميزة إيقاف المحتوى مؤقتًا وإرجاعه
لإضافة ميزة إيقاف البث مؤقتًا وإرجاعه إلى خدمة إدخال التلفزيون، عليك تنفيذ واجهات برمجة التطبيقات الخاصة بهذه الميزة في فئة TvInputService.Session، والتعامل مع تسجيلات هذه الميزة وتشغيلها في تطبيقك، وإبلاغ النظام بأنّ خدمة الإدخال توفّر ميزة إيقاف البث مؤقتًا وإرجاعه.
طُرق TvInputService.Session التي تنفّذها هي كما يلي:
-
onTimeShiftGetCurrentPosition(): يستدعيها النظام للحصول على موضع التشغيل الحالي بالمللي ثانية. لمزيد من التفاصيل، يُرجى الاطّلاع على قسم تتبُّع أوقات التشغيل. -
onTimeShiftGetStartPosition(): يستدعيه النظام للحصول على موضع البدء للتسجيل الحالي باستخدام ميزة "إيقاف البث مؤقتًا" بالمللي ثانية. لمزيد من التفاصيل، راجِع القسم تتبُّع أوقات التشغيل. -
onTimeShiftPause(): يتم استدعاؤها عندما يوقِف المستخدم التشغيل مؤقتًا. -
onTimeShiftResume(): يتم استدعاؤه عندما يستأنف المستخدم التشغيل. -
onTimeShiftSeekTo(long): يتم استدعاؤها عندما يحتاج النظام إلى البحث عن موضع زمني جديد. عادةً، يكون الموضع الجديد بين موضع البدء والموضع الحالي. -
onTimeShiftSetPlaybackParams(PlaybackParams): يتم استدعاؤها من خلال النظام لتوفير مَعلمات التشغيل، مثل سرعة التشغيل، للجلسة الحالية. لمزيد من التفاصيل، راجع قسم معلمات التشغيل المدعومة.
لمزيد من المعلومات حول كيفية إعلام النظام بأنّ خدمة الإدخال تتيح ميزة "تأخير البث"، يُرجى الاطّلاع على قسم إعلام النظام بحالة ميزة "تأخير البث".
إذا كنت تستخدم مكتبة TIF Companion Library لتنفيذ الفئة
TvInputService.Session، ستحصل تلقائيًا على عملية تنفيذ لميزة "تأخير المشاهدة" تستخدم ExoPlayer. يمكنك استخدام هذا التنفيذ أو إلغاء طرق Time-shifting API في BaseTvInputService.Session وتقديم التنفيذ الخاص بك. لمزيد من المعلومات حول استخدام TIF Companion Library، يُرجى الاطّلاع على إنشاء خدمة إدخال تلفزيوني باستخدام TIF Companion Library.
تسجيل المحتوى عند بدء جلسة
يمكن للمستخدم إيقاف محتوى البرنامج مؤقتًا، وإعادة تشغيله، وتقديمه سريعًا من خلال الوصول إلى عناصر التحكم في التشغيل الخاصة بالقناة، إما عن طريق الضغط على Select أثناء مشاهدة المحتوى ثم الانتقال إلى عناصر التحكم في التشغيل أو عن طريق استخدام عناصر التحكم المخصصة في التشغيل على جهاز بعيد.
بما أنّ المستخدم يمكنه استخدام ميزة "تأخير المشاهدة" في أي وقت أثناء مشاهدة محتوى البرنامج، يجب أن تبدأ خدمة إدخال التلفزيون في تسجيل المحتوى الذي يمكن تأخير مشاهدته فور أن ينتقل المستخدم إلى قناة في عملية التنفيذ onTune(). تحتاج أيضًا إلى إبلاغ النظام بأنك قادر على التسجيل عن طريق الاتصال بـ notifyTimeShiftStatusChanged(int)، كما هو موضح في قسم إخطار النظام بحالة تغيير الوقت.
إدارة مساحة تخزين المحتوى المسجّل
تتحمّل خدمة إدخال التلفزيون مسؤولية تخزين التسجيلات التي تتيح إيقاف البث مؤقتًا وإعادة تشغيله في مساحة التخزين الخاصة بالتطبيق، وتشغيل المحتوى عندما يستدعي النظام طرق إيقاف البث مؤقتًا وإعادة تشغيله، مثل onTimeShiftResume().
إذا كان المحتوى مخزّنًا في السحابة الإلكترونية وكان تطبيقك قادرًا على إدارة التسجيلات التي يمكن مشاهدتها في وقت لاحق في السحابة الإلكترونية، يمكنك استخدام التخزين في السحابة الإلكترونية بدلاً من التخزين في التطبيق.
إذا كان المحتوى الخاص بك يستخدم محتوى محميًا، فإن خدمة إدخال التلفزيون الخاصة بك مسؤولة عن التشفير الصحيح للمحتوى المسجل وفك تشفير المحتوى أثناء التشغيل.
بما أن محتوى الفيديو المسجل قد يتطلب مساحة تخزين كبيرة، فأنت بحاجة إلى إدارة المحتوى المسجل بعناية أثناء تشغيل الجلسة. إذا تجاوزت مدة جلسة التشغيل المدة المتاحة للتسجيل والتخزين باستخدام ميزة "تأخير البث"، عليك تعديل مدة التسجيل باستخدام هذه الميزة للحفاظ على المخزن المؤقت الحالي والتأكّد من تسجيل الوقت الحالي. على سبيل المثال، إذا كان المستخدم يقوم بتشغيل المحتوى لمدة 31 دقيقة وكان الحد الأقصى لحجم التسجيل المؤقت لديك هو 30 دقيقة، فقم بضبط وقت التسجيل ووقت البدء بحيث يحتوي على المحتوى من الدقيقة 1 إلى الدقيقة 31.
إذا كانت خدمة إدخال التلفزيون لديك لا تدعم خاصية تأجيل الوقت بسبب نقص مساحة التخزين، فيجب عليك إبلاغ النظام بذلك. لمزيد من التفاصيل حول كيفية إعلام النظام بالقيود المفروضة على ميزة "المشاهدة المؤجّلة"، يُرجى الاطّلاع على قسم إعلام النظام بحالة ميزة "المشاهدة المؤجّلة".
عندما يقوم المستخدم بالتبديل إلى قناة مختلفة أو ينهي جلسة التشغيل الخاصة به، احذف بيانات تغيير الوقت المسجلة.
إبلاغ النظام بحالة تغيير الوقت
إذا كانت خدمة إدخال التلفزيون تتيح ميزة "تأخير البث"، استخدِم الدالة notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE) في تنفيذك للدالة onTune() عندما ينتقل المستخدم إلى قناة.
لإبلاغ النظام في حال حدوث أي تغيير في إمكانات خدمة الإدخال المتعلقة بتأخير البث، استخدِم notifyTimeShiftStatusChanged(int).
على سبيل المثال، إذا كانت خدمة إدخال التلفزيون لا تتيح ميزة "تأخير البث" بسبب قيود على مساحة التخزين أو لأسباب أخرى، يُرجى الاتصال بالرقم notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE).
إذا كانت خدمة إدخال التلفزيون لا تتيح ميزة "تأخير التشغيل" على الإطلاق، عليك استدعاء
notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNSUPPORTED)
عند إنشاء جلسة تشغيل. يتعامل النظام مع أي خدمة إدخال لا تستدعي notifyTimeShiftStatusChanged() مطلقًا على أنّها خدمة إدخال لا يمكنها توفير ميزة "تأخير البث". ويشمل ذلك خدمات الإدخال التي تستخدم المستوى 22 لواجهة برمجة التطبيقات والإصدارات الأقدم.
تتبُّع أوقات التشغيل
موضع بدء التسجيل الذي يمكن إيقافه مؤقتًا وإرجاعه هو أبكر موضع زمني مطلق، بالمللي ثانية منذ بداية الحقبة، يمكن للمستخدم الانتقال إليه. وهذا هو الوقت الذي يبدأ فيه تشغيل الفيديو عادةً بعد استدعاء onTune().
ومع ذلك، عندما يشاهد المستخدم مقدارًا من المحتوى يتجاوز ما يمكن لتطبيقك تسجيله، عليك بدء تسجيل مقطع جديد من أجل إيقاف البث مؤقتًا ثم استئنافه وتعديل وقت البدء وفقًا لذلك.
الموضع الحالي لتسجيل يمكن إيقافه مؤقتًا هو موضع التشغيل الحالي، بالملي ثانية منذ بدء الحقبة. يتغير هذا الموضع باستمرار أثناء التشغيل. عادةً، يمكنك استخدام محرك التشغيل الخاص بك لتحديد هذه القيمة، كما هو موضح في المثال التالي:
Kotlin
override fun onTimeShiftGetCurrentPosition(): Long = tvPlayer?.run { currentProgram?.let { program -> currentPosition + program.startTimeUtcMillis } } ?: TvInputManager.TIME_SHIFT_INVALID_TIME
Java
@Override public long onTimeShiftGetCurrentPosition() { if (getTvPlayer() != null && currentProgram != null) { return getTvPlayer().getCurrentPosition() + currentProgram.getStartTimeUtcMillis(); } return TvInputManager.TIME_SHIFT_INVALID_TIME; }
تأكَّد من أنّ وقت البدء الذي تقدّمه عندما يستدعي النظام
onTimeShiftGetStartPosition()
لا يتجاوز أبدًا موضع الوقت الحالي الذي تقدّمه في
onTimeShiftGetCurrentPosition().
يستخدم النظام هذه المكالمات لتعديل مدة إيقاف البث مؤقتًا في واجهة المستخدم الخاصة بعناصر التحكّم في التشغيل.
مَعلمات التشغيل المتوافقة
لتغيير سرعة التشغيل أثناء إيقاف البث مؤقتًا، يستخدم النظام مَعلمات التشغيل. على سبيل المثال، إذا قرر المستخدم ترجيع المحتوى الحالي، يتم تمرير مَعلمات تشغيل جديدة إلى تطبيقك مع سرعة تشغيل سالبة. تتيح ميزة "تأخير المشاهدة" أيضًا مستويات مختلفة من سرعة التشغيل، مثل 2x أو 3x، للترجيع أو التقديم السريع.
يستدعي النظام طريقتك
onTimeShiftSetPlaybackParams(PlaybackParams)
باستخدام كائن PlaybackParams يحتوي على
مَعلمات الجلسة الحالية. استخدِم هذه المعلومات
لضبط إعدادات محرّك تشغيل الوسائط بشكل مناسب.
إذا كان محرك التشغيل لا يتيح استخدام مَعلمة، حاوِل محاكاة السلوك المتوقّع بأفضل ما يمكنك. على سبيل المثال، إذا كان محرّك التشغيل لا يتيح سرعة مضاعفة، استخدِم عمليات البحث المتكرّرة في محرّك التشغيل لتحقيق سرعة تشغيل مضاعفة تقريبًا.
بعد ضبط المَعلمات، لا تغيِّر الإعدادات إلا إذا أصدر المستخدم أمر تشغيل يتطلّب مَعلمة مختلفة أو انتقل إلى قناة جديدة.