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 |
ExoPlayer میں ABR (Adaptive Bitrate) 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) کو سپورٹ کرتا ہے۔ تاہم، fMP4 سیگمنٹس کے ساتھ DASH اور HLS کے لیے 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