সময়-বদল সমর্থন

ব্যবহারকারীদের আপনার পরিষেবা চ্যানেলে লাইভ প্রোগ্রামগুলিকে বিরতি, রিওয়াইন্ড এবং দ্রুত-ফরোয়ার্ড করার জন্য আপনার টিভি ইনপুট পরিষেবাতে সময়-বদলকারী API ব্যবহার করুন৷ যদি আপনার অ্যাপ টাইম-শিফটিং সমর্থন করে, ব্যবহারকারীরা কীভাবে আপনার বিষয়বস্তু দেখেন তাতে নমনীয়তা পাবেন:

  • ব্যবহারকারীরা একটি স্বল্প-মেয়াদী বাধা পরিচালনা করার সময় প্রোগ্রামগুলিকে বিরতি দিতে পারে, তাই তারা কখনই মূল মুহূর্তগুলি মিস করবেন না।
  • ব্যবহারকারীরা ইতিমধ্যেই দেখেছেন এমন সামগ্রী বা তাদের আগ্রহ নেই এমন সামগ্রীর মাধ্যমে দ্রুত-ফরোয়ার্ড করতে পারেন৷
  • ব্যবহারকারীরা প্রোগ্রাম সামগ্রীতে প্রিয় মুহূর্তগুলি রিওয়াইন্ড এবং পুনরায় দেখতে পারেন।

চিত্র 1. সময় পরিবর্তনের জন্য ব্যবহৃত অ্যান্ড্রয়েড টিভি প্লেব্যাক নিয়ন্ত্রণ।

লাইভ প্রোগ্রাম প্লেব্যাক করার ক্ষমতা বাস্তবায়নের জন্য টাইম-শিফটিং প্রোগ্রাম ডেটার সংক্ষিপ্ত, অস্থায়ী, রেকর্ড করা অংশগুলি ব্যবহার করে। ব্যবহারকারীরা বর্তমান প্লেব্যাক সেশনের বাইরে এই সময় পরিবর্তনকারী রেকর্ডিংগুলি খেলতে পারবেন না৷ এর অর্থ হল তারা পরের দিন দেখার জন্য একটি প্রোগ্রাম বিরতি দিতে বা অন্য চ্যানেলে স্যুইচ করার সময় পরে দেখার জন্য একটি প্রোগ্রাম বিরতি দেওয়ার জন্য সময়-বদল ব্যবহার করতে পারে না।

আপনি যদি আপনার ব্যবহারকারীদের বর্তমান প্লেব্যাক সেশনের বাইরে দেখার জন্য প্রোগ্রাম সামগ্রী রেকর্ড করতে দিতে চান তাহলে টিভি রেকর্ডিং API ব্যবহার করুন৷

সময় পরিবর্তন সমর্থন যোগ করুন

আপনার টিভি ইনপুট পরিষেবাতে টাইম-শিফটিং সমর্থন যোগ করার জন্য, আপনাকে আপনার TvInputService.Session ক্লাসে সময়-বদলকারী APIগুলি প্রয়োগ করতে হবে, আপনার অ্যাপে রেকর্ডিং এবং টাইম-শিফটিং রেকর্ডিংগুলির প্লেব্যাক পরিচালনা করতে হবে এবং আপনার ইনপুট পরিষেবা সরবরাহ করে এমন সিস্টেমকে অবহিত করতে হবে সময় পরিবর্তন সমর্থন।

