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

টাইম-শিফটিং লাইভ প্রোগ্রাম প্লেব্যাক করার সুবিধা দিতে প্রোগ্রামের ডেটার সংক্ষিপ্ত, অস্থায়ী ও রেকর্ড করা অংশ ব্যবহার করে। ব্যবহারকারীরা বর্তমান প্লেব্যাক সেশনের বাইরে এই টাইম-শিফটিং রেকর্ডিংগুলো চালাতে পারেন না। এর মানে হলো, তারা পরের দিন দেখার জন্য কোনো প্রোগ্রাম পজ করতে অথবা অন্য চ্যানেলে যাওয়ার সময় পরে দেখার জন্য প্রোগ্রামটি পজ করতে টাইম-শিফটিং ব্যবহার করতে পারেন না।
আপনার ব্যবহারকারীরা যাতে বর্তমান প্লেব্যাক সেশনের বাইরে দেখার জন্য প্রোগ্রামের বিষয়বস্তু রেকর্ড করতে পারে, তার জন্য টিভি রেকর্ডিং এপিআই ব্যবহার করুন।
সময়-স্থানান্তর সমর্থন যোগ করুন
আপনার টিভি ইনপুট সার্ভিসে টাইম-শিফটিং সাপোর্ট যোগ করতে হলে, আপনাকে আপনার TvInputService.Session ক্লাসে টাইম-শিফটিং এপিআইগুলো ইমপ্লিমেন্ট করতে হবে, আপনার অ্যাপে টাইম-শিফটিং রেকর্ডিংয়ের রেকর্ডিং ও প্লেব্যাক পরিচালনা করতে হবে এবং আপনার ইনপুট সার্ভিসটি যে টাইম-শিফটিং সাপোর্ট প্রদান করে, সে বিষয়ে সিস্টেমকে অবহিত করতে হবে।
আপনি যে TvInputService.Session মেথডগুলো ইমপ্লিমেন্ট করেন, সেগুলো হলো নিম্নরূপ:
-
onTimeShiftGetCurrentPosition(): মিলিসেকেন্ডে বর্তমান প্লেব্যাক পজিশন পাওয়ার জন্য সিস্টেম এই ফাংশনটি কল করে। আরও বিস্তারিত জানতে, "ট্র্যাক প্লেব্যাক টাইম" বিভাগটি দেখুন। -
onTimeShiftGetStartPosition(): বর্তমান টাইম-শিফট রেকর্ডিংয়ের শুরুর অবস্থান মিলিসেকেন্ডে জানার জন্য সিস্টেম এই ফাংশনটি কল করে। আরও বিস্তারিত জানতে, "ট্র্যাক প্লেব্যাক টাইম" বিভাগটি দেখুন। -
onTimeShiftPause(): যখন ব্যবহারকারী প্লেব্যাক থামায় তখন এটি কল করা হয়। -
onTimeShiftResume(): যখন ব্যবহারকারী প্লেব্যাক পুনরায় শুরু করেন তখন এটি কল করা হয়। -
onTimeShiftSeekTo(long): যখন সিস্টেমকে একটি নতুন সময় অবস্থানে যেতে হয় তখন এটি কল করা হয়। সাধারণত, নতুন অবস্থানটি শুরুর অবস্থান এবং বর্তমান অবস্থানের মধ্যে থাকে। -
onTimeShiftSetPlaybackParams(PlaybackParams): বর্তমান সেশনের জন্য প্লেব্যাক স্পিডের মতো প্লেব্যাক প্যারামিটার সরবরাহ করতে সিস্টেম দ্বারা কল করা হয়। আরও বিস্তারিত জানতে, "সাপোর্ট প্লেব্যাক প্যারামিটার" বিভাগটি দেখুন।
আপনার ইনপুট পরিষেবা যে টাইম-শিফটিং সমর্থন করে, তা সিস্টেমকে কীভাবে জানাবেন সে সম্পর্কে আরও তথ্যের জন্য , “সিস্টেমকে টাইম-শিফটিং স্ট্যাটাস সম্পর্কে অবহিত করুন” বিভাগটি দেখুন।
আপনি যদি আপনার TvInputService.Session ক্লাসটি ইমপ্লিমেন্ট করার জন্য TIF Companion Library ব্যবহার করেন, তাহলে আপনি স্বয়ংক্রিয়ভাবে ExoPlayer ব্যবহার করে এমন একটি টাইম-শিফটিং ইমপ্লিমেন্টেশন পেয়ে যাবেন। আপনি এই ইমপ্লিমেন্টেশনটি ব্যবহার করতে পারেন অথবা BaseTvInputService.Session এ থাকা টাইম-শিফটিং API মেথডগুলোকে ওভাররাইড করে আপনার নিজস্ব ইমপ্লিমেন্টেশন প্রদান করতে পারেন। TIF Companion Library ব্যবহারের বিষয়ে আরও তথ্যের জন্য, “Create a TV input service using the TIF Companion Library” দেখুন।
সেশন শুরু হলে বিষয়বস্তু রেকর্ড করুন
ব্যবহারকারী প্রোগ্রাম দেখার সময় সিলেক্ট বোতাম টিপে প্লেব্যাক কন্ট্রোলে গিয়ে অথবা রিমোট ডিভাইসের নির্দিষ্ট প্লেব্যাক কন্ট্রোল ব্যবহার করে চ্যানেলের প্লেব্যাক কন্ট্রোল অ্যাক্সেস করতে পারেন।
যেহেতু ব্যবহারকারী প্রোগ্রাম দেখার সময় যেকোনো মুহূর্তে টাইম-শিফটিং ব্যবহার করতে পারেন, তাই আপনার onTune() ইমপ্লিমেন্টেশনে ব্যবহারকারী কোনো চ্যানেলে টিউন করার সাথে সাথেই আপনার টিভি ইনপুট সার্ভিসকে টাইম-শিফটিং কন্টেন্ট রেকর্ড করা শুরু করতে হবে। এছাড়াও, "সিস্টেমকে টাইম-শিফটিং স্ট্যাটাস সম্পর্কে অবহিত করুন " বিভাগে বর্ণিত পদ্ধতি অনুযায়ী notifyTimeShiftStatusChanged(int) কল করে আপনাকে সিস্টেমকে জানাতে হবে যে আপনি রেকর্ডিং করতে সক্ষম।
রেকর্ডকৃত বিষয়বস্তুর সংরক্ষণ পরিচালনা করুন
আপনার টিভি ইনপুট সার্ভিসটি আপনার অ্যাপের নিজস্ব অ্যাপ স্টোরেজে টাইম-শিফটিং রেকর্ডিং সংরক্ষণ করার এবং সিস্টেম যখন আপনার টাইম-শিফটিং মেথড, যেমন onTimeShiftResume() , কল করে তখন কন্টেন্ট প্লেব্যাক করার জন্য দায়ী। যদি আপনার কন্টেন্ট ইতিমধ্যেই ক্লাউডে সংরক্ষিত থাকে এবং আপনার অ্যাপ ক্লাউডে টাইম-শিফটিং রেকর্ডিং পরিচালনা করতে পারে, তাহলে আপনি অ্যাপ স্টোরেজের পরিবর্তে ক্লাউড স্টোরেজ ব্যবহার করতে পারেন।
আপনার কন্টেন্টে যদি সুরক্ষিত উপাদান ব্যবহার করা হয়, তাহলে রেকর্ড করা কন্টেন্টের যথাযথ এনক্রিপশন এবং প্লেব্যাকের সময় কন্টেন্টের ডিক্রিপশনের দায়িত্ব আপনার টিভি ইনপুট সার্ভিসের।
যেহেতু রেকর্ড করা ভিডিও কন্টেন্টের জন্য প্রচুর স্টোরেজের প্রয়োজন হতে পারে, তাই সেশন প্লেব্যাকের সময় আপনাকে রেকর্ড করা কন্টেন্ট সাবধানে পরিচালনা করতে হবে। যদি প্লেব্যাক সেশনের সময়, টাইম-শিফটিংয়ের জন্য আপনার রেকর্ড ও সংরক্ষণ করার ক্ষমতার চেয়ে বেশি হয়ে যায়, তাহলে বর্তমান বাফার বজায় রেখে আপনার টাইম-শিফটিং রেকর্ডিং এমনভাবে সামঞ্জস্য করুন যাতে বর্তমান সময়টিও ধারণ করা হয়। উদাহরণস্বরূপ, যদি ব্যবহারকারী ৩১ মিনিট ধরে কন্টেন্ট প্লে করেন এবং আপনার সর্বোচ্চ টাইম-শিফটিং রেকর্ডিংয়ের আকার ৩০ মিনিট হয়, তাহলে আপনার রেকর্ডিং এবং শুরুর সময় এমনভাবে সামঞ্জস্য করুন যাতে এতে ১ মিনিট থেকে ৩১ মিনিট পর্যন্ত কন্টেন্ট থাকে।
স্টোরেজের অভাবে যদি আপনার টিভি ইনপুট সার্ভিস টাইম-শিফটিং সমর্থন করতে না পারে, তবে আপনাকে অবশ্যই সিস্টেমকে জানাতে হবে। টাইম-শিফটিং সমর্থনের সীমাবদ্ধতা সম্পর্কে সিস্টেমকে কীভাবে অবহিত করবেন, সে বিষয়ে আরও বিস্তারিত জানতে ‘টাইম-শিফটিং স্ট্যাটাস সম্পর্কে সিস্টেমকে অবহিত করুন’ অংশটি দেখুন।
যখন ব্যবহারকারী অন্য চ্যানেলে যান বা অন্য কোনোভাবে তাদের প্লেব্যাক সেশন শেষ করেন, তখন আপনার রেকর্ড করা টাইম-শিফটিং ডেটা মুছে ফেলুন।
সময় পরিবর্তনের অবস্থা সম্পর্কে সিস্টেমকে অবহিত করুন।
আপনার টিভি ইনপুট পরিষেবা যদি টাইম-শিফটিং সমর্থন করে, তাহলে কোনো ব্যবহারকারী একটি চ্যানেল টিউন করলে আপনার onTune() ফাংশনের ইমপ্লিমেন্টেশনে notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE) ফাংশনটি কল করুন।
আপনার ইনপুট সার্ভিসের সময়-পরিবর্তন ক্ষমতার কোনো পরিবর্তন হলে সিস্টেমকে জানাতে notifyTimeShiftStatusChanged(int) ব্যবহার করুন। উদাহরণস্বরূপ, যদি স্টোরেজ স্পেসের সীমাবদ্ধতা বা অন্য কোনো কারণে আপনার টিভি ইনপুট সার্ভিস সময়-পরিবর্তন সমর্থন করতে না পারে, তাহলে notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE) কল করুন।
যদি আপনার টিভি ইনপুট সার্ভিস টাইম-শিফটিং একেবারেই সাপোর্ট করতে না পারে, তাহলে একটি প্লেব্যাক সেশন তৈরি করার সময় notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNSUPPORTED) কল করুন। যে কোনো ইনপুট সার্ভিস যা কখনও notifyTimeShiftStatusChanged() কল করে না, সিস্টেম সেটিকে এমন একটি ইনপুট সার্ভিস হিসেবে গণ্য করে যা টাইম-শিফটিং সাপোর্ট করতে পারে না। এটি API লেভেল 22 এবং তার আগের সংস্করণ ব্যবহারকারী ইনপুট সার্ভিসগুলোর ক্ষেত্রে প্রযোজ্য।
ট্র্যাক প্লেব্যাকের সময়
একটি টাইম-শিফটিং রেকর্ডিংয়ের শুরুর অবস্থান হলো ইপক (epoch) থেকে মিলিসেকেন্ডে পরিমাপকৃত সবচেয়ে আগের পরম সময়ের অবস্থান, যেখানে ব্যবহারকারী সিক (seek) করতে পারেন। সাধারণত, 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 গতি সমর্থন না করে, তবে প্রায় দ্বিগুণ প্লেব্যাক গতি অর্জনের জন্য আপনার প্লেব্যাক ইঞ্জিনে বারবার সিক অপারেশন ব্যবহার করুন।
প্যারামিটারগুলো সেট করার পর, ব্যবহারকারী ভিন্ন প্যারামিটার প্রয়োজন এমন কোনো প্লেব্যাক কমান্ড না দিলে অথবা নতুন কোনো চ্যানেলে না গেলে, সেটিংস পরিবর্তন করবেন না।
,আপনার টিভি ইনপুট সার্ভিসে টাইম-শিফটিং এপিআই ব্যবহার করুন, যাতে ব্যবহারকারীরা আপনার সার্ভিস চ্যানেলগুলোর লাইভ প্রোগ্রাম পজ, রিওয়াইন্ড এবং ফাস্ট-ফরোয়ার্ড করতে পারে। আপনার অ্যাপ টাইম-শিফটিং সমর্থন করলে, ব্যবহারকারীরা আপনার কন্টেন্ট দেখার পদ্ধতিতে আরও বেশি স্বাধীনতা পায়:
- ব্যবহারকারীরা স্বল্প সময়ের জন্য কোনো বাধা সামলানোর সময় প্রোগ্রাম থামিয়ে রাখতে পারেন, ফলে তারা কোনো গুরুত্বপূর্ণ মুহূর্ত মিস করেন না।
- ব্যবহারকারীরা আগে দেখা বা আগ্রহহীন বিষয়বস্তু দ্রুতগতিতে এগিয়ে নিয়ে যেতে পারেন।
- ব্যবহারকারীরা অনুষ্ঠানের বিষয়বস্তুর পছন্দের মুহূর্তগুলো রিওয়াইন্ড করে পুনরায় দেখতে পারেন।

