লাইভ কন্টেন্ট সমর্থন করার জন্য কাস্ট SDK-তে অন্তর্নির্মিত API অন্তর্ভুক্ত রয়েছে। এর মধ্যে রয়েছে একটি নমনীয়, আউট-অফ-বক্স UI, API-এর সাথে মিলিত যা বিকাশকারীদের মাত্র কয়েকটি লাইনের কোড সহ সমৃদ্ধ লাইভ অভিজ্ঞতা তৈরি করতে দেয়। লাইভ এপিআই শুরু এবং শেষের সময়, প্রোগ্রাম মেটাডেটা, ডিভিআর কন্ট্রোল এবং অনুসন্ধানযোগ্য উইন্ডোগুলি প্রদর্শন সমর্থন করে।
এই নির্দেশিকাটি দেখায় কিভাবে লাইভ এপিআই-তে একটি স্ট্রীম কনফিগার করতে হয়, মূল লাইভ পরিস্থিতি কনফিগার করার জন্য কোড এবং মেটাডেটা নমুনা সহ, স্ক্রিনশট সহ প্রতিটি দৃশ্যকল্প কেমন দেখাচ্ছে।
পূর্বশর্ত
এই নির্দেশিকা পর্যালোচনা করার আগে একটি ওয়েব রিসিভার বাস্তবায়নের মৌলিক বিষয়গুলির সাথে পরিচিতি প্রয়োজন৷ উপরন্তু, কোডের নমুনাগুলি চালানোর জন্য আপনার একটি লাইভ স্ট্রীমে অ্যাক্সেসের প্রয়োজন হবে যা Cast এর জন্য সমর্থিত মিডিয়া প্রকারগুলির একটির সাথে সামঞ্জস্যপূর্ণ। সাধারণভাবে, লাইভ বৈশিষ্ট্যটি সমর্থিত মিডিয়ার জন্য সাধারণ লাইভ স্ট্রিম কনফিগারেশন সমর্থন করে।
নিম্নলিখিত পদগুলি নির্দেশিকা জুড়ে ব্যবহৃত হয়:
- অনুসন্ধানযোগ্য উইন্ডো - একটি লাইভ স্ট্রিমের পরিসর যা ব্যবহারকারীরা খুঁজতে পারেন।
- লাইভ এজ - প্লেয়ারের কাছে উপলব্ধ একটি লাইভ স্ট্রিমের নতুন অংশ।
- প্লে হেড - বর্তমান প্লেব্যাক অবস্থানের জন্য একটি UI টাইমস্ট্যাম্প৷
একটি লাইভ স্ট্রিম কাস্ট করা হচ্ছে
বিষয়বস্তুর জন্য লাইভ API ব্যবহার করার জন্য ওয়েব রিসিভার SDK কনফিগার করার দুটি উপায় রয়েছে:
- আপনার ওয়েব রিসিভার অ্যাপ্লিকেশনে
LOAD
মেসেজ ইন্টারসেপ্টর ব্যবহার করে। (প্রস্তাবিত) - প্রেরক-সাইড বা রিসিভার-সাইড জেনারেটেড লোড অনুরোধ ব্যবহার করে।
ইন্টারসেপ্টর একটি LoadRequestData
অবজেক্ট প্রদান করে যাতে একটি লোড অনুরোধ সম্পর্কে সমস্ত গুরুত্বপূর্ণ মেটাডেটা থাকে। একটি লাইভ স্ট্রিমের জন্য একটি লোডের অনুরোধ বোঝাতে, mediaInformation
অবজেক্টে streamType
সেট করুন 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;
});
প্রোগ্রাম গাইড ডেটা যোগ করা হচ্ছে
লাইভ স্ট্রিম, বিশেষ করে একটি টিভি চ্যানেলের মতো দীর্ঘ চলমান স্ট্রীম, একটি লাইভ স্ট্রিমে বর্তমান প্লেব্যাক অবস্থানের উপর ভিত্তি করে অন-স্ক্রীন গাইড/প্রোগ্রামিং মেটাডেটা প্রদর্শন করতে সক্ষম। বিষয়বস্তু প্রদানকারীদের একটি ভাল শেষ ব্যবহারকারীর অভিজ্ঞতার জন্য তাদের ওয়েব রিসিভার অ্যাপ্লিকেশনগুলিতে প্রোগ্রামিং মেটাডেটা অন্তর্ভুক্ত করার জন্য দৃঢ়ভাবে উত্সাহিত করা হয়।
আপনি LOAD মেসেজ ইন্টারসেপ্টরে একটি স্ট্রীমের জন্য প্রাথমিক গাইড ডেটা কনফিগার করতে পারেন, যেভাবে আমরা পূর্ববর্তী উদাহরণে স্ট্রীমটি একটি লাইভ স্ট্রিম নির্দেশ করেছিলাম। লাইভ স্ট্রীমের স্বতন্ত্র বিভাগ বা প্রোগ্রামগুলিকে MediaMetadata
অবজেক্ট হিসাবে উপস্থাপন করা হয় যা পরে একটি সারিতে সংরক্ষণ করা হয়। বিভিন্ন ধরনের প্রোগ্রামের জন্য আলাদা MediaMetadata
ক্লাস আছে—যেমন TvShowMediaMetadata
, MovieMediaMetadata
, MusicTrackMediaMetadata
, ইত্যাদি।
নিম্নলিখিত কোড স্নিপেটে, আমরা sectionStartAbsoluteTime
প্রপার্টি সহ একটি UNIX টাইমস্ট্যাম্প সহ প্রতিটি শোর শুরুর সময় নির্দিষ্ট করতে MediaMetadata
অবজেক্ট ব্যবহার করি। একটি প্রোগ্রামের সময়কাল সেকেন্ডে উপস্থাপন করা হয়।
// 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);
লাইভ সন্ধানযোগ্য পরিসীমা
কাস্ট SDK-এ UI উপাদান এবং নিয়ন্ত্রণ রয়েছে যা ব্যবহারকারীকে প্রসারিত কন্ট্রোলার বা স্পর্শ-সক্ষম ডিভাইসগুলিতে স্পর্শ নিয়ন্ত্রণ ব্যবহার করে স্ট্রিমের মধ্যে তাদের প্লেহেড সরাতে দেয়।
LiveSeekableRange
একটি স্ট্রীমের সময়সীমাকে উপস্থাপন করে যেখানে একজন ব্যবহারকারী অনুসন্ধান করতে সক্ষম। ওয়েব রিসিভারে আপনি PlayerManager.getLiveSeekableRange()
এর মাধ্যমে অনুসন্ধানযোগ্য পরিসর সম্পর্কে তথ্য অ্যাক্সেস করতে পারেন, যা একটি LiveSeekableRange
অবজেক্ট প্রদান করে। অবজেক্টের প্রধান বৈশিষ্ট্যগুলি সম্পর্কে সচেতন হতে হবে:
- শুরু — সেকেন্ডে স্ট্রিমের শুরুর সাথে সম্পর্কিত পরিসরের শুরুর সময় (সেকেন্ডে)।
- শেষ — স্ট্রিমের শুরুর সাপেক্ষে, উপলব্ধ অংশগুলির উপর ভিত্তি করে প্লেয়ারটি সর্বোচ্চ সম্ভাব্য সময় (সেকেন্ডে) চাইতে পারে।
- isMovingWindow — একটি বুলিয়ান মান যা নির্দেশ করে যে যদি অনুসন্ধানযোগ্য পরিসরটি স্ট্রিমের সাথে সরে যায় (অর্থাৎ পুরোনো অংশগুলি ম্যানিফেস্ট থেকে সরানো হয়), এটি সমস্ত লাইভ স্ট্রিমের জন্য সত্য হওয়া উচিত।
- 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
সংকেতগুলির জন্য সমর্থিত মিডিয়া কমান্ড সরানো হচ্ছে এবং অনুসন্ধানকে অক্ষম করতে টাচ ডিসপ্লে, কিন্তু ভয়েস কমান্ড যেমন 'ওকে গুগল, 30 সেকেন্ড পিছনের দিকে সন্ধান করুন' অক্ষম করে না৷ ভয়েসের জন্য মিডিয়া কমান্ডগুলি কীভাবে অক্ষম করা যায় সে সম্পর্কে বিশদ বিবরণের জন্য ভয়েস গাইড সহ সমর্থিত মিডিয়া কমান্ডগুলি দেখুন।
লাইভ ফ্রেমওয়ার্ক ইভেন্ট
দুটি ইভেন্ট, LIVE_ENDED
এবং LIVE_IS_MOVING_WINDOW_CHANGED
, লাইভ এপিআই-তে অন্তর্ভুক্ত করা হয়েছে৷ উভয় ইভেন্ট একটি LiveStatusEvent
অবজেক্ট পাস করা হয়, যা বর্তমান লাইভ অনুসন্ধানযোগ্য পরিসীমা ধারণ করে।
ঘটনা | বর্ণনা |
---|---|
LIVE_ENDED | লাইভ স্ট্রিম শেষ হলে ট্রিগার হয়। এই মুহুর্তে LiveSeekableRange এর শেষ মান আপডেট করা বন্ধ হয়ে যাবে; ব্যবহারকারীরা এখনও লাইভ সন্ধানযোগ্য পরিসরের মধ্যে সামগ্রী দেখতে সক্ষম হবেন। |
LIVE_IS_MOVING_WINDOW_CHANGED | একটি লাইভ স্ট্রিমের অনুসন্ধানযোগ্য পরিসর একটি নির্দিষ্ট উইন্ডো থেকে একটি চলমান উইন্ডোতে পরিবর্তিত হলে বা এর বিপরীতে ট্রিগার হয়৷ একটি লাইভ স্ট্রীমের জন্য এটি ঘটবে যখন প্লেয়ার শনাক্ত করবে যে ম্যানিফেস্টটি আগের অংশগুলি সরিয়ে দিচ্ছে৷ |
লাইভ স্ট্রিম দৃশ্যকল্প
লাইভ স্ট্রিমিংয়ের জন্য সম্ভাব্য আট ধরনের পরিস্থিতি রয়েছে, যার প্রতিটি তিনটি মূল সেটিংস সেট করে কনফিগার করা হয়েছে:
- স্ট্রীমের শুরুর সময় আছে
- স্ট্রিমের শেষ সময় আছে
- ব্যবহারকারীদের লাইভ স্ট্রিমের অনুসন্ধানযোগ্য উইন্ডোর মধ্যে খোঁজার অনুমতি দেওয়া হয়
সেই মানগুলি কীভাবে কনফিগার করতে হয় তার জন্য প্রোগ্রাম গাইড ডেটা যুক্ত করা দেখুন।
নীচে লাইভ API দ্বারা সমর্থিত পরিস্থিতিগুলির বর্ণনা এবং স্ক্রিনশট রয়েছে৷ T1 এবং T2 ভেরিয়েবলগুলি যথাক্রমে UI এর বাম এবং ডানদিকে টাইমস্ট্যাম্প উপস্থাপন করতে ব্যবহৃত হয়।
শুরুর সময় | শেষ সময় | অন্বেষণযোগ্য | T1 | T2 | |
---|---|---|---|---|---|
দৃশ্যকল্প 1 | না | না | না | প্লে হেড | দেখানো হয়নি |
দৃশ্যকল্প 7 | হ্যাঁ | হ্যাঁ | না | শুরুর সময় দেখান | শেষ সময় দেখান |
দৃশ্যকল্প 8 | হ্যাঁ | হ্যাঁ | হ্যাঁ | শুরুর সময় দেখান | শেষ সময় দেখান |
দৃশ্যকল্প এক
শুরুর সময় | শেষ সময় | অন্বেষণযোগ্য | T1 | T2 |
---|---|---|---|---|
না | না | না | মাথা খেলা | দেখানো হয়নি |
একটি দৃশ্যকল্পের কোন শুরু বা শেষ সময় নেই এবং ব্যবহারকারীরা স্ট্রিমের মধ্যে অনুসন্ধান করতে অক্ষম। যখন একজন ব্যবহারকারী একটি স্ট্রিম বন্ধ করে, প্লেব্যাক যেখানে স্ট্রীম থামানো হয়েছিল তার পরিবর্তে লাইভ প্রান্ত থেকে পুনরায় শুরু হবে৷
দৃশ্যপট সাত
শুরুর সময় | শেষ সময় | অন্বেষণযোগ্য | T1 | T2 |
---|---|---|---|---|
হ্যাঁ | হ্যাঁ | না | প্লে হেড | প্রোগ্রামের সময়কাল |
সেভেনের দৃশ্যকল্পের শুরুর সময় এবং শেষের সময় আছে কিন্তু তা অনুসন্ধানযোগ্য নয়। UI এর দুটি টাইমস্ট্যাম্প, T1 এবং T2, যথাক্রমে বর্তমান প্লেহেড সময় এবং মোট প্রোগ্রামের সময়কাল উপস্থাপন করে। কোনো ব্যবহারকারী প্লেব্যাক বিরতি/পুনরায় শুরু করলে স্ট্রীমটি স্ট্রিমের লাইভ প্রান্তে আবার শুরু হবে। উপরের উদাহরণে, ব্যবহারকারী দেখা শুরু করার পর থেকে অনুসন্ধান বারের লাল অংশটি স্ট্রিমের অংশকে উপস্থাপন করে।
দৃশ্যকল্প আট
শুরুর সময় | শেষ সময় | অন্বেষণযোগ্য | T1 | T2 |
---|---|---|---|---|
হ্যাঁ | হ্যাঁ | হ্যাঁ | প্লে হেড | প্রোগ্রামের সময়কাল |
সেভেনের দৃশ্যকল্পের শুরুর সময়, শেষের সময় আছে এবং তা অনুসন্ধানযোগ্য। UI এর দুটি টাইমস্ট্যাম্প, T1 এবং T2, যথাক্রমে বর্তমান প্লেহেড সময় এবং মোট প্রোগ্রামের সময়কাল উপস্থাপন করে। যদি কোনো ব্যবহারকারী প্লেব্যাককে বিরতি দেয়/পুনরায় শুরু করে তাহলে স্ট্রীমটি তাদের থামানোর সময়ে পুনরায় শুরু হবে যদি এটি অনুসন্ধানযোগ্য উইন্ডোর মধ্যে থাকে—সিক বারে লাল রঙের এলাকাটি প্রতিনিধিত্ব করে যেখানে একজন ব্যবহারকারী ফিরে যেতে পারে এবং সাদা অংশটি প্রতিনিধিত্ব করে যেখানে তারা খুঁজতে পারে। এগিয়ে
একটি দৃশ্যকল্প কনফিগার করা হচ্ছে
একটি নির্দিষ্ট লাইভ দৃশ্যকল্প হিসাবে একটি স্ট্রিম কনফিগার করা তিনটি অংশে সম্পন্ন করা হয়:
- স্ট্রিমের ধরন সেট করুন - স্ট্রিমটিকে লাইভ স্ট্রিম হিসাবে চিহ্নিত করুন।
- প্রোগ্রাম গাইড ডেটা যোগ করুন -
MediaMetadata
অবজেক্টে একটি শুরুর সময় এবং সময়কাল সেট করুন। - অনুসন্ধান কার্যকারিতা কনফিগার করুন - চাওয়া সক্ষম বা অক্ষম করুন।
প্লেব্যাক আচরণ
বিরাম দেওয়া অবস্থায়, UI এর প্লেব্যাক মেটাডেটা আপডেট করা অব্যাহত থাকবে—এতে প্লেব্যাক হেড এবং লাইভ এজ টাইম অন্তর্ভুক্ত রয়েছে। স্ট্রীম পুনরায় চালু করার পরে, স্ট্রীম কনফিগারেশনের উপর ভিত্তি করে পরিবর্তিত হওয়ার বিষয়ে সচেতন হওয়ার জন্য কয়েকটি আচরণ রয়েছে।
অন্বেষণযোগ্য প্রবাহ
একটি অনুসন্ধানযোগ্য স্ট্রিম পুনরায় শুরু করার পরে:
- লাইভ প্রান্তটি লাইভ অবস্থানে আপডেট করা হবে এবং সেই অনুযায়ী অনুসন্ধানযোগ্য পরিসীমা সামঞ্জস্য করা হবে।
- যদি প্লেহেডটি বর্তমান শোকে অতিক্রম করে, স্ক্রাব বারটি নতুন শো থেকে মেটাডেটার সাথে আপডেট করা হবে (উপলভ্য থাকলে শুরুর সময় এবং শেষের সময় সহ)।
- যদি একটি অনুসন্ধানযোগ্য উইন্ডোর দৈর্ঘ্য '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;
}
...
});
অ-অনুসন্ধানী স্রোত
একটি অ-অনুসন্ধানযোগ্য স্ট্রিম পুনরায় শুরু করার পরে:
- এই ক্ষেত্রে, লাইভ প্রান্তে প্লেব্যাক আবার শুরু হবে।
- যদি লাইভ এজ বর্তমান শোকে অতিক্রম করে, স্ক্রাব বারটি নতুন শো থেকে মেটাডেটা সহ আপডেট করা উচিত (উপলভ্য থাকলে শুরুর সময় এবং শেষের সময় সহ)।
API পৃষ্ঠ পরিবর্তন এবং লাইভ UI কাস্টমাইজ করা
কাস্ট SDK-এর আউট-অফ-দ্য-বক্স UI ব্যবহার করার পরিবর্তে কাস্টম ব্যবহারকারী ইন্টারফেস তৈরি করার জন্য অন্তর্নির্মিত সমর্থন রয়েছে। তবে ইন্টারফেস কাস্টমাইজ করার সময় Cast UX ডিজাইন চেকলিস্ট অনুসরণ করা গুরুত্বপূর্ণ।
ওয়েব রিসিভার
ওয়েব রিসিভারে, ডেভেলপারদের লাইভ স্ট্রিমের জন্য তাদের কাস্টম ইন্টারফেস প্রসারিত করার অনুমতি দেওয়ার জন্য PlayerData
নিম্নলিখিত ক্ষেত্রগুলি অন্তর্ভুক্ত করে:
- isLive - একটি পতাকা যা নির্দেশ করে যে বর্তমান স্ট্রিমটি VOD এর বিপরীতে একটি লাইভ স্ট্রিম কিনা।
- liveSeekableRange - ডিভিআর উইন্ডোর সীমানা চিহ্নিত করে স্ক্রিনে দেখানোর জন্য অনুসন্ধানযোগ্য পরিসর।
- mediaStartAbsoluteTime - যখন বিভাগটি পরম সময়ে শুরু হয় ( UNIX Epoch )।
- sectionStartTimeInMedia - মিডিয়া শুরুর সময়ের তুলনায় সেকেন্ডে বিভাগ শুরুর সময়।
- বিভাগকাল - সেকেন্ডে বিভাগের সময়কাল।
এছাড়াও UI কাস্টমাইজ করার সময় দুটি লাইভ ইভেন্টকে বিবেচনায় নেওয়া নিশ্চিত করুন।
অ্যান্ড্রয়েড এসডিকে
লাইভ কার্যকারিতার অংশ হিসাবে, UIMediaController
এ অ্যান্ড্রয়েড সিকবার উইজেটের ব্যবহার বাতিল করা হয়েছে, পরিবর্তে CastSeekBar
ব্যবহার করুন।