इस सेक्शन में बताया गया है कि मीडिया प्लेयर ऐप्लिकेशन को मीडिया कंट्रोलर (यूज़र इंटरफ़ेस के लिए) और मीडिया सेशन (असली प्लेयर के लिए) में कैसे अलग किया जाता है. इसमें दो मीडिया ऐप्लिकेशन आर्किटेक्चर के बारे में बताया गया है: क्लाइंट/सर्वर डिज़ाइन, जो ऑडियो ऐप्लिकेशन के लिए अच्छी तरह से काम करता है. साथ ही, वीडियो प्लेयर के लिए सिंगल-ऐक्टिविटी डिज़ाइन. इसमें यह भी बताया गया है कि मीडिया ऐप्लिकेशन, हार्डवेयर कंट्रोल के हिसाब से कैसे काम करते हैं. साथ ही, यह भी बताया गया है कि वे ऑडियो आउटपुट स्ट्रीम का इस्तेमाल करने वाले अन्य ऐप्लिकेशन के साथ कैसे काम करते हैं.
खिलाड़ी और यूज़र इंटरफ़ेस (यूआई)
ऑडियो या वीडियो चलाने वाले मल्टीमीडिया ऐप्लिकेशन में आम तौर पर दो हिस्से होते हैं:
- ऐसा प्लेयर जो डिजिटल मीडिया को इनपुट के तौर पर लेता है और उसे वीडियो और/या ऑडियो के तौर पर रेंडर करता है
- प्लेयर को चलाने के लिए, ट्रांसपोर्ट कंट्रोल वाला यूज़र इंटरफ़ेस (यूआई). साथ ही, प्लेयर की स्थिति दिखाने का विकल्प
Android में, शुरू से ही अपना प्लेयर बनाया जा सकता है. इसके अलावा, इन विकल्पों में से कोई एक चुना जा सकता है:
- MediaPlayer क्लास, बुनियादी प्लेयर के लिए बुनियादी सुविधाएं उपलब्ध कराती है. यह सबसे आम ऑडियो/वीडियो फ़ॉर्मैट और डेटा सोर्स के साथ काम करता है.
- ExoPlayer एक ओपन सोर्स लाइब्रेरी है. इसे
MediaCodec
औरAudioTrack
जैसे लोअर-लेवल मीडिया फ़्रेमवर्क कॉम्पोनेंट के आधार पर बनाया गया है. ExoPlayer में DASH जैसी बेहतरीन परफ़ॉर्मेंस वाली सुविधाएं काम करती हैं. ये सुविधाएंMediaPlayer
में उपलब्ध नहीं हैं. ExoPlayer के कोड को अपनी पसंद के मुताबिक बनाया जा सकता है. इससे नए कॉम्पोनेंट जोड़ना आसान हो जाता है. ExoPlayer का इस्तेमाल सिर्फ़ Android 4.1 और इसके बाद के वर्शन पर किया जा सकता है.
मीडिया सेशन और मीडिया कंट्रोलर
यूज़र इंटरफ़ेस (यूआई) और प्लेयर के लिए एपीआई अलग-अलग हो सकते हैं. हालांकि, दोनों के बीच इंटरैक्शन का तरीका, सभी मीडिया प्लेयर ऐप्लिकेशन के लिए एक जैसा होता है. Android फ़्रेमवर्क, दो क्लास तय करता है: मीडिया सेशन और मीडिया कंट्रोलर. ये दोनों क्लास,मीडिया प्लेयर ऐप्लिकेशन बनाने के लिए एक तय स्ट्रक्चर लागू करती हैं.
मीडिया सेशन और मीडिया कंट्रोलर, पहले से तय किए गए कॉलबैक का इस्तेमाल करके एक-दूसरे से कम्यूनिकेट करते हैं. ये कॉलबैक, प्लेयर की स्टैंडर्ड कार्रवाइयों (चलाएं, रोकें, बंद करें वगैरह) के साथ-साथ एक्सटेंसिबल कस्टम कॉल से जुड़े होते हैं. इनका इस्तेमाल, अपने ऐप्लिकेशन के लिए खास तौर पर तैयार किए गए व्यवहारों को तय करने के लिए किया जाता है.
मीडिया सेशन
मीडिया सेशन, प्लेयर के साथ सभी तरह के कम्यूनिकेशन के लिए ज़िम्मेदार होता है. यह आपके ऐप्लिकेशन के बाकी हिस्से से प्लेयर के एपीआई को छिपाता है. प्लेयर को सिर्फ़ उस मीडिया सेशन से कॉल किया जाता है जो उसे कंट्रोल करता है.
यह सेशन, खिलाड़ी की स्थिति (चल रहा है/रोका गया है) और क्या चल रहा है, इसकी जानकारी को बनाए रखता है. किसी सेशन को एक या उससे ज़्यादा मीडिया कंट्रोलर से कॉल बैक मिल सकते हैं. इससे आपके प्लेयर को, ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) के साथ-साथ Wear OS और Android Auto पर काम करने वाले साथी डिवाइसों से कंट्रोल किया जा सकता है. कॉलबैक का जवाब देने वाला लॉजिक एक जैसा होना चाहिए. MediaSession
कॉलबैक का जवाब एक जैसा होना चाहिए. इससे कोई फ़र्क़ नहीं पड़ता कि कॉलबैक किस क्लाइंट ऐप्लिकेशन ने शुरू किया है.
मीडिया कंट्रोलर
मीडिया कंट्रोलर, आपके यूज़र इंटरफ़ेस (यूआई) को अलग करता है. आपका यूज़र इंटरफ़ेस (यूआई) कोड सिर्फ़ मीडिया कंट्रोलर से कम्यूनिकेट करता है, प्लेयर से नहीं. मीडिया कंट्रोलर, ट्रांसपोर्ट कंट्रोल की कार्रवाइयों को मीडिया सेशन में कॉलबैक में बदलता है. जब भी सेशन की स्थिति बदलती है, तो इसे मीडिया सेशन से कॉलबैक भी मिलते हैं. इससे, यूज़र इंटरफ़ेस (यूआई) को अपने-आप अपडेट करने का तरीका मिलता है. मीडिया कंट्रोलर, एक बार में सिर्फ़ एक मीडिया सेशन से कनेक्ट हो सकता है.
मीडिया कंट्रोलर और मीडिया सेशन का इस्तेमाल करने पर, रनटाइम के दौरान अलग-अलग इंटरफ़ेस और/या प्लेयर डिप्लॉय किए जा सकते हैं. आपके पास अपने ऐप्लिकेशन के लुक और/या परफ़ॉर्मेंस में अलग-अलग बदलाव करने का विकल्प होता है. यह इस बात पर निर्भर करता है कि ऐप्लिकेशन किस डिवाइस पर चल रहा है.
वीडियो ऐप्लिकेशन बनाम ऑडियो ऐप्लिकेशन
वीडियो देखते समय, आपकी आंखें और कान दोनों काम करते हैं. ऑडियो चलाते समय, आपको सुनाई देता है. हालाँकि, इस दौरान किसी दूसरे ऐप्लिकेशन का भी इस्तेमाल किया जा सकता है. हर इस्तेमाल के लिए अलग-अलग डिज़ाइन उपलब्ध हैं.
वीडियो ऐप्लिकेशन
वीडियो ऐप्लिकेशन को कॉन्टेंट देखने के लिए एक विंडो की ज़रूरत होती है. इस वजह से, वीडियो ऐप्लिकेशन को आम तौर पर एक Android ऐक्टिविटी के तौर पर लागू किया जाता है. जिस स्क्रीन पर वीडियो दिखता है वह गतिविधि का हिस्सा है.
ऑडियो ऐप्लिकेशन
ऑडियो प्लेयर के लिए, यूज़र इंटरफ़ेस (यूआई) हमेशा दिखना ज़रूरी नहीं है. ऑडियो चलना शुरू होने के बाद, प्लेयर को बैकग्राउंड टास्क के तौर पर चलाया जा सकता है. उपयोगकर्ता किसी दूसरे ऐप्लिकेशन पर स्विच कर सकता है और सुनने के साथ-साथ काम भी कर सकता है.
Android में इस डिज़ाइन को लागू करने के लिए, दो कॉम्पोनेंट का इस्तेमाल करके एक ऑडियो ऐप्लिकेशन बनाया जा सकता है: यूज़र इंटरफ़ेस (यूआई) के लिए एक ऐक्टिविटी और प्लेयर के लिए एक सेवा. अगर उपयोगकर्ता किसी दूसरे ऐप्लिकेशन पर स्विच करता है, तो यह सेवा बैकग्राउंड में चल सकती है. ऑडियो ऐप्लिकेशन के दो हिस्सों को अलग-अलग कॉम्पोनेंट में बांटकर, हर कॉम्पोनेंट को ज़्यादा बेहतर तरीके से चलाया जा सकता है. आम तौर पर, यूज़र इंटरफ़ेस (यूआई) की अवधि, प्लेयर की तुलना में कम होती है. प्लेयर, यूज़र इंटरफ़ेस (यूआई) के बिना लंबे समय तक चल सकता है.
सपोर्ट लाइब्रेरी, क्लाइंट/सर्वर के इस तरीके को लागू करने के लिए दो क्लास उपलब्ध कराती है: MediaBrowserService
और MediaBrowser
. सेवा कॉम्पोनेंट को MediaBrowserService
की सबक्लास के तौर पर लागू किया जाता है. इसमें मीडिया सेशन और उसका प्लेयर शामिल होता है. यूज़र इंटरफ़ेस (यूआई) और मीडिया कंट्रोलर वाली गतिविधि में MediaBrowser
शामिल होना चाहिए. यह MediaBrowserService
से कम्यूनिकेट करता है.
MediaBrowserService
का इस्तेमाल करने से, साथ में काम करने वाले डिवाइसों (जैसे कि Android Auto और Wear) के लिए, आपके ऐप्लिकेशन को ढूंढना, उससे कनेक्ट करना, कॉन्टेंट ब्राउज़ करना, और प्लेबैक को कंट्रोल करना आसान हो जाता है. इसके लिए, उन्हें आपके ऐप्लिकेशन की यूज़र इंटरफ़ेस (यूआई) गतिविधि को ऐक्सेस करने की ज़रूरत नहीं होती. असल में, एक ही समय में एक ही MediaBrowserService
से कई ऐप्लिकेशन कनेक्ट किए जा सकते हैं. हर ऐप्लिकेशन का अपना MediaBrowserService
होता है.MediaController
MediaBrowserService
की सुविधा देने वाले ऐप्लिकेशन में, एक साथ कई कनेक्शन मैनेज करने की क्षमता होनी चाहिए.
मीडिया ऐप्लिकेशन और Android का ऑडियो इंफ़्रास्ट्रक्चर
अच्छे से डिज़ाइन किए गए मीडिया ऐप्लिकेशन को, ऑडियो चलाने वाले अन्य ऐप्लिकेशन के साथ "मिलकर काम करना चाहिए". इसे फ़ोन का ऐक्सेस शेयर करने और ऑडियो का इस्तेमाल करने वाले अन्य ऐप्लिकेशन के साथ मिलकर काम करने के लिए तैयार रहना चाहिए. साथ ही, इसे डिवाइस पर मौजूद हार्डवेयर कंट्रोल के ज़रिए भी कंट्रोल किया जा सकता हो.
इस तरह के सभी व्यवहार के बारे में, ऑडियो आउटपुट को कंट्रोल करना लेख में बताया गया है.
media-compat लाइब्रेरी
media-compat लाइब्रेरी में ऐसी क्लास होती हैं जो ऑडियो और वीडियो चलाने वाले ऐप्लिकेशन बनाने में मददगार होती हैं. ये क्लास, Android 2.3 (एपीआई लेवल 9) और उसके बाद के वर्शन वाले डिवाइसों के साथ काम करती हैं. ये सुविधाएं, Android की अन्य सुविधाओं के साथ मिलकर काम करती हैं. इससे आपको Android का जाना-पहचाना और बेहतर अनुभव मिलता है.
मीडिया सेशन और मीडिया कंट्रोलर को लागू करने के लिए, MediaSessionCompat
और MediaControllerCompat
क्लास का इस्तेमाल करने का सुझाव दिया जाता है. ये क्लास, media-compat support library में तय की गई हैं. ये क्लास, Android 5.0 (एपीआई लेवल 21) में पेश की गई MediaSession
और MediaController
क्लास के पुराने वर्शन की जगह लेती हैं. कंपैट क्लास में वही सुविधाएं मिलती हैं. हालांकि, इनकी मदद से ऐप्लिकेशन को आसानी से डेवलप किया जा सकता है, क्योंकि आपको सिर्फ़ एक एपीआई के लिए कोड लिखना होता है. लाइब्रेरी, पुराने सिस्टम के साथ काम करने की सुविधा का ध्यान रखती है. इसके लिए, वह मीडिया सेशन के तरीकों को प्लैटफ़ॉर्म के पुराने वर्शन पर उपलब्ध तरीकों में बदलती है.
अगर आपके पास पहले से ही एक ऐसा ऐप्लिकेशन है जो पुरानी क्लास का इस्तेमाल कर रहा है, तो हमारा सुझाव है कि आप उसे कंपैट क्लास पर अपडेट करें. SDK टूल के साथ काम करने वाले वर्शन का इस्तेमाल करने पर, registerMediaButtonReceiver()
के सभी कॉल और RemoteControlClient
के सभी तरीके हटाए जा सकते हैं.
परफ़ॉर्मेंस को मेज़र करना
Android 8.0 (एपीआई लेवल 26) और इसके बाद के वर्शन में, कुछ मीडिया क्लास के लिए getMetrics()
तरीका उपलब्ध है. यह PersistableBundle
एक ऑब्जेक्ट दिखाता है. इसमें कॉन्फ़िगरेशन
और परफ़ॉर्मेंस की जानकारी होती है. इसे एट्रिब्यूट और वैल्यू के मैप के तौर पर दिखाया जाता है.
getMetrics()
मेथड को इन मीडिया क्लास के लिए तय किया गया है:
MediaPlayer.getMetrics()
MediaRecorder.getMetrics()
MediaCodec.getMetrics()
MediaExtractor.getMetrics()
हर इंस्टेंस के लिए मेट्रिक अलग से इकट्ठा की जाती हैं. ये इंस्टेंस के लाइफ़टाइम तक बनी रहती हैं. अगर कोई मेट्रिक उपलब्ध नहीं है, तो यह तरीका null दिखाता है. असल में दिखाई गई मेट्रिक, क्लास पर निर्भर करती हैं.