پشتیبانی از جابه‌جایی زمان

از میاناهای برنامه‌سازی کاربردی تغییر زمان در سرویس ورودی تلویزیون خود استفاده کنید تا به کاربران اجازه دهید برنامه‌های زنده را در کانال‌های سرویس شما مکث، عقب‌گرد و جلوبرند. اگر برنامه‌تان از تغییر زمان پشتیبانی کند، کاربران در نحوه تماشای محتوای شما انعطاف‌پذیری بیشتری خواهند داشت:

  • کاربران می‌توانند برنامه‌ها را هنگام رسیدگی به وقفه‌های کوتاه‌مدت موقتاً متوقف کنند، بنابراین هرگز لحظات کلیدی را ازدست نمی‌دهند.
  • کاربران می‌توانند محتوایی را که قبلاً دیده‌اند یا محتوایی را که به آن علاقه ندارند، سریع جلو ببرند.
  • کاربران می‌توانند لحظات دلخواهشان را در محتوای برنامه به عقب برگردانند و دوباره تماشا کنند.
شکل ۱. کنترل‌های بازپخش Android TV که برای تغییر زمان استفاده می‌شود.

تغییر زمان از بخش‌های کوتاه، موقت، و ضبط‌شده داده‌های برنامه برای پیاده‌سازی قابلیت بازپخش برنامه‌های زنده استفاده می‌کند. کاربران نمی‌توانند این ضبط‌های با تأخیر زمانی را خارج از جلسه بازپخش فعلی پخش کنند. این یعنی آن‌ها نمی‌توانند از قابلیت تغییر زمان برای توقف موقت برنامه و تماشای آن در روز بعد یا توقف موقت برنامه برای تماشای آن در زمانی دیگر هنگام تغییر کانال استفاده کنند.

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

افزودن پشتیبانی از تغییر زمان

برای افزودن پشتیبانی از تغییر زمان به سرویس ورودی تلویزیون، باید میاناهای برنامه‌سازی کاربردی تغییر زمان را در کلاس TvInputService.Session پیاده‌سازی کنید، ضبط و بازپخش موارد ضبط‌شده تغییر زمان را در برنامه‌تان مدیریت کنید، و به سیستم اطلاع دهید که سرویس ورودی شما از تغییر زمان پشتیبانی می‌کند.

روش‌های TvInputService.Session که پیاده‌سازی می‌کنید به شرح زیر است:

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

اگر از «کتابخانه همراه TIF» برای پیاده‌سازی کلاس TvInputService.Session خود استفاده می‌کنید، به‌طور خودکار پیاده‌سازی تغییر زمان را که از ExoPlayer استفاده می‌کند دریافت می‌کنید. می‌توانید از این پیاده‌سازی استفاده کنید یا روش‌های میانای برنامه‌سازی کاربردی تغییر زمان را در BaseTvInputService.Session لغو کنید و پیاده‌سازی خودتان را ارائه دهید. برای اطلاعات بیشتر درباره استفاده از «کتابخانه همراه TIF»، به ایجاد سرویس ورودی تلویزیون بااستفاده از کتابخانه همراه TIF مراجعه کنید.

ضبط محتوا هنگام شروع جلسه

کاربر می‌تواند با دسترسی به کنترل‌های بازپخش کانال، محتوای برنامه را موقتاً متوقف کند، به عقب برگرداند، و سریع جلو ببرد. این کار را می‌تواند با فشار دادن انتخاب درحین تماشای محتوا و سپس پیمایش به کنترل‌های بازپخش یا بااستفاده از کنترل‌های بازپخش اختصاصی در دستگاه از راه دور انجام دهد.

چون کاربر می‌تواند در هر زمانی هنگام تماشای محتوای برنامه از جابه‌جایی زمانی استفاده کند، سرویس ورودی تلویزیون شما باید به‌محض اینکه کاربر در پیاده‌سازی onTune() شما به کانالی می‌رود، ضبط محتوای جابه‌جایی زمانی را شروع کند. همچنین باید با فراخوانی notifyTimeShiftStatusChanged(int)، به سیستم اطلاع دهید که می‌توانید ضبط کنید، همان‌طور که در بخش اطلاع دادن به سیستم درباره وضعیت جابه‌جایی زمانی توضیح داده شده است.

مدیریت فضای ذخیره‌سازی محتوای ضبط‌شده

سرویس ورودی تلویزیون شما مسئول ذخیره کردن ضبط‌های جابه‌جایی زمانی در فضای ذخیره‌سازی خصوصی برنامه شما و بازپخش محتوا هنگام فراخوانی روش‌های جابه‌جایی زمانی توسط سیستم است، مانند onTimeShiftResume(). اگر محتوایتان ازقبل در فضای ابری ذخیره شده است و برنامه‌تان می‌تواند ضبط‌های جابه‌جایی زمانی را در فضای ابری مدیریت کند، می‌توانید به‌جای فضای ذخیره‌سازی برنامه از فضای ذخیره‌سازی ابری استفاده کنید.

اگر محتوای شما از محتوای محافظت‌شده استفاده می‌کند، سرویس ورودی تلویزیون شما مسئول رمزگذاری مناسب محتوای ضبط‌شده و رمزگشایی محتوا درطول بازپخش است.

ازآنجایی‌که محتوای ویدیویی ضبط‌شده می‌تواند به مقدار زیادی فضای ذخیره‌سازی نیاز داشته باشد، باید محتوای ضبط‌شده را درطول بازپخش جلسه به‌دقت مدیریت کنید. اگر زمان جلسه بازپخش از مدت‌زمانی که می‌توانید برای جابه‌جایی زمانی ضبط و ذخیره کنید بیشتر است، ضبط جابه‌جایی زمانی را تنظیم کنید تا میان‌گیر فعلی حفظ شود اما مطمئن شوید زمان فعلی ضبط می‌شود. برای مثال، اگر کاربر ۳۱ دقیقه است که درحال پخش محتوا است و حداکثر اندازه ضبط با تغییر زمان ۳۰ دقیقه است، ضبط و زمان شروع را طوری تنظیم کنید که محتوا از دقیقه ۱ تا دقیقه ۳۱ را دربرگیرد.

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

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

اطلاع دادن به سیستم درباره وضعیت تغییر زمان

اگر سرویس ورودی تلویزیون شما از تغییر زمان پشتیبانی می‌کند، notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE) را در پیاده‌سازی onTune() زمانی که کاربر به یک کانال تنظیم می‌کند، فراخوانی کنید.

برای اطلاع دادن به سیستم درصورت تغییر هرگونه قابلیت جابه‌جایی زمانی سرویس ورودی‌تان، از notifyTimeShiftStatusChanged(int) استفاده کنید. برای مثال، اگر سرویس ورودی تلویزیون شما به‌دلیل محدودیت‌های فضای ذخیره‌سازی یا دلایل دیگر نمی‌تواند از جابه‌جایی زمانی پشتیبانی کند، notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE) را فراخوانی کنید.

اگر سرویس ورودی تلویزیون شما اصلاً نمی‌تواند از تغییر زمان پشتیبانی کند، notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNSUPPORTED) را هنگام ایجاد جلسه بازپخش فراخوانی کنید. سیستم هر سرویس ورودی را که هرگز notifyTimeShiftStatusChanged() را فراخوانی نکند به‌عنوان سرویس ورودی‌ای درنظر می‌گیرد که نمی‌تواند از تغییر زمان پشتیبانی کند. این بخش سرویس‌های ورودی را که از سطح API‏ ۲۲ و نسخه‌های قدیمی‌تر استفاده می‌کنند پوشش می‌دهد.

ردگیری زمان‌های بازپخش

موقعیت شروع ضبط با تغییر زمان، اولین موقعیت زمانی مطلق برحسب میلی‌ثانیه از مبدأ زمانی است که کاربر می‌تواند به آن برود. این معمولاً زمانی است که بازپخش ویدیو پس‌از فراخوانی onTune() شروع می‌شود. بااین‌حال، وقتی کاربر مقدار محتوایی را تماشا می‌کند که از آنچه برنامه‌تان می‌تواند ضبط کند فراتر می‌رود، باید ضبط بخش جدیدی را برای جابه‌جایی زمانی شروع کنید و زمان شروع را مطابق با آن به‌روز کنید.

موقعیت فعلی ضبط با تغییر زمان، موقعیت بازپخش فعلی برحسب میلی‌ثانیه از تاریخ یونیکس است. این موقعیت به‌طور مداوم درطول بازپخش تغییر می‌کند. معمولاً می‌توانید از موتور بازپخش خود برای تعیین این مقدار استفاده کنید، همان‌طور که در مثال زیر نشان داده شده است:

کاتلین

override fun onTimeShiftGetCurrentPosition(): Long =
        tvPlayer?.run {
            currentProgram?.let { program ->
                currentPosition + program.startTimeUtcMillis
            }
        } ?: TvInputManager.TIME_SHIFT_INVALID_TIME

جاوا

@Override
public long onTimeShiftGetCurrentPosition() {
  if (getTvPlayer() != null && currentProgram != null) {
    return getTvPlayer().getCurrentPosition() +
      currentProgram.getStartTimeUtcMillis();
  }
  return TvInputManager.TIME_SHIFT_INVALID_TIME;
}

مطمئن شوید زمان شروعی که هنگام فراخوانی سیستم onTimeShiftGetStartPosition() ارائه می‌دهید هرگز بیشتر از موقعیت زمانی فعلی که در onTimeShiftGetCurrentPosition() ارائه می‌دهید نباشد. سیستم از این فراخوانی‌ها برای به‌روزرسانی مدت زمان تغییر زمان در میانای کاربر کنترل‌های بازپخش استفاده می‌کند.

پشتیبانی از پارامترهای بازپخش

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

سیستم روش onTimeShiftSetPlaybackParams(PlaybackParams) شما را با شیء PlaybackParams که حاوی پارامترهای جلسه فعلی است فراخوانی می‌کند. از این اطلاعات برای پیکربندی مناسب موتور بازپخش رسانه استفاده کنید.

اگر موتور بازپخش شما از پارامتری پشتیبانی نمی‌کند، رفتار موردانتظار را تا جایی که می‌توانید شبیه‌سازی کنید. برای مثال، اگر موتور بازپخش شما از سرعت ۲ برابر پشتیبانی نمی‌کند، از عملیات جستجوی مکرر در موتور بازپخش خود استفاده کنید تا به سرعت بازپخش تقریباً دوبرابر برسید.

پس‌از تنظیم پارامترها، تنظیمات را تغییر ندهید، مگراینکه کاربر فرمان بازپخشی صادر کند که به پارامتر متفاوتی نیاز داشته باشد یا به کانال جدیدی برود.