प्लेयर इंटरफ़ेस

प्लेयर, आपके ऐप्लिकेशन का वह कॉम्पोनेंट होता है जो मीडिया आइटम चलाने में मदद करता है. Media3 Player इंटरफ़ेस, आम तौर पर प्लेयर की ओर से हैंडल की जाने वाली सुविधाओं के लिए एक आउटलाइन सेट अप करता है. इसमें यह शामिल है:

  • प्लेबैक कंट्रोल पर असर डालती हैं. जैसे, वीडियो चलाना, रोकना, और आगे-पीछे करना
  • फ़िलहाल चल रहे मीडिया की प्रॉपर्टी के बारे में क्वेरी करना. जैसे, चलाने की जगह
  • मीडिया आइटम की प्लेलिस्ट/कतार मैनेज करना
  • वीडियो चलाने की सेटिंग कॉन्फ़िगर करना. जैसे, शफ़ल करना, दोहराना, स्पीड, और आवाज़
  • स्क्रीन पर वीडियो रेंडर करना

Media3, Player इंटरफ़ेस को लागू करने की सुविधा भी देता है. इसे ExoPlayer कहा जाता है.

कॉम्पोनेंट के बीच एक कॉमन इंटरफ़ेस

Media3 में कई कॉम्पोनेंट, Player इंटरफ़ेस लागू करते हैं. उदाहरण के लिए:

कॉम्पोनेंट ब्यौरा और व्यवहार से जुड़े नोट
ExoPlayer मीडिया प्लेयर एपीआई और Player इंटरफ़ेस का डिफ़ॉल्ट तौर पर लागू किया गया वर्शन.
MediaController यह कुकी, MediaSession के साथ इंटरैक्ट करती है, ताकि वीडियो चलाने के लिए निर्देश भेजे जा सकें. अगर आपका Player और MediaSession, Activity या Fragment से अलग Service में हैं, जहां आपके प्लेयर का यूज़र इंटरफ़ेस (यूआई) मौजूद है, तो अपने MediaController को अपने यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट के लिए प्लेयर के तौर पर असाइन किया जा सकता है. जैसे, PlayerView या Player कंपोज़ेबल. प्लेबैक और प्लेलिस्ट के तरीके के कॉल, MediaSession के ज़रिए आपके Player को भेजे जाते हैं.
MediaBrowser MediaController की ओर से दी जाने वाली सुविधाओं के अलावा, उपलब्ध मीडिया कॉन्टेंट ब्राउज़ करने के लिए MediaLibrarySession के साथ इंटरैक्ट करता है.
SimpleBasePlayer Player को लागू करने का ऐसा तरीका जिससे लागू करने के तरीकों की संख्या कम से कम हो. यह तब काम आता है, जब आपको किसी कस्टम प्लेयर को MediaSession से कनेक्ट करना हो.
ForwardingSimpleBasePlayer यह SimpleBasePlayer की एक सबक्लास है. इसे प्लेबैक की कार्रवाइयों को किसी अन्य Player पर फ़ॉरवर्ड करने के लिए डिज़ाइन किया गया है. साथ ही, यह SimpleBasePlayer की तरह ही व्यवहार को लगातार पसंद के मुताबिक बनाने की अनुमति देती है. इस क्लास का इस्तेमाल करके, किसी खास वीडियो को चलाने की कार्रवाइयों को रोका जा सकता है या उनमें बदलाव किया जा सकता है.
RemoteCastPlayer कास्ट किए जाने वाले डिवाइस पर, रिमोट Cast Receiver ऐप्लिकेशन पर कॉन्टेंट चलाने की सुविधा को कंट्रोल करने के लिए Player को लागू किया गया है.
CastPlayer लोकल और रिमोट, दोनों तरह से कास्ट किए जा रहे कॉन्टेंट को कंट्रोल करने के लिए, Player को लागू करना.

हालांकि, MediaSession, Player इंटरफ़ेस को लागू नहीं करता है, लेकिन इसे बनाते समय Player की ज़रूरत होती है. इसका मकसद, अन्य प्रोसेस या थ्रेड से Player को ऐक्सेस करने की अनुमति देना है.

Media3 के प्लेबैक का आर्किटेक्चर

