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

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

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

Media3, Player इंटरफ़ेस का एक ऐसा वर्शन भी उपलब्ध कराता है जिसे ExoPlayer कहा जाता है.

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

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

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

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.Listener का इस्तेमाल करें.Player लिसनर बनाने और उसका इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, प्लेयर इवेंट के बारे में 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() तरीके के अलावा, आपको सिर्फ़ उन तरीकों को लागू करना होगा जिनका इस्तेमाल उन निर्देशों के लिए किया जाता है जिन्हें आपका प्लेयर उपलब्ध बताता है. उस हैंडलर तरीके को ढूंढें जिसे बदला जा सकता है और जो उस सुविधा से जुड़ा हो जिसे आपको लागू करना है. उदाहरण के लिए, तरीके को बदलें handleSeek() जैसी कार्रवाइयों के लिए, COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM और COMMAND_SEEK_TO_NEXT_MEDIA_ITEM.

Player के वर्शन में बदलाव करना

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