আপনি যে TvInputService.Session পদ্ধতিগুলি প্রয়োগ করেন তা হল:

  • onTimeShiftGetCurrentPosition() : মিলিসেকেন্ডে বর্তমান প্লেব্যাক অবস্থান পেতে সিস্টেম দ্বারা ডাকা হয়। আরও বিশদ বিবরণের জন্য, ট্র্যাক প্লেব্যাক সময় বিভাগটি দেখুন।
  • onTimeShiftGetStartPosition() : মিলিসেকেন্ডে বর্তমান টাইম-শিফ্ট রেকর্ডিংয়ের শুরুর অবস্থান পেতে সিস্টেম দ্বারা ডাকা হয়। আরও বিশদ বিবরণের জন্য, ট্র্যাক প্লেব্যাক সময় বিভাগটি দেখুন।
  • onTimeShiftPause() : ব্যবহারকারী যখন প্লেব্যাক বিরতি দেয় তখন বলা হয়।
  • onTimeShiftResume() : ব্যবহারকারী যখন প্লেব্যাক পুনরায় শুরু করে তখন বলা হয়।
  • onTimeShiftSeekTo(long) : যখন সিস্টেমকে একটি নতুন সময়ের অবস্থান খোঁজার প্রয়োজন হয় তখন বলা হয়। সাধারণত, নতুন অবস্থানটি শুরুর অবস্থান এবং বর্তমান অবস্থানের মধ্যে থাকে।
  • onTimeShiftSetPlaybackParams(PlaybackParams) : বর্তমান সেশনের জন্য প্লেব্যাক প্যারামিটার, যেমন প্লেব্যাক গতি, প্রদানের জন্য সিস্টেম দ্বারা ডাকা হয়। আরও বিশদ বিবরণের জন্য, সমর্থন প্লেব্যাক পরামিতি বিভাগটি দেখুন।

আপনার ইনপুট পরিষেবা টাইম-শিফটিং সমর্থন করে কীভাবে সিস্টেমকে জানাবেন সে সম্পর্কে আরও তথ্যের জন্য, টাইম-শিফটিং স্ট্যাটাস সম্পর্কে সিস্টেমকে অবহিত করুন বিভাগটি দেখুন।

আপনি যদি আপনার TvInputService.Session ক্লাস বাস্তবায়নের জন্য TIF Companion Library ব্যবহার করেন, তাহলে আপনি স্বয়ংক্রিয়ভাবে সময়-বদলের একটি বাস্তবায়ন পাবেন যা ExoPlayer ব্যবহার করে। আপনি এই বাস্তবায়ন ব্যবহার করতে পারেন বা BaseTvInputService.Session এ টাইম-শিফটিং API পদ্ধতিগুলিকে ওভাররাইড করতে পারেন এবং আপনার নিজস্ব বাস্তবায়ন প্রদান করতে পারেন। TIF Companion Library ব্যবহার করার বিষয়ে আরও তথ্যের জন্য, TIF Companion Library ব্যবহার করে একটি TV ইনপুট পরিষেবা তৈরি করুন দেখুন।

সেশন শুরু হলে বিষয়বস্তু রেকর্ড করুন

একজন ব্যবহারকারী চ্যানেলের জন্য প্লেব্যাক কন্ট্রোল অ্যাক্সেস করে প্রোগ্রামের বিষয়বস্তুকে বিরতি, রিওয়াইন্ড এবং ফাস্ট-ফরওয়ার্ড করতে পারেন, হয় কনটেন্ট দেখার সময় সিলেক্ট টিপে এবং তারপর প্লেব্যাক কন্ট্রোলে নেভিগেট করে অথবা রিমোট ডিভাইসে ডেডিকেটেড প্লেব্যাক কন্ট্রোল ব্যবহার করে।

যেহেতু ব্যবহারকারী প্রোগ্রামের বিষয়বস্তু দেখার সময় যে কোনো সময় সময়-বদল ব্যবহার করতে পারে, আপনার টিভি ইনপুট পরিষেবাটি আপনার onTune() বাস্তবায়নের কোনো চ্যানেলে ব্যবহারকারী টিউন করার সাথে সাথে সময়-বদলকারী বিষয়বস্তু রেকর্ড করা শুরু করতে হবে। এছাড়াও আপনাকে সিস্টেমকে জানাতে হবে যে আপনি notifyTimeShiftStatusChanged(int) কল করে রেকর্ডিং করতে সক্ষম, যেমনটি সিস্টেমকে নোটিফাই টাইম-শিফটিং স্ট্যাটাস বিভাগে বর্ণনা করা হয়েছে।