টাইম-শিফটিং লাইভ প্রোগ্রাম প্লেব্যাক করার সুবিধা দিতে প্রোগ্রামের ডেটার সংক্ষিপ্ত, অস্থায়ী ও রেকর্ড করা অংশ ব্যবহার করে। ব্যবহারকারীরা বর্তমান প্লেব্যাক সেশনের বাইরে এই টাইম-শিফটিং রেকর্ডিংগুলো চালাতে পারেন না। এর মানে হলো, তারা পরের দিন দেখার জন্য কোনো প্রোগ্রাম পজ করতে অথবা অন্য চ্যানেলে যাওয়ার সময় পরে দেখার জন্য প্রোগ্রামটি পজ করতে টাইম-শিফটিং ব্যবহার করতে পারেন না।
আপনার ব্যবহারকারীরা যাতে বর্তমান প্লেব্যাক সেশনের বাইরে দেখার জন্য প্রোগ্রামের বিষয়বস্তু রেকর্ড করতে পারে, তার জন্য টিভি রেকর্ডিং এপিআই ব্যবহার করুন।
সময়-স্থানান্তর সমর্থন যোগ করুন
আপনার টিভি ইনপুট সার্ভিসে টাইম-শিফটিং সাপোর্ট যোগ করতে হলে, আপনাকে আপনার TvInputService.Session ক্লাসে টাইম-শিফটিং এপিআইগুলো ইমপ্লিমেন্ট করতে হবে, আপনার অ্যাপে টাইম-শিফটিং রেকর্ডিংয়ের রেকর্ডিং ও প্লেব্যাক পরিচালনা করতে হবে এবং আপনার ইনপুট সার্ভিসটি যে টাইম-শিফটিং সাপোর্ট প্রদান করে, সে বিষয়ে সিস্টেমকে অবহিত করতে হবে।
আপনি যে TvInputService.Session মেথডগুলো ইমপ্লিমেন্ট করেন, সেগুলো হলো নিম্নরূপ:
-
onTimeShiftGetCurrentPosition(): মিলিসেকেন্ডে বর্তমান প্লেব্যাক পজিশন পাওয়ার জন্য সিস্টেম এই ফাংশনটি কল করে। আরও বিস্তারিত জানতে, "ট্র্যাক প্লেব্যাক টাইম" বিভাগটি দেখুন। -
onTimeShiftGetStartPosition(): বর্তমান টাইম-শিফট রেকর্ডিংয়ের শুরুর অবস্থান মিলিসেকেন্ডে জানার জন্য সিস্টেম এই ফাংশনটি কল করে। আরও বিস্তারিত জানতে, "ট্র্যাক প্লেব্যাক টাইম" বিভাগটি দেখুন। -
onTimeShiftPause(): যখন ব্যবহারকারী প্লেব্যাক থামায় তখন এটি কল করা হয়। -
onTimeShiftResume(): যখন ব্যবহারকারী প্লেব্যাক পুনরায় শুরু করেন তখন এটি কল করা হয়। -
onTimeShiftSeekTo(long): যখন সিস্টেমকে একটি নতুন সময় অবস্থানে যেতে হয় তখন এটি কল করা হয়। সাধারণত, নতুন অবস্থানটি শুরুর অবস্থান এবং বর্তমান অবস্থানের মধ্যে থাকে। -
onTimeShiftSetPlaybackParams(PlaybackParams): বর্তমান সেশনের জন্য প্লেব্যাক স্পিডের মতো প্লেব্যাক প্যারামিটার সরবরাহ করতে সিস্টেম দ্বারা কল করা হয়। আরও বিস্তারিত জানতে, "সাপোর্ট প্লেব্যাক প্যারামিটার" বিভাগটি দেখুন।
আপনার ইনপুট পরিষেবা যে টাইম-শিফটিং সমর্থন করে, তা সিস্টেমকে কীভাবে জানাবেন সে সম্পর্কে আরও তথ্যের জন্য , “সিস্টেমকে টাইম-শিফটিং স্ট্যাটাস সম্পর্কে অবহিত করুন” বিভাগটি দেখুন।
আপনি যদি আপনার TvInputService.Session ক্লাসটি ইমপ্লিমেন্ট করার জন্য TIF Companion Library ব্যবহার করেন, তাহলে আপনি স্বয়ংক্রিয়ভাবে ExoPlayer ব্যবহার করে এমন একটি টাইম-শিফটিং ইমপ্লিমেন্টেশন পেয়ে যাবেন। আপনি এই ইমপ্লিমেন্টেশনটি ব্যবহার করতে পারেন অথবা BaseTvInputService.Session এ থাকা টাইম-শিফটিং API মেথডগুলোকে ওভাররাইড করে আপনার নিজস্ব ইমপ্লিমেন্টেশন প্রদান করতে পারেন। TIF Companion Library ব্যবহারের বিষয়ে আরও তথ্যের জন্য, “Create a TV input service using the TIF Companion Library” দেখুন।
সেশন শুরু হলে বিষয়বস্তু রেকর্ড করুন
ব্যবহারকারী প্রোগ্রাম দেখার সময় সিলেক্ট বোতাম টিপে প্লেব্যাক কন্ট্রোলে গিয়ে অথবা রিমোট ডিভাইসের নির্দিষ্ট প্লেব্যাক কন্ট্রোল ব্যবহার করে চ্যানেলের প্লেব্যাক কন্ট্রোল অ্যাক্সেস করতে পারেন।
যেহেতু ব্যবহারকারী প্রোগ্রাম দেখার সময় যেকোনো মুহূর্তে টাইম-শিফটিং ব্যবহার করতে পারেন, তাই আপনার onTune() ইমপ্লিমেন্টেশনে ব্যবহারকারী কোনো চ্যানেলে টিউন করার সাথে সাথেই আপনার টিভি ইনপুট সার্ভিসকে টাইম-শিফটিং কন্টেন্ট রেকর্ড করা শুরু করতে হবে। এছাড়াও, "সিস্টেমকে টাইম-শিফটিং স্ট্যাটাস সম্পর্কে অবহিত করুন " বিভাগে বর্ণিত পদ্ধতি অনুযায়ী notifyTimeShiftStatusChanged(int) কল করে আপনাকে সিস্টেমকে জানাতে হবে যে আপনি রেকর্ডিং করতে সক্ষম।
রেকর্ডকৃত বিষয়বস্তুর সংরক্ষণ পরিচালনা করুন
আপনার টিভি ইনপুট সার্ভিসটি আপনার অ্যাপের নিজস্ব অ্যাপ স্টোরেজে টাইম-শিফটিং রেকর্ডিং সংরক্ষণ করার এবং সিস্টেম যখন আপনার টাইম-শিফটিং মেথড, যেমন onTimeShiftResume() , কল করে তখন কন্টেন্ট প্লেব্যাক করার জন্য দায়ী। যদি আপনার কন্টেন্ট ইতিমধ্যেই ক্লাউডে সংরক্ষিত থাকে এবং আপনার অ্যাপ ক্লাউডে টাইম-শিফটিং রেকর্ডিং পরিচালনা করতে পারে, তাহলে আপনি অ্যাপ স্টোরেজের পরিবর্তে ক্লাউড স্টোরেজ ব্যবহার করতে পারেন।
আপনার কন্টেন্টে যদি সুরক্ষিত উপাদান ব্যবহার করা হয়, তাহলে রেকর্ড করা কন্টেন্টের যথাযথ এনক্রিপশন এবং প্লেব্যাকের সময় কন্টেন্টের ডিক্রিপশনের দায়িত্ব আপনার টিভি ইনপুট সার্ভিসের।
যেহেতু রেকর্ড করা ভিডিও কন্টেন্টের জন্য প্রচুর স্টোরেজের প্রয়োজন হতে পারে, তাই সেশন প্লেব্যাকের সময় আপনাকে রেকর্ড করা কন্টেন্ট সাবধানে পরিচালনা করতে হবে। যদি প্লেব্যাক সেশনের সময়, টাইম-শিফটিংয়ের জন্য আপনার রেকর্ড ও সংরক্ষণ করার ক্ষমতার চেয়ে বেশি হয়ে যায়, তাহলে বর্তমান বাফার বজায় রেখে আপনার টাইম-শিফটিং রেকর্ডিং এমনভাবে সামঞ্জস্য করুন যাতে বর্তমান সময়টিও ধারণ করা হয়। উদাহরণস্বরূপ, যদি ব্যবহারকারী ৩১ মিনিট ধরে কন্টেন্ট প্লে করেন এবং আপনার সর্বোচ্চ টাইম-শিফটিং রেকর্ডিংয়ের আকার ৩০ মিনিট হয়, তাহলে আপনার রেকর্ডিং এবং শুরুর সময় এমনভাবে সামঞ্জস্য করুন যাতে এতে ১ মিনিট থেকে ৩১ মিনিট পর্যন্ত কন্টেন্ট থাকে।
স্টোরেজের অভাবে যদি আপনার টিভি ইনপুট সার্ভিস টাইম-শিফটিং সমর্থন করতে না পারে, তবে আপনাকে অবশ্যই সিস্টেমকে জানাতে হবে। টাইম-শিফটিং সমর্থনের সীমাবদ্ধতা সম্পর্কে সিস্টেমকে কীভাবে অবহিত করবেন, সে বিষয়ে আরও বিস্তারিত জানতে ‘টাইম-শিফটিং স্ট্যাটাস সম্পর্কে সিস্টেমকে অবহিত করুন’ অংশটি দেখুন।
যখন ব্যবহারকারী অন্য চ্যানেলে যান বা অন্য কোনোভাবে তাদের প্লেব্যাক সেশন শেষ করেন, তখন আপনার রেকর্ড করা টাইম-শিফটিং ডেটা মুছে ফেলুন।
সময় পরিবর্তনের অবস্থা সম্পর্কে সিস্টেমকে অবহিত করুন।
আপনার টিভি ইনপুট পরিষেবা যদি টাইম-শিফটিং সমর্থন করে, তাহলে কোনো ব্যবহারকারী একটি চ্যানেল টিউন করলে আপনার onTune() ফাংশনের ইমপ্লিমেন্টেশনে notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE) ফাংশনটি কল করুন।
আপনার ইনপুট সার্ভিসের সময়-পরিবর্তন ক্ষমতার কোনো পরিবর্তন হলে সিস্টেমকে জানাতে notifyTimeShiftStatusChanged(int) ব্যবহার করুন। উদাহরণস্বরূপ, যদি স্টোরেজ স্পেসের সীমাবদ্ধতা বা অন্য কোনো কারণে আপনার টিভি ইনপুট সার্ভিস সময়-পরিবর্তন সমর্থন করতে না পারে, তাহলে notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE) কল করুন।
যদি আপনার টিভি ইনপুট সার্ভিস টাইম-শিফটিং একেবারেই সাপোর্ট করতে না পারে, তাহলে একটি প্লেব্যাক সেশন তৈরি করার সময় notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNSUPPORTED) কল করুন। যে কোনো ইনপুট সার্ভিস যা কখনও notifyTimeShiftStatusChanged() কল করে না, সিস্টেম সেটিকে এমন একটি ইনপুট সার্ভিস হিসেবে গণ্য করে যা টাইম-শিফটিং সাপোর্ট করতে পারে না। এটি API লেভেল 22 এবং তার আগের সংস্করণ ব্যবহারকারী ইনপুট সার্ভিসগুলোর ক্ষেত্রে প্রযোজ্য।
ট্র্যাক প্লেব্যাকের সময়
একটি টাইম-শিফটিং রেকর্ডিংয়ের শুরুর অবস্থান হলো ইপক (epoch) থেকে মিলিসেকেন্ডে পরিমাপকৃত সবচেয়ে আগের পরম সময়ের অবস্থান, যেখানে ব্যবহারকারী সিক (seek) করতে পারেন। সাধারণত, 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 গতি সমর্থন না করে, তবে প্রায় দ্বিগুণ প্লেব্যাক গতি অর্জনের জন্য আপনার প্লেব্যাক ইঞ্জিনে বারবার সিক অপারেশন ব্যবহার করুন।
প্যারামিটারগুলো সেট করার পর, ব্যবহারকারী ভিন্ন প্যারামিটার প্রয়োজন এমন কোনো প্লেব্যাক কমান্ড না দিলে অথবা নতুন কোনো চ্যানেলে না গেলে, সেটিংস পরিবর্তন করবেন না।
,আপনার টিভি ইনপুট সার্ভিসে টাইম-শিফটিং এপিআই ব্যবহার করুন, যাতে ব্যবহারকারীরা আপনার সার্ভিস চ্যানেলগুলোর লাইভ প্রোগ্রাম পজ, রিওয়াইন্ড এবং ফাস্ট-ফরোয়ার্ড করতে পারে। আপনার অ্যাপ টাইম-শিফটিং সমর্থন করলে, ব্যবহারকারীরা আপনার কন্টেন্ট দেখার পদ্ধতিতে আরও বেশি স্বাধীনতা পায়:
- ব্যবহারকারীরা স্বল্প সময়ের জন্য কোনো বাধা সামলানোর সময় প্রোগ্রাম থামিয়ে রাখতে পারেন, ফলে তারা কোনো গুরুত্বপূর্ণ মুহূর্ত মিস করেন না।
- ব্যবহারকারীরা আগে দেখা বা আগ্রহহীন বিষয়বস্তু দ্রুতগতিতে এগিয়ে নিয়ে যেতে পারেন।
- ব্যবহারকারীরা অনুষ্ঠানের বিষয়বস্তুর পছন্দের মুহূর্তগুলো রিওয়াইন্ড করে পুনরায় দেখতে পারেন।

