নেটওয়ার্ক স্ট্যাক

ExoPlayer সাধারণত ইন্টারনেটে মিডিয়া স্ট্রিম করার জন্য ব্যবহৃত হয়। এটি তার অন্তর্নিহিত নেটওয়ার্ক অনুরোধ করার জন্য একাধিক নেটওয়ার্ক স্ট্যাক সমর্থন করে। নেটওয়ার্ক স্ট্যাকের আপনার পছন্দ স্ট্রিমিং কর্মক্ষমতা উপর একটি উল্লেখযোগ্য প্রভাব ফেলতে পারে.

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

একটি নির্দিষ্ট নেটওয়ার্ক স্ট্যাক ব্যবহার করতে ExoPlayer কনফিগার করা হচ্ছে

ExoPlayer DataSource উপাদানগুলির মাধ্যমে ডেটা লোড করে, যা এটি DataSource.Factory থেকে প্রাপ্ত করে৷ ফ্যাক্টরি দৃষ্টান্তগুলি যা অ্যাপ কোড থেকে ইনজেকশন করা হয়৷

যদি আপনার অ্যাপের শুধুমাত্র http(গুলি) বিষয়বস্তু চালানোর প্রয়োজন হয়, তাহলে একটি নেটওয়ার্ক স্ট্যাক নির্বাচন করা যেকোন DataSource.Factory আপডেট করার মতোই সহজ৷ ফ্যাক্টরি দৃষ্টান্তগুলি যা আপনার অ্যাপটি HttpDataSource.Factory এর দৃষ্টান্ত হিসাবে ইনজেক্ট করে৷ ফ্যাক্টরি যা আপনি যে নেটওয়ার্ক স্ট্যাকের ব্যবহার করতে চান তার সাথে মিলে যায়৷ আপনার অ্যাপেরও যদি স্থানীয় ফাইলের মতো নন-http(গুলি) সামগ্রী চালাতে হয়, তাহলে DefaultDataSource.Factory ব্যবহার করুন:

কোটলিন

DefaultDataSource.Factory(
  ...
  /* baseDataSourceFactory= */ PreferredHttpDataSource.Factory(...))

জাভা

new DefaultDataSource.Factory(
    ...
    /* baseDataSourceFactory= */ new PreferredHttpDataSource.Factory(...));

এই উদাহরণে, PreferredHttpDataSource.Factory হল আপনার পছন্দের নেটওয়ার্ক স্ট্যাকের সাথে সংশ্লিষ্ট ফ্যাক্টরি। DefaultDataSource.Factory লেয়ারটি নন-http(গুলি) উত্স যেমন স্থানীয় ফাইলগুলির জন্য সমর্থন যোগ করে।

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে একটি ExoPlayer তৈরি করতে হয় যা Cronet নেটওয়ার্ক স্ট্যাক ব্যবহার করবে এবং নন-http(গুলি) সামগ্রীর প্লেব্যাক সমর্থন করবে।

কোটলিন

// Given a CronetEngine and Executor, build a CronetDataSource.Factory.
val cronetDataSourceFactory = CronetDataSource.Factory(cronetEngine, executor)

// Wrap the CronetDataSource.Factory in a DefaultDataSource.Factory, which adds
// in support for requesting data from other sources (such as files, resources,
// etc).
val dataSourceFactory =
  DefaultDataSource.Factory(context, /* baseDataSourceFactory= */ cronetDataSourceFactory)

// Inject the DefaultDataSource.Factory when creating the player.
val player =
  ExoPlayer.Builder(context)
    .setMediaSourceFactory(
      DefaultMediaSourceFactory(context).setDataSourceFactory(dataSourceFactory)
    )
    .build()

জাভা

// Given a CronetEngine and Executor, build a CronetDataSource.Factory.
CronetDataSource.Factory cronetDataSourceFactory =
    new CronetDataSource.Factory(cronetEngine, executor);

// Wrap the CronetDataSource.Factory in a DefaultDataSource.Factory, which adds
// in support for requesting data from other sources (such as files, resources,
// etc).
DefaultDataSource.Factory dataSourceFactory =
    new DefaultDataSource.Factory(
        context, /* baseDataSourceFactory= */ cronetDataSourceFactory);

// Inject the DefaultDataSource.Factory when creating the player.
ExoPlayer player =
    new ExoPlayer.Builder(context)
        .setMediaSourceFactory(
            new DefaultMediaSourceFactory(context).setDataSourceFactory(dataSourceFactory))
        .build();

সমর্থিত নেটওয়ার্ক স্ট্যাক

ExoPlayer HttpEngine, Cronet, OkHttp এবং Android এর বিল্ট-ইন ডিফল্ট নেটওয়ার্ক স্ট্যাকের জন্য সরাসরি সমর্থন প্রদান করে। অ্যান্ড্রয়েডে কাজ করে এমন অন্য কোনও নেটওয়ার্ক স্ট্যাককে সমর্থন করার জন্য এক্সোপ্লেয়ারকেও বাড়ানো যেতে পারে।

Http ইঞ্জিন

HttpEngine হল API 34 (বা S এক্সটেনশন 7) থেকে Android-এ প্রস্তাবিত ডিফল্ট নেটওয়ার্ক স্ট্যাক। বেশিরভাগ ক্ষেত্রে, এটি অভ্যন্তরীণভাবে Cronet নেটওয়ার্ক স্ট্যাক ব্যবহার করে, HTTP, HTTP/2, এবং HTTP/3 কে QUIC প্রোটোকলের মাধ্যমে সমর্থন করে।

ExoPlayer HttpEngine এর HttpEngineDataSource.Factory সহ সমর্থন করে। আপনি একটি নির্দিষ্ট নেটওয়ার্ক স্ট্যাক ব্যবহার করার জন্য ExoPlayer কনফিগারিং -এ বর্ণিত ডেটা সোর্স ফ্যাক্টরিটি ইনজেকশন করতে পারেন৷

ক্রোনেট

Cronet হল ক্রোমিয়াম নেটওয়ার্ক স্ট্যাক যা Android অ্যাপে লাইব্রেরি হিসেবে উপলব্ধ করা হয়েছে। Cronet একাধিক প্রযুক্তির সুবিধা গ্রহণ করে যা লেটেন্সি কমায় এবং আপনার অ্যাপের কাজ করার জন্য প্রয়োজনীয় নেটওয়ার্ক অনুরোধগুলির থ্রুপুট বাড়ায়, যার মধ্যে ExoPlayer দ্বারা তৈরি করা হয়। এটি স্থানীয়ভাবে HTTP, HTTP/2, এবং HTTP/3 কে QUIC প্রোটোকলের মাধ্যমে সমর্থন করে। ক্রোনেট ইউটিউব সহ বিশ্বের কিছু বড় স্ট্রিমিং অ্যাপ ব্যবহার করে।