अगर आपके पास Player का ऐक्सेस है, तो आपको सीधे तौर पर इसके तरीकों को कॉल करना चाहिए, ताकि वीडियो चलाने के निर्देश दिए जा सकें. MediaSession लागू करके, अपने कॉन्टेंट के प्लेबैक का विज्ञापन दिखाया जा सकता है. साथ ही, बाहरी सोर्स को प्लेबैक कंट्रोल करने की अनुमति दी जा सकती है. ये बाहरी सोर्स, MediaController लागू करते हैं. इससे मीडिया सेशन से कनेक्ट करने और मीडिया चलाने के अनुरोध भेजने में आसानी होती है.

बैकग्राउंड में मीडिया चलाने के लिए, आपको अपने मीडिया सेशन और प्लेयर को MediaSessionService या MediaLibraryService में रखना होगा. यह फ़ोरग्राउंड सेवा के तौर पर काम करता है. ऐसा करने पर, आपके पास प्लेयर को अपने ऐप्लिकेशन में मौजूद उस ऐक्टिविटी से अलग करने का विकल्प होता है जिसमें वीडियो चलाने पर कंट्रोल करने के लिए यूज़र इंटरफ़ेस (यूआई) होता है. इसके लिए, आपको मीडिया कंट्रोलर का इस्तेमाल करना पड़ सकता है.

इस डायग्राम में दिखाया गया है कि Media3 के प्लेबैक कॉम्पोनेंट, मीडिया ऐप्लिकेशन के आर्किटेक्चर में कैसे फ़िट होते हैं.
पहली इमेज: Media3 के आर्किटेक्चर में Player इंटरफ़ेस की अहम भूमिका होती है.

प्लेयर की स्थिति

Player इंटरफ़ेस लागू करने वाले मीडिया प्लेयर की स्थिति में मुख्य रूप से चार कैटगरी की जानकारी शामिल होती है:

  1. प्लेबैक का स्टेटस
  2. मीडिया आइटम की प्लेलिस्ट
    • प्लेबैक के लिए, MediaItem इंस्टेंस का क्रम.
    • getCurrentTimeline() की मदद से वापस पाएं
    • Player इंस्टेंस, प्लेलिस्ट के लिए कई तरीके उपलब्ध करा सकते हैं. जैसे, किसी MediaItem को जोड़ने या हटाने के तरीके. साथ ही, ये कुछ सुविधाजनक तरीके भी उपलब्ध करा सकते हैं. जैसे, getCurrentMediaItem().
  3. मीडिया चलाने/रोकने की प्रॉपर्टी, जैसे कि:
    • playWhenReady: इससे पता चलता है कि उपयोगकर्ता को मीडिया चलाना है या उसे रोकना है
    • वीडियो चलाने की सुविधा को सीमित करने की वजह: अगर लागू हो, तो वीडियो चलाने की सुविधा को सीमित करने की वजह के बारे में जानकारी. भले ही, playWhenReady true हो
    • isPlaying: इससे पता चलता है कि प्लेयर फ़िलहाल वीडियो चला रहा है या नहीं. यह सिर्फ़ तब true होगा, जब वीडियो चलाने की स्थिति STATE_READY हो, playWhenReady true हो, और वीडियो चलाने की सुविधा बंद न हो
  4. वीडियो जितना चल चुका है उसकी स्थिति. इसमें ये शामिल हैं:

इसके अलावा, Player इंटरफ़ेस से उपलब्ध ट्रैक, मीडिया मेटाडेटा, प्लेबैक की स्पीड, आवाज़, और प्लेबैक की अन्य सहायक प्रॉपर्टी ऐक्सेस की जा सकती हैं.

बदलावों के बारे में सूचना पाना

Player में हुए बदलावों को सुनने के लिए, Player.Listener का इस्तेमाल करें. लिसनर बनाने और उसका इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, प्लेयर इवेंट पर ExoPlayer का दस्तावेज़ देखें.

ध्यान दें कि लिसनर इंटरफ़ेस में, सामान्य प्लेबैक प्रोग्रेशन को ट्रैक करने के लिए कोई कॉलबैक शामिल नहीं होता. प्लेबैक की प्रोग्रेस पर लगातार नज़र रखने के लिए, जैसे कि प्रोग्रेस बार का यूज़र इंटरफ़ेस (यूआई) सेट अप करने के लिए, आपको सही इंटरवल पर मौजूदा पोज़िशन के बारे में क्वेरी करनी चाहिए.