টাইম-শিফটিং লাইভ প্রোগ্রাম প্লেব্যাক করার সুবিধা দিতে প্রোগ্রামের ডেটার সংক্ষিপ্ত, অস্থায়ী ও রেকর্ড করা অংশ ব্যবহার করে। ব্যবহারকারীরা বর্তমান প্লেব্যাক সেশনের বাইরে এই টাইম-শিফটিং রেকর্ডিংগুলো চালাতে পারেন না। এর মানে হলো, তারা পরের দিন দেখার জন্য কোনো প্রোগ্রাম পজ করতে অথবা অন্য চ্যানেলে যাওয়ার সময় পরে দেখার জন্য প্রোগ্রামটি পজ করতে টাইম-শিফটিং ব্যবহার করতে পারেন না।
আপনার ব্যবহারকারীরা যাতে বর্তমান প্লেব্যাক সেশনের বাইরে দেখার জন্য প্রোগ্রামের বিষয়বস্তু রেকর্ড করতে পারে, তার জন্য টিভি রেকর্ডিং এপিআই ব্যবহার করুন।
সময়-স্থানান্তর সমর্থন যোগ করুন
আপনার টিভি ইনপুট সার্ভিসে টাইম-শিফটিং সাপোর্ট যোগ করতে হলে, আপনাকে আপনার TvInputService.Session ক্লাসে টাইম-শিফটিং এপিআইগুলো ইমপ্লিমেন্ট করতে হবে, আপনার অ্যাপে টাইম-শিফটিং রেকর্ডিংয়ের রেকর্ডিং ও প্লেব্যাক পরিচালনা করতে হবে এবং আপনার ইনপুট সার্ভিসটি যে টাইম-শিফটিং সাপোর্ট প্রদান করে, সে বিষয়ে সিস্টেমকে অবহিত করতে হবে।
আপনি যে TvInputService.Session মেথডগুলো ইমপ্লিমেন্ট করেন, সেগুলো হলো নিম্নরূপ:
-
onTimeShiftGetCurrentPosition(): মিলিসেকেন্ডে বর্তমান প্লেব্যাক পজিশন পাওয়ার জন্য সিস্টেম এই ফাংশনটি কল করে। আরও বিস্তারিত জানতে, "ট্র্যাক প্লেব্যাক টাইম" বিভাগটি দেখুন। -
onTimeShiftGetStartPosition(): বর্তমান টাইম-শিফট রেকর্ডিংয়ের শুরুর অবস্থান মিলিসেকেন্ডে জানার জন্য সিস্টেম এই ফাংশনটি কল করে। আরও বিস্তারিত জানতে, "ট্র্যাক প্লেব্যাক টাইম" বিভাগটি দেখুন। -
onTimeShiftPause(): যখন ব্যবহারকারী প্লেব্যাক থামায় তখন এটি কল করা হয়। -
onTimeShiftResume(): যখন ব্যবহারকারী প্লেব্যাক পুনরায় শুরু করেন তখন এটি কল করা হয়। -
onTimeShiftSeekTo(long): যখন সিস্টেমকে একটি নতুন সময় অবস্থানে যেতে হয় তখন এটি কল করা হয়। সাধারণত, নতুন অবস্থানটি শুরুর অবস্থান এবং বর্তমান অবস্থানের মধ্যে থাকে। -
onTimeShiftSetPlaybackParams(PlaybackParams): বর্তমান সেশনের জন্য প্লেব্যাক স্পিডের মতো প্লেব্যাক প্যারামিটার সরবরাহ করতে সিস্টেম দ্বারা কল করা হয়। আরও বিস্তারিত জানতে, "সাপোর্ট প্লেব্যাক প্যারামিটার" বিভাগটি দেখুন।
আপনার ইনপুট পরিষেবা যে টাইম-শিফটিং সমর্থন করে, তা সিস্টেমকে কীভাবে জানাবেন সে সম্পর্কে আরও তথ্যের জন্য , “সিস্টেমকে টাইম-শিফটিং স্ট্যাটাস সম্পর্কে অবহিত করুন” বিভাগটি দেখুন।
আপনি যদি আপনার TvInputService.Session ক্লাসটি ইমপ্লিমেন্ট করার জন্য TIF Companion Library ব্যবহার করেন, তাহলে আপনি স্বয়ংক্রিয়ভাবে ExoPlayer ব্যবহার করে এমন একটি টাইম-শিফটিং ইমপ্লিমেন্টেশন পেয়ে যাবেন। আপনি এই ইমপ্লিমেন্টেশনটি ব্যবহার করতে পারেন অথবা BaseTvInputService.Session এ থাকা টাইম-শিফটিং API মেথডগুলোকে ওভাররাইড করে আপনার নিজস্ব ইমপ্লিমেন্টেশন প্রদান করতে পারেন। TIF Companion Library ব্যবহারের বিষয়ে আরও তথ্যের জন্য, “Create a TV input service using the TIF Companion Library” দেখুন।
সেশন শুরু হলে বিষয়বস্তু রেকর্ড করুন
ব্যবহারকারী প্রোগ্রাম দেখার সময় সিলেক্ট বোতাম টিপে প্লেব্যাক কন্ট্রোলে গিয়ে অথবা রিমোট ডিভাইসের নির্দিষ্ট প্লেব্যাক কন্ট্রোল ব্যবহার করে চ্যানেলের প্লেব্যাক কন্ট্রোল অ্যাক্সেস করতে পারেন।
যেহেতু ব্যবহারকারী প্রোগ্রাম দেখার সময় যেকোনো মুহূর্তে টাইম-শিফটিং ব্যবহার করতে পারেন, তাই আপনার onTune() ইমপ্লিমেন্টেশনে ব্যবহারকারী কোনো চ্যানেলে টিউন করার সাথে সাথেই আপনার টিভি ইনপুট সার্ভিসকে টাইম-শিফটিং কন্টেন্ট রেকর্ড করা শুরু করতে হবে। এছাড়াও, "সিস্টেমকে টাইম-শিফটিং স্ট্যাটাস সম্পর্কে অবহিত করুন " বিভাগে বর্ণিত পদ্ধতি অনুযায়ী notifyTimeShiftStatusChanged(int) কল করে আপনাকে সিস্টেমকে জানাতে হবে যে আপনি রেকর্ডিং করতে সক্ষম।
রেকর্ডকৃত বিষয়বস্তুর সংরক্ষণ পরিচালনা করুন
আপনার টিভি ইনপুট সার্ভিসটি আপনার অ্যাপের নিজস্ব অ্যাপ স্টোরেজে টাইম-শিফটিং রেকর্ডিং সংরক্ষণ করার এবং সিস্টেম যখন আপনার টাইম-শিফটিং মেথড, যেমন onTimeShiftResume() , কল করে তখন কন্টেন্ট প্লেব্যাক করার জন্য দায়ী। যদি আপনার কন্টেন্ট ইতিমধ্যেই ক্লাউডে সংরক্ষিত থাকে এবং আপনার অ্যাপ ক্লাউডে টাইম-শিফটিং রেকর্ডিং পরিচালনা করতে পারে, তাহলে আপনি অ্যাপ স্টোরেজের পরিবর্তে ক্লাউড স্টোরেজ ব্যবহার করতে পারেন।
আপনার কন্টেন্টে যদি সুরক্ষিত উপাদান ব্যবহার করা হয়, তাহলে রেকর্ড করা কন্টেন্টের যথাযথ এনক্রিপশন এবং প্লেব্যাকের সময় কন্টেন্টের ডিক্রিপশনের দায়িত্ব আপনার টিভি ইনপুট সার্ভিসের।
যেহেতু রেকর্ড করা ভিডিও কন্টেন্টের জন্য প্রচুর স্টোরেজের প্রয়োজন হতে পারে, তাই সেশন প্লেব্যাকের সময় আপনাকে রেকর্ড করা কন্টেন্ট সাবধানে পরিচালনা করতে হবে। যদি প্লেব্যাক সেশনের সময়, টাইম-শিফটিংয়ের জন্য আপনার রেকর্ড ও সংরক্ষণ করার ক্ষমতার চেয়ে বেশি হয়ে যায়, তাহলে বর্তমান বাফার বজায় রেখে আপনার টাইম-শিফটিং রেকর্ডিং এমনভাবে সামঞ্জস্য করুন যাতে বর্তমান সময়টিও ধারণ করা হয়। উদাহরণস্বরূপ, যদি ব্যবহারকারী ৩১ মিনিট ধরে কন্টেন্ট প্লে করেন এবং আপনার সর্বোচ্চ টাইম-শিফটিং রেকর্ডিংয়ের আকার ৩০ মিনিট হয়, তাহলে আপনার রেকর্ডিং এবং শুরুর সময় এমনভাবে সামঞ্জস্য করুন যাতে এতে ১ মিনিট থেকে ৩১ মিনিট পর্যন্ত কন্টেন্ট থাকে।
স্টোরেজের অভাবে যদি আপনার টিভি ইনপুট সার্ভিস টাইম-শিফটিং সমর্থন করতে না পারে, তবে আপনাকে অবশ্যই সিস্টেমকে জানাতে হবে। টাইম-শিফটিং সমর্থনের সীমাবদ্ধতা সম্পর্কে সিস্টেমকে কীভাবে অবহিত করবেন, সে বিষয়ে আরও বিস্তারিত জানতে ‘টাইম-শিফটিং স্ট্যাটাস সম্পর্কে সিস্টেমকে অবহিত করুন’ অংশটি দেখুন।
যখন ব্যবহারকারী অন্য চ্যানেলে যান বা অন্য কোনোভাবে তাদের প্লেব্যাক সেশন শেষ করেন, তখন আপনার রেকর্ড করা টাইম-শিফটিং ডেটা মুছে ফেলুন।
সময় পরিবর্তনের অবস্থা সম্পর্কে সিস্টেমকে অবহিত করুন।
আপনার টিভি ইনপুট পরিষেবা যদি টাইম-শিফটিং সমর্থন করে, তাহলে কোনো ব্যবহারকারী একটি চ্যানেল টিউন করলে আপনার onTune() ফাংশনের ইমপ্লিমেন্টেশনে notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE) ফাংশনটি কল করুন।
আপনার ইনপুট সার্ভিসের সময়-পরিবর্তন ক্ষমতার কোনো পরিবর্তন হলে সিস্টেমকে জানাতে notifyTimeShiftStatusChanged(int) ব্যবহার করুন। উদাহরণস্বরূপ, যদি স্টোরেজ স্পেসের সীমাবদ্ধতা বা অন্য কোনো কারণে আপনার টিভি ইনপুট সার্ভিস সময়-পরিবর্তন সমর্থন করতে না পারে, তাহলে notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE) কল করুন।
যদি আপনার টিভি ইনপুট সার্ভিস টাইম-শিফটিং একেবারেই সাপোর্ট করতে না পারে, তাহলে একটি প্লেব্যাক সেশন তৈরি করার সময় notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNSUPPORTED) কল করুন। যে কোনো ইনপুট সার্ভিস যা কখনও notifyTimeShiftStatusChanged() কল করে না, সিস্টেম সেটিকে এমন একটি ইনপুট সার্ভিস হিসেবে গণ্য করে যা টাইম-শিফটিং সাপোর্ট করতে পারে না। এটি API লেভেল 22 এবং তার আগের সংস্করণ ব্যবহারকারী ইনপুট সার্ভিসগুলোর ক্ষেত্রে প্রযোজ্য।
ট্র্যাক প্লেব্যাকের সময়
একটি টাইম-শিফটিং রেকর্ডিংয়ের শুরুর অবস্থান হলো ইপক (epoch) থেকে মিলিসেকেন্ডে পরিমাপকৃত সবচেয়ে আগের পরম সময়ের অবস্থান, যেখানে ব্যবহারকারী সিক (seek) করতে পারেন। সাধারণত, 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 গতি সমর্থন না করে, তবে প্রায় দ্বিগুণ প্লেব্যাক গতি অর্জনের জন্য আপনার প্লেব্যাক ইঞ্জিনে বারবার সিক অপারেশন ব্যবহার করুন।
প্যারামিটারগুলো সেট করার পর, ব্যবহারকারী ভিন্ন প্যারামিটার প্রয়োজন এমন কোনো প্লেব্যাক কমান্ড না দিলে অথবা নতুন কোনো চ্যানেলে না গেলে, সেটিংস পরিবর্তন করবেন না।
,আপনার টিভি ইনপুট সার্ভিসে টাইম-শিফটিং এপিআই ব্যবহার করুন, যাতে ব্যবহারকারীরা আপনার সার্ভিস চ্যানেলগুলোর লাইভ প্রোগ্রাম পজ, রিওয়াইন্ড এবং ফাস্ট-ফরোয়ার্ড করতে পারে। আপনার অ্যাপ টাইম-শিফটিং সমর্থন করলে, ব্যবহারকারীরা আপনার কন্টেন্ট দেখার পদ্ধতিতে আরও বেশি স্বাধীনতা পায়:
- ব্যবহারকারীরা স্বল্প সময়ের জন্য কোনো বাধা সামলানোর সময় প্রোগ্রাম থামিয়ে রাখতে পারেন, ফলে তারা কোনো গুরুত্বপূর্ণ মুহূর্ত মিস করেন না।
- ব্যবহারকারীরা আগে দেখা বা আগ্রহহীন বিষয়বস্তু দ্রুতগতিতে এগিয়ে নিয়ে যেতে পারেন।
- ব্যবহারকারীরা অনুষ্ঠানের বিষয়বস্তুর পছন্দের মুহূর্তগুলো রিওয়াইন্ড করে পুনরায় দেখতে পারেন।

