आम तौर पर, ExoPlayer का इस्तेमाल इंटरनेट पर मीडिया स्ट्रीम करने के लिए किया जाता है. यह नेटवर्क से जुड़े अनुरोध करने के लिए, कई नेटवर्क स्टैक के साथ काम करता है. आपकी पसंद का नेटवर्क स्टैक होने की वजह से, स्ट्रीमिंग की परफ़ॉर्मेंस पर काफ़ी असर पड़ सकता है.
इस पेज पर, अपनी पसंद के नेटवर्क स्टैक का इस्तेमाल करने के लिए, ExoPlayer को कॉन्फ़िगर करने का तरीका बताया गया है. साथ ही, उपलब्ध विकल्पों की सूची दी गई है. इसमें, अपने ऐप्लिकेशन के लिए नेटवर्क स्टैक चुनने का तरीका भी बताया गया है. इसके अलावा, स्ट्रीम किए गए मीडिया के लिए कैश मेमोरी का इस्तेमाल करने की सुविधा चालू करने का तरीका भी बताया गया है.
किसी खास नेटवर्क स्टैक का इस्तेमाल करने के लिए ExoPlayer को कॉन्फ़िगर करना
ExoPlayer, DataSource
कॉम्पोनेंट की मदद से डेटा लोड करता है. यह डेटा, ऐप्लिकेशन कोड से इंजेक्ट किए गए DataSource.Factory
इंस्टेंस से मिलता है.
अगर आपके ऐप्लिकेशन को सिर्फ़ http(s) कॉन्टेंट चलाना है, तो नेटवर्क स्टैक चुनना उतना ही आसान है जितना कि किसी भी DataSource.Factory
इंस्टेंस को अपडेट करना. आपका ऐप्लिकेशन, HttpDataSource.Factory
के इंस्टेंस के तौर पर इंजेक्शन करता है, जो उस नेटवर्क स्टैक से जुड़ा होता है जिसका आपको इस्तेमाल करना है. अगर आपके ऐप्लिकेशन को लोकल फ़ाइलों जैसे ऐसे कॉन्टेंट को चलाना है जो एचटीटीपी (एस) पर उपलब्ध नहीं है, तो DefaultDataSource.Factory
का इस्तेमाल करें:
Kotlin
DefaultDataSource.Factory( ... /* baseDataSourceFactory= */ PreferredHttpDataSource.Factory(...))
Java
new DefaultDataSource.Factory( ... /* baseDataSourceFactory= */ new PreferredHttpDataSource.Factory(...));
इस उदाहरण में, PreferredHttpDataSource.Factory
आपके पसंदीदा नेटवर्क स्टैक से जुड़ी फ़ैक्ट्री है. DefaultDataSource.Factory
लेयर, काम में मदद करती है
बिना एचटीटीपी सोर्स के, जैसे कि लोकल फ़ाइलें.
यहां दिए गए उदाहरण में, ऐसा ExoPlayer
बनाने का तरीका बताया गया है जो Cronet नेटवर्क स्टैक का इस्तेमाल करेगा. साथ ही, यह http(s) के अलावा दूसरे टाइप के कॉन्टेंट को चलाने की सुविधा भी देगा.
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, OkHttp, और Android के डिफ़ॉल्ट नेटवर्क स्टैक के साथ सीधे तौर पर काम करता है. ExoPlayer को Android पर काम करने वाले किसी भी अन्य नेटवर्क स्टैक के साथ काम करने के लिए भी बढ़ाया जा सकता है.
एचटीटीपीइंजन
HttpEngine, Android पर एपीआई लेवल 34 (या S एक्सटेंशन 7) से डिफ़ॉल्ट नेटवर्क स्टैक के तौर पर इस्तेमाल करने का सुझाव दिया जाता है. ज़्यादातर मामलों में, यह अंदरूनी तौर पर Cronet नेटवर्क स्टैक का इस्तेमाल करता है. साथ ही, QUIC प्रोटोकॉल पर एचटीटीपी, एचटीटीपी/2, और एचटीटीपी/3 के साथ काम करता है.
ExoPlayer, अपने HttpEngineDataSource.Factory
के साथ HttpEngine के साथ काम करता है. इस डेटा सोर्स फ़ैक्ट्री को इंजेक्ट करने के लिए, किसी खास नेटवर्क स्टैक का इस्तेमाल करने के लिए ExoPlayer को कॉन्फ़िगर करना लेख में दिया गया तरीका अपनाएं.
Cronet
क्रोनेट Chromium नेटवर्क स्टैक, Android ऐप्लिकेशन के लिए लाइब्रेरी के तौर पर उपलब्ध कराया गया. Cronet ने लिया का लाभ उठाने के लिए कई तरह की टेक्नोलॉजी का इस्तेमाल किया है, जो इंतज़ार के समय को कम करती हैं और आपके ऐप्लिकेशन को काम करने के लिए ज़रूरी नेटवर्क अनुरोधों की थ्रूपुट वैल्यू. इसमें वे अनुरोध भी शामिल हैं इसे ExoPlayer ने बनाया है. यह क्यूयूआईसी प्रोटोकॉल पर, एचटीटीपी, एचटीटीपी/2, और एचटीटीपी/3 के साथ काम करता है. दुनिया के कुछ सबसे बड़े स्ट्रीमिंग ऐप्लिकेशन, जैसे कि YouTube में Cronet का इस्तेमाल किया जाता है.
ExoPlayer, अपनी Cronet लाइब्रेरी की मदद से Cronet के साथ काम करता है.
इस्तेमाल करने के तरीके से जुड़े निर्देशों के लिए, लाइब्रेरी की README.md
देखें
इसे. ध्यान दें कि Cronet लाइब्रेरी, Cronet के तीन अलग-अलग वर्शन का इस्तेमाल कर सकती है:
- Google Play Services: हमारा सुझाव है कि आप लागू करने की इस सुविधा का इस्तेमाल
और Android के बिल्ट-इन नेटवर्क स्टैक पर वापस जाएं
(
DefaultHttpDataSource
) अगर Google Play services उपलब्ध नहीं है. - एम्बेड किया गया Cronet: अगर आपके उपयोगकर्ताओं का ज़्यादातर हिस्सा ऐसे बाज़ारों में है जहां Google Play Services का इस्तेमाल नहीं किया जा सकता या आपको इस्तेमाल किए जा रहे Cronet के सटीक वर्शन को कंट्रोल करना है, तो यह एक अच्छा विकल्प हो सकता है. कॉन्टेंट बनाने Cronet Embed का एक बड़ा नुकसान यह है कि इससे करीब 8 एमबी आपका ऐप्लिकेशन.
- क्रोनेट फ़ॉलबैक: 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, DefaultHttpDataSource
और DefaultHttpDataSource.Factory
के साथ Android के पहले से मौजूद नेटवर्क स्टैक का इस्तेमाल करता है. ये, ExoPlayer की मुख्य लाइब्रेरी का हिस्सा हैं.
नेटवर्क स्टैक को लागू करने का सटीक तरीका, इस पर चल रहे सॉफ़्टवेयर पर निर्भर करता है पहले से मौजूद डिवाइस. ज़्यादातर डिवाइसों पर सिर्फ़ एचटीटीपी काम करता है. इसका मतलब है कि एचटीटीपी/2 और एचटीटीपी/3, QUIC पर काम नहीं करते).
अन्य नेटवर्क स्टैक
ऐप्लिकेशन, ExoPlayer के साथ अन्य नेटवर्क स्टैक भी इंटिग्रेट कर सकते हैं.
ऐसा करने के लिए, नेटवर्क स्टैक को रैप करने वाला HttpDataSource
लागू करें. साथ ही, उससे जुड़ा HttpDataSource.Factory
भी लागू करें. ExoPlayer's Cronet और
ऐसा करने का तरीका जानने के लिए, OkHttp लाइब्रेरी अच्छे उदाहरण हैं.
पूरी तरह से Java नेटवर्क स्टैक के साथ इंटिग्रेट करते समय,
DataSourceContractTest
, ताकि यह जांच की जा सके कि आपका HttpDataSource
लागू हुआ है या नहीं
ठीक से काम करता है. OkHttp लाइब्रेरी में मौजूद OkHttpDataSourceContractTest
, ऐसा करने का एक अच्छा उदाहरण है.
नेटवर्क स्टैक चुनना
यहां दी गई टेबल में, ExoPlayer के साथ काम करने वाले नेटवर्क स्टैक के फ़ायदों और नुकसानों के बारे में बताया गया है.
नेटवर्क स्टैक | प्रोटोकॉल | APK के साइज़ का असर | नोट |
---|---|---|---|
HttpEngine | एचटीटीपी HTTP/2 HTTP/3 ज़्यादा QUIC |
कोई नहीं | सिर्फ़ API 34 या S एक्सटेंशन 7 पर उपलब्ध है |
Cronet (Google Play services) | एचटीटीपी एचटीटीपी/2 QUIC पर एचटीटीपी/3 |
छोटा (100 केबी से कम) |
इसके लिए, Google Play services की ज़रूरत होती है. Cronet का वर्शन अपने-आप अपडेट हो गया |
Cronet (एम्बेडेड) | एचटीटीपी एचटीटीपी/2 QUIC पर एचटीटीपी/3 |
बड़ा (~8 एमबी) |
ऐप्लिकेशन डेवलपर के कंट्रोल में Cronet का वर्शन |
Cronet (फ़ॉलबैक) | एचटीटीपी (डिवाइस के हिसाब से अलग-अलग होता है) |
छोटा (<100 केबी) |
ExoPlayer के लिए सुझाया नहीं जाता |
OkHttp | एचटीटीपी एचटीटीपी/2 |
छोटा (<1एमबी) |
|
पहले से मौजूद नेटवर्क स्टैक | एचटीटीपी (डिवाइस के हिसाब से अलग-अलग होता है) |
कोई नहीं | लागू करने का तरीका, डिवाइस के हिसाब से अलग-अलग होता है |
QUIC प्रोटोकॉल पर एचटीटीपी/2 और एचटीटीपी/3 का इस्तेमाल करने से, मीडिया स्ट्रीमिंग की परफ़ॉर्मेंस में काफ़ी सुधार हो सकता है. खास तौर पर, कॉन्टेंट डिस्ट्रिब्यूशन नेटवर्क (सीडीएन) का इस्तेमाल करके डिस्ट्रिब्यूट किए गए अडैप्टिव मीडिया को स्ट्रीम करते समय, ऐसे मामले हो सकते हैं जिनमें इन प्रोटोकॉल का इस्तेमाल करके सीडीएन को ज़्यादा बेहतर तरीके से काम करने की अनुमति मिल सकती है. इस वजह से, HttpEngine और Cronets का इस्तेमाल, एचटीटीपी/2 और एचटीटीपी/3, दोनों के लिए किया जा सकता है QUIC (और HTTP/2 के लिए OkHttp की सहायता), की तुलना में एक बड़ा लाभ है, तो का इस्तेमाल करके, Android के बिल्ट-इन नेटवर्क स्टैक का इस्तेमाल करके सामग्री होस्ट की जाती है और वह इन प्रोटोकॉल का भी समर्थन करती है.
अगर आपको मीडिया स्ट्रीमिंग को अलग से इस्तेमाल करना है, तो हमारा सुझाव है कि आप Google Play services की ओर से उपलब्ध HttpEngine या Cronet का इस्तेमाल करें. अगर Google Play services उपलब्ध नहीं है, तो DefaultHttpDataSource
का इस्तेमाल करें. इस सुझाव ने
यह ज़्यादातर डिवाइसों पर 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();