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