Mediasession की मदद से मीडिया को कंट्रोल करना

1. परिचय

पिछली बार अपडेट किए जाने की तारीख: 09-09-2020

वीडियो प्लेबैक के आस-पास Mediasession जोड़ने के क्या फ़ायदे हैं?

मीडिया सेशन, Android प्लैटफ़ॉर्म और मीडिया ऐप्लिकेशन के बीच एक अहम लिंक हैं. इससे Android को न सिर्फ़ यह पता चलता है कि मीडिया चल रहा है, बल्कि वह मीडिया से जुड़ी कार्रवाइयों को सही सेशन में भेज सकता है. साथ ही, इससे प्लैटफ़ॉर्म को यह भी पता चलता है कि क्या चल रहा है और उसे कैसे कंट्रोल किया जा सकता है.

अपने ऐप्लिकेशन की मदद से Mediasession दिखाने के कई फ़ायदे हैं. ये सभी उपयोगकर्ताओं को पसंद आएंगे. यहां कुछ बेहतरीन उदाहरण दिए गए हैं.

Google Assistant

"रोको", जैसे बोले गए निर्देशों की मदद से उपयोगकर्ता आपके ऐप्लिकेशन में मीडिया से आसानी से इंटरैक्ट कर सकते हैं "फिर से शुरू करो," और "आगे बढ़ें." आपके मीडिया के मेटाडेटा का इस्तेमाल, चल रहे कॉन्टेंट के बारे में जवाब पाने के लिए भी किया जा सकता है.

Android TV

बड़ी स्क्रीन वाले डिवाइस पर, आपका Android TV ऐप्लिकेशन, एचडीएमआई-सीईसी के साथ काम करने वाले टीवी पर पारंपरिक रिमोट कंट्रोल का इस्तेमाल कर सकता है. चलाएं/रोकें, बंद करें, अगला और पिछला बटन से जारी किए गए निर्देश आपके ऐप्लिकेशन पर रिले किए जाते हैं.

स्क्रीन पर दिखने वाले मीडिया कंट्रोल

Android 4.0 (एपीआई लेवल 14) के बाद वाले वर्शन में, सिस्टम किसी मीडिया सेशन के वीडियो चलाने की स्थिति और मेटाडेटा को ऐक्सेस कर सकता है. इस सुविधा का इस्तेमाल करके, लॉक स्क्रीन पर मीडिया कंट्रोल और आर्टवर्क दिखाए जा सकते हैं. यह तरीका, Android के वर्शन के हिसाब से अलग-अलग होता है.

बैकग्राउंड मीडिया

इनमें से किसी भी स्थिति में, मीडिया को कंट्रोल किया जा सकता है. भले ही, बैकग्राउंड में मीडिया चलाने वाला ऐप्लिकेशन चल रहा हो.

ऐंबियंट कंप्यूटिंग

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

आपको क्या बनाना होगा

इस कोडलैब में, मीडिया सेशन के लिए सहायता जोड़ी जा सकती है. इसके लिए, मौजूदा Exoplayer सैंपल को बढ़ाया जा रहा है. आपका ऐप्लिकेशन ये काम करेगा:

  • मीडिया सेशन की चालू स्थिति को सही तरीके से दिखाता हो
  • मीडिया कंट्रोल को ExoPlayer में रिले करें
  • सूची में मौजूद आइटम के मेटाडेटा को मीडिया सेशन में पास करें

आपको इनके बारे में जानकारी मिलेगी

  • मीडिया सेशन से उपयोगकर्ताओं को बेहतर अनुभव क्यों मिलता है
  • मीडिया सेशन बनाने और उसकी स्थिति को मैनेज करने का तरीका
  • मीडिया सेशन को ExoPlayer से कनेक्ट करने का तरीका
  • मीडिया सेशन के दौरान, वीडियो चलाने की सूची में आइटम का मेटाडेटा शामिल करने का तरीका
  • अन्य (कस्टम) कार्रवाइयां जोड़ने का तरीका

यह कोडलैब, Mediaसेशन SDK टूल पर फ़ोकस करता है. इसमें ExoPlayer को लागू करने के बारे में जानकारी के साथ-साथ गैर-ज़रूरी कॉन्सेप्ट और कोड ब्लॉक पर चर्चा नहीं की गई है. हालांकि, उन्हें सिर्फ़ कॉपी करके चिपकाने के लिए उपलब्ध कराया गया है.

आपको इन चीज़ों की ज़रूरत होगी

  • Android Studio का नया वर्शन (3.5 या उसके बाद का वर्शन)
  • Android ऐप्लिकेशन डेवलप करने की बुनियादी जानकारी

2. सेट अप किया जा रहा है

शुरुआत करने के लिए हम क्या करना चाहते हैं?

सबसे पहले, ExoPlayer का डेमो देखें. इस डेमो में, स्क्रीन पर प्लेबैक कंट्रोल वाले वीडियो शामिल हैं. हालांकि, इसमें अलग-अलग तरह के मीडिया सेशन का इस्तेमाल नहीं किया गया है. यह एक ऐसी बढ़िया जगह है, जहां हम इनके बारे में विस्तार से जान सकते हैं और उन्हें शामिल कर सकते हैं!

ExoPlayer सैंपल पाएं

आइए, शुरुआत करने के लिए ExoPlayer के सैंपल से शुरुआत करें. नीचे दिए गए कोड को चलाकर, GitHub रिपॉज़िटरी का क्लोन बनाएं.

git clone https://github.com/google/ExoPlayer.git

डेमो खोलें

Android Studio में, demos/main में मौजूद मुख्य डेमो प्रोजेक्ट खोलें.

Android Studio से आपको SDK टूल का पाथ सेट करने का अनुरोध मिलेगा. अगर आपको कोई समस्या आती है, तो आईडीई और SDK टूल को अपडेट करने के लिए दिए गए सुझावों को अपनाएं.

10e3b5c652186d57.png

अगर आपसे Gradle के सबसे नए वर्शन का इस्तेमाल करने के लिए कहा जाता है, तो इसे अपडेट करें.

कुछ समय निकालकर, ऐप्लिकेशन को डिज़ाइन करने का तरीका जानें. ध्यान दें कि दो गतिविधियां होती हैं: sampleChooserActivity और PlayerActivity. हम PlayerActivity में कोडलैब का बाकी हिस्सा खर्च करेंगे, जहां असल में मीडिया चलता है. इसलिए, इस क्लास को खोलें और अगले सेक्शन पर जाएं.

3. मीडिया सेशन बनाना और उसकी स्थिति मैनेज करना

मीडिया सेशन बनाना

PlayerActivity.java खोलें. यह क्लास ExoPlayer बनाती है और इसके फ़ंक्शन मैनेज करती है, जैसे कि स्क्रीन पर वीडियो रेंडर करना. इस गतिविधि में, हम ExoPlayer को किसी मीडिया सेशन से कनेक्ट करेंगे.

क्लास के सबसे ऊपर, नीचे दिए गए दो फ़ील्ड का एलान करें. हम इस पूरे सेक्शन में इन फ़ील्ड का इस्तेमाल करेंगे.

private MediaSessionCompat mediaSession;
private MediaSessionConnector mediaSessionConnector;

आपको "एक्सटेंशन-मीडिया सेशन" जोड़ना होगा "मॉड्यूल: डेमो" के लिए मॉड्यूल-लेवल build.gradle पर प्रोजेक्ट निर्भरता है:

implementation project(path: ':extension-mediasession')

ध्यान दें कि Android Studio की मदद से, इस डिपेंडेंसी को अपने-आप जोड़ा जा सकता है. ऐसा तब होता है, जब मीडिया से कनेक्ट करने के प्रोसेस को ठीक करने में आने वाली गड़बड़ी पर कर्सर ले जाया जाए:

60055e4ad54fbb97.png