ExoPlayer এর Cronet লাইব্রেরির মাধ্যমে Cronet সমর্থন করে। এটি কীভাবে ব্যবহার করবেন তার বিস্তারিত নির্দেশাবলীর জন্য লাইব্রেরির README.md দেখুন। মনে রাখবেন যে Cronet লাইব্রেরি তিনটি অন্তর্নিহিত Cronet বাস্তবায়ন ব্যবহার করতে সক্ষম:

  1. Google Play পরিষেবাগুলি: আমরা বেশিরভাগ ক্ষেত্রে এই প্রয়োগটি ব্যবহার করার পরামর্শ দিই, এবং Google Play পরিষেবাগুলি উপলব্ধ না হলে Android এর অন্তর্নির্মিত নেটওয়ার্ক স্ট্যাকে ( DefaultHttpDataSource ) ফিরে আসার পরামর্শ দিই৷
  2. Cronet এমবেডেড: আপনার ব্যবহারকারীদের একটি বৃহৎ শতাংশ এমন বাজারে থাকলে একটি ভাল পছন্দ হতে পারে যেখানে Google Play পরিষেবাগুলি ব্যাপকভাবে উপলব্ধ নয়, অথবা আপনি যদি Cronet বাস্তবায়নের সঠিক সংস্করণটি ব্যবহার করা হচ্ছে তা নিয়ন্ত্রণ করতে চান। Cronet Embedded এর প্রধান অসুবিধা হল এটি আপনার অ্যাপে প্রায় 8MB যোগ করে।
  3. ক্রোনেট ফলব্যাক: ক্রোনেটের ফলব্যাক বাস্তবায়ন ক্রনেটের এপিআইকে অ্যান্ড্রয়েডের অন্তর্নির্মিত নেটওয়ার্ক স্ট্যাকের চারপাশে একটি মোড়ক হিসাবে প্রয়োগ করে। এটি ExoPlayer এর সাথে ব্যবহার করা উচিত নয়, যেহেতু Android এর অন্তর্নির্মিত নেটওয়ার্ক স্ট্যাক সরাসরি ব্যবহার করা ( DefaultHttpDataSource ব্যবহার করে) আরও দক্ষ।

OkHttp

OkHttp হল আরেকটি আধুনিক নেটওয়ার্ক স্ট্যাক যা অনেক জনপ্রিয় অ্যান্ড্রয়েড অ্যাপ দ্বারা ব্যাপকভাবে ব্যবহৃত হয়। এটি HTTP এবং HTTP/2 সমর্থন করে, কিন্তু এখনও QUIC তে HTTP/3 সমর্থন করে না।

ExoPlayer তার OkHttp লাইব্রেরির মাধ্যমে OkHttp সমর্থন করে। এটি কীভাবে ব্যবহার করবেন তার বিস্তারিত নির্দেশাবলীর জন্য লাইব্রেরির README.md দেখুন। OkHttp লাইব্রেরি ব্যবহার করার সময়, নেটওয়ার্ক স্ট্যাক অ্যাপের মধ্যে এমবেড করা হয়। এটি Cronet Embedded এর মতো, তবে OkHttp উল্লেখযোগ্যভাবে ছোট, আপনার অ্যাপে 1MB এর কম যোগ করে।

Android এর অন্তর্নির্মিত নেটওয়ার্ক স্ট্যাক

ExoPlayer DefaultHttpDataSource এবং DefaultHttpDataSource.Factory সহ Android এর অন্তর্নির্মিত নেটওয়ার্ক স্ট্যাকের ব্যবহার সমর্থন করে, যা মূল ExoPlayer লাইব্রেরির অংশ।

সঠিক নেটওয়ার্ক স্ট্যাক বাস্তবায়ন অন্তর্নিহিত ডিভাইসে চলমান সফ্টওয়্যারের উপর নির্ভর করে। বেশিরভাগ ডিভাইসে শুধুমাত্র HTTP সমর্থিত (অর্থাৎ, HTTP/2 এবং HTTP/3 QUIC তে সমর্থিত নয়)।

অন্যান্য নেটওয়ার্ক স্ট্যাক

অ্যাপ্লিকেশানগুলি ExoPlayer এর সাথে অন্যান্য নেটওয়ার্ক স্ট্যাকগুলিকেও একীভূত করতে পারে৷ এটি করার জন্য, একটি HttpDataSource প্রয়োগ করুন যা একটি সংশ্লিষ্ট HttpDataSource.Factory সহ নেটওয়ার্ক স্ট্যাককে মোড়ানো হয়। ExoPlayer এর Cronet এবং OkHttp লাইব্রেরিগুলি কীভাবে এটি করতে হয় তার ভাল উদাহরণ।

একটি খাঁটি জাভা নেটওয়ার্ক স্ট্যাকের সাথে সংহত করার সময়, আপনার HttpDataSource বাস্তবায়ন সঠিকভাবে আচরণ করছে কিনা তা পরীক্ষা করার জন্য একটি DataSourceContractTest প্রয়োগ করা একটি ভাল ধারণা৷ OkHttp লাইব্রেরিতে OkHttpDataSourceContractTest এটি কীভাবে করা যায় তার একটি ভাল উদাহরণ।

একটি নেটওয়ার্ক স্ট্যাক নির্বাচন করা হচ্ছে

নিম্নলিখিত সারণী ExoPlayer দ্বারা সমর্থিত নেটওয়ার্ক স্ট্যাকগুলির সুবিধা এবং অসুবিধাগুলিকে রূপরেখা দেয়৷

নেটওয়ার্ক স্তর প্রোটোকল APK আকার প্রভাব মন্তব্য
Http ইঞ্জিন HTTP
HTTP/2
HTTP/3 QUIC তে
কোনোটিই নয় শুধুমাত্র API 34, বা S এক্সটেনশন 7 এ উপলব্ধ
ক্রোনেট (গুগল প্লে পরিষেবা) HTTP
HTTP/2
HTTP/3 QUIC তে
ছোট
(<100KB)
Google Play পরিষেবার প্রয়োজন। Cronet সংস্করণ স্বয়ংক্রিয়ভাবে আপডেট করা হয়েছে
Cronet (এম্বেড করা) HTTP
HTTP/2
HTTP/3 QUIC তে
বড়
(~8MB)
ক্রনেট সংস্করণ অ্যাপ বিকাশকারী দ্বারা নিয়ন্ত্রিত
ক্রোনেট (ফলব্যাক) HTTP
(ডিভাইস দ্বারা পরিবর্তিত হয়)
ছোট
(<100KB)
ExoPlayer এর জন্য প্রস্তাবিত নয়
OkHttp HTTP
HTTP/2
ছোট
(<1MB)
অন্তর্নির্মিত নেটওয়ার্ক স্ট্যাক HTTP
(ডিভাইস দ্বারা পরিবর্তিত হয়)
কোনোটিই নয় বাস্তবায়ন ডিভাইস দ্বারা পরিবর্তিত হয়

HTTP/2 এবং HTTP/3 ওভার QUIC প্রোটোকল উল্লেখযোগ্যভাবে মিডিয়া স্ট্রিমিং কর্মক্ষমতা উন্নত করতে পারে। বিশেষ করে, যখন কনটেন্ট ডিস্ট্রিবিউশন নেটওয়ার্ক (CDN) ব্যবহার করে বিতরণ করা অভিযোজিত মিডিয়া স্ট্রিমিং করা হয়, তখন এমন কিছু ঘটনা রয়েছে যেগুলির জন্য এই প্রোটোকলগুলির ব্যবহার CDNগুলিকে আরও দক্ষতার সাথে কাজ করতে দেয়। এই কারণে, HttpEngine এবং Cronet-এর সমর্থন HTTP/2 এবং HTTP/3 উভয়ের জন্য QUIC (এবং HTTP/2-এর জন্য OkHttp-এর সমর্থন), অ্যান্ড্রয়েডের অন্তর্নির্মিত নেটওয়ার্ক স্ট্যাক ব্যবহার করার তুলনায় একটি প্রধান সুবিধা, যে সার্ভারগুলিতে সামগ্রী হোস্ট করা হয় এই প্রোটোকল সমর্থন করে.

