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

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

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

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

এক্সোপ্লেয়ার DataSource উপাদানগুলির মাধ্যমে ডেটা লোড করে, যা এটি DataSource.Factory ইনস্ট্যান্স থেকে প্রাপ্ত করে যা অ্যাপ কোড থেকে ইনজেক্ট করা হয়।

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

কোটলিন

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

জাভা

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

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

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

কোটলিন

// 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 এর বিল্ট-ইন ডিফল্ট নেটওয়ার্ক স্ট্যাকের জন্য সরাসরি সহায়তা প্রদান করে। ExoPlayer কে Android এ কাজ করে এমন অন্য যেকোনো নেটওয়ার্ক স্ট্যাক সমর্থন করার জন্যও বাড়ানো যেতে পারে।

HttpEngine সম্পর্কে

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

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

ক্রোনেট

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

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

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

ঠিক আছে

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

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

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

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

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

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

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

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

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

নিম্নলিখিত টেবিলে ExoPlayer দ্বারা সমর্থিত নেটওয়ার্ক স্ট্যাকের সুবিধা এবং অসুবিধাগুলি বর্ণনা করা হয়েছে।

নেটওয়ার্ক স্ট্যাক প্রোটোকল APK আকারের প্রভাব মন্তব্য
HttpEngine সম্পর্কে HTTP সম্পর্কে
HTTP/2 সম্পর্কে
QUIC এর মাধ্যমে HTTP/3
কোনটিই নয় শুধুমাত্র API 34, অথবা S এক্সটেনশন 7-এ উপলব্ধ
ক্রোনেট (গুগল প্লে সার্ভিসেস) HTTP সম্পর্কে
HTTP/2 সম্পর্কে
QUIC এর মাধ্যমে HTTP/3
ছোট
(<১০০ কেবি)
গুগল প্লে পরিষেবা প্রয়োজন। ক্রোনেট সংস্করণ স্বয়ংক্রিয়ভাবে আপডেট হয়
ক্রোনেট (এম্বেডেড) HTTP সম্পর্কে
HTTP/2 সম্পর্কে
QUIC এর মাধ্যমে HTTP/3
বড়
(~৮ এমবি)
অ্যাপ ডেভেলপার দ্বারা নিয়ন্ত্রিত ক্রোনেট সংস্করণ
ক্রোনেট (ফলব্যাক) HTTP সম্পর্কে
(ডিভাইস অনুসারে পরিবর্তিত হয়)
ছোট
(<১০০ কেবি)
ExoPlayer-এর জন্য সুপারিশ করা হয় না
ঠিক আছে HTTP সম্পর্কে
HTTP/2 সম্পর্কে
ছোট
(<১ এমবি)
অন্তর্নির্মিত নেটওয়ার্ক স্ট্যাক HTTP সম্পর্কে
(ডিভাইস অনুসারে পরিবর্তিত হয়)
কোনটিই নয় ডিভাইস অনুসারে বাস্তবায়ন পরিবর্তিত হয়

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

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

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

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

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

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

ক্যাশিংয়ের জন্য একটি ডেডিকেটেড ক্যাশে ডিরেক্টরি এবং একটি 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();