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-এ ধাপে ধাপে সংহতি দেখি।
build.gradle ফাইলে (Module) ExoPlayer মডিউল যোগ করুন। ন্যূনতম সেটে 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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন