ExoPlayer एक ओपन-सोर्स मीडिया प्लेयर लाइब्रेरी है जो Android के लिए Google द्वारा बिल्ट-इन MediaPlayer के विकल्प के रूप में विकसित की गई है। ExoPlayer DASH, HLS, SmoothStreaming और सामान्य मीडिया फ़ाइलों सहित विभिन्न फ़ॉर्मेट में ऑडियो और वीडियो प्लेबैक प्रदान करता है, जो एडेप्टिव स्ट्रीमिंग के समर्थन के साथ एकल API के माध्यम से काम करता है। Google I/O (2024) के अनुसार, ExoPlayer का उपयोग 60,000 से अधिक Android एप्लिकेशन में किया जाता है, जिसमें YouTube, Google TV और Netflix शामिल हैं।
मुख्य बिंदु
ExoPlayer Android के लिए एक ओपन-सोर्स (Apache 2.0) मल्टीमीडिया प्लेबैक लाइब्रेरी है, जिसका पहला संस्करण Google ने 2014 में जारी किया था। बिल्ट-इन MediaPlayer के विपरीत, जो सिस्टम मीडिया कोडेक (MediaCodec) के ऊपर एक पतली परत है, ExoPlayer पूरी तरह से Java/Kotlin स्तर पर लागू किया गया है, जो डेवलपर्स को प्लेबैक के हर चरण पर पूर्ण नियंत्रण देता है।
आर्किटेक्चरल रूप से, ExoPlayer मॉड्यूलर सिद्धांत पर बनाया गया है: प्लेबैक का हर पहलू एक अलग कंपोनेंट द्वारा कार्यान्वित किया जाता है। मुख्य मॉड्यूल (exoplayer-core) में प्लेयर, रेंडरर, ट्रैक सेलेक्टर और बफ़र प्रबंधन शामिल है। अतिरिक्त मॉड्यूल (exoplayer-dash, exoplayer-hls, exoplayer-rtsp, exoplayer-smoothstreaming) संबंधित स्ट्रीमिंग प्रोटोकॉल के लिए समर्थन जोड़ते हैं। यह आर्किटेक्चर एप्लिकेशन को केवल आवश्यक कंपोनेंट शामिल करने की अनुमति देता है, जिससे APK आकार कम होता है।
ExoPlayer 2 (वर्तमान प्रमुख संस्करण) 2018 में जारी किया गया था और इसमें API का मौलिक पुनर्गठन हुआ: Player Interface की शुरुआत, AndroidX Media3 के माध्यम से Compose समर्थन, बेहतर त्रुटि प्रबंधन और एडेप्टिव ट्रैक चयन एल्गोरिदम। संस्करण 2.19 (2024) से, ExoPlayer AndroidX Media लाइब्रेरी का हिस्सा बन गया, जिसने मानक Android निर्भरता प्रबंधक के माध्यम से एकीकरण और अपडेट को सरल बना दिया।
ExoPlayer के केंद्र में ExoPlayerImpl कंपोनेंट है, जो प्लेबैक जीवनचक्र का प्रबंधन करता है। इसमें MediaSource (मीडिया स्रोत), TrackSelector (ट्रैक चयन), LoadControl (बफ़रिंग प्रबंधन) और Renderer की सूची (वीडियो, ऑडियो, सबटाइटल और मेटाडेटा के लिए रेंडरर) शामिल है। प्रत्येक कंपोनेंट को Builder या फ़ैक्टरी विधियों के माध्यम से कस्टम इम्प्लीमेंटेशन से बदला जा सकता है।
वीडियो रेंडरिंग के लिए, ExoPlayer SurfaceView, TextureView या SphericalSurfaceView (360-डिग्री वीडियो के लिए) का उपयोग करता है। अनुशंसित विकल्प SurfaceView है, क्योंकि यह हार्डवेयर त्वरण और न्यूनतम बिजली खपत प्रदान करता है। Jetpack Compose के लिए, AndroidX Media3 लाइब्रेरी `AndroidView` कंपोनेंट प्रदान करती है, जो SurfaceView को रैप करता है, और प्रायोगिक `Media3Compose` मूल Compose एकीकरण के साथ प्रदान करती है।
ExoPlayer सामान्य मीडिया प्लेयर से परे सुविधाओं की एक विस्तृत श्रृंखला प्रदान करता है। मुख्य क्षमताओं में सभी लोकप्रिय स्ट्रीमिंग प्रोटोकॉल के लिए समर्थन, एक लचीली DRM प्रणाली, एडेप्टिव बिटरेट स्विचिंग (ABR) और प्लेबैक एनालिटिक्स टूल शामिल हैं।
| सुविधा | विवरण | मॉड्यूल |
|---|---|---|
| DASH | MPEG मानक के अनुसार एडेप्टिव स्ट्रीमिंग | exoplayer-dash |
| HLS | Apple से HTTP Live Streaming | exoplayer-hls |
| SmoothStreaming | Microsoft से एडेप्टिव स्ट्रीमिंग | exoplayer-smoothstreaming |
| RTSP | लाइव के लिए रियल-टाइम स्ट्रीमिंग प्रोटोकॉल | exoplayer-rtsp |
| Widevine | DRM सामग्री सुरक्षा | exoplayer-drm |
| Concatenation | एकाधिक मीडिया फ़ाइलों को जोड़ना | exoplayer-core |
| Ads | विज्ञापन के लिए IMA SDK एकीकरण | exoplayer-ima |
ABR (Adaptive Bitrate) ExoPlayer में AdaptiveTrackSelection इंटरफ़ेस के माध्यम से कार्यान्वित किया जाता है। डिफ़ॉल्ट रूप से, AdaptiveTrackSelectionFactory का उपयोग किया जाता है, जो DefaultAdaptiveTrackSelection बनाता है — एक संतुलित एल्गोरिदम जो नेटवर्क बैंडविड्थ और बफ़र आकार को ध्यान में रखता है। विशिष्ट परिदृश्यों के लिए, वैकल्पिक इम्प्लीमेंटेशन जोड़े जा सकते हैं: BOLA (स्विचिंग को कम करना), RandomAdaptiveTrackSelection (परीक्षण) या TrackSelection इंटरफ़ेस के माध्यम से कस्टम इम्प्लीमेंटेशन।
BandwidthMeter — एक और महत्वपूर्ण कंपोनेंट जो नेटवर्क बैंडविड्थ मापने के लिए जिम्मेदार है। डिफ़ॉल्ट रूप से, DefaultBandwidthMeter का उपयोग किया जाता है, जो प्लेयर के सभी HTTP अनुरोधों पर आँकड़े एकत्र करता है। डेवलपर अतिरिक्त कारकों को शामिल करने के लिए इसे विस्तारित कर सकता है: नेटवर्क प्रकार (Wi-Fi, 4G, 5G), सेल टॉवर सिग्नल या उपयोगकर्ता के लिए डेटा लागत।
ExoPlayer Widevine (L1, L3), PlayReady और ClearKey DRM सपोर्ट करता है। लाइसेंस प्राप्त करना DrmSessionManager के माध्यम से कॉन्फ़िगर किया जाता है, जो लाइसेंस सर्वर के साथ इंटरैक्ट करता है। प्रीमियम वीडियो (4K HDR) के लिए, Widevine L1 के हार्डवेयर समर्थन की आवश्यकता होती है, जो चिप-स्तरीय सुरक्षा प्रदान करता है और स्क्रीन कैप्चर को रोकता है। DRM सिस्टम का चुनाव लक्ष्य प्लेटफ़ॉर्म पर निर्भर करता है: Widevine Android और Chromecast पर उपयोग किया जाता है, PlayReady Xbox और Windows पर, FairPlay iOS और Apple TV पर। ExoPlayer MPD फ़ाइल के आधार पर उपलब्ध DRM सिस्टम को स्वचालित रूप से निर्धारित करता है और बुनियादी परिदृश्यों के लिए मैन्युअल कॉन्फ़िगरेशन की आवश्यकता नहीं होती है।
ExoPlayer को Android प्रोजेक्ट से जोड़ना Gradle निर्भरताओं के माध्यम से किया जाता है। संस्करण 2.19 से, ExoPlayer AndroidX Media (androidx.media3) का हिस्सा है, जो Jetpack Compose और अन्य AndroidX कंपोनेंट के साथ संगतता सुनिश्चित करता है। आइए Kotlin में चरण-दर-चरण एकीकरण देखें।
ExoPlayer मॉड्यूल को build.gradle फ़ाइल (Module) में जोड़ें। न्यूनतम सेट में core, ui और आवश्यक स्ट्रीमिंग प्रोटोकॉल के लिए मॉड्यूल शामिल है। DASH सामग्री प्लेबैक के लिए exoplayer-dash आवश्यक है, HLS के लिए — exoplayer-hls।
dependencies {
implementation "androidx.media3:media3-exoplayer:1.5.0"
implementation "androidx.media3:media3-ui:1.5.0"
implementation "androidx.media3:media3-exoplayer-dash:1.5.0"
implementation "androidx.media3:media3-exoplayer-hls:1.5.0"
}
Activity या Fragment में प्लेयर बनाना और कॉन्फ़िगर करना। ExoPlayer वीडियो और बिल्ट-इन नियंत्रण प्रदर्शित करने के लिए PlayerView (या कस्टमाइज़ेशन के लिए StyledPlayerView) का उपयोग करता है। न्यूनतम कॉन्फ़िगरेशन में ExoPlayer.Builder के माध्यम से प्लेयर बनाना और स्रोत URI के साथ MediaItem पास करना शामिल है।
class PlayerActivity : AppCompatActivity() {
private var player: ExoPlayer? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_player)
player = ExoPlayer.Builder(this).build()
val playerView = findViewById<StyledPlayerView>(R.id.playerView)
playerView.player = player
val mediaItem = MediaItem
.Builder()
.setUri("https://example.com/video.mp4")
.build()
player?.setMediaItem(mediaItem)
player?.prepare()
}
override fun onDestroy() {
player?.release()
super.onDestroy()
}
}
प्रोडक्शन एप्लिकेशन के लिए, संभावित प्लेबैक त्रुटियों का प्रबंधन आवश्यक है: नेटवर्क विफलताएँ, असमर्थित फ़ॉर्मेट, DRM लाइसेंसिंग त्रुटियाँ। ExoPlayer onPlayerError, onPlaybackStateChanged और onPlayWhenReadyChanged विधियों के साथ Player.Listener इंटरफ़ेस प्रदान करता है। उपयोगकर्ता को पुनः प्रयास विकल्प के साथ सूचनात्मक त्रुटि संदेश दिखाने की अनुशंसा की जाती है।
ExoPlayer और बिल्ट-इन MediaPlayer के बीच चुनाव Android एप्लिकेशन विकसित करते समय एक सामान्य प्रश्न है। MediaPlayer संस्करण 1.0 से Android SDK का हिस्सा है, जबकि ExoPlayer एक लाइब्रेरी है जिसके लिए Gradle निर्भरता की आवश्यकता होती है। आइए प्रमुख मानदंडों पर उनके अंतर देखें।
| मानदंड | ExoPlayer | MediaPlayer |
|---|---|---|
| आर्किटेक्चर | मॉड्यूलर, पूरी तरह से Java/Kotlin में | सिस्टम C++ कंपोनेंट के ऊपर परत |
| स्ट्रीमिंग | DASH, HLS, SmoothStreaming, RTSP | केवल लोकल फ़ाइलें और HLS (Android 9+) |
| अनुकूलन | पूर्ण (कोई भी कंपोनेंट बदला जा सकता है) | न्यूनतम (केवल पैरामीटर) |
| अपडेट | Google Play या APK के माध्यम से (OS से स्वतंत्र) | केवल Android अपडेट (OTA) के माध्यम से |
| APK आकार | +1–3 MB (मॉड्यूल के अनुसार) | 0 (OS का हिस्सा) |
| न्यूनतम SDK | API 16+ (Android 4.1) | API 1+ |
| DRM | Widevine, PlayReady, ClearKey | Widevine (सीमित) |
ExoPlayer बेहतर है उन परिदृश्यों में जहाँ स्ट्रीमिंग (DASH, HLS), UI अनुकूलन, DRM समर्थन और Android संस्करण से स्वतंत्रता की आवश्यकता होती है। MediaPlayer सरल एप्लिकेशन के लिए उपयुक्त है जो लोकल मीडिया फ़ाइलें चलाते हैं, जहाँ APK आकार महत्वपूर्ण है और एडेप्टिव स्ट्रीमिंग की कोई आवश्यकता नहीं है। नेटवर्क से सामग्री वाले आधुनिक एप्लिकेशन के लिए, ExoPlayer स्पष्ट विकल्प है।
अपवाद — API 16 (Android 4.1) से नीचे न्यूनतम SDK वाले एप्लिकेशन, जो बाज़ार में लगभग मौजूद नहीं हैं। targetSdk 33+ और न्यूनतम SDK 21+ वाले सभी एप्लिकेशन के लिए, ExoPlayer न केवल बेहतर है बल्कि उपयुक्त एक्सटेंशन के माध्यम से AV1 और Dolby Vision जैसे आधुनिक फ़ॉर्मेट का समर्थन करने के लिए आवश्यक है।
प्रोडक्शन एप्लिकेशन के लिए, ExoPlayer के बुनियादी एकीकरण में अक्सर अतिरिक्त कॉन्फ़िगरेशन की आवश्यकता होती है: कैश प्रबंधन, मोबाइल नेटवर्क के लिए बफ़र ऑप्टिमाइज़ेशन, एनालिटिक्स एकीकरण और ऑडियो ट्रैक चयन अनुकूलन। आइए उन्नत उपयोग परिदृश्य देखें।
CacheDataSourceFactory डाउनलोड किए गए सेगमेंट को लोकल स्टोरेज पर कैश करने की अनुमति देता है, जिससे बार-बार देखने पर ट्रैफ़िक बचता है और ऑफ़लाइन प्लेबैक सक्षम होता है। ExoPlayer exoplayer-cas लाइब्रेरी से SimpleCache का उपयोग करता है — LRU निकासी समर्थन और आकार सीमाओं के साथ फ़ाइल-आधारित कैशिंग।
val cache = SimpleCache(
cacheDir,
LeastRecentlyUsedCacheEvictor(50 * 1024 * 1024),
AppDatabaseProvider(this)
)
val cacheDataSourceFactory = CacheDataSource
.Factory()
.setCache(cache)
val player = ExoPlayer.Builder(this)
.setMediaSourceFactory(
DefaultMediaSourceFactory(cacheDataSourceFactory)
)
.build()
मोबाइल एप्लिकेशन में, Wi-Fi और सेल्युलर नेटवर्क के बीच स्विचिंग का प्रबंधन महत्वपूर्ण है। ExoPlayer नेटवर्क स्थिति को ट्रैक करने के लिए ConnectivityManager प्रदान करता है। कनेक्शन खोने पर, प्लेयर को रोकने के बजाय उसे PAUSED स्थिति में डालने की अनुशंसा की जाती है, स्थिति को संरक्षित करते हुए। कनेक्शन बहाल होने के बाद, सेगमेंट को पुनः लोड करके प्लेबैक फिर से शुरू करें।
AndroidX Media3 के रिलीज़ के साथ, लाइब्रेरी को Jetpack Compose के लिए प्रायोगिक समर्थन मिला। `AndroidView` कंपोनेंट SurfaceView या PlayerView को रैप करता है, Compose पदानुक्रम के साथ संगतता सुनिश्चित करता है। गहन एकीकरण के लिए, `androidx.media3:media3-ui-compose` लाइब्रेरी का उपयोग किया जाता है, जो Compose-संगत प्लेयर नियंत्रण प्रदान करती है।
@Composable
fun VideoPlayer(uri: String) {
val context = LocalContext.current
val player = remember {
ExoPlayer.Builder(context).build()
.also { it.setMediaItem(MediaItem.fromUri(uri)) }
}
DisposableEffect(key = null) {
player.prepare()
onDispose { player.release() }
}
AndroidView(
factory = { StyledPlayerView(context).also { it.player = player } }
)
}
अक्सर पूछे जाने वाले प्रश्न
ExoPlayer Android API 16+ (Android 4.1 Jelly Bean) सपोर्ट करता है। हालाँकि, DASH और HLS के लिए fMP4 सेगमेंट के साथ, API 21+ (Android 5.0 Lollipop) की अनुशंसा की जाती है। DRM मॉड्यूल (Widevine) API 19+ की आवश्यकता है, और हार्डवेयर HEVC डिकोडिंग API 21 से उपलब्ध है।
हाँ, ExoPlayer ऑडियो के लिए उत्कृष्ट है। केवल ऑडियो प्लेबैक के लिए SurfaceView या PlayerView की आवश्यकता नहीं है। ExoPlayer स्वचालित रूप से ऑडियो रेंडरर का चयन करेगा और पृष्ठभूमि में काम करेगा। पृष्ठभूमि प्लेबैक के लिए, सिस्टम नियंत्रणों के साथ एकीकरण के लिए MediaSessionService का उपयोग करने की अनुशंसा की जाती है।
ExoPlayer में TrackSelector ऑडियो ट्रैक चयन का प्रबंधन करता है। स्विच करने के लिए, player.getCurrentTracks().groups और player.setTrackSelectionParameters() का उपयोग करें जिसमें पसंदीदा ऑडियो भाषा निर्दिष्ट हो। एकाधिक ऑडियो ट्रैक वाले DASH और HLS स्ट्रीम के लिए, स्विचिंग प्लेबैक में बिना किसी रुकावट के होती है।
हाँ, ExoPlayer एम्बेडेड (MP4, WebM कंटेनर में) और बाहरी सबटाइटल को TTML, SRT, VTT और CEA-608 फ़ॉर्मेट में सपोर्ट करता है। बाहरी सबटाइटल के लिए, वीडियो स्ट्रीम के साथ मर्ज करने के लिए SingleSampleMediaSource या MergingMediaSource का उपयोग किया जाता है। स्टाइलिश सबटाइटल डिस्प्ले CaptionStyleCompat के माध्यम से कॉन्फ़िगर किया जाता है।
कम-विलंबता स्ट्रीमिंग के लिए, LoadControl को छोटे लक्ष्य बफ़र मानों के साथ कॉन्फ़िगर करें: HLS LL और DASH LL के लिए DefaultLoadControl.Builder().setTargetBufferBytes(1024 * 512).setBufferDurationsMs(500, 2000, 500, 1000) का उपयोग करें। साथ ही, लाइव प्रसारण से पीछे रहने पर त्वरित बफ़र भरने के लिए minPlaybackSpeed = 1.02 सेट करें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें