Media3 ExoPlayer का इस्तेमाल करके, एक बेसिक मीडिया प्लेयर ऐप्लिकेशन बनाएं

Jetpack Media3 एक Player इंटरफ़ेस के बारे में बताता है, जो बुनियादी फ़ंक्शन के बारे में बताता है वीडियो और ऑडियो फ़ाइलें चलाने के लिए. डिफ़ॉल्ट रूप से ExoPlayer लागू होता है मीडिया3 में इस इंटरफ़ेस का. हम ExoPlayer का इस्तेमाल करने का सुझाव देते हैं, क्योंकि यह ऐसी सुविधाओं का एक सेट है जो वीडियो चलाने के ज़्यादातर मामलों में काम करती हैं. ज़रूरत के हिसाब से कस्टमाइज़ किया जा सकता है. ExoPlayer पर भी डिवाइस और ओएस फ़्रैगमेंटेशन को ऐब्स्ट्रैक्ट कर देगा, ताकि आपका कोड लगातार काम करता रहे जानकारी को ऐक्सेस करने की सुविधा मिलती है. ExoPlayer में ये शामिल हैं:

इस पेज पर, आपको वीडियो चलाने के लिए ज़रूरी चरणों के बारे में बताया गया है ऐप्लिकेशन डाउनलोड करें. ज़्यादा जानकारी के लिए, Media3 ExoPlayer.

शुरू करना

शुरू करने के लिए, ExoPlayer, यूज़र इंटरफ़ेस (यूआई) और इसके सामान्य मॉड्यूल पर डिपेंडेंसी जोड़ें Jetpack Media3:

implementation "androidx.media3:media3-exoplayer:1.4.0"
implementation "androidx.media3:media3-ui:1.4.0"
implementation "androidx.media3:media3-common:1.4.0"

आपको अपने इस्तेमाल के उदाहरण के आधार पर, Media3, जैसे कि DASH फ़ॉर्मैट में स्ट्रीम चलाने के लिए exoplayer-dash.

1.4.0 को, लाइब्रेरी. आपके पास प्रॉडक्ट की जानकारी देखने का विकल्प है ताकि आप सबसे नया वर्शन देख सकें.

मीडिया प्लेयर बनाना

Media3 के साथ, Player को शामिल करने की प्रोसेस का इस्तेमाल किया जा सकता है इंटरफ़ेस, ExoPlayer में बदलाव किया जा सकता है. इसके अलावा, अपने हिसाब से बदलाव भी किया जा सकता है.

कोई ExoPlayer बनाना

ExoPlayer इंस्टेंस बनाने का सबसे आसान तरीका यह है:

Kotlin

val player = ExoPlayer.Builder(context).build()

Java

ExoPlayer player = new ExoPlayer.Builder(context).build();

मीडिया प्लेयर बनाने के लिए, इसकी onCreate() लाइफ़साइकल तरीके का इस्तेमाल करें Activity, Fragment या Service जहां यह रहता है.

Builder में ये शामिल हैं विज्ञापनों को पसंद के मुताबिक बनाने के कई विकल्प देते हैं, जिनमें आपकी दिलचस्पी हो सकती है. जैसे:

Media3 एक PlayerView यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट उपलब्ध कराता है, जिसे अपने ऐप्लिकेशन में शामिल किया जा सकता है लेआउट फ़ाइल शामिल है. यह कॉम्पोनेंट, वीडियो चलाने के लिए PlayerControlView को इनकैप्सुलेट करता है कंट्रोल, सबटाइटल दिखाने के लिए SubtitleView, और रेंडर करने के लिए Surface वीडियो.

खिलाड़ी की तैयारी की जा रही है

इनके लिए प्लेलिस्ट में मीडिया आइटम जोड़ें इन तरीकों से वीडियो चलाएं setMediaItem() और addMediaItem(). इसके बाद, prepare() को कॉल करें मीडिया को लोड करना और ज़रूरी संसाधनों को हासिल करना शुरू करेगा.

ऐप्लिकेशन के फ़ोरग्राउंड में आने से पहले, आपको इस तरीके का इस्तेमाल नहीं करना चाहिए. अगर आपके खिलाड़ी Activity या Fragment में है, इसका मतलब है कि खिलाड़ी को एपीआई लेवल 24 और उसके बाद के लेवल या onResume() पर, onStart() लाइफ़साइकल मेथड लाइफ़साइकल तरीके को एपीआई लेवल 23 और उससे पहले के लेवल पर सेट करें. ऐसे खिलाड़ी के लिए जो Service में है, तो onCreate() में इसे तैयार करें.

प्लेयर को कंट्रोल करें

प्लेयर तैयार हो जाने के बाद, कॉल करने के तरीकों का इस्तेमाल करके, प्लेबैक को कंट्रोल किया जा सकता है प्लेयर पर ये सेटिंग लागू होती हैं, जैसे:

  • play() और pause() प्लेबैक को शुरू करने और रोकने के लिए
  • seekTo() का इस्तेमाल करके वर्तमान मीडिया आइटम में कोई स्थिति
  • seekToNextMediaItem() और seekToPreviousMediaItem() प्लेलिस्ट में नेविगेट करने के लिए

PlayerView या PlayerControlView जैसे यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट अपडेट हो जाएंगे जब वे खिलाड़ी के लिए बने हों.

प्लेयर को छोड़ें

वीडियो चलाने के लिए, ऐसे संसाधनों की ज़रूरत पड़ सकती है जो सीमित तौर पर उपलब्ध हों, जैसे कि वीडियो डीकोडर का इस्तेमाल करें, इसलिए release() को कॉल करना ज़रूरी है इस्तेमाल करके, संसाधनों को खाली किया जा सकता है.

अगर आपका प्लेयर Activity या Fragment में है, तो उसे इसमें छोड़ दें एपीआई लेवल 24 और उसके बाद के लेवल या onPause() पर, onStop() लाइफ़साइकल मेथड वाला तरीका अपनाएं. Service में शामिल खिलाड़ी के लिए, ये काम किए जा सकते हैं इसे onDestroy() में रिलीज़ करें.

मीडिया सेशन की मदद से प्लेबैक मैनेज करना

Android पर, मीडिया सेशन की मदद से मीडिया के साथ इंटरैक्ट करने का स्टैंडर्ड तरीका मिलता है हर खिलाड़ी को अलग-अलग प्रोसेस से गुज़रना होता है. मीडिया सेशन को अपने प्लेयर से कनेक्ट करना आपको अपने मीडिया प्लेबैक का बाहरी रूप से विज्ञापन करने और प्लेबैक प्राप्त करने की अनुमति देता है बाहरी सोर्स से कमांड दें, जैसे कि मोबाइल और बड़े साइज़, दोनों पर सिस्टम मीडिया कंट्रोल स्क्रीन डिवाइस.

मीडिया सेशन का इस्तेमाल करने के लिए, Media3 Session मॉड्यूल पर कोई डिपेंडेंसी जोड़ें:

implementation "androidx.media3:media3-session:1.4.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 या कस्टम लागू करने का विकल्प.

अन्य क्लाइंट को कंट्रोल दें

क्लाइंट ऐप्लिकेशन, मीडिया कंट्रोलर लागू कर सकते हैं का इस्तेमाल करके, अपने मीडिया सेशन के प्लेबैक को कंट्रोल किया जा सकता है. ये अनुरोध पाने के लिए, callback ऑब्जेक्ट, जब MediaSession बनाया जा रहा है.

जब कोई कंट्रोलर आपके मीडिया सेशन से कनेक्ट होने वाला होता है, तो 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();
    }
}

आपके मेनिफ़ेस्ट में, MediaSessionService इंटेंट वाली आपकी Service क्लास फ़ोरग्राउंड चलाने के लिए, 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 से अलग Service में है या Fragment आपका प्लेयर यूआई यहां मौजूद है. लिंक करने के लिए, MediaController का इस्तेमाल किया जा सकता है उन्हें एक साथ रखें. onStart() विधि में Activity या Fragment की विधि में आपके यूज़र इंटरफ़ेस (यूआई), अपने MediaSession के लिए SessionToken बनाएं. इसके बाद, SessionToken का इस्तेमाल करें MediaController बनाने के लिए. 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 के साथ या प्रोवाइडर इंटरफ़ेस को अपनी पसंद के हिसाब से लागू करके. अपने को, आपके MediaSession को setMediaNotificationProvider.

अपनी कॉन्टेंट लाइब्रेरी का विज्ञापन करना

क्लाइंट को अनुमति देकर, MediaLibraryService, MediaSessionService पर बनता है आपके ऐप्लिकेशन के उपलब्ध कराए गए मीडिया कॉन्टेंट को ब्राउज़ करने वाले ऐप्लिकेशन. क्लाइंट ऐप्लिकेशन, इंटरैक्ट करने के लिए MediaBrowser MediaLibraryService के साथ.

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 एपीआई को बढ़ाएं. इसकी तुलना में MediaSession कॉलबैक, MediaLibrarySession कॉलबैक इस तरह की विधियां जोड़ता है:

  • onGetLibraryRoot() जब कोई क्लाइंट किसी कॉन्टेंट ट्री के रूट MediaItem का अनुरोध करता है
  • onGetChildren() जब कोई क्लाइंट, कॉन्टेंट ट्री में मौजूद MediaItem के बच्चों से अनुरोध करता है
  • onGetSearchResult() जब कोई क्लाइंट किसी दिए गए विषय के लिए कॉन्टेंट ट्री से खोज नतीजों का अनुरोध करता है क् वेरी

काम के कॉलबैक के तरीकों में एक LibraryParams शामिल होगा ऐसा ऑब्जेक्ट जो क्लाइंट ऐप्लिकेशन के कॉन्टेंट ट्री के टाइप के बारे में अतिरिक्त सिग्नल के साथ करता है रुचि है.