টাইম-শিফটিং লাইভ প্রোগ্রাম প্লেব্যাক করার সুবিধা দিতে প্রোগ্রামের ডেটার সংক্ষিপ্ত, অস্থায়ী ও রেকর্ড করা অংশ ব্যবহার করে। ব্যবহারকারীরা বর্তমান প্লেব্যাক সেশনের বাইরে এই টাইম-শিফটিং রেকর্ডিংগুলো চালাতে পারেন না। এর মানে হলো, তারা পরের দিন দেখার জন্য কোনো প্রোগ্রাম পজ করতে অথবা অন্য চ্যানেলে যাওয়ার সময় পরে দেখার জন্য প্রোগ্রামটি পজ করতে টাইম-শিফটিং ব্যবহার করতে পারেন না।
আপনার ব্যবহারকারীরা যাতে বর্তমান প্লেব্যাক সেশনের বাইরে দেখার জন্য প্রোগ্রামের বিষয়বস্তু রেকর্ড করতে পারে, তার জন্য টিভি রেকর্ডিং এপিআই ব্যবহার করুন।
সময়-স্থানান্তর সমর্থন যোগ করুন
আপনার টিভি ইনপুট সার্ভিসে টাইম-শিফটিং সাপোর্ট যোগ করতে হলে, আপনাকে আপনার TvInputService.Session ক্লাসে টাইম-শিফটিং এপিআইগুলো ইমপ্লিমেন্ট করতে হবে, আপনার অ্যাপে টাইম-শিফটিং রেকর্ডিংয়ের রেকর্ডিং ও প্লেব্যাক পরিচালনা করতে হবে এবং আপনার ইনপুট সার্ভিসটি যে টাইম-শিফটিং সাপোর্ট প্রদান করে, সে বিষয়ে সিস্টেমকে অবহিত করতে হবে।
আপনি যে TvInputService.Session মেথডগুলো ইমপ্লিমেন্ট করেন, সেগুলো হলো নিম্নরূপ:
-
onTimeShiftGetCurrentPosition(): মিলিসেকেন্ডে বর্তমান প্লেব্যাক পজিশন পাওয়ার জন্য সিস্টেম এই ফাংশনটি কল করে। আরও বিস্তারিত জানতে, "ট্র্যাক প্লেব্যাক টাইম" বিভাগটি দেখুন। -
onTimeShiftGetStartPosition(): বর্তমান টাইম-শিফট রেকর্ডিংয়ের শুরুর অবস্থান মিলিসেকেন্ডে জানার জন্য সিস্টেম এই ফাংশনটি কল করে। আরও বিস্তারিত জানতে, "ট্র্যাক প্লেব্যাক টাইম" বিভাগটি দেখুন। -
onTimeShiftPause(): যখন ব্যবহারকারী প্লেব্যাক থামায় তখন এটি কল করা হয়। -
onTimeShiftResume(): যখন ব্যবহারকারী প্লেব্যাক পুনরায় শুরু করেন তখন এটি কল করা হয়। -
onTimeShiftSeekTo(long): যখন সিস্টেমকে একটি নতুন সময় অবস্থানে যেতে হয় তখন এটি কল করা হয়। সাধারণত, নতুন অবস্থানটি শুরুর অবস্থান এবং বর্তমান অবস্থানের মধ্যে থাকে। -
onTimeShiftSetPlaybackParams(PlaybackParams): বর্তমান সেশনের জন্য প্লেব্যাক স্পিডের মতো প্লেব্যাক প্যারামিটার সরবরাহ করতে সিস্টেম দ্বারা কল করা হয়। আরও বিস্তারিত জানতে, "সাপোর্ট প্লেব্যাক প্যারামিটার" বিভাগটি দেখুন।
আপনার ইনপুট পরিষেবা যে টাইম-শিফটিং সমর্থন করে, তা সিস্টেমকে কীভাবে জানাবেন সে সম্পর্কে আরও তথ্যের জন্য , “সিস্টেমকে টাইম-শিফটিং স্ট্যাটাস সম্পর্কে অবহিত করুন” বিভাগটি দেখুন।
আপনি যদি আপনার TvInputService.Session ক্লাসটি ইমপ্লিমেন্ট করার জন্য TIF Companion Library ব্যবহার করেন, তাহলে আপনি স্বয়ংক্রিয়ভাবে ExoPlayer ব্যবহার করে এমন একটি টাইম-শিফটিং ইমপ্লিমেন্টেশন পেয়ে যাবেন। আপনি এই ইমপ্লিমেন্টেশনটি ব্যবহার করতে পারেন অথবা BaseTvInputService.Session এ থাকা টাইম-শিফটিং API মেথডগুলোকে ওভাররাইড করে আপনার নিজস্ব ইমপ্লিমেন্টেশন প্রদান করতে পারেন। TIF Companion Library ব্যবহারের বিষয়ে আরও তথ্যের জন্য, “Create a TV input service using the TIF Companion Library” দেখুন।
সেশন শুরু হলে বিষয়বস্তু রেকর্ড করুন
ব্যবহারকারী প্রোগ্রাম দেখার সময় সিলেক্ট বোতাম টিপে প্লেব্যাক কন্ট্রোলে গিয়ে অথবা রিমোট ডিভাইসের নির্দিষ্ট প্লেব্যাক কন্ট্রোল ব্যবহার করে চ্যানেলের প্লেব্যাক কন্ট্রোল অ্যাক্সেস করতে পারেন।
যেহেতু ব্যবহারকারী প্রোগ্রাম দেখার সময় যেকোনো মুহূর্তে টাইম-শিফটিং ব্যবহার করতে পারেন, তাই আপনার onTune() ইমপ্লিমেন্টেশনে ব্যবহারকারী কোনো চ্যানেলে টিউন করার সাথে সাথেই আপনার টিভি ইনপুট সার্ভিসকে টাইম-শিফটিং কন্টেন্ট রেকর্ড করা শুরু করতে হবে। এছাড়াও, "সিস্টেমকে টাইম-শিফটিং স্ট্যাটাস সম্পর্কে অবহিত করুন " বিভাগে বর্ণিত পদ্ধতি অনুযায়ী notifyTimeShiftStatusChanged(int) কল করে আপনাকে সিস্টেমকে জানাতে হবে যে আপনি রেকর্ডিং করতে সক্ষম।
রেকর্ডকৃত বিষয়বস্তুর সংরক্ষণ পরিচালনা করুন
আপনার টিভি ইনপুট সার্ভিসটি আপনার অ্যাপের নিজস্ব অ্যাপ স্টোরেজে টাইম-শিফটিং রেকর্ডিং সংরক্ষণ করার এবং সিস্টেম যখন আপনার টাইম-শিফটিং মেথড, যেমন onTimeShiftResume() , কল করে তখন কন্টেন্ট প্লেব্যাক করার জন্য দায়ী। যদি আপনার কন্টেন্ট ইতিমধ্যেই ক্লাউডে সংরক্ষিত থাকে এবং আপনার অ্যাপ ক্লাউডে টাইম-শিফটিং রেকর্ডিং পরিচালনা করতে পারে, তাহলে আপনি অ্যাপ স্টোরেজের পরিবর্তে ক্লাউড স্টোরেজ ব্যবহার করতে পারেন।
আপনার কন্টেন্টে যদি সুরক্ষিত উপাদান ব্যবহার করা হয়, তাহলে রেকর্ড করা কন্টেন্টের যথাযথ এনক্রিপশন এবং প্লেব্যাকের সময় কন্টেন্টের ডিক্রিপশনের দায়িত্ব আপনার টিভি ইনপুট সার্ভিসের।
যেহেতু রেকর্ড করা ভিডিও কন্টেন্টের জন্য প্রচুর স্টোরেজের প্রয়োজন হতে পারে, তাই সেশন প্লেব্যাকের সময় আপনাকে রেকর্ড করা কন্টেন্ট সাবধানে পরিচালনা করতে হবে। যদি প্লেব্যাক সেশনের সময়, টাইম-শিফটিংয়ের জন্য আপনার রেকর্ড ও সংরক্ষণ করার ক্ষমতার চেয়ে বেশি হয়ে যায়, তাহলে বর্তমান বাফার বজায় রেখে আপনার টাইম-শিফটিং রেকর্ডিং এমনভাবে সামঞ্জস্য করুন যাতে বর্তমান সময়টিও ধারণ করা হয়। উদাহরণস্বরূপ, যদি ব্যবহারকারী ৩১ মিনিট ধরে কন্টেন্ট প্লে করেন এবং আপনার সর্বোচ্চ টাইম-শিফটিং রেকর্ডিংয়ের আকার ৩০ মিনিট হয়, তাহলে আপনার রেকর্ডিং এবং শুরুর সময় এমনভাবে সামঞ্জস্য করুন যাতে এতে ১ মিনিট থেকে ৩১ মিনিট পর্যন্ত কন্টেন্ট থাকে।
স্টোরেজের অভাবে যদি আপনার টিভি ইনপুট সার্ভিস টাইম-শিফটিং সমর্থন করতে না পারে, তবে আপনাকে অবশ্যই সিস্টেমকে জানাতে হবে। টাইম-শিফটিং সমর্থনের সীমাবদ্ধতা সম্পর্কে সিস্টেমকে কীভাবে অবহিত করবেন, সে বিষয়ে আরও বিস্তারিত জানতে ‘টাইম-শিফটিং স্ট্যাটাস সম্পর্কে সিস্টেমকে অবহিত করুন’ অংশটি দেখুন।
যখন ব্যবহারকারী অন্য চ্যানেলে যান বা অন্য কোনোভাবে তাদের প্লেব্যাক সেশন শেষ করেন, তখন আপনার রেকর্ড করা টাইম-শিফটিং ডেটা মুছে ফেলুন।
সময় পরিবর্তনের অবস্থা সম্পর্কে সিস্টেমকে অবহিত করুন।
আপনার টিভি ইনপুট পরিষেবা যদি টাইম-শিফটিং সমর্থন করে, তাহলে কোনো ব্যবহারকারী একটি চ্যানেল টিউন করলে আপনার onTune() ফাংশনের ইমপ্লিমেন্টেশনে notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE) ফাংশনটি কল করুন।
আপনার ইনপুট সার্ভিসের সময়-পরিবর্তন ক্ষমতার কোনো পরিবর্তন হলে সিস্টেমকে জানাতে notifyTimeShiftStatusChanged(int) ব্যবহার করুন। উদাহরণস্বরূপ, যদি স্টোরেজ স্পেসের সীমাবদ্ধতা বা অন্য কোনো কারণে আপনার টিভি ইনপুট সার্ভিস সময়-পরিবর্তন সমর্থন করতে না পারে, তাহলে notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE) কল করুন।
যদি আপনার টিভি ইনপুট সার্ভিস টাইম-শিফটিং একেবারেই সাপোর্ট করতে না পারে, তাহলে একটি প্লেব্যাক সেশন তৈরি করার সময় notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNSUPPORTED) কল করুন। যে কোনো ইনপুট সার্ভিস যা কখনও notifyTimeShiftStatusChanged() কল করে না, সিস্টেম সেটিকে এমন একটি ইনপুট সার্ভিস হিসেবে গণ্য করে যা টাইম-শিফটিং সাপোর্ট করতে পারে না। এটি API লেভেল 22 এবং তার আগের সংস্করণ ব্যবহারকারী ইনপুট সার্ভিসগুলোর ক্ষেত্রে প্রযোজ্য।
ট্র্যাক প্লেব্যাকের সময়
একটি টাইম-শিফটিং রেকর্ডিংয়ের শুরুর অবস্থান হলো ইপক (epoch) থেকে মিলিসেকেন্ডে পরিমাপকৃত সবচেয়ে আগের পরম সময়ের অবস্থান, যেখানে ব্যবহারকারী সিক (seek) করতে পারেন। সাধারণত, onTune() কল করার পর যখন ভিডিও প্লেব্যাক শুরু হয়, তখন এই সময়টিই নির্ধারিত হয়। তবে, যখন ব্যবহারকারী আপনার অ্যাপের রেকর্ড করার ক্ষমতার চেয়ে বেশি পরিমাণ কন্টেন্ট দেখেন, তখন আপনাকে টাইম-শিফটিংয়ের জন্য একটি নতুন সেগমেন্ট রেকর্ড করা শুরু করতে হবে এবং সেই অনুযায়ী আপনার শুরুর সময় আপডেট করতে হবে।
The current position of a time-shifting recording is the current playback position, in milliseconds since the epoch. This position changes continuously during playback. Typically, you can use your playback engine to determine this value, as shown in the following example:
কোটলিন
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; }
Ensure that the start time you provide when the system calls your onTimeShiftGetStartPosition() is never greater than the current time position you provide in onTimeShiftGetCurrentPosition() . The system uses these calls to update the time-shifting duration in the playback controls UI.
Support playback parameters
To change playback speed during time-shifting, the system uses playback parameters. For example, if the user decides to rewind the current playback, new playback parameters are passed to your app with a negative playback speed. Time-shifting also supports several different levels, 2x or 3x, of playback speed for rewinding or fast-forwarding.
The system calls your onTimeShiftSetPlaybackParams(PlaybackParams) method with a PlaybackParams object that contains parameters for the current session. Use this information to configure your media playback engine appropriately.
If your playback engine does not support a parameter, emulate the expected behavior as best you can. For example, if your playback engine doesn't support 2x speed, use repeated seek operations on your playback engine to achieve an approximately double playback speed.
After the parameters are set, don't change the settings unless the user either issues a playback command that requires a different parameter or switches to a new channel.