आखिर में, इन्हें जोड़कर क्लास इंपोर्ट का समाधान करें:

import android.support.v4.media.session.MediaSessionCompat;
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector;

गतिविधि बनाते समय, हम एक मीडिया सेशन और एक मीडिया सेशन कनेक्टर बनाना चाहेंगे. यह कनेक्टर मीडिया सेशन और ExoPlayer के बीच, मध्यस्थ के तौर पर काम करेगा.

इसे शामिल करने के लिए सबसे सही जगह है ExoPlayer. अपने डेमो ऐप्लिकेशन में, हम initializePlayer() के आखिर में अपना कोड जोड़ सकते हैं. प्लेयर के इंस्टैंशिएट होने के बाद इस लॉजिक को ज़रूर जोड़ें!

private void initializePlayer() {
  if (player == null) {
    ...
    player = ...
    ...
    mediaSession = new MediaSessionCompat(this, "sample");
    mediaSessionConnector = new MediaSessionConnector(mediaSession);
    mediaSessionConnector.setPlayer(player);
  }
  ...
}

मीडिया सेशन को रिलीज़ करना

जब मीडिया सेशन की ज़रूरत न हो, तब उसे छोड़ दें. जब हम releasePlayer() में ExoPlayer रिलीज़ करते हैं, तो हम ऐसा करने के लिए यह कोड भी शामिल कर सकते हैं:

private void releasePlayer() {
  if (mediaSession != null) {
    mediaSession.release();
  }
  ...
}

मीडिया सेशन की स्थिति को मैनेज करना

अब हमने मीडिया सेशन को इंस्टैंशिएट कर दिया है, इसलिए हमें यह पक्का करना होगा कि उपयोगकर्ता की गतिविधि से इंटरैक्ट करने पर, इसकी स्थिति सही तरीके से दिखे.

जब उपयोगकर्ता गतिविधि शुरू करता है, तो मीडिया सेशन चालू हो जाना चाहिए:

@Override
public void onStart() {
  ...
  if (mediaSession != null) {
    mediaSession.setActive(true);
  }
}

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

@Override
public void onStop() {
  super.onStop();
  if (mediaSession != null) {
    mediaSession.setActive(false);
  }
  ...
}

आइए, डेमो चलाएं

  1. कोई Android डिवाइस अटैच करें या एम्युलेटर शुरू करें.
  2. पक्का करें कि "डेमो" को Android Studio के टूलबार से चलाने के लिए चुना गया है. cb1ec4e50886874f.png अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
  3. Android Studio के टूलबार में जाकर, 9d8fb3a9ddf12827.png पर क्लिक करें.
  4. डिवाइस पर ऐप्लिकेशन लॉन्च होने के बाद, चलाने के लिए कोई वीडियो स्ट्रीम चुनें.
  5. वीडियो चलाने के बाद, मीडिया सेशन को कंट्रोल करने के लिए, इन adb निर्देशों का इस्तेमाल करें:
adb shell media dispatch pause
adb shell media dispatch play
adb shell media dispatch play-pause
adb shell media dispatch fast-forward
adb shell media dispatch rewind
  1. यह भी जानें कि Android को आपका मीडिया सेशन कैसा दिखता है. खास तौर पर, ऐक्शन फ़ील्ड को देखकर यह पता लगाया जा सकता है कि कौनसी कार्रवाइयां की जा सकती हैं. आपको यहां जो संख्या दिखेगी वह कार्रवाई आईडी का मिला-जुला रूप है. इसका एलान PlaybackState ऑब्जेक्ट में किया गया है. चालू मीडिया सेशन देखने के लिए: adb shell dumpsys media_session
  2. अगर आप माइक्रोफ़ोन वाले डिवाइस का इस्तेमाल कर रहे हैं, तो Google Assistant को चालू करके देखें और बोलकर निर्देश देने की कोशिश करें, जैसे कि "रोको." "फिर से चलाओ।" "एक मिनट आगे बढ़ाओ."

b8dda02a6fb0f6a4.pngAndroid TV पर चल रहा ExoPlayer सैंपल.

4. वीडियो चलाने की सूची में मौजूद आइटम का मेटाडेटा शामिल है

अब हम अपने उस मीडिया सेशन के साथ काम करने वाली सुविधाओं को बढ़ा सकते हैं जहां हमने पहले initializePlayer() में MediasessionConnector बनाया था.

टाइमलाइन सूची नेविगेटर जोड़ना

ExoPlayer, मीडिया की बनावट को टाइमलाइन के तौर पर दिखाता है. इसके काम करने के तरीके के बारे में जानने के लिए, कुछ समय निकालकर ExoPlayer के टाइमलाइन ऑब्जेक्ट के बारे में पढ़ें. इस स्ट्रक्चर पर टैप करने से, हमें इस बात की जानकारी मिलती है कि वीडियो में कब बदलाव हो रहा है. साथ ही, पूछे जाने पर हमें इस बात की जानकारी मिल सकती है कि अभी कौनसा वीडियो चल रहा है.

ऐसा करने के लिए, हम एक टाइमलाइन लाइन नाइविटर तय करेंगे. initializePlayer() में MediasessionConnector के इंस्टैंशिएट का पता लगाएं और mediaSession शुरू करने के बाद Timeline में मौजूद Navigator को लागू करने की सुविधा जोड़ें.

mediaSessionConnector.setQueueNavigator(new TimelineQueueNavigator(mediaSession) {
  @Override
  public MediaDescriptionCompat getMediaDescription(Player player, int windowIndex) {
    return new MediaDescriptionCompat.Builder()
            .setTitle(player.getCurrentMediaItem().mediaMetadata.title)
            .setDescription("MediaDescription description for " + windowIndex)
            .setSubtitle("MediaDescription subtitle")
            .build();
  }
});

यह जोड़कर क्लास इंपोर्ट का समाधान करें:

import android.support.v4.media.MediaDescriptionCompat;
import com.google.android.exoplayer2.ext.mediasession.TimelineQueueNavigator;

देखें कि windowIndex पैरामीटर, वीडियो चलाने की सूची में उस इंडेक्स के आइटम से मेल खाता है या नहीं.

आपने कुछ मेटाडेटा जोड़ लिया है, तो अब यह देखा जा सकता है कि क्या चल रहा है, इसलिए Assistant को समझ आ रहा है या नहीं. Android TV पर वीडियो चलाते समय, Assistant को चालू करें और पूछें "क्या चल रहा है?"

6c7fc0cb853cbc38.png

5. कार्रवाइयों को पसंद के मुताबिक बनाना

ऐसा हो सकता है कि आपका खिलाड़ी कुछ कार्रवाइयों को सपोर्ट न करता हो या आपको अन्य कार्रवाइयों के लिए सहायता शामिल करनी है? आइए, अब उस मीडिया सेशन के बारे में थोड़ा गहराई से जानते हैं जिसमें हमने पहले initializePlayer() में MediasessionConnector बनाया था.

इस्तेमाल की जा सकने वाली कार्रवाइयों का एलान करना

आपको मीडिया सेशन में कौनसी कार्रवाइयां करनी हैं, यह तय करने के लिए mediaSessionConnector.setEnabledPlaybackActions() का इस्तेमाल करें.

ध्यान दें कि पूरा सेट यह है:

mediaSessionConnector.setEnabledPlaybackActions(
        PlaybackStateCompat.ACTION_PLAY_PAUSE
                | PlaybackStateCompat.ACTION_PLAY
                | PlaybackStateCompat.ACTION_PAUSE
                | PlaybackStateCompat.ACTION_SEEK_TO
                | PlaybackStateCompat.ACTION_FAST_FORWARD
                | PlaybackStateCompat.ACTION_REWIND
                | PlaybackStateCompat.ACTION_STOP
                | PlaybackStateCompat.ACTION_SET_REPEAT_MODE
                | PlaybackStateCompat.ACTION_SET_SHUFFLE_MODE
);

