Jetpack Media3, एक Player इंटरफ़ेस तय करता है. इसमें वीडियो और ऑडियो फ़ाइलों को चलाने की बुनियादी सुविधाओं के बारे में बताया गया है. ExoPlayer, Media3 में इस इंटरफ़ेस का डिफ़ॉल्ट तौर पर लागू किया गया वर्शन है. हमारा सुझाव है कि ExoPlayer का इस्तेमाल करें. इसमें सुविधाओं का एक पूरा सेट मिलता है. इससे वीडियो चलाने के ज़्यादातर मामलों को कवर किया जा सकता है. साथ ही, इसे अपनी ज़रूरत के हिसाब से बनाया जा सकता है, ताकि वीडियो चलाने के अन्य मामलों को भी हैंडल किया जा सके. ExoPlayer, डिवाइस और ओएस के फ़्रैगमेंटेशन को भी कम करता है, ताकि आपका कोड पूरे Android नेटवर्क पर लगातार काम कर सके. ExoPlayer में ये शामिल हैं:
- प्लेलिस्ट के लिए सहायता
- प्रोग्रेसिव और अडैप्टिव स्ट्रीमिंग के कई फ़ॉर्मैट के साथ काम करता है
- क्लाइंट-साइड और सर्वर-साइड, दोनों तरह के विज्ञापन इंसर्शन के साथ काम करता है
- DRM से सुरक्षित कॉन्टेंट चलाने की सुविधा
इस पेज पर, आपको वीडियो चलाने वाला ऐप्लिकेशन बनाने के कुछ अहम चरणों के बारे में बताया गया है. ज़्यादा जानकारी के लिए, Media3 ExoPlayer के बारे में हमारी पूरी गाइड पढ़ें.
शुरू करना
शुरू करने के लिए, Jetpack Media3 के ExoPlayer, UI, और Common मॉड्यूल पर डिपेंडेंसी जोड़ें:
Kotlin
implementation("androidx.media3:media3-exoplayer:1.10.1")
implementation("androidx.media3:media3-ui:1.10.1")
implementation("androidx.media3:media3-common:1.10.1")
शानदार
implementation "androidx.media3:media3-exoplayer:1.10.1"
implementation "androidx.media3:media3-ui:1.10.1"
implementation "androidx.media3:media3-common:1.10.1"
इस्तेमाल के उदाहरण के आधार पर, आपको Media3 के अन्य मॉड्यूल की भी ज़रूरत पड़ सकती है. जैसे, DASH फ़ॉर्मैट में स्ट्रीम चलाने के लिए exoplayer-dash.
1.10.1 को लाइब्रेरी के अपने पसंदीदा वर्शन से बदलना न भूलें. सबसे नया वर्शन देखने के लिए, प्रॉडक्ट की जानकारी देखें.
मीडिया प्लेयर बनाना
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() में तैयारी की जा सकती है. लाइफ़साइकल के तरीकों को लागू करने के उदाहरण के लिए, Exoplayer codelab देखें.
प्लेयर को कंट्रोल करना
प्लेयर तैयार हो जाने के बाद, प्लेयर पर मौजूद इन तरीकों का इस्तेमाल करके वीडियो चलाने की सुविधा को कंट्रोल किया जा सकता है:
- वीडियो चलाने और रोकने के लिए,
play()औरpause()का इस्तेमाल करें seekTo()का इस्तेमाल, मौजूदा मीडिया आइटम में किसी जगह पर जाने के लिए किया जाता है- प्लेलिस्ट में आगे-पीछे जाने के लिए,
seekToNextMediaItem()औरseekToPreviousMediaItem()का इस्तेमाल करें
किसी प्लेयर से बाइंड होने पर, PlayerView या PlayerControlView जैसे यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट, उसी के हिसाब से अपडेट हो जाएंगे.
प्लेयर को रिलीज़ करना
प्लेबैक के लिए ऐसे संसाधनों की ज़रूरत पड़ सकती है जो सीमित संख्या में उपलब्ध होते हैं. जैसे, वीडियो डिकोडर. इसलिए, जब प्लेयर की ज़रूरत न हो, तो release() को कॉल करना ज़रूरी है, ताकि संसाधन खाली हो सकें.
अगर आपका प्लेयर Activity या Fragment में है, तो उसे एपीआई लेवल 24 और इसके बाद के वर्शन पर onStop() लाइफ़साइकल मेथड में रिलीज़ करें. इसके अलावा, एपीआई लेवल 23 और इससे पहले के वर्शन पर onPause() मेथड में रिलीज़ करें. Service में शामिल किसी प्लेयर को onDestroy() में रिलीज़ किया जा सकता है. लाइफ़साइकल के तरीकों को लागू करने के तरीके का उदाहरण देखने के लिए, Exoplayer का कोडलैब देखें.
मीडिया सेशन की मदद से प्लेबैक मैनेज करना
Android पर, मीडिया सेशन की मदद से, प्रोसेस की सीमाओं के बीच मीडिया प्लेयर के साथ इंटरैक्ट करने का एक स्टैंडर्ड तरीका मिलता है. मीडिया सेशन को अपने प्लेयर से कनेक्ट करने पर, मीडिया को बाहरी तौर पर चलाने का विज्ञापन दिखाया जा सकता है. साथ ही, बाहरी सोर्स से मीडिया चलाने के निर्देश पाए जा सकते हैं. उदाहरण के लिए, मोबाइल और बड़ी स्क्रीन वाले डिवाइसों पर सिस्टम मीडिया कंट्रोल के साथ इंटिग्रेट करना.
मीडिया सेशन का इस्तेमाल करने के लिए, Media3 सेशन मॉड्यूल पर डिपेंडेंसी जोड़ें:
Kotlin
implementation("androidx.media3:media3-session:1.10.1")
शानदार
implementation "androidx.media3:media3-session:1.10.1"
मीडिया सेशन बनाना
नीचे दिए गए तरीके से प्लेयर को शुरू करने के बाद, 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 अलग है. 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, आपके लिए MediaNotification के तौर पर MediaStyle सूचना अपने-आप बना देगा. कस्टम सूचना देने के लिए, DefaultMediaNotificationProvider.Builder के साथ MediaNotification.Provider बनाएं या प्रोवाइडर इंटरफ़ेस का कस्टम तरीके से इस्तेमाल करें. 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 ऑब्जेक्ट शामिल होगा. इसमें उस कॉन्टेंट ट्री के टाइप के बारे में अतिरिक्त सिग्नल होंगे जिसमें क्लाइंट ऐप्लिकेशन की दिलचस्पी है.