Kotlin

fun checkPlaybackPosition(delayMs: Long): Boolean =
  handler.postDelayed(
    {
      val currentPosition = player.currentPosition
      // Update UI based on currentPosition
      checkPlaybackPosition(delayMs)
    },
    delayMs,
  )

Java

boolean checkPlaybackPosition(long delayMs) {
  return handler.postDelayed(
      () -> {
        long currentPosition = player.getCurrentPosition();
        // Update UI based on currentPosition
        checkPlaybackPosition(delayMs);
      },
      delayMs);
}

ऑडियो कंट्रोल करने का तरीक़ा

Player इंटरफ़ेस में, स्थिति में बदलाव करने और वीडियो चलाने को कंट्रोल करने के कई तरीके उपलब्ध हैं:

कस्टम Player लागू करने की सुविधा

कस्टम प्लेयर बनाने के लिए, Media3 में शामिल SimpleBasePlayer का इस्तेमाल किया जा सकता है. यह क्लास, Player इंटरफ़ेस को लागू करने का बुनियादी तरीका उपलब्ध कराती है. इससे आपको कम से कम तरीकों को लागू करना पड़ता है.

getState() तरीके को बदलकर शुरू करें. इस तरीके को कॉल किए जाने पर, मौजूदा खिलाड़ी की स्थिति की जानकारी अपने-आप भरनी चाहिए. इसमें यह जानकारी शामिल होनी चाहिए:

  • उपलब्ध निर्देशों का सेट
  • प्लेबैक की प्रॉपर्टी. जैसे, जब प्लेबैक की स्थिति STATE_READY हो, तब प्लेयर को वीडियो चलाना शुरू करना चाहिए या नहीं, फ़िलहाल चल रहे मीडिया आइटम का इंडेक्स, और मौजूदा आइटम में प्लेबैक की पोज़िशन

Kotlin

class CustomPlayer(looper: Looper) : SimpleBasePlayer(looper) {
  override fun getState(): State {
    return State.Builder()
      .setAvailableCommands(Commands.EMPTY) // Set which playback commands the player can handle
      // Configure additional playback properties
      .setPlayWhenReady(true, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST)
      .setCurrentMediaItemIndex(0)
      .setContentPositionMs(0)
      .build()
  }
}

Java

private static final class CustomPlayer extends SimpleBasePlayer {
  public CustomPlayer(Looper looper) {
    super(looper);
  }

  @Override
  protected State getState() {
    return new State.Builder()
        .setAvailableCommands(Commands.EMPTY) // Set which playback commands the player can handle
        // Configure additional playback properties
        .setPlayWhenReady(true, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST)
        .setCurrentMediaItemIndex(0)
        .setContentPositionMs(0)
        .build();
  }
}

SimpleBasePlayer यह पक्का करेगा कि State को राज्य की वैल्यू के मान्य कॉम्बिनेशन के साथ बनाया गया हो. यह लिसनर को मैनेज करने के साथ-साथ, स्थिति में हुए बदलावों के बारे में लिसनर को सूचना देने का काम भी करेगा. अगर आपको मैन्युअल तरीके से स्थिति अपडेट करनी है, तो invalidateState() को कॉल करें.

getState() तरीके के अलावा, आपको सिर्फ़ उन तरीकों को लागू करना होगा जिनका इस्तेमाल उन कमांड के लिए किया जाता है जिन्हें आपका प्लेयर उपलब्ध होने का एलान करता है. उस फ़ंक्शन के लिए, ओवरराइड किए जा सकने वाले हैंडलर का तरीका ढूंढें जिसे आपको लागू करना है. उदाहरण के लिए, COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM और COMMAND_SEEK_TO_NEXT_MEDIA_ITEM जैसे ऑपरेशन के लिए, handleSeek() तरीके को बदलें.

Player को लागू करने के तरीके में बदलाव करना

पूरी तरह से कस्टम Player बनाने के बजाय, ForwardingSimpleBasePlayer का इस्तेमाल करके, मौजूदा Player की स्थिति और व्यवहार में बदलाव किया जा सकता है. ज़्यादा जानकारी के लिए, पसंद के मुताबिक बनाने वाले पेज पर मौजूद गाइड देखें.