ওয়েব রিসিভার SDK আজ তিন ধরনের স্ট্রিমিং প্রোটোকল সমর্থন করে:
DASH , HTTP লাইভ স্ট্রিমিং , এবং স্মুথ স্ট্রিমিং ।
এই নথিতে আমরা প্রতিটি স্ট্রিমিং প্রোটোকলের জন্য আমাদের সমর্থন তালিকাভুক্ত করি। নোট করুন প্রতিটি প্রোটোকলের জন্য সমর্থিত ট্যাগের ব্যাখ্যা বিশদ প্রোটোকল স্পেকের তুলনায় বেশ সংক্ষিপ্ত। লক্ষ্য হল প্রতিটি প্রোটোকল কীভাবে ব্যবহার করতে হয় এবং প্রোটোকলের কোন বৈশিষ্ট্যগুলি তাদের স্ট্রিমিং অভিজ্ঞতা প্রদানের জন্য কাস্ট সক্ষম ডিভাইসগুলিতে সমর্থিত হয় তার একটি দ্রুত আভাস এবং বোঝা প্রদান করা।
ডাইনামিক অ্যাডাপটিভ স্ট্রিমিং ওভার HTTP (DASH)
ISO এর DASH এর বিস্তারিত স্পেসিফিকেশন ।
DASH হল একটি অভিযোজিত বিটরেট স্ট্রিমিং প্রোটোকল যা HTTP(S) সার্ভারের মাধ্যমে উচ্চ মানের ভিডিও স্ট্রিমিং সক্ষম করে। XML-এ রচিত একটি ম্যানিফেস্টে ভিডিও কন্টেন্ট কীভাবে শুরু করা যায় এবং ডাউনলোড করা যায় তার বেশিরভাগ মেটাডেটা তথ্য থাকে। ওয়েব রিসিভার প্লেয়ার যে মূল ধারণাগুলিকে সমর্থন করে তা হল <Period>
, <AdaptationSet>
, <Representation>
, <SegmentTemplate>
, <SegmentList>
, <BaseUrl>
, এবং <ContentProtection>
।
একটি DASH ম্যানিফেস্ট একটি রুট <MPD>
ট্যাগ দিয়ে শুরু হয় এবং ভিতরে এক বা একাধিক <Period>
ট্যাগ থাকে, যা একটি স্ট্রিমিং বিষয়বস্তু উপস্থাপন করে। <Period>
ট্যাগগুলি স্ট্রিমিং সামগ্রীর বিভিন্ন অংশের অর্ডার দেওয়ার অনুমতি দেয় এবং প্রায়শই প্রধান বিষয়বস্তু এবং বিজ্ঞাপন বা একাধিক ধারাবাহিক ভিডিও সামগ্রী আলাদা করতে ব্যবহৃত হয়।
<MPD>
এর অধীনে একটি <AdaptationSet>
হল এক ধরনের মিডিয়া স্ট্রিমের জন্য উপস্থাপনার একটি সেট, বেশিরভাগ ক্ষেত্রে ভিডিও, অডিও বা ক্যাপশন। সর্বাধিক সমর্থিত মাইমেটাইপগুলি হল "ভিডিও/mp4", "অডিও/mp4", এবং "টেক্সট/ভিটিটি"। একটি ঐচ্ছিক <ContentComponent contentType="$TYPE$">
<AdaptationSet>
এর অধীনে অন্তর্ভুক্ত করা যেতে পারে।
প্রতিটি <AdaptationSet>
-এর ভিতরে <Representation>
ট্যাগের একটি তালিকা উপস্থিত থাকা উচিত এবং ওয়েব রিসিভার প্লেয়ার codecs
তথ্য ব্যবহার করে এমএসই সোর্স বাফার শুরু করতে এবং bandwidth
তথ্য স্বয়ংক্রিয়ভাবে সঠিক উপস্থাপনা/বিটরেট বেছে নিতে ব্যবহার করে।
প্রতিটি <Representation>
-এর জন্য, মিডিয়া সেগমেন্টগুলিকে একক সেগমেন্টের প্রতিনিধিত্বের জন্য একটি <BaseURL>
, সেগমেন্টের তালিকার জন্য <SegmentList>
(HLS-এর অনুরূপ), অথবা <SegmentTemplate>
ব্যবহার করে বর্ণনা করা হয়।
একটি <SegmentTemplate>
এর জন্য, এটি নির্দেশ করে কিভাবে টেমপ্লেটিং-এর মাধ্যমে প্রারম্ভিক সেগমেন্ট এবং মিডিয়া সেগমেন্টগুলিকে উপস্থাপন করা যেতে পারে। নীচের উদাহরণে $Number$
CDN থেকে উপলব্ধ সেগমেন্ট নম্বর নির্দেশ করে। তাই প্লেব্যাক চলতে থাকলে এটি seg1.m4s, seg2.m4s ইত্যাদিতে অনুবাদ করে।
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:ns2="http://www.w3.org/1999/xlink"
profiles="urn:mpeg:dash:profile:isoff-live:2011,http://dashif.org/guidelines/dash264" type="static"
publishTime="2016-10-05T22:07:14.859Z" mediaPresentationDuration="P1DT0H0M0.000S" minBufferTime="P0DT0H0M7.500S">
<Period id="P0">
<AdaptationSet lang="en" segmentAlignment="true">
<ContentComponent id="1" contentType="audio"/>
<SegmentTemplate media="seg$Number$.m4s" initialization="seginit.mp4"
duration="10000" startNumber="1" timescale="1000" presentationTimeOffset="0"/>
<Representation id="1" bandwidth="150123" audioSamplingRate="44100"
mimeType="audio/mp4" codecs="mp4a.40.2" startWithSAP="1">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
<BaseURL>http://www.google.com/testVideo</BaseURL>
</Representation>
</AdaptationSet>
<AdaptationSet segmentAlignment="true">
<ContentComponent id="1" contentType="video"/>
<SegmentTemplate media="seg$Number$.m4s" initialization="seginit.mp4"
duration="10000" startNumber="1" timescale="1000" presentationTimeOffset="0"/>
<Representation id="1" bandwidth="212191" width="384" height="208" sar="26:27"
frameRate="25" mimeType="video/mp4" codecs="avc1.42c01f" startWithSAP="1">
<BaseURL>http://www.google.com/testVideo/bitrate1/</BaseURL>
</Representation>
<Representation id="1" bandwidth="366954" width="512" height="288" sar="1:1"
frameRate="25" mimeType="video/mp4" codecs="avc1.42c01f" startWithSAP="1">
<BaseURL>http://www.google.com/testVideo/bitrate2/</BaseURL>
</Representation>
<Representation id="1" bandwidth="673914" width="640" height="352" sar="44:45"
frameRate="25" mimeType="video/mp4" codecs="avc1.42c01f" startWithSAP="1">
<BaseURL>http://www.google.com/testVideo/bitrate3/</BaseURL>
</Representation>
</AdaptationSet>
</Period>
</MPD>
একটি <SegmentTemplate>
এর জন্য, প্রতিটি সেগমেন্ট কত লম্বা এবং কোন সেগমেন্ট পুনরাবৃত্তি হয় তা নির্দেশ করতে <SegmentTimeline>
ট্যাগ ব্যবহার করা সাধারণ। একটি timescale
(এক সেকেন্ডের প্রতিনিধিত্ব করার জন্য একক) প্রায়ই <SegmentTemplate>
-এর বৈশিষ্ট্যের অংশ হিসাবে অন্তর্ভুক্ত করা হয় যাতে আমরা এই ইউনিটের উপর ভিত্তি করে সেগমেন্টের সময় গণনা করতে পারি। নীচের উদাহরণে, <S>
ট্যাগটি একটি সেগমেন্ট ট্যাগকে নির্দেশ করে, d
বৈশিষ্ট্যটি নির্দিষ্ট করে যে সেগমেন্টটি কতদিন এবং r
বৈশিষ্ট্যটি নির্দিষ্ট করে একই সময়কালের কতগুলি সেগমেন্ট পুনরাবৃত্তি হবে যাতে $Time$
মিডিয়া ডাউনলোড করার জন্য সঠিকভাবে গণনা করা যায় media
অ্যাট্রিবিউটে নির্দিষ্ট করা সেগমেন্ট।
<SegmentTemplate>
timescale="48000"
initialization="$RepresentationID$-init.dash"
media="$RepresentationID$-$Time$.dash"
startNumber="1">
<SegmentTimeline>
<S t="0" d="96256" r="2" />
<S d="95232" />
<S d="96256" r="2" />
<S d="95232" />
<S d="96256" r="2" />
</SegmentTimeline>
</SegmentTemplate>
<SegmentList>
ব্যবহার করে উপস্থাপনার জন্য, এখানে একটি উদাহরণ দেওয়া হল:
<Representation id="FirstRep" bandwidth="2000000" width="1280"
height="720">
<BaseURL>FirstRep/</BaseURL>
<SegmentList timescale="90000" duration="270000">
<RepresentationIndex sourceURL="representation-index.sidx"/>
<SegmentURL media="seg-1.ts"/>
<SegmentURL media="seg-2.ts"/>
<SegmentURL media="seg-3.ts"/>
</SegmentList>
</Representation>
একটি একক সেগমেন্ট ফাইলের জন্য, একটি <SegmentBase>
প্রায়শই বাইট পরিসরের অনুরোধের সাথে ব্যবহার করা হয় একটি <BaseURL>
ফাইলের কোন অংশে সূচী রয়েছে তা নির্দিষ্ট করতে, এবং বাকিগুলি প্লেব্যাক চলতে থাকলে বা অনুসন্ধান ঘটলে চাহিদা অনুযায়ী আনা যেতে পারে। এখানে Initialization
রেঞ্জ init মেটাডেটা রেঞ্জ নির্দিষ্ট করে এবং indexRange
মিডিয়া সেগমেন্টের জন্য সূচক নির্দিষ্ট করে। মনে রাখবেন এই মুহূর্তে আমরা শুধুমাত্র পরপর বাইট রেঞ্জ সমর্থন করি।
<Representation bandwidth="4190760" codecs="avc1.640028"
height="1080" id="1" mimeType="video/mp4" width="1920">
<BaseURL>video.mp4<BaseURL>
<SegmentBase indexRange="674-1149">
<Initialization range="0-673" />
</SegmentBase>
</Representation>
যে উপস্থাপনা ব্যবহার করা হোক না কেন, স্ট্রীমগুলি সুরক্ষিত থাকলে, একটি <ContentProtection>
বিভাগ <AdaptationSet>
এর অধীনে উপস্থিত হতে পারে, যেখানে একটি schemeIdUri
ব্যবহার করার জন্য DRM সিস্টেমটিকে স্বতন্ত্রভাবে সনাক্ত করে। সাধারণ এনক্রিপশনের জন্য একটি ঐচ্ছিক কী আইডি অন্তর্ভুক্ত করা যেতে পারে।
<!-- Common Encryption -->
<ContentProtection
schemeIdUri="urn:mpeg:dash:mp4protection:2011"
value="cenc"
cenc:default_KID="7D2714D0-552D-41F5-AD56-8DD9592FF891">
</ContentProtection>
<!-- Widevine -->
<ContentProtection
schemeIdUri="urn:uuid:EDEF8BA9-79D6-4ACE-A3C8-27DCD51D21ED">
</ContentProtection>
আরও উদাহরণ এবং বিশদ বিবরণের জন্য অনুগ্রহ করে MPEG-DASH স্পেসিফিকেশন পড়ুন। নীচে ট্যাগগুলিতে অতিরিক্ত DASH বৈশিষ্ট্যগুলির একটি তালিকা রয়েছে যা আমরা বর্তমানে সমর্থন করি:
বৈশিষ্ট্যের নাম | বৈশিষ্ট্য ফাংশন |
---|---|
মিডিয়া উপস্থাপনা সময়কাল | ভিডিও কন্টেন্ট কতদিনের। |
সর্বনিম্ন আপডেট পিরিয়ড | <MPD> ট্যাগের বৈশিষ্ট্য; আমাদের কত ঘন ঘন ম্যানিফেস্ট পুনরায় লোড করতে হবে তা নির্দিষ্ট করে। |
টাইপ | <MPD> ট্যাগের বৈশিষ্ট্য; "গতিশীল" নির্দেশ করে যে এটি একটি লাইভ স্ট্রিম। |
উপস্থাপনা সময়অফসেট | <SegmentBase> ট্যাগের বৈশিষ্ট্য; পিরিয়ডের শুরু থেকে উপস্থাপনার সময় অফসেট নির্দিষ্ট করে। |
শুরু নম্বর | একটি পিরিয়ডে একটি উপস্থাপনায় প্রথম মিডিয়া সেগমেন্টের সংখ্যা নির্দিষ্ট করে। এটি প্রায়শই লাইভ স্ট্রিমে ব্যবহৃত হয়। |
আমরা DASH-এর জন্য MP4 টুকরোগুলির মধ্যে EMSG বক্স শনাক্ত করাকে সমর্থন করি এবং বিকাশকারীদের একটি EmsgEvent
প্রদান করি।
যদিও আমাদের বর্তমান ওয়েব রিসিভার প্লেয়ার প্রধান DASH ব্যবহারের ক্ষেত্রে সমর্থন করে, এখানে সাধারণ বৈশিষ্ট্যগুলির একটি তালিকা রয়েছে যা DASH-এর আমাদের বর্তমান বাস্তবায়ন উপেক্ষা করে বা ব্যবহার করে না। এর মানে ম্যানিফেস্টে সেগুলি থাকুক না কেন, বিষয়বস্তুর প্লেব্যাকের অভিজ্ঞতার উপর তাদের কোন প্রভাব নেই৷
- প্রাপ্যতা শুরুর সময়
- সেগমেন্ট সারিবদ্ধকরণ
HTTP লাইভ স্ট্রিমিং (HLS)
HTTP লাইভ স্ট্রিমিংয়ের ওভারভিউ এবং সম্পূর্ণ স্পেক এখানে পাওয়া যাবে।
ওয়েব রিসিভার প্লেয়ারের অন্যতম প্রধান শক্তি হল MSE-তে HLS-এর প্লেব্যাক সমর্থন করার ক্ষমতা। DASH থেকে ভিন্ন, যেখানে একটি ম্যানিফেস্ট একটি একক ফাইলে আসে, HLS তাদের নিজ নিজ URL সহ সমস্ত বৈকল্পিক স্ট্রীমের একটি তালিকা সহ মাস্টার প্লেলিস্ট পাঠায়। বৈকল্পিক প্লেলিস্ট হল মিডিয়া প্লেলিস্ট। ওয়েব রিসিভার প্লেয়ার বর্তমানে মাস্টার প্লেলিস্টে যে দুটি প্রধান HLS ট্যাগ সমর্থন করে তা হল:
ট্যাগ নাম | কার্যকারিতা |
---|---|
#EXT-X-stream-INF | একটি বিটরেট/ভেরিয়েন্ট স্ট্রীম নির্দিষ্ট করে। BANDWIDTH অ্যাট্রিবিউট প্রয়োজন যা অভিযোজিত বিটরেট স্ট্রিমিং নির্বাচনকে সমর্থন করে। MSE শুরু করার জন্য CODECS বৈশিষ্ট্যটি দৃঢ়ভাবে সুপারিশ করা হয়, যেমন "avc1.42c01e,mp4a.40.2" । নির্দিষ্ট করা না থাকলে, ডিফল্ট কেস H264 প্রধান প্রোফাইল 3.0 ভিডিও এবং "mp4a.40.2" অডিও এনকোড করা সামগ্রীতে সেট করা হয়৷ |
#এক্সট-এক্স-মিডিয়া | অতিরিক্ত মিডিয়া প্লেলিস্ট ( URI অ্যাট্রিবিউটে) নির্দিষ্ট করে যা বিষয়বস্তুকে উপস্থাপন করে। এগুলি সাধারণত অন্যান্য বিন্যাসে (5.1 চারপাশের শব্দ) বা ভাষার বিকল্প অডিও স্ট্রিম। VIDEO , AUDIO , SUBTITLES বা CLOSED-CAPTIONS সহ TYPE এর একটি বৈশিষ্ট্য অনুমোদিত৷ DEFAULT অ্যাট্রিবিউটটি YES তে সেট করা ডিফল্টরূপে এই বিকল্প স্ট্রিমটি বেছে নেওয়ার ইঙ্গিত দেবে৷ |
এখানে HLS ট্যাগের একটি তালিকা রয়েছে যা ওয়েব রিসিভার প্লেয়ার বর্তমানে মিডিয়া প্লেলিস্টে সমর্থন করে:
ট্যাগ নাম | কার্যকারিতা |
---|---|
#EXTINF | স্ট্রীম তথ্য, সাধারণত সেকেন্ডে সেগমেন্টের সময়কাল এবং পরবর্তী লাইনে সেগমেন্টের url। |
#এক্সট-এক্স-টার্গেটডিউরেশন | সেকেন্ডে প্রতিটি সেগমেন্ট কত লম্বা। লাইভ স্ট্রিমের জন্য আমরা কত ঘন ঘন প্লেলিস্ট ম্যানিফেস্ট ডাউনলোড/রিফ্রেশ করব তাও এটি নির্ধারণ করে। ওয়েব রিসিভার প্লেয়ার 0.1 সেকেন্ডের কম সময়কাল সমর্থন করে না। |
#EXT-X-MEDIA-Sequence | এই প্লেলিস্টের প্রথম অংশটি প্রতিনিধিত্ব করে এমন ক্রম সংখ্যা (প্রায়শই লাইভ স্ট্রিমের জন্য)। |
#EXT-X-কী | DRM মূল তথ্য। METHOD অ্যাট্রিবিউট আমাদের বলে দেয় কী কী সিস্টেম ব্যবহার করতে হবে। আজ আমরা AES-128 এবং SAMPLE-AES সমর্থন করি। |
#এক্সট-এক্স-বাইটারঞ্জ | একটি সেগমেন্ট url-এর জন্য বাইট পরিসর। |
#EXT-X-বিরতি | পরপর সেগমেন্টের মধ্যে একটি বিচ্ছিন্নতা নির্দিষ্ট করে। এটি প্রায়ই সার্ভার সাইড বিজ্ঞাপন সন্নিবেশের সাথে দেখা যায় যেখানে একটি বিজ্ঞাপন বিভাগ প্রধান স্ট্রিমের মাঝখানে প্রদর্শিত হয়। |
#EXT-X-PROGRAM-DATE-TIME | পরবর্তী সেগমেন্টের প্রথম নমুনার সম্পূর্ণ সময়, উদাহরণস্বরূপ "2016-09-21T23:23:52.066Z"। |
#এক্সট-এক্স-এন্ডলিস্ট | এটি একটি VOD বা লাইভ স্ট্রিম কিনা। |
লাইভ স্ট্রীমের জন্য, নতুন রিফ্রেশ করা ম্যানিফেস্টকে কীভাবে একত্রিত করা যায় তা নির্ধারণ করতে আমরা #EXT-X-PROGRAM-DATE-TIME
এবং #EXT-X-MEDIA-SEQUENCE
ব্যবহার করি। যদি উপস্থিত থাকে, #EXT-X-PROGRAM-DATE-TIME
ব্যবহার করা হয় রিফ্রেশ করা অংশগুলির সাথে মেলে৷ অন্যথায়, #EXT-X-MEDIA-SEQUENCE
নম্বরটি ব্যবহার করা হবে৷ মনে রাখবেন যে HLS স্পেক অনুযায়ী, আমরা মিলের জন্য ফাইলের নাম তুলনা ব্যবহার করি না।
আমাদের HLS বাস্তবায়ন প্রধান অডিও প্লেব্যাক হিসাবে 5.1 চারপাশের শব্দের মতো একটি বিকল্প অডিও স্ট্রিম নির্বাচন করা সমর্থন করে। বিকল্প কোডেকগুলির সাথে একটি #EXT-X-MEDIA
ট্যাগ থাকার পাশাপাশি স্ট্রীম কনফিগারেশনে সেগমেন্ট ফর্ম্যাট প্রদান করে এটি সম্পন্ন করা যেতে পারে।
ওয়েব রিসিভার প্লেয়ার নির্দিষ্ট প্রতি-নির্দিষ্ট আচরণ আশা করে। উদাহরণস্বরূপ, একটি #EXT-INF
ট্যাগের পরে, আমরা একটি URI আশা করি৷ যদি এটি একটি URI না হয়, উদাহরণস্বরূপ একটি #EXT-X-DISCOUNTINUITY
প্লেলিস্টের জন্য পার্সিং ব্যর্থ হবে৷
প্রতি #EXT-X-TARGETDURATION
সেকেন্ডে, আমরা নতুন সেগমেন্ট তালিকা পেতে প্লেলিস্ট/মেনিফেস্টটি পুনরায় লোড করি এবং আমরা সমস্ত বিভাগের নতুন অভ্যন্তরীণ উপস্থাপনা নতুনটিতে আপডেট করি। যে কোন সময় একটি চাওয়া অনুরোধ করা হয়, আমরা শুধুমাত্র অন্বেষণযোগ্য সীমার মধ্যে খুঁজছি. লাইভের জন্য, আমরা শুধুমাত্র নতুন তালিকার শুরু থেকে শেষ থেকে তিনটি টার্গেট সময়কাল পর্যন্ত খোঁজার অনুমতি দিই। সুতরাং উদাহরণস্বরূপ, যদি আপনার একটি 10 সেগমেন্ট তালিকা থাকে এবং আপনি সেগমেন্ট 6-এ থাকেন, আপনি শুধুমাত্র 7 পর্যন্ত চাইতে পারেন, কিন্তু 8টি নয়।
সেগমেন্ট বিন্যাস সমর্থন
CAF SDK অডিওর জন্য HlsSegmentFormat
এবং ভিডিওর জন্য HlsVideoSegmentFormat
এ উল্লেখিত একাধিক ফর্ম্যাটে বিতরণ করা সামগ্রী প্লে করা সমর্থন করে৷ এতে প্যাকড অডিও যেমন AAC এবং AC3 প্লেব্যাকের জন্য সমর্থন অন্তর্ভুক্ত, উভয় এনক্রিপ্ট করা এবং নন-এনক্রিপ্ট করা। প্লেয়ারের কাছে আপনার বিষয়বস্তু সঠিকভাবে বর্ণনা করার জন্য LoadRequestData
এর MediaInformation
এ এই তথ্যটি উল্লেখ করা প্রয়োজন। নির্দিষ্ট করা না থাকলে, ডিফল্ট প্লেয়ার কনফিগারেশন ট্রান্সপোর্ট স্ট্রিম প্যাকেজ করা সামগ্রী হিসাবে সামগ্রীটি চালানোর চেষ্টা করবে। এই প্রপার্টিটি লোড রিকোয়েস্ট ডেটাতে ( অ্যান্ড্রয়েড , আইওএস এবং ওয়েব ) অথবা মেসেজ ইন্টারসেপ্টরের মাধ্যমে রিসিভারের মধ্যে যেকোনও প্রেরক থেকে সেট করা যেতে পারে।
ওয়েব রিসিভারে কীভাবে সামগ্রী প্রস্তুত করতে হয় সে সম্পর্কে আরও তথ্যের জন্য নীচের নমুনা কোড স্নিপেট বা contentId, contentUrl এবং সত্তা নির্দেশিকা ব্যবহার করে লোডিং মিডিয়া দেখুন।
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD, loadRequestData => {
...
// Specify segment format for an HLS stream playing CMAF packaged content.
loadRequestData.media.contentType = 'application/x-mpegurl';
loadRequestData.media.hlsSegmentFormat = cast.framework.messages.HlsSegmentFormat.FMP4;
loadRequestData.media.hlsVideoSegmentFormat = cast.framework.messages.HlsVideoSegmentFormat.FMP4;
...
return loadRequestData;
});
বিষয়বস্তু সুরক্ষা
উপরের #EXT-X-KEY
ট্যাগ বিভাগে তালিকাভুক্ত হিসাবে, Cast SDK SAMPLE-AES
বা SAMPLE-AES-CTR
সমর্থন করে যেখানে একটি URI-এর জন্য একটি প্রাথমিক ভেক্টর নির্দিষ্ট করা যেতে পারে:
EXT-X-KEY: METHOD=SAMPLE-AES, \
URI="data:text/plain;base64,XXXXXX", \
IV=0x6df49213a781e338628d0e9c812d328e, \
KEYFORMAT="com.widevine", \
KEYFORMATVERSIONS="1"
আমরা এখন যে KEYFORMAT
সমর্থন করি তা হল Widevine, এবং URI-তে একটি BASE64 এনকোড করা DRM তথ্য XXXXXXX
রয়েছে যা ডিকোড করা হলে কী আইডি থাকে:
{
"content_id": "MTQ1NjkzNzM1NDgxNA==",
"key_ids": [
"xxxxxxxxxxxxxxxx"
]
}
সংস্করণ 1 নিম্নলিখিত বৈশিষ্ট্যগুলিকে সংজ্ঞায়িত করে:
বৈশিষ্ট্য | উদাহরণ | বর্ণনা |
---|---|---|
KEYFORMATVERSIONS | "1" | এই প্রস্তাবটি মূল বিন্যাস সংস্করণ 1 সংজ্ঞায়িত করে |
KEYFORMAT | "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" | UUID হল DASH IF IOP থেকে Widevine UUID। Widevine এনক্রিপ্ট করা স্ট্রিমগুলির সাথে MPD-এ একই সঠিক স্ট্রিং ব্যবহার করা হয়। |
URI | "data:text/plain;base64, <base64 encoded PSSH box>" | ডেটা টাইপ এবং PSSH বক্স ধারণকারী স্ট্রিমের URI। |
METHOD | SAMPLE-AES-CTR | বিষয়বস্তু এনক্রিপ্ট করার সময় ব্যবহৃত এনক্রিপশন সাইফার নির্দেশ করে। স্যাম্পল-এইএস ইঙ্গিত দেয় যে বিষয়বস্তু 'cbcs' ব্যবহার করে এনক্রিপ্ট করা হয়েছে। SAMPLE-AES-CTR সংকেত দেয় যে বিষয়বস্তু AES-CTR সুরক্ষা স্কিমগুলির একটি ব্যবহার করে এনক্রিপ্ট করা হয়েছে, নাম 'cenc'৷ |
DASH MPD-তে ম্যাপ করা বৈশিষ্ট্যগুলি:
বৈশিষ্ট্য | বর্ণনা |
---|---|
KEYFORMAT | বিষয়বস্তু সুরক্ষা উপাদানের স্কিমআইডিউরি অ্যাট্রিবিউট। |
URI | cenc:pssh উপাদানের বিষয়বস্তু। |
KEYID | 16-বাইট হেক্সাডেসিমেল স্ট্রিং কী আইডি এনকোড করছে যা MPEG DASH-এ default_kid-এর মতোই ভূমিকা রাখে। একটি শ্রেণীবিন্যাস কী স্কিম ব্যবহার করলে, এটি হবে "রুট" কী। |
V2 সিগন্যালিং সহ HLS প্লেলিস্টের উদাহরণ:
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:2
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MAP:URI="init_segment.mp4"
#EXTINF:1.001,
output_video-1.mp4
#EXT-X-DISCONTINUITY
#EXT-X-KEY:METHOD=SAMPLE-AES,URI="data:text/plain;base64,AAAAPXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAB0aDXdpZGV2aW5lX3Rlc3QiDHRlc3QgY29udGVudA==",KEYID=0x112233445566778899001122334455,KEYFORMAT="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed",KEYFORMATVERSION="1"
#EXTINF:1.001,
output_video-2.mp4
#EXTINF:0.734,
output_video-3.mp4
#EXT-X-ENDLIST
নীচে HLS-এর বৈশিষ্ট্য এবং ট্যাগগুলির একটি তালিকা রয়েছে যা আমরা বর্তমানে ব্যবহার করি না বা সমর্থন করি না৷ তাদের উপস্থিতি বা অনুপস্থিতি স্ট্রিমিং আচরণকে প্রভাবিত করে না।
-
RESOLUTION=
#EXT-X-STREAM-INF
এ অ্যাট্রিবিউট উপেক্ষা করা হয়েছে। -
#EXT-X-MEDIA
এAUTOSELECT=
অ্যাট্রিবিউট ব্যবহার করা হয় না। পরিবর্তে আমরাDEFAULT=
উপর নির্ভর করি - মাস্টার প্লেলিস্টে
#EXT-XI-FRAME-STREAM-INF
উপেক্ষা করা হয়েছে৷ -
#EXT-X-DISCONTINUITY-SEQUENCE
উপেক্ষা করা হয়েছে৷ -
#EXT-X-PLAYLIST-TYPE:EVENT
একটি লাইভ স্ট্রীমে উপস্থিত থাকতে পারে এবং#EXT-X-PLAYLIST-TYPE:VOD
একটি VOD স্ট্রীমে উপস্থিত থাকতে পারে, কিন্তু বর্তমানে আমাদের ওয়েব রিসিভার প্লেয়ার শুধুমাত্র#EXT-X-ENDLIST
এর অস্তিত্বের উপর নির্ভর করে লাইভ বনাম VOD নির্ধারণ করতে#EXT-X-ENDLIST
।
মসৃণ স্ট্রিমিং
মাইক্রোসফটের অফিসিয়াল স্মুথ স্ট্রিমিং স্পেক ।
মসৃণ স্ট্রিমিং HTTP এর উপর অভিযোজিত স্ট্রিমিং প্রোটোকল এবং XML স্পেসিফিকেশন প্রদান করে (DASH এর মতো)। DASH থেকে ভিন্ন, স্মুথ স্ট্রিমিং মিডিয়া সেগমেন্টের জন্য শুধুমাত্র MPEG-4 প্যাকেজিংয়ের সুপারিশ করে।
এখানে স্মুথ স্ট্রিমিং-এর সবচেয়ে সাধারণ ট্যাগ এবং বৈশিষ্ট্যগুলির একটি সারণী রয়েছে যা ওয়েব রিসিভার প্লেয়ার আজ সমর্থন করে। অনেক ধারণা ইতিমধ্যে উপরের DASH বিভাগে ব্যাখ্যা করা হয়েছে।
ট্যাগ/অ্যাট্রিবিউট | ব্যবহার |
---|---|
<স্মুথস্ট্রিমিংমিডিয়া> | ম্যানিফেস্টের জন্য প্রধান ট্যাগ, এর বৈশিষ্ট্যগুলি রয়েছে:
|
<StreamIndex> | স্ট্রিমের এক সেট, DASH-এর অ্যাডাপ্টেশনসেটের অনুরূপ। টাইপ সাধারণত "টেক্সট", "ভিডিও", বা "অডিও" হয়। ইউআরএল অ্যাট্রিবিউটে সাধারণত বিটরেট বা স্টার্ট টাইমের মতো তথ্য ব্যবহার করে একটি টেমপ্লেটেড ফ্র্যাগমেন্ট URL থাকে। |
<গুণমান স্তর> | প্রতিটি কোয়ালিটি লেভেল ট্যাগ তার বিটরেট এবং একটি ফোরসিসি কোডেক নির্দিষ্ট করে। ফোরসিসি কোড প্রায়ই 'H264', 'AVC1', 'AACL' ইত্যাদি। ভিডিওর জন্য, এটি MaxWidth এবং MaxHeight এর মাধ্যমে এর রেজোলিউশন নির্দিষ্ট করে। অডিওর জন্য, এটি স্যাম্পলিংরেট এবং চ্যানেলের সংখ্যার মাধ্যমে এর ফ্রিকোয়েন্সি (যেমন 44100) নির্দিষ্ট করে। |
<c> | স্ট্রিম ফ্র্যাগমেন্ট উপাদান। রয়েছে:
|
<সুরক্ষা> | ঐচ্ছিক SystemID অ্যাট্রিবিউট সহ একটি ট্যাগ যা <SmoothStreamingMedia> ট্যাগের অধীনে ব্যবহার করার জন্য সিস্টেম DRM-এর ID তালিকাভুক্ত করে। |
<প্রটেকশন হেডার> | <Protection>-এর অধীনে, SystemID এবং কাস্টম ডেটার একটি বৈশিষ্ট্য থাকতে পারে, সাধারণত Base64 এনকোড করা হয়। Widevine-এর জন্য, এতে কী আইডি, কী দৈর্ঘ্য, অ্যালগরিদম আইডি থাকবে, যেমন AESCTR, LA_URL (লাইসেন্স অধিগ্রহণ ইউআরএল), LUI_URL (লাইসেন্স ইউজার ইন্টারফেস ইউআরএল), এবং DS_ID (ডোমেন পরিষেবা আইডি)। |
বিষয়বস্তু সুরক্ষা
সুরক্ষা সিস্টেম আইডিগুলি সঠিকভাবে এনকোড করতে, দয়া করে নীচের ম্যাপিংটি ব্যবহার করুন:
- ওয়াইডভিন: 'EDEF8BA9-79D6-4ACE-A3C8-27DCD51D21ED',
- ক্লিয়ারকি: '1077EFEC-C0B2-4D02-ACE3-3C1E52E2FB4B',
- MPEG_DASH_MP4PROTECTION: 'URN:MPEG:DASH:MP4PROTECTION:2011'
<ProtectionHeader>
এর জন্য, নীচে Base64 এনকোড করা ডেটা সহ একটি উদাহরণ রয়েছে। ডেটা, যখন ডিকোড করা হয়, উপরের DASH বিষয়বস্তু সুরক্ষা সমর্থনে বর্ণিত একই ডিকোডেড বিন্যাসের সাথে সঙ্গতিপূর্ণ হয়৷
<Protection>
<ProtectionHeader SystemID="9a04f079-9840-4286-ab92-e65be0885f95">
$BASE64ENCODED_DATA
</ProtectionHeader>
</Protection>
নীচে একটি লাইভ স্মুথ স্ট্রিমিং ম্যানিফেস্টের একটি উদাহরণ রয়েছে যার 3000 সেকেন্ড সময়কালের সামগ্রী রয়েছে:
<?xml version="1.0"?>
<SmoothStreamingMedia MajorVersion="2" MinorVersion="0" Duration="3000000000"
TimeScale="10000000" IsLive="TRUE" LookAheadFragmentCount="2" DVRWindowLength="600000000" CanSeek="TRUE" CanPause="TRUE">
<StreamIndex Type="text" Name="textstream301_swe" Language="swe" Subtype="CAPT" Chunks="0"
TimeScale="10000000" Url="QualityLevels({bitrate})/Fragments(textstream301_swe={start time})">
<QualityLevel Index="0" Bitrate="20000" CodecPrivateData="" FourCC="DFXP"/>
<c d="40000000" t="80649382288125"/>
<c d="39980000"/>
<c d="40020000"/>
</StreamIndex>
<Protection>
<ProtectionHeader> SystemID="$BASE64ENCODEDDRMDATA$"</ProtectionHeader>
</Protection>
<StreamIndex Type="audio" Name="audio101_eng" Language="eng" Subtype="AACL" Chunks="0"
TimeScale="10000000" Url="QualityLevels({bitrate})/Fragments(audio101_eng={start time})">
<QualityLevel Index="0" Bitrate="128000" CodecPrivateData="1290" FourCC="AACL" AudioTag="255"
Channels="2" SamplingRate="32000" BitsPerSample="16" PacketSize="4"/>
<c d="40000000" t="80649401327500"/>
<c d="40000000"/>
<c d="40000000"/>
</StreamIndex>
<StreamIndex Type="video" Name="video" Subtype="AVC1" Chunks="0" TimeScale="10000000"
Url="QualityLevels({bitrate})/Fragments(video={start time})">
<QualityLevel Index="0" Bitrate="400000" CodecPrivateData="000000016742E01596540C0EFCB808140000000168CE3880"
FourCC="AVC1" MaxWidth="384" MaxHeight="216"/>
<QualityLevel Index="1" Bitrate="800000" CodecPrivateData="00000001674D401E965281004B6020500000000168EF3880"
FourCC="AVC1" MaxWidth="512" MaxHeight="288"/>
<QualityLevel Index="2" Bitrate="1600000" CodecPrivateData="00000001674D401E965281B07BCDE020500000000168EF3880"
FourCC="AVC1" MaxWidth="854" MaxHeight="480"/>
<QualityLevel Index="3" Bitrate="2200000" CodecPrivateData="00000001674D401F96528080093602050000000168EF3880"
FourCC="AVC1" MaxWidth="1024" MaxHeight="576"/>
<c d="40000000" t="80649401378125"/>
<c d="40000000"/>
<c d="40000000"/>
</StreamIndex>
</SmoothStreamingMedia>
ভিডিও স্ট্রীমের জন্য উপরের উদাহরণে, url টেমপ্লেট হল:
QualityLevels({bitrate})/Fragments(video={start time})
সুতরাং প্রথম দুটি সেগমেন্ট (ধরে নিচ্ছি আমরা সূচক 2 মানের স্তরে আছি) নিম্নলিখিত হবে, ভিডিও স্ট্রিমইন্ডেক্সের অধীনে t="80649401378125" থেকে নেওয়া প্রাথমিক সময় এবং প্রতি সেগমেন্টে 4 সেকেন্ডের সময় বৃদ্ধি * 10000000:
QualityLevels(2)/Fragments(video=80649401378125) QualityLevels(2)/Fragments(video=80649441378125) ...
এখানে স্মুথ স্ট্রিমিং বৈশিষ্ট্যগুলির একটি তালিকা রয়েছে যা আমরা বর্তমানে উপেক্ষা করি এবং সেগুলি সরবরাহ করা হোক না কেন স্ট্রিমিং অভিজ্ঞতার উপর কোন প্রভাব নেই:
-
<SmoothStreamingMedia>
ট্যাগে CanSeek , CanPause করুন । - অংশ ,
<StreamIndex>
ট্যাগে কোয়ালিটি লেভেল । পরিবর্তে, আমরা<StreamIndex>
এর মধ্যে প্রদত্ত তথ্য যেমন প্রকৃতQualityLevel
ট্যাগ এবং<c>
ট্যাগের উপর ভিত্তি করে সেগমেন্টের সংখ্যা এবং গুণমানের স্তরের সংখ্যা গণনা করি। - BitsPerSample ,
<QualityLevel>
-এ PacketSize ব্যবহার করা হয় না।
প্রদর্শনের ধরন পরীক্ষা করুন
canDisplayType
পদ্ধতি ওয়েব রিসিভার ডিভাইসের ভিডিও এবং অডিও ক্ষমতা পরীক্ষা করে এবং বুলিয়ান ফেরত দিয়ে মিডিয়া প্যারামিটারগুলি যাচাই করে প্রদর্শন করে। সমস্ত প্যারামিটার কিন্তু প্রথমটি ঐচ্ছিক — আপনি যত বেশি প্যারামিটার অন্তর্ভুক্ত করবেন, চেক তত বেশি সুনির্দিষ্ট হবে।
এর স্বাক্ষর হল canDisplayType(<em>mimeType</em>,<em>codecs</em>,<em>width</em>,<em>height</em>,<em>framerate</em>)
উদাহরণ:
ওয়েব রিসিভার ডিভাইস এবং ডিসপ্লে এই নির্দিষ্ট কোডেক, মাত্রা এবং ফ্রেমরেট সহ ভিডিও/mp4 মাইমেটাইপ সমর্থন করে কিনা তা পরীক্ষা করে:
canDisplayType("video/mp4", "avc1.42e015,mp4a.40.5", 1920, 1080, 30)
3840 এর প্রস্থ এবং 2160 এর উচ্চতা উল্লেখ করে এই কোডেকটির জন্য ওয়েব রিসিভার ডিভাইস এবং ডিসপ্লে 4K ভিডিও ফর্ম্যাট সমর্থন করে কিনা তা পরীক্ষা করে:
canDisplayType("video/mp4", "hev1.1.2.L150", 3840, 2160)
এই কোডেক, মাত্রা এবং ফ্রেমরেটের জন্য ওয়েব রিসিভার ডিভাইস এবং ডিসপ্লে HDR10 সমর্থন করে কিনা তা পরীক্ষা করে:
canDisplayType("video/mp4", "hev1.2.6.L150", 3840, 2160, 30)
এই কোডেক, মাত্রা এবং ফ্রেমরেটের জন্য ওয়েব রিসিভার ডিভাইস এবং ডিসপ্লে সমর্থন ডলবি ভিশন (DV) কিনা তা পরীক্ষা করে:
canDisplayType("video/mp4", "dvhe.04.06", 1920, 1080, 30)
ডিআরএম
কিছু মিডিয়া বিষয়বস্তুর জন্য ডিজিটাল রাইটস ম্যানেজমেন্ট (DRM) প্রয়োজন। মিডিয়া বিষয়বস্তুর জন্য যার DRM লাইসেন্স (এবং মূল URL) তাদের ম্যানিফেস্টে (DASH বা HLS) সংরক্ষিত আছে, Cast SDK আপনার জন্য এই কেসটি পরিচালনা করে৷ সেই বিষয়বস্তুর একটি উপসেটের জন্য একটি licenseUrl
প্রয়োজন যা ডিক্রিপশন কী পেতে প্রয়োজন। ওয়েব রিসিভারে, আপনি licenseUrl
সেট করতে PlaybackConfig
ব্যবহার করতে পারেন।
নিম্নলিখিত কোড স্নিপেট দেখায় কিভাবে আপনি লাইসেন্স অনুরোধের জন্য অনুরোধের তথ্য সেট করতে পারেন যেমন withCredentials
:
const context = cast.framework.CastReceiverContext.getInstance();
const playbackConfig = new cast.framework.PlaybackConfig();
// Customize the license url for playback
playbackConfig.licenseUrl = 'http://widevine/yourLicenseServer';
playbackConfig.protectionSystem = cast.framework.ContentProtection.WIDEVINE;
playbackConfig.licenseRequestHandler = requestInfo => {
requestInfo.withCredentials = true;
};
context.start({playbackConfig: playbackConfig});
// Update playback config licenseUrl according to provided value in load request.
context.getPlayerManager().setMediaPlaybackInfoHandler((loadRequest, playbackConfig) => {
if (loadRequest.media.customData && loadRequest.media.customData.licenseUrl) {
playbackConfig.licenseUrl = loadRequest.media.customData.licenseUrl;
}
return playbackConfig;
});
আপনার যদি Google অ্যাসিস্ট্যান্ট ইন্টিগ্রেশন থাকে, তাহলে কিছু DRM তথ্য যেমন কন্টেন্টের জন্য প্রয়োজনীয় শংসাপত্রগুলি OAuth/SSO-এর মতো প্রক্রিয়ার মাধ্যমে সরাসরি আপনার Google অ্যাকাউন্টের সাথে লিঙ্ক করা হতে পারে। এই ক্ষেত্রে, যদি মিডিয়া বিষয়বস্তু ভয়েসের মাধ্যমে লোড করা হয় বা ক্লাউড থেকে আসে, তাহলে ক্লাউড থেকে কাস্ট ডিভাইসে একটি setCredentials
আহ্বান করা হয় যা সেই শংসাপত্রগুলি প্রদান করে৷ একটি ওয়েব রিসিভার অ্যাপ লেখার অ্যাপ্লিকেশনগুলি প্রয়োজনীয়তা অনুযায়ী DRM পরিচালনা করতে setCredentials
তথ্য ব্যবহার করতে পারে। মিডিয়া নির্মাণের জন্য শংসাপত্র ব্যবহার করার একটি উদাহরণ এখানে।
পরামর্শ : এছাড়াও contentId, contentUrl এবং সত্তা ব্যবহার করে মিডিয়া লোড করা দেখুন।
অডিও চ্যানেল পরিচালনা
যখন কাস্ট প্লেয়ার মিডিয়া লোড করে, তখন এটি একটি একক অডিও উৎস বাফার সেট আপ করে৷ একই সময়ে, এটি প্রাথমিক ট্র্যাকের MIME প্রকারের উপর ভিত্তি করে বাফার দ্বারা ব্যবহার করার জন্য একটি উপযুক্ত কোডেকও নির্বাচন করে। একটি নতুন বাফার এবং কোডেক সেট আপ করা হয়েছে:
- যখন প্লেব্যাক শুরু হয়,
- প্রতিটি বিজ্ঞাপন বিরতিতে, এবং
- প্রতিবার মূল বিষয়বস্তু পুনরায় শুরু হয়।
কারণ বাফারটি একটি একক কোডেক ব্যবহার করে এবং কোডেকটি প্রাথমিক ট্র্যাকের উপর ভিত্তি করে বেছে নেওয়ার কারণে, সেকেন্ডারি ট্র্যাকগুলি ফিল্টার করা হতে পারে এবং শোনা যায় না। এটি ঘটতে পারে যখন একটি মিডিয়া প্রোগ্রামের প্রাথমিক ট্র্যাক চারপাশে-সাউন্ডে থাকে, কিন্তু সেকেন্ডারি অডিও ট্র্যাকগুলি স্টেরিও সাউন্ড ব্যবহার করে। যেহেতু সেকেন্ডারি ট্র্যাকগুলি প্রায়শই বিকল্প ভাষায় সামগ্রী অফার করার জন্য ব্যবহৃত হয়, তাই বিভিন্ন সংখ্যক ট্র্যাক ধারণকারী মিডিয়া প্রদান করা যথেষ্ট প্রভাব ফেলতে পারে, যেমন বিপুল সংখ্যক দর্শক তাদের স্থানীয় ভাষায় সামগ্রী শুনতে অক্ষম।
নিম্নলিখিত পরিস্থিতিগুলি ব্যাখ্যা করে যে কেন প্রোগ্রামিং প্রদান করা গুরুত্বপূর্ণ যেখানে প্রাথমিক এবং মাধ্যমিক ট্র্যাকগুলিতে একই সংখ্যক চ্যানেল রয়েছে:
দৃশ্যকল্প 1 - মিডিয়া স্ট্রীম প্রাথমিক এবং মাধ্যমিক ট্র্যাক জুড়ে চ্যানেল সমতার অভাব রয়েছে:
- ইংরেজি - AC-3 5.1 চ্যানেল (প্রাথমিক)
- সুইডিশ - AAC 2-চ্যানেল
- ফরাসি - AAC 2-চ্যানেল
- জার্মান - AAC 2-চ্যানেল
এই দৃশ্যে, যদি প্লেয়ারের ভাষা ইংরেজি ছাড়া অন্য কিছুতে সেট করা থাকে, ব্যবহারকারীরা যে ট্র্যাক শুনতে আশা করেন তা শুনতে পান না, কারণ প্লেব্যাকের সময় সমস্ত দুই-চ্যানেল ট্র্যাক ফিল্টার করা হয়। একমাত্র ট্র্যাক যা চালানো যেতে পারে প্রাথমিক AC-3 5.1-চ্যানেল, এবং তারপর শুধুমাত্র যখন ভাষা ইংরেজিতে সেট করা হয়।
দৃশ্যকল্প 2 - প্রাথমিক এবং মাধ্যমিক ট্র্যাক জুড়ে চ্যানেল সমতা সহ মিডিয়া স্ট্রিম:
- ইংরেজি - AC-3 5.1 চ্যানেল (প্রাথমিক)
- সুইডিশ - AC-3 5.1 চ্যানেল
- ফরাসি - AC-3 5.1 চ্যানেল
- জার্মান - AC-3 5.1 চ্যানেল
যেহেতু এই স্ট্রীমের সমস্ত ট্র্যাকগুলিতে একই সংখ্যক চ্যানেল রয়েছে, তাই নির্বাচিত ভাষা নির্বিশেষে একজন শ্রোতা একটি ট্র্যাক শুনতে পাবে৷
শাকা অডিও চ্যানেল পরিচালনা
সেকেন্ডারি অডিও ট্র্যাক জুড়ে সমতা নেই এমন মিডিয়ার মুখোমুখি হওয়ার সময় একটি প্রশমনের পরিমাপ হিসাবে, শাকা প্লেয়ার (DASH) একটি পছন্দের চ্যানেলের সংখ্যা দুটিতে ডিফল্ট করে।
যদি প্রাথমিক ট্র্যাকটি সাউন্ড সাউন্ড না হয় (উদাহরণস্বরূপ, একটি দুই-চ্যানেল স্টেরিও ট্র্যাক), তাহলে শাকা প্লেয়ারটি দুটি চ্যানেলে ডিফল্ট হবে এবং স্বয়ংক্রিয়ভাবে যেকোন সেকেন্ডারি মিডিয়া ট্র্যাকগুলিকে ফিল্টার করবে যেখানে দুটির বেশি চ্যানেল রয়েছে।
cast.framework.PlaybackConfig- এ shakaConfig
প্রপার্টিতে preferredAudioChannelCount
সেট করে Shaka-এর পছন্দের সংখ্যক অডিও চ্যানেল কনফিগার করা যেতে পারে।
যেমন:
shakaConfig = { "preferredAudioChannelCount": 6 };
preferredAudioChannelCount
6-এ সেট করা হলে, Shaka Player এটি সার্উন্ড সাউন্ড কোডেক ( AC-3
বা EC-3
) সমর্থন করতে পারে কিনা তা পরীক্ষা করে এবং পছন্দের সংখ্যক চ্যানেলের সাথে সঙ্গতিপূর্ণ নয় এমন কোনো মিডিয়া ট্র্যাক স্বয়ংক্রিয়ভাবে ফিল্টার করে।