Jetpack Media3, एक Player
इंटरफ़ेस तय करता है. इसमें वीडियो और ऑडियो फ़ाइलों को चलाने की बुनियादी सुविधाओं के बारे में बताया गया है. ExoPlayer
, Media3 में इस इंटरफ़ेस का डिफ़ॉल्ट तौर पर लागू किया गया वर्शन है. हमारा सुझाव है कि ExoPlayer का इस्तेमाल करें. इसमें सुविधाओं का एक पूरा सेट मिलता है. इससे वीडियो चलाने के ज़्यादातर मामलों को कवर किया जा सकता है. साथ ही, इसे अपनी ज़रूरत के हिसाब से बनाया जा सकता है, ताकि वीडियो चलाने के अन्य मामलों को भी हैंडल किया जा सके. ExoPlayer, डिवाइस और ओएस के फ़्रैगमेंटेशन को भी अलग करता है, ताकि आपका कोड पूरे Android नेटवर्क पर एक जैसा काम करे. ExoPlayer में ये शामिल हैं:
- प्लेलिस्ट के लिए सहायता
- प्रोग्रेसिव और अडैप्टिव स्ट्रीमिंग के कई फ़ॉर्मैट के साथ काम करता है
- क्लाइंट-साइड और सर्वर-साइड, दोनों तरह के विज्ञापन इंसर्ट करने की सुविधा
- DRM से सुरक्षित कॉन्टेंट चलाने की सुविधा
इस पेज पर, वीडियो चलाने वाला ऐप्लिकेशन बनाने के कु�� अहम चरणों के बारे में बताया गया है. ज़्यादा जानकारी के लिए, Media3 ExoPlayer के बारे में हमारी पूरी गाइड देखें.
शुरू करना
शुरू करने के लिए, Jetpack Media3 के ExoPlayer, UI, और Common मॉड्यूल पर डिपेंडेंसी जोड़ें:
implementation "androidx.media3:media3-exoplayer:1.8.0" implementation "androidx.media3:media3-ui:1.8.0" implementation "androidx.media3:media3-common:1.8.0"
इस्तेमाल के उदाहरण के आधार पर, आपको Media3 के अन्य मॉड्यूल की भी ज़रूरत पड़ सकती है. जैसे, DASH फ़ॉर्मैट में स्ट्रीम चलाने के लिए exoplayer-dash
.
1.8.0
को अपनी पसंद के हिसाब से लाइब्रेरी के वर्शन से बदलना न भूलें. सबसे नया वर्शन देखने के लिए, रिलीज़ नोट देखें.
मीडिया प्लेयर बनाना
Media3 की मदद से, Player
इंटरफ़ेस, ExoPlayer
के साथ शामिल किए गए लागू करने के तरीके का इस्तेमाल किया जा सकता है. इसके अलावा, आपके पास लागू करने का अपना कस्टम तरीका बनाने का विकल्प भी होता है.
ExoPlayer बनाना
ExoPlayer
इंस्टेंस बनाने का सबसे आसान तरीका यहां दिया गया है:
Kotlin
val player = ExoPlayer.Builder(context).build()
Java
ExoPlayer player = new ExoPlayer.Builder(context).build();
मीडिया प्लेयर को Activity
, Fragment
या Service
के onCreate()
लाइफ़साइकल मेथड में बनाया जा सकता है.
Builder
में, कस्टमाइज़ेशन के कई विकल्प शामिल हैं. इनमें ये विकल्प शामिल हैं:
setAudioAttributes()
ऑडियो फ़ोकस को मैनेज करने के लिएsetHandleAudioBecomingNoisy()
ऑडियो आउटपुट डिवाइस के डिसकनेक्ट होने पर, प्लेबैक के तरीके को कॉन्फ़िगर करने के लिए- ट्रैक चुनने की सुविधा को कॉन्फ़िगर करने के लिए,
setTrackSelector()
पर क्लिक करें
Media3, PlayerView
यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट उपलब्ध कराता है. इसे अपने ऐप्लिकेशन की लेआउट फ़ाइल में शामिल किया जा सकता है. इस कॉम्पोनेंट में, वीडियो चलाने के कंट्रोल के लिए PlayerControlView
, सबटाइटल दिखाने के लिए SubtitleView
, और वीडियो रेंडर करने के लिए Surface
शामिल होता है.
प्लेयर तैयार किया जा रहा है
मीडिया आइटम को किसी प्लेलिस्ट में जोड़ें, ताकि उन्हें setMediaItem()
और addMediaItem()
जैसे तरीकों से चलाया जा सके.
इसके बाद, मीडिया लोड करना शुरू करने और ज़रूरी संसाधन पाने के लिए, prepare()
को कॉल करें.
ऐप्लिकेशन के फ़ोरग्राउंड में होने से पहले, इन चरणों को पूरा नहीं किया जाना चाहिए. अगर आपका प्लेयर Activity
या Fragment
में है, तो इसका मतलब है कि एपीआई लेवल 24 और उसके बाद के वर्शन पर, onStart()
लाइफ़साइकल मेथड में प्लेयर को तैयार करना या एपीआई लेवल 23 और उससे पहले के वर्शन पर, onResume()
लाइफ़साइकल मेथड में प्लेयर को तैयार करना. Service
में मौजूद किसी प्लेयर के लिए, onCreate()
में तैयारी की जा सकती है.
प्लेयर को कंट्रोल करना
प्लेयर तैयार हो जाने के बाद, प्लेयर पर मौजूद इन तरीकों का इस्तेमाल करके वीडियो चलाने की सुविधा को कंट्रोल किया जा सकता है:
- वीडियो चलाने और रोकने के लिए,
play()
औरpause()
का इस्तेमाल करें seekTo()
का इस्तेमाल करके, मौजूदा मीडिया आइटम में किसी खास जगह पर जाएं- प्लेलिस्ट में एक से दूसरी जगह जाने के लिए,
seekToNextMediaItem()
औरseekToPreviousMediaItem()
का इस्तेमाल करें
किसी प्लेयर से बाइंड होने ��र, PlayerView
या PlayerControlView
ज���से ��ूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट, उसी के हिसाब से अपडेट हो जाएंगे.
प्लेयर को रिलीज़ करना
वीडियो चलाने के लिए, ऐसे संसाधनों की ज़रूरत पड़ सकती है जो सीमित संख्या में उपलब्ध होते हैं. जैसे, वीडियो डिकोडर. इसलिए, जब प्लेयर की ज़रूरत न हो, तो release()
को कॉल करना ज़रूरी है, ताकि संसाधन खाली किए जा सकें.
अगर आपका प्लेयर Activity
या Fragment
में है, तो उसे एपीआई लेवल 24 और उसके बाद के वर्शन पर onStop()
लाइफ़साइकल के तरीके से या एपीआई लेवल 23 और उससे पहले के वर्शन पर onPause()
तरीके से रिलीज़ करें. Service
में मौजूद किसी खिलाड़ी को onDestroy()
में रिलीज़ किया जा सकता है.
मीडिया सेशन की मदद से प्लेबैक मैनेज करना
Android पर, मीडिया सेशन की मदद से, प्रोसेस की सीमाओं के पार जाकर मीडिया प्लेयर के साथ इंटरैक्ट किया जा सकता है. मीडिया सेशन को अपने प्लेयर से कनेक्ट करने पर, मीडिया प्लेबैक का विज्ञापन बाहरी तौर पर दिखाया जा सकता है. साथ ही, बाहरी सोर्स से प्लेबैक के निर्देश पाए जा सकते हैं. उदाहरण के लिए, मोबाइल और बड़ी स्क्रीन वाले डिवाइसों पर सिस्टम मीडिया कंट्रोल के साथ इंटिग्रेट किया जा सकता है.
मीडिया सेशन का इस्तेमाल करने के लिए, Media3 सेशन मॉड्यूल पर डिपेंडेंसी जोड़ें:
implementation "androidx.media3:media3-session:1.8.0"
मीडिया सेशन बनाना
नीचे दिए गए तरीके से प्लेयर को शुरू करने के बाद, MediaSession
बनाया जा सकता है:
Kotlin
val player = ExoPlayer.Builder(context).build() val mediaSession = MediaSession.Builder(context, player).build()
Java
ExoPlayer player = new ExoPlayer.Builder(context).build(); MediaSession mediaSession = new MediaSession.Builder(context, player).build();
Media3, Player
की स्थिति को MediaSession
की स्थिति के साथ अपने-आप सिंक करता है. यह सुविधा, Player
के किसी भी वर्शन के साथ काम करती है. जैसे, ExoPlayer
, CastPlayer
या कस्टम वर्शन.
अन्य क्लाइंट को कंट्रोल करने की अनुमति देना
क्लाइंट ऐप्लिकेशन, आपके मीडिया सेशन के प्लेबैक को कंट्रोल करने के लिए, मीडिया कंट्रोलर लागू कर सकते हैं. इन अनुरोधों को पाने के लिए, MediaSession
बनाते समय callback ऑब्जेक्ट सेट करें.
जब कोई कंट्रोलर आपके मीडिया सेशन से कनेक्ट होने वाला होता है, तब onConnect()
तरीके को कॉल किया जाता है. अनुरोध को स्वीकार
या अस्वीकार
करने का फ़ैसला लेने के लिए, दिए गए ControllerInfo
का इस्तेमाल करें. इसका उदाहरण Media3 सेशन के डेमो ऐप्लिकेशन में देखें.
कनेक्ट होने के बाद, कंट्रोलर सेशन को मीडिया चलाने के निर्देश भेज सकता है. इसके बाद, सेशन उन निर्देशों को प्लेयर को सौंप देता है. Player
इंटरफ़ेस में तय की गई, वीडियो चलाने और प्लेलिस्ट से जुड़ी कार्रवाइयों को सेशन अपने-आप हैंडल करता है.
कॉल बैक के अन्य तरीकों से, इन अनुरोधों को हैंडल किया जा सकता है. जैसे, कस्टम प्लेबैक कमांड और प्लेलिस्ट में बदलाव करना. इन कॉलबैक में भी ControllerInfo
ऑब्जेक्ट शामिल होता है, ताकि अनुरोध के आधार पर ऐक्सेस कंट्रोल तय किया जा सके.
बैकग्राउंड में मीडिया चलाना
जब आपका ऐप्लिकेशन फ़ोरग्राउंड में न हो, तब भी मीडिया चलाने के लिए, Player
और MediaSession
को फ़ोरग्राउंड सेवा में शामिल किया जाना चाहिए. उदाहरण के लिए, अगर उपयोगकर्ता ने आपका ऐप्लिकेशन नहीं खोला है, तब भी संगीत, ऑडियो बुक या पॉडकास्ट चलाने के लिए ऐसा करना ज़रूरी है. Media3, इस काम के लिए MediaSessionService
इंटरफ़ेस उपलब्ध कराता है.
MediaSessionService
लागू करना
ऐसी क्लास बनाएं जो MediaSessionService
को बढ़ाती हो. साथ ही, onCreate()
लाइफ़साइकल के तरीके में MediaSession
को इंस्टैंशिएट करें.
Kotlin
class PlaybackService : MediaSessionService() { private var mediaSession: MediaSession? = null // Create your Player and MediaSession in the onCreate lifecycle event override fun onCreate() { super.onCreate() val player = ExoPlayer.Builder(this).build() mediaSession = MediaSession.Builder(this, player).build() } // Remember to release the player and media session in onDestroy override fun onDestroy() { mediaSession?.run { player.release() release() mediaSession = null } super.onDestroy() } }
Java
public class PlaybackService extends MediaSessionService { private MediaSession mediaSession = null; @Override public void onCreate() { super.onCreate(); ExoPlayer player = new ExoPlayer.Builder(this).build(); mediaSession = new MediaSession.Builder(this, player).build(); } @Override public void onDestroy() { mediaSession.getPlayer().release(); mediaSession.release(); mediaSession = null; super.onDestroy(); } }
अपनी मेनिफ़ेस्ट फ़ाइल में, Service
क्लास को MediaSessionService
इंटेंट फ़िल्टर के साथ जोड़ें. साथ ही, फ़ोरग्राउंड सेवा चलाने के लिए FOREGROUND_SERVICE
अनुमति का अनुरोध करें:
<service
android:name=".PlaybackService"
android:foregroundServiceType="mediaPlayback"
android:exported="true">
<intent-filter>
<action android:name="androidx.media3.session.MediaSessionService"/>
</intent-filter>
</service>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
आखिर में, बनाई गई क्लास में onGetSession()
तरीके को बदलें, ताकि क्लाइंट को मीडिया सेशन का ऐक्सेस दिया जा सके. कनेक्शन का अनुरोध स्वीकार करने के लिए, MediaSession
दिखाएं या अनुरोध अस्वीकार करने के लिए, null
दिखाएं.
Kotlin
// This example always accepts the connection request override fun onGetSession( controllerInfo: MediaSession.ControllerInfo ): MediaSession? = mediaSession
Java
@Override public MediaSession onGetSession(MediaSession.ControllerInfo controllerInfo) { // This example always accepts the connection request return mediaSession; }
आपके यूज़र इंटरफ़ेस (यूआई) से कनेक्ट किया जा रहा है
अब आपका मीडिया सेशन, Activity
या Fragment
से Service
अलग है. Activity
या Fragment
में आपका प्लेयर यूज़र इंटरफ़ेस (यूआई) मौजूद होता है. इसलिए, इन दोनों को एक साथ लिंक करने के लिए, MediaController
का इस्तेमाल किया जा सकता है. अपने यूज़र इंटरफ़ेस (यूआई) के साथ Activity
या Fragment
के onStart()
तरीके में, अपने MediaSession
के लिए SessionToken
बनाएं. इसके बाद, MediaController
बनाने के लिए SessionToken
का इस्तेमाल करें. MediaController
को एसिंक्रोनस तरीके से बनाया जाता है.
Kotlin
override fun onStart() { val sessionToken = SessionToken(this, ComponentName(this, PlaybackService::class.java)) val controllerFuture = MediaController.Builder(this, sessionToken).buildAsync() controllerFuture.addListener( { // Call controllerFuture.get() to retrieve the MediaController. // MediaController implements the Player interface, so it can be // attached to the PlayerView UI component. playerView.setPlayer(controllerFuture.get()) }, MoreExecutors.directExecutor() ) }
Java
@Override public void onStart() { SessionToken sessionToken = new SessionToken(this, new ComponentName(this, PlaybackService.class)); ListenableFuture<MediaController> controllerFuture = new MediaController.Builder(this, sessionToken).buildAsync(); controllerFuture.addListener(() -> { // Call controllerFuture.get() to retrieve the MediaController. // MediaController implements the Player interface, so it can be // attached to the PlayerView UI component. playerView.setPlayer(controllerFuture.get()); }, MoreExecutors.directExecutor()) }
MediaController
, Player
इंटरफ़ेस लागू करता है. इसलिए, कॉन्टेंट चलाने की सुविधा को कंट्रोल करने के लिए, play()
और pause()
जैसे एक ही तरीके इस्तेमाल किए जा सकते हैं. अन्य कॉम्पोनेंट की तरह, जब MediaController
की ज़रूरत न हो, तब उसे रिलीज़ करना न भूलें. जैसे, Activity
की onStop()
लाइफ़साइकल मेथड को MediaController.releaseFuture()
को कॉल करके रिलीज़ किया जाता है.
सूचना पब्लिश करना
फ़ोरग्राउंड सेवाओं को चालू होने पर सूचना पब्लिश करने की ज़रूरत होती है. MediaSessionService
, आपके लिए MediaStyle
सूचना अपने-आप बना देगा. यह सूचना आपको MediaNotification
के तौर पर मिलेगी.
कस्टम सूचना देने के लिए, MediaNotification.Provider
बनाएं. इसके लिए, DefaultMediaNotificationProvider.Builder
का इस्तेमाल करें या प्रोवाइडर इंटरफ़ेस का कस्टम तरीके से इस्तेमाल करें. setMediaNotificationProvider
का इस्तेमाल करके, सेवा देने वाली कंपनी को अपने MediaSession
में जोड़ें.
अपनी कॉन्टेंट लाइब्रेरी का विज्ञापन करना
MediaLibraryService
, MediaSessionService
पर आधारित होता है. यह क्लाइंट ऐप्लिकेशन को आपके ऐप्लिकेशन से मिले मीडिया कॉन्टेंट को ब्राउज़ करने की अनुमति देता है. क्लाइंट ऐप्लिकेशन, आपके MediaLibraryService
के साथ इंटरैक्ट करने के लिए MediaBrowser
लागू करते हैं.
MediaLibraryService
को लागू करना, MediaSessionService
��ो लागू करने जैसा ही है. हालांकि, onGetSession()
में आपको MediaSession
के बजाय MediaLibrarySession
को दिखाना चाहिए. MediaSession.Callback
की तुलना में, MediaLibrarySession.Callback
में अतिरिक्त तरीके शामिल होते हैं. इनकी मदद से, ब्राउज़र क्लाइंट आपकी लाइब्रेरी सेवा से ऑफ़र किए गए कॉन्टेंट पर जा सकता है.
MediaSessionService
की तरह ही, अपनी मेनिफ़ेस्ट फ़ाइल में MediaLibraryService
की जानकारी दें. साथ ही, फ़ोरग्राउंड सेवा चलाने के लिए FOREGROUND_SERVICE
अनुमति का अनुरोध करें:
<service
android:name=".PlaybackService"
android:foregroundServiceType="mediaPlayback"
android:exported="true">
<intent-filter>
<action android:name="androidx.media3.session.MediaLibraryService"/>
<action android:name="android.media.browse.MediaBrowserService"/>
</intent-filter>
</service>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
ऊपर दिए गए उदाहरण में, MediaLibraryService
और पुराने सिस्टम के साथ काम करने की सुविधा के लिए, लेगसी MediaBrowserService
, दोनों के लिए इंटेंट फ़िल्टर शामिल है. अतिरिक्त इंटेंट फ़िल्टर की मदद से, MediaBrowserCompat
एपीआई का इस्तेमाल करने वाले क्लाइंट ऐप्लिकेशन, आपके Service
की पहचान कर पाते हैं.
MediaLibrarySession
की मदद से, अपनी कॉन्टेंट लाइब्रेरी को ट्री स्ट्रक्चर में दिखाया जा सकता है. इसमें एक ही रूट MediaItem
होता है. ट्री में मौजूद हर MediaItem
में, बच्चों के MediaItem
नोड की कोई भी संख्या हो सकती है. क्लाइंट ऐप्लिकेशन के अनुरोध के आधार पर, अलग-अलग रूट या अलग-अलग ट्री दिखाए जा सकते हैं. उदाहरण के लिए, मीडिया आइटम के सुझावों की सूची ढूंढ रहे क्लाइंट को दिखाया गया ट्री, सिर्फ़ रूट MediaItem
और एक लेवल के चाइल्ड MediaItem
नोड दिखा सकता है. वहीं, किसी दूसरे क्लाइंट ऐप्लिकेशन को दिखाया गया ट्री, कॉन्टेंट की ज़्यादा पूरी लाइब्रेरी दिखा सकता है.
MediaLibrarySession
बनाया जा रहा है
MediaLibrarySession
MediaSession
API को कॉन्टेंट ब्राउज़ करने वाले एपीआई जोड़ने के लिए एक्सटेंड करता है. MediaSession
कॉलबैक की तुलना में, MediaLibrarySession
कॉलबैक में ये तरीके शामिल हैं:
onGetLibraryRoot()
जब कोई क्लाइंट, कॉन्टेंट ट्री के रूटMediaItem
का अनुरोध करता हैonGetChildren()
जब कोई क्लाइंट, कॉन्टेंट ट्री में मौजूदMediaItem
के बच्चों का अनुरोध करता हैonGetSearchResult()
जब कोई क्लाइंट किसी क्वेरी के लिए, कॉन्टेंट ट्री से खोज नतीजों का अनुरोध करता है, तब इस फ़ंक्शन का इस्तेमाल किया जाता है
काम की कॉलबैक विधियों में, LibraryParams
ऑब्जेक्ट शामिल होगा. इसमें क्लाइंट ऐप्लिकेशन की दिलचस्पी वाले कॉन्टेंट ट्री के टाइप के बारे में अतिरिक्त सिग्नल होंगे.