রেকর্ডকৃত বিষয়বস্তু সঞ্চয়স্থান পরিচালনা করুন

আপনার টিভি ইনপুট পরিষেবা আপনার অ্যাপের ব্যক্তিগত অ্যাপ স্টোরেজে টাইম-শিফটিং রেকর্ডিং সঞ্চয় করার জন্য এবং সিস্টেম আপনার সময়-বদল করার পদ্ধতি, যেমন onTimeShiftResume() কল করে তখন সামগ্রী প্লে ব্যাক করার জন্য দায়ী। যদি আপনার সামগ্রী ইতিমধ্যেই ক্লাউডে সংরক্ষিত থাকে এবং আপনার অ্যাপটি ক্লাউডে টাইম-শিফটিং রেকর্ডিং পরিচালনা করতে পারে, আপনি অ্যাপ স্টোরেজের পরিবর্তে ক্লাউড স্টোরেজ ব্যবহার করতে পারেন।

যদি আপনার সামগ্রী সুরক্ষিত সামগ্রী ব্যবহার করে, তাহলে আপনার টিভি ইনপুট পরিষেবাটি রেকর্ড করা সামগ্রীর সঠিক এনক্রিপশন এবং প্লেব্যাকের সময় সামগ্রীর ডিক্রিপশনের জন্য দায়ী৷

যেহেতু রেকর্ড করা ভিডিও সামগ্রীতে প্রচুর পরিমাণে সঞ্চয়ের প্রয়োজন হতে পারে, তাই সেশন প্লেব্যাকের সময় আপনাকে সাবধানে রেকর্ড করা সামগ্রী পরিচালনা করতে হবে। যদি প্লেব্যাক সেশনের সময়টি সময়ের পরিমাণ অতিক্রম করে যা আপনি সময়-বদলের জন্য রেকর্ড এবং সংরক্ষণ করতে পারেন, বর্তমান বাফার বজায় রাখতে আপনার সময়-বদল রেকর্ডিং সামঞ্জস্য করুন তবে বর্তমান সময়টি ক্যাপচার করা হয়েছে তা নিশ্চিত করুন। উদাহরণস্বরূপ, যদি ব্যবহারকারী 31 মিনিটের জন্য সামগ্রী চালায় এবং আপনার সর্বোচ্চ সময়-বদল রেকর্ডিং আকার 30 মিনিট হয়, তাহলে আপনার রেকর্ডিং সামঞ্জস্য করুন এবং 1 মিনিট থেকে 31 মিনিট পর্যন্ত সামগ্রী থাকতে আপনার রেকর্ডিং শুরু করুন৷

যদি আপনার টিভি ইনপুট পরিষেবা স্টোরেজের অভাবের কারণে সময়-বদলকে সমর্থন করতে না পারে, তাহলে আপনাকে অবশ্যই সিস্টেমকে জানাতে হবে। টাইম-শিফটিং সমর্থন বিধিনিষেধ সম্পর্কে সিস্টেমকে কীভাবে অবহিত করা যায় সে সম্পর্কে আরও বিশদ বিবরণের জন্য, টাইম-শিফটিং স্ট্যাটাস সম্পর্কে সিস্টেমকে অবহিত করুন বিভাগটি দেখুন।

যখন ব্যবহারকারী একটি ভিন্ন চ্যানেলে স্যুইচ করে বা অন্যথায় তাদের প্লেব্যাক সেশন শেষ করে, তখন আপনার রেকর্ড করা সময়-বদল সংক্রান্ত ডেটা মুছুন।

সময় পরিবর্তনের অবস্থা সম্পর্কে সিস্টেমকে অবহিত করুন

যদি আপনার টিভি ইনপুট পরিষেবা টাইম-শিফটিং সমর্থন করে, একজন ব্যবহারকারী চ্যানেলে টিউন করলে onTune() এর বাস্তবায়নে notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE) কল করুন।

আপনার ইনপুট পরিষেবার কোনো সময়-বদল করার ক্ষমতা পরিবর্তন হলে সিস্টেমকে জানাতে, notifyTimeShiftStatusChanged(int) ব্যবহার করুন। উদাহরণস্বরূপ, যদি আপনার টিভি ইনপুট পরিষেবা স্টোরেজ স্পেস সীমাবদ্ধতা বা অন্যান্য কারণে সময়-বদলকে সমর্থন করতে না পারে, notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE) কল করুন।

যদি আপনার টিভি ইনপুট পরিষেবা টাইম-শিফটিংকে সমর্থন করতে না পারে, একটি প্লেব্যাক সেশন তৈরি হলে notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNSUPPORTED) কল করুন। সিস্টেমটি এমন কোনো ইনপুট পরিষেবাকে বিবেচনা করে যা notifyTimeShiftStatusChanged() একটি ইনপুট পরিষেবা হিসাবে কল করে না যা সময়-বদল সমর্থন করতে পারে না। এটি API স্তর 22 এবং তার আগের ব্যবহার করে ইনপুট পরিষেবাগুলিকে কভার করে৷

প্লেব্যাক সময় ট্র্যাক

টাইম-শিফটিং রেকর্ডিংয়ের শুরুর অবস্থান হল প্রথমতম নিখুঁত সময়ের অবস্থান, যুগের পর থেকে মিলিসেকেন্ডে, যা ব্যবহারকারী চাইতে পারেন। এটি সাধারণত যখন 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() এ আপনি যে বর্তমান সময়ের অবস্থান প্রদান করেন তার চেয়ে বেশি নয়। প্লেব্যাক কন্ট্রোল UI-তে সময় পরিবর্তনের সময়কাল আপডেট করতে সিস্টেম এই কলগুলি ব্যবহার করে।

প্লেব্যাক পরামিতি সমর্থন

সময় পরিবর্তনের সময় প্লেব্যাকের গতি পরিবর্তন করতে, সিস্টেম প্লেব্যাক পরামিতি ব্যবহার করে। উদাহরণস্বরূপ, যদি ব্যবহারকারী বর্তমান প্লেব্যাক রিওয়াইন্ড করার সিদ্ধান্ত নেয়, নতুন প্লেব্যাক প্যারামিটারগুলি নেতিবাচক প্লেব্যাক গতির সাথে আপনার অ্যাপে প্রেরণ করা হয়। টাইম-শিফটিং রিওয়াইন্ডিং বা দ্রুত-ফরোয়ার্ডিংয়ের জন্য প্লেব্যাকের গতির 2x বা 3x বিভিন্ন স্তরকেও সমর্থন করে।

সিস্টেমটি আপনার onTimeShiftSetPlaybackParams(PlaybackParams) পদ্ধতিকে একটি PlaybackParams অবজেক্টের সাথে কল করে যাতে বর্তমান সেশনের জন্য পরামিতি রয়েছে। আপনার মিডিয়া প্লেব্যাক ইঞ্জিন যথাযথভাবে কনফিগার করতে এই তথ্য ব্যবহার করুন।

যদি আপনার প্লেব্যাক ইঞ্জিন একটি প্যারামিটার সমর্থন না করে, তাহলে প্রত্যাশিত আচরণটি যতটা সম্ভব অনুকরণ করুন। উদাহরণস্বরূপ, যদি আপনার প্লেব্যাক ইঞ্জিন 2x গতি সমর্থন না করে, তাহলে প্রায় দ্বিগুণ প্লেব্যাক গতি অর্জন করতে আপনার প্লেব্যাক ইঞ্জিনে বারবার অনুসন্ধান অপারেশন ব্যবহার করুন।

পরামিতি সেট করার পরে, সেটিংস পরিবর্তন করবেন না যদি না ব্যবহারকারী হয় একটি প্লেব্যাক কমান্ড জারি করে যার জন্য একটি ভিন্ন প্যারামিটার প্রয়োজন বা একটি নতুন চ্যানেলে স্যুইচ করে৷