चलिए, फिर से देखते हैं कि प्लैटफ़ॉर्म पर यह डेटा कैसे दिखाया जाता है:

  1. पहले की तरह ही, वीडियो शुरू करें.
  2. यह जानें कि Android, आपके मीडिया सेशन का मेटाडेटा कैसे देखता है. इसके लिए, यहां दिए गए निर्देशों का पालन करें: adb shell dumpsys media_session
  3. मेटाडेटा वाली लाइन पर जाएं और देखें कि उसमें टाइटल और ब्यौरा शामिल है और com.google.android.exoplayer2.demo/sample से जुड़ा है.

अतिरिक्त कार्रवाइयां जोड़ी जा रही हैं

हम अपने मीडिया सेशन को कुछ अन्य कार्रवाइयों की मदद से बढ़ा सकते हैं. इस सेक्शन में, हम सिर्फ़ कैप्शन की सुविधा जोड़ेंगे.

अन्य कैप्शन

मीडिया सेशन में कैप्शन जोड़ने की सुविधा से उपयोगकर्ता, कैप्शन को बोलकर टॉगल कर सकते हैं. जहां आपने मीडिया सेशन कनेक्टर शुरू किया था, उसमें यह जानकारी जोड़ें:

mediaSessionConnector.setCaptionCallback(new MediaSessionConnector.CaptionCallback() {
      @Override
      public void onSetCaptioningEnabled(Player player, boolean enabled) {
        Log.d("MediaSession", "onSetCaptioningEnabled: enabled=" + enabled);
      }

      @Override
      public boolean hasCaptions(Player player) {
        return true;
      }

      @Override
      public boolean onCommand(Player player, ControlDispatcher controlDispatcher, String command, Bundle extras, ResultReceiver cb) {
        return false;
      }
    }
);

आखिर में, छूटे हुए इंपोर्ट की समस्या ठीक करें.

इसकी जाँच करने के लिए, Android TV पर Google Assistant को चालू करें और फिर "कैप्शन चालू करो" कहें. यह देखने के लिए कि यह आपके कोड में कैसे कॉल करता है, मैसेज के लिए Logcat देखें.

6. बधाई हो

बधाई हो, आपने सैंपल में मीडिया सेशन जोड़ दिए हैं!

इनके ज़रिए आपको बहुत सारी सुविधाएं मिलती हैं:

  • मीडिया सेशन जोड़ने के बाद,
  • मीडिया सेशन को ExoPlayer के इंस्टेंस से कनेक्ट करती है,
  • मेटाडेटा और अन्य कार्रवाइयां जोड़ने के लिए किया जा सकता है.

अब आपको पता है कि किसी मीडिया ऐप्लिकेशन को बेहतर बनाने और उपयोगकर्ताओं को अलग-अलग तरह के अनुभव देने के लिए, क्या ज़रूरी है!

फ़ाइनल टिप्पणी

इस कोडलैब को ExoPlayer के सोर्स कोड के सैंपल के आधार पर बनाया गया है. सोर्स से ExoPlayer इस्तेमाल करने की कोई ज़रूरत नहीं है. साथ ही, यह सुझाव दिया जाता है कि आप ExoPlayer और Media SessionConnector की डिपेंडेंसी का इस्तेमाल करें. इससे आपको नई रिलीज़ के बारे में अप-टू-डेट रहने में आसानी होगी.

ऐसा करने के लिए, बस प्रोजेक्ट डिपेंडेंसी को बदलें, जैसे कि:

implementation project(modulePrefix + 'library-core')
implementation project(path: ':extension-mediasession')

Maven रिपॉज़िटरी से डेटा फ़ेच करने के लिए. जैसे:

implementation 'com.google.android.exoplayer:exoplayer-core:2.+'
implementation 'com.google.android.exoplayer:extension-mediasession:2.+'

पहचान फ़ाइलें