বিচ্ছিন্নভাবে মিডিয়া স্ট্রিমিং বিবেচনা করার সময়, আমরা Google Play পরিষেবাগুলি দ্বারা প্রদত্ত HttpEngine বা Cronet ব্যবহার করার পরামর্শ দিই যদি Google Play পরিষেবাগুলি অনুপলব্ধ থাকে তাহলে DefaultHttpDataSource এ ফিরে আসবে৷ এই সুপারিশটি বেশিরভাগ ডিভাইসে QUIC এর উপর HTTP/2 এবং HTTP/3 ব্যবহার সক্ষম করার এবং APK আকারে উল্লেখযোগ্য বৃদ্ধি এড়ানোর মধ্যে একটি ভাল ভারসাম্য বজায় রাখে। এই সুপারিশের ব্যতিক্রম আছে. এমন ক্ষেত্রে যেখানে Google Play পরিষেবাগুলি আপনার অ্যাপ চালানোর মতো ডিভাইসগুলির একটি উল্লেখযোগ্য অংশে অনুপলব্ধ হওয়ার সম্ভাবনা রয়েছে, Cronet Embedded বা OkHttp ব্যবহার করা আরও উপযুক্ত হতে পারে। বিল্ট-ইন নেটওয়ার্ক স্ট্যাকের ব্যবহার গ্রহণযোগ্য হতে পারে যদি APK আকার একটি গুরুত্বপূর্ণ উদ্বেগ হয়, অথবা যদি মিডিয়া স্ট্রিমিং আপনার অ্যাপের কার্যকারিতার একটি ছোট অংশ হয়।

শুধুমাত্র মিডিয়ার বাইরে, আপনার অ্যাপ দ্বারা সম্পাদিত সমস্ত নেটওয়ার্কিংয়ের জন্য একটি একক নেটওয়ার্ক স্ট্যাক বেছে নেওয়া সাধারণত একটি ভাল ধারণা। এটি সম্পদগুলি (যেমন সকেট) দক্ষতার সাথে পুল এবং ExoPlayer এবং অন্যান্য অ্যাপ উপাদানগুলির মধ্যে ভাগ করার অনুমতি দেয়৷

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

ক্যাশিং মিডিয়া

ExoPlayer নেটওয়ার্ক থেকে একই বাইট বারবার লোড হওয়া প্রতিরোধ করতে ডিস্কে লোড করা বাইট ক্যাশিং সমর্থন করে। বর্তমান মিডিয়াতে ফিরে খোঁজার সময় বা একই আইটেম পুনরাবৃত্তি করার সময় এটি কার্যকর।

ক্যাশিংয়ের জন্য একটি ডেডিকেটেড ক্যাশে ডিরেক্টরি এবং একটি CacheDataSource.Factory নির্দেশ করে একটি SimpleCache উদাহরণ প্রয়োজন:

কোটলিন

// Note: This should be a singleton in your app.
val databaseProvider = StandaloneDatabaseProvider(context)

// An on-the-fly cache should evict media when reaching a maximum disk space limit.
val cache =
    SimpleCache(
        downloadDirectory, LeastRecentlyUsedCacheEvictor(maxBytes), databaseProvider)

// Configure the DataSource.Factory with the cache and factory for the desired HTTP stack.
val cacheDataSourceFactory =
    CacheDataSource.Factory()
        .setCache(cache)
        .setUpstreamDataSourceFactory(httpDataSourceFactory)

// Inject the DefaultDataSource.Factory when creating the player.
val player =
    ExoPlayer.Builder(context)
        .setMediaSourceFactory(
            DefaultMediaSourceFactory(context).setDataSourceFactory(cacheDataSourceFactory))
        .build()

জাভা

// Note: This should be a singleton in your app.
DatabaseProvider databaseProvider = new StandaloneDatabaseProvider(context);

// An on-the-fly cache should evict media when reaching a maximum disk space limit.
Cache cache =
    new SimpleCache(
        downloadDirectory, new LeastRecentlyUsedCacheEvictor(maxBytes), databaseProvider);

// Configure the DataSource.Factory with the cache and factory for the desired HTTP stack.
DataSource.Factory cacheDataSourceFactory =
    new CacheDataSource.Factory()
        .setCache(cache)
        .setUpstreamDataSourceFactory(httpDataSourceFactory);

// Inject the DefaultDataSource.Factory when creating the player.
ExoPlayer player =
    new ExoPlayer.Builder(context)
        .setMediaSourceFactory(
            new DefaultMediaSourceFactory(context).setDataSourceFactory(cacheDataSourceFactory))
        .build();