नेटवर्क स्टैक

ExoPlayer, आम तौर पर इंटरनेट पर मीडिया स्ट्रीम करने के लिए इस्तेमाल किया जाता है. यह एक साथ, एक से ज़्यादा नेटवर्क स्टैक का अनुरोध करना. आपकी पसंद का नेटवर्क स्टैक होने की वजह से, स्ट्रीमिंग की परफ़ॉर्मेंस पर काफ़ी असर पड़ सकता है.

इस पेज में बताया गया है कि कैसे ExoPlayer को कॉन्फ़िगर करके, विकल्प, उपलब्ध विकल्पों की सूची देता है, और चुनने के तरीके के बारे में कुछ जानकारी देता है आपके ऐप्लिकेशन के लिए एक नेटवर्क स्टैक. साथ ही, स्ट्रीम के लिए कैश मेमोरी में सेव करने की सुविधा चालू करने का तरीका बताता है मीडिया.

किसी खास नेटवर्क स्टैक का इस्तेमाल करने के लिए, ExoPlayer को कॉन्फ़िगर करना

ExoPlayer, DataSource कॉम्पोनेंट के ज़रिए डेटा लोड करता है. इससे वह डेटा इकट्ठा करता है ऐप्लिकेशन कोड से इंजेक्ट किए गए DataSource.Factory इंस्टेंस.

अगर आपके ऐप्लिकेशन को नेटवर्क चुनने के लिए, सिर्फ़ एचटीटीपी कॉन्टेंट चलाना है स्टैक, किसी भी DataSource.Factory इंस्टेंस को अपडेट करने जितना आसान है ऐप्लिकेशन, HttpDataSource.Factory के इंस्टेंस के लिए इंजेक्ट करता है जो उस नेटवर्क स्टैक से जुड़ी हो जिसका आपको इस्तेमाल करना है. अगर आपका ऐप्लिकेशन भी बिना एचटीटीपी वाला कॉन्टेंट चलाने की ज़रूरत होती है, जैसे कि लोकल फ़ाइलें DefaultDataSource.Factory:

Kotlin

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

Java

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

इस उदाहरण में, PreferredHttpDataSource.Factory आपकी पसंदीदा नेटवर्क स्टैक चुनें. DefaultDataSource.Factory लेयर, काम में मदद करती है बिना एचटीटीपी सोर्स के इस्तेमाल करें, जैसे कि लोकल फ़ाइलें.

नीचे दिए गए उदाहरण में, Cronet का इस्तेमाल करने वाला ExoPlayer बनाने का तरीका बताया गया है नेटवर्क स्टैक की सुविधा उपलब्ध है. साथ ही, बिना एचटीटीपी वाले कॉन्टेंट को चलाने की सुविधा भी मिलती है.

Kotlin

// 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()

Java

// 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, Okttp, और Android के लिए सीधे सहायता उपलब्ध कराता है पहले से मौजूद डिफ़ॉल्ट नेटवर्क स्टैक. ExoPlayer को जो Android पर काम करते हों.

एचटीटीपीइंजन

HttpEngine Android पर, एपीआई 34 (या S) से चलने वाले डिफ़ॉल्ट नेटवर्क स्टैक का सुझाव दिया जाता है एक्सटेंशन 7). ज़्यादातर मामलों में, Cronet नेटवर्क स्टैक का इस्तेमाल किया जाता है. QUIC प्रोटोकॉल पर एचटीटीपी, एचटीटीपी/2, और एचटीटीपी/3 के साथ काम करता है.

ExoPlayer, अपने HttpEngineDataSource.Factory के साथ HttpEngine के साथ काम करता है. आप इस डेटा सोर्स फ़ैक्ट्री को इंजेक्ट करने के लिए, ExoPlayer को कॉन्फ़िगर करना चुनिंदा नेटवर्क स्टैक को हटा दिया जाए.

क्रोनट

क्रोनेट Chromium नेटवर्क स्टैक, Android ऐप्लिकेशन के लिए लाइब्रेरी के तौर पर उपलब्ध कराया गया. Cronet ने लिया का लाभ उठाने के लिए कई तरह की टेक्नोलॉजी का इस्तेमाल किया है, जो इंतज़ार के समय को कम करती हैं और आपके ऐप्लिकेशन को काम करने के लिए ज़रूरी नेटवर्क अनुरोधों की थ्रूपुट वैल्यू. इसमें वे अनुरोध भी शामिल हैं इसे ExoPlayer ने बनाया है. यह मूल रूप से QUIC पर एचटीटीपी, एचटीटीपी/2, और एचटीटीपी/3 के साथ काम करता है प्रोटोकॉल इस्तेमाल किए. दुनिया के कुछ बड़े स्ट्रीमिंग ऐप्लिकेशन, Cronet का इस्तेमाल करते हैं. जिसमें YouTube भी शामिल है.

