प्लेयर, आपके ऐप्लिकेशन का वह कॉम्पोनेंट होता है जो मीडिया आइटम चलाने में मदद करता है.
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 में रखना होगा. यह फ़ोरग्राउंड सेवा के तौर पर काम करता है. ऐसा करने पर, अपने प्लेयर को ऐप्लिकेशन में मौजूद उस गतिविधि से अलग किया जा सकता है जिसमें प्लेबैक कंट्रोल के लिए यूज़र इंटरफ़ेस (यूआई) होता है. इसके लिए, आपको मीडिया कंट्रोलर का इस्तेमाल करना पड़ सकता है.
Player इंटरफ़ेस अहम भूमिका निभाता है.प्लेयर की स्थिति
Player इंटरफ़ेस को लागू करने वाले मीडिया प्लेयर की स्थिति में, मुख्य तौर पर चार तरह की जानकारी शामिल होती है:
- प्लेबैक की स्थिति
getPlaybackState()की मदद से वापस पाएं.- इंटरफ़ेस से तय की गई स्थिति की वैल्यू,
STATE_IDLE,STATE_BUFFERING,STATE_READY, औरSTATE_ENDEDहोती हैं.
- मीडिया आइटम की प्लेलिस्ट
- प्लेबैक के लिए,
MediaItemइंस्टेंस का क्रम. getCurrentTimeline()की मदद से वापस पाएंPlayerइंस्टेंस, प्लेलिस्ट की कार्रवाइयों के तरीके उपलब्ध करा सकते हैं. जैसे, जोड़ना या हटानाMediaItemऔर सुविधाजनक तरीके भी उपलब्ध करा सकते हैं. जैसे,getCurrentMediaItem().
- प्लेबैक के लिए,
- वीडियो चलाने/रोकने की प्रॉपर्टी. जैसे:
playWhenReady: इससे पता चलता है कि उपयोगकर्ता, मीडिया को चलने देना चाहता है या उसे रोककर रखना चाहता है- प्लेबैक रोकने की वजह:
इससे पता चलता है कि प्लेबैक क्यों रोका गया है. यह जानकारी तब दिखती है, जब
playWhenReadyकी वैल्यूtrueहो isPlaying: इससे पता चलता है कि फ़िलहाल प्लेयर चल रहा है या नहीं. इसकी वैल्यू सिर्फ़ तबtrueहोगी, जब प्लेबैक की स्थितिSTATE_READYहो,playWhenReadyकी वैल्यूtrueहो, और प्लेबैक न रोका गया हो
- प्लेबैक की पोज़िशन. इसमें ये शामिल हैं:
- मौजूदा मीडिया आइटम का इंडेक्स:
यह प्लेलिस्ट में मौजूद मौजूदा
MediaItemका इंडेक्स होता है. isPlayingAd: इससे पता चलता है कि डाला गया विज्ञापन चल रहा है या नहीं.- मौजूदा प्लेबैक की पोज़िशन:
यह मौजूदा
MediaItemया डाले गए विज्ञापन में, मौजूदा प्लेबैक की पोज़िशन होती है.
- मौजूदा मीडिया आइटम का इंडेक्स:
यह प्लेलिस्ट में मौजूद मौजूदा
इसके अलावा, 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 इंटरफ़ेस, स्थिति में बदलाव करने और प्लेबैक को कंट्रोल करने के कई तरीके उपलब्ध कराता है:
- प्लेबैक के बुनियादी कंट्रोल
जैसे
play(),pause(),prepare(), औरstop(). - प्लेलिस्ट की कार्रवाइयां. जैसे
addMediaItem()याremoveMediaItem(). - मौजूदा आइटम या पोज़िशन में बदलाव करने के लिए, सीक करना.
- दोहराने के मोड और शफ़ल मोड सेट करना.
- ट्रैक चुनने की प्राथमिकताओं को अपडेट करना .
- प्लेबैक की स्पीड सेट करना.
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 का इस्तेमाल किया जा सकता है. ज़्यादा जानकारी के लिए, पसंद के मुताबिक बनाना पेज पर मौजूद गाइड देखें.