ExoPlayer, अपनी क्रोनेट लाइब्रेरी. इस्तेमाल करने के तरीके से जुड़े निर्देशों के लिए, लाइब्रेरी की README.md देखें इसे. ध्यान दें कि Cronet लाइब्रेरी लागू करना:

  1. Google Play Services: हमारा सुझाव है कि आप लागू करने की इस सुविधा का इस्तेमाल और Android के बिल्ट-इन नेटवर्क स्टैक पर वापस जाएं (DefaultHttpDataSource) अगर Google Play services उपलब्ध नहीं है.
  2. क्रोनेट एम्बेड किया गया: अगर आपके उपयोगकर्ताओं का एक बड़ा हिस्सा हो, तो यह एक अच्छा विकल्प हो सकता है ऐसे देशों में हैं जहां Google Play services आम तौर पर उपलब्ध नहीं है या इस्तेमाल किए जा रहे Cronet वर्शन के सटीक वर्शन को कंट्रोल करना हो. कॉन्टेंट बनाने Cronet Embedded का एक बड़ा नुकसान यह है कि यह आपका ऐप्लिकेशन.
  3. क्रोनेट फ़ॉलबैक: Cronet ऐप्लिकेशन के लिए फ़ॉलबैक लागू करने की प्रक्रिया Android में पहले से मौजूद नेटवर्क स्टैक के चारों ओर रैपर के तौर पर Cronet का एपीआई. इसे ऐसा होना चाहिए ExoPlayer के साथ इस्तेमाल नहीं किया जा सकता, क्योंकि Android के बिल्ट-इन नेटवर्क स्टैक का इस्तेमाल किया जा रहा है बेहतर तरीके से काम करते हैं (DefaultHttpDataSource का इस्तेमाल करके).

OkHttp

OkHttp एक और मॉडर्न नेटवर्क स्टैक है, जो कई लोकप्रिय Android ऐप्लिकेशन में इस ऐप्लिकेशन का काफ़ी इस्तेमाल किया जाता है. यह एचटीटीपी और HTTP/2, लेकिन अभी तक QUIC पर एचटीटीपी/3 के साथ काम नहीं करता है.

ExoPlayer, इसकी मदद से OkHttp का इस्तेमाल करता है OkHttp लाइब्रेरी. इस्तेमाल करने के तरीके से जुड़े निर्देशों के लिए, लाइब्रेरी की README.md देखें इसे. OkHttp लाइब्रेरी का इस्तेमाल करते समय, नेटवर्क स्टैक को है. यह Cronet Embedded की तरह है. हालांकि, OkHttp काफ़ी अहम है छोटा, ऐप्लिकेशन में 1 एमबी से कम किया जा रहा है.

Android में पहले से मौजूद नेटवर्क स्टैक

ExoPlayer, Android के बिल्ट-इन नेटवर्क स्टैक का इस्तेमाल DefaultHttpDataSource और DefaultHttpDataSource.Factory, जो इसका हिस्सा हैं मुख्य ExoPlayer लाइब्रेरी.

नेटवर्क स्टैक को पूरी तरह लागू किया जाता है, यह पहले से मौजूद डिवाइस. ज़्यादातर डिवाइसों पर सिर्फ़ एचटीटीपी काम करता है. इसका मतलब है कि एचटीटीपी/2 और एचटीटीपी/3, QUIC पर काम नहीं करते).

अन्य नेटवर्क स्टैक

ऐप्लिकेशन, ExoPlayer के साथ अन्य नेटवर्क स्टैक को भी इंटिग्रेट कर सकते हैं. ऐसा करने के लिए, एक HttpDataSource लागू करें, जो नेटवर्क स्टैक को रैप करता है. और संबंधित HttpDataSource.Factory को साथ में रखें. ExoPlayer's Cronet और ऐसा करने का तरीका जानने के लिए, OkHttp लाइब्रेरी अच्छे उदाहरण हैं.

पूरी तरह से Java नेटवर्क स्टैक के साथ इंटिग्रेट करते समय, DataSourceContractTest, ताकि यह जांच की जा सके कि आपका HttpDataSource लागू हुआ है या नहीं ठीक से काम करता है. OkHttp लाइब्रेरी में मौजूद OkHttpDataSourceContractTest को अच्छी तरह से समझ लिया है.

नेटवर्क स्टैक चुनना

नीचे दी गई टेबल में, दो डिवाइसों पर काम करने वाले नेटवर्क स्टैक के फ़ायदे और नुकसान बताए गए हैं ExoPlayer.

नेटवर्क स्टैक प्रोटोकॉल APK के साइज़ का असर नोट
एचटीटीपीइंजन एचटीटीपी
HTTP/2
HTTP/3 ज़्यादा QUIC
कोई नहीं सिर्फ़ API 34 या S एक्सटेंशन 7 पर उपलब्ध है
Cronet (Google Play सेवाएं) एचटीटीपी
HTTP/2
HTTP/3 ज़्यादा QUIC
छोटा
(100 केबी से कम)
इसके लिए, Google Play services की ज़रूरत होती है. Cronet वर्शन अपने-आप अपडेट हो गया
Cronet (एम्बेडेड) एचटीटीपी
HTTP/2
HTTP/3 ज़्यादा QUIC
बड़ा
(~8 एमबी)
Cronet वर्शन को ऐप्लिकेशन डेवलपर कंट्रोल करता है
Cronet (फ़ॉलबैक) एचटीटीपी
(डिवाइस के हिसाब से अलग-अलग होता है)
छोटा
(100 केबी से कम)
ExoPlayer पर खेलने का सुझाव नहीं दिया जाता
OkHttp एचटीटीपी
एचटीटीपी/2
छोटा
(1 एमबी से कम)
पहले से मौजूद नेटवर्क स्टैक एचटीटीपी
(डिवाइस के हिसाब से अलग-अलग होता है)
कोई नहीं डिवाइस के हिसाब से लागू करने का तरीका अलग-अलग होता है

QUIC प्रोटोकॉल पर एचटीटीपी/2 और एचटीटीपी/3 से मीडिया को काफ़ी बेहतर बनाया जा सकता है स्ट्रीमिंग परफ़ॉर्मेंस. खास तौर पर, ऐसे अडैप्टिव मीडिया की स्ट्रीमिंग कॉन्टेंट डिस्ट्रिब्यूशन नेटवर्क (सीडीएन) का इस्तेमाल करके डिस्ट्रिब्यूट किया जाता है. ऐसे में इन प्रोटोकॉल का इस्तेमाल करने से, सीडीएन बेहतर तरीके से काम कर सकते हैं. इस वजह से, HttpEngine और Cronets का इस्तेमाल, एचटीटीपी/2 और एचटीटीपी/3, दोनों के लिए किया जा सकता है QUIC (और HTTP/2 के लिए OkHttp की सहायता), की तुलना में एक बड़ा लाभ है, तो का इस्तेमाल करके, Android के बिल्ट-इन नेटवर्क स्टैक का इस्तेमाल करके सामग्री होस्ट की जाती है और वह इन प्रोटोकॉल का भी समर्थन करती है.

अलग से मीडिया स्ट्रीमिंग करने के बारे में विचार करते समय, हम HttpEngine का इस्तेमाल करने या Google Play services की ओर से उपलब्ध कराया गया CronetDefaultHttpDataSource ऐप्लिकेशन उपलब्ध न हो. इस सुझाव ने यह ज़्यादातर डिवाइसों पर QUIC के मुकाबले एचटीटीपी/2 और एचटीटीपी/3 के इस्तेमाल के बीच संतुलन बनाता है और APK के साइज़ को बढ़ाने से बचने के लिए. इसके अपवाद हैं सुझाव. उन मामलों में जहां Google Play सेवाएं अनुपलब्ध होने की संभावना है जिन डिवाइसों पर आपका ऐप्लिकेशन चलेगा, ऐसे में, Cronet Embedded या OkHttp का इस्तेमाल करना सही हो सकता है. बिल्ट-इन सुविधाओं का इस्तेमाल अगर APK का साइज़ गंभीर है या मीडिया को लेकर कोई परेशानी है, तो नेटवर्क स्टैक की अनुमति मिल सकती है स्ट्रीमिंग, आपके ऐप्लिकेशन की सुविधाओं का एक छोटा सा हिस्सा है.

मीडिया के अलावा, आम तौर पर एक नेटवर्क स्टैक को चुनना अच्छा रहता है आपके ऐप्लिकेशन की सभी नेटवर्किंग के लिए. इससे संसाधनों को (जैसे कि सॉकेट) को ExoPlayer और अन्य के बीच कुशलता से पूल किया जाना और शेयर किया जाना के तौर पर इस्तेमाल किए जा सकते हैं.

आपके ऐप्लिकेशन को नेटवर्किंग की ज़रूरत होगी, क्योंकि यह एक-दूसरे से जुड़ी हुई नहीं है मीडिया प्लेबैक के लिए, आपके नेटवर्क स्टैक का विकल्प हमारे अलग से मीडिया स्ट्रीम करने के बारे में ऊपर दिए गए सुझाव पढ़ें. नेटवर्किंग करने वाले अन्य कॉम्पोनेंट और आपके कारोबार के लिए उनका सापेक्ष है.

मीडिया को कैश मेमोरी में सेव करना

ExoPlayer, डिस्क में कैश मेमोरी में लोड होने वाली बाइट की सुविधा देता है, ताकि बार-बार लोड होने से रोका जा सके नेटवर्क से इतने बाइट होना चाहिए. यह मौजूदा स्थिति में वापस आने के लिए उपयोगी है मीडिया या एक ही आइटम को दोहराना.

कैश मेमोरी में सेव करने के लिए, यह ज़रूरी है कि SimpleCache इंस्टेंस, खास तरह की कैश मेमोरी पर ले जाता हो और एक CacheDataSource.Factory:

Kotlin

// 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()

Java

// 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();