ExoPlayer का मुख्य डेमो ऐप्लिकेशन, इन दो मुख्य कामों के लिए बनाया गया है:
- ExoPlayer के इस्तेमाल का एक ऐसा उदाहरण देना जो समझने में आसान हो और जिसमें सभी सुविधाएं मौजूद हों. डेमो ऐप्लिकेशन का इस्तेमाल, अपने ऐप्लिकेशन को डेवलप करने के लिए शुरुआती पॉइंट के तौर पर किया जा सकता है.
- इससे ExoPlayer को आज़माना आसान हो जाता है. डेमो ऐप्लिकेशन का इस्तेमाल, शामिल किए गए सैंपल के अलावा, अपने कॉन्टेंट को चलाने की सुविधा को टेस्ट करने के लिए किया जा सकता है.
इस पेज पर, डेमो ऐप्लिकेशन को पाने, कंपाइल करने, और चलाने का तरीका बताया गया है. इसमें यह भी बताया गया है कि इसका इस्तेमाल करके, अपना मीडिया कैसे चलाया जाए.
कोड पाना
मुख्य डेमो ऐप्लिकेशन का सोर्स कोड, हमारे GitHub प्रोजेक्ट के demos/main फ़ोल्डर में मौजूद है. अगर आपने अब तक ऐसा नहीं किया है, तो प्रोजेक्ट को किसी लोकल डायरेक्ट्री में क्लोन करें:
git clone https://github.com/androidx/media.git
इसके बाद, Android Studio में प्रोजेक्ट खोलें. आपको Android प्रोजेक्ट व्यू में यह दिखेगा (डेमो ऐप्लिकेशन के काम के फ़ोल्डर को बड़ा किया गया है):

कंपाइल और रन करना
डेमो ऐप्लिकेशन को कंपाइल और चलाने के लिए, Android Studio में demo कॉन्फ़िगरेशन को चुनें और चलाएं. डेमो ऐप्लिकेशन, कनेक्ट किए गए Android डिवाइस पर इंस्टॉल हो जाएगा और चलने लगेगा.
हमारा सुझाव है कि अगर हो सके, तो किसी फ़िज़िकल डिवाइस का इस्तेमाल करें. अगर आपको इसके बजाय किसी एम्युलेटर का इस्तेमाल करना है, तो कृपया सपोर्ट किए गए डिवाइस सेक्शन में जाकर, एम्युलेटर के बारे में पढ़ें. साथ ही, पक्का करें कि आपके वर्चुअल डिवाइस में, कम से कम 23 के एपीआई लेवल वाली सिस्टम इमेज का इस्तेमाल किया जा रहा हो.

डेमो ऐप्लिकेशन में, सैंपल की सूची (SampleChooserActivity) दिखाई जाती है. किसी सैंपल को चुनने पर, चलाने के लिए दूसरी गतिविधि (PlayerActivity) खुल जाएगी. डेमो में, वीडियो चलाने के कंट्रोल और ट्रैक चुनने की सुविधा दिखाई गई है. यह सिस्टम लॉग में डीबग करने से जुड़ी काम की जानकारी देने के लिए, ExoPlayer की EventLogger यूटिलिटी क्लास का भी इस्तेमाल करता है. इस लॉगिंग को (अन्य टैग के लिए गड़बड़ी के लेवल की लॉगिंग के साथ) इस कमांड से देखा जा सकता है:
adb logcat EventLogger:V *:E
बंडल किए गए डिकोडर चालू करना
ExoPlayer में कई एक्सटेंशन होते हैं. इनकी मदद से, बंडल किए गए सॉफ़्टवेयर डिकोडर का इस्तेमाल किया जा सकता है. इनमें AV1, VP9, Opus, FLAC, और FFmpeg (सिर्फ़ ऑडियो) शामिल हैं. इन एक्सटेंशन को शामिल करने और इस्तेमाल करने के लिए, डेमो ऐप्लिकेशन को इस तरह बनाया जा सकता है:
- उन सभी एक्सटेंशन को बनाएं जिन्हें आपको शामिल करना है. ध्यान दें कि यह एक मैन्युअल प्रोसेस है. निर्देशों के लिए, हर एक्सटेंशन में मौजूद
README.mdफ़ाइल देखें. Android Studio के Build Variants व्यू में, डेमो मॉड्यूल के लिए बिल्ड वैरिएंट को
withDecoderExtensionsDebugयाwithDecoderExtensionsReleaseपर सेट करें. ऐसा नीचे दी गई इमेज में दिखाया गया है.
demoकॉन्फ़िगरेशन को सामान्य तरीके से कंपाइल, इंस्टॉल, और रन करें.
डिफ़ॉल्ट रूप से, एक्सटेंशन डिकोडर का इस्तेमाल सिर्फ़ तब किया जाएगा, जब कोई सही प्लैटफ़ॉर्म डिकोडर मौजूद न हो. यह तय किया जा सकता है कि एक्सटेंशन डिकोडर को प्राथमिकता दी जानी चाहिए. इसके बारे में यहां दिए गए सेक्शन में बताया गया है.
अपना कॉन्टेंट चलाना
डेमो ऐप्लिकेशन में अपना कॉन्टेंट चलाने के कई तरीके हैं.
1. assets/media.exolist.json में बदलाव करना
डेमो ऐप्लिकेशन में दिए गए सैंपल, assets/media.exolist.json से लोड किए जाते हैं.
इस JSON फ़ाइल में बदलाव करके, डेमो ऐप्लिकेशन में सैंपल जोड़े और हटाए जा सकते हैं. स्कीमा यहां दिया गया है. इसमें [O] का मतलब है कि एट्रिब्यूट की वैल्यू देना ज़रूरी नहीं है.
[
{
"name": "Name of heading",
"samples": [
{
"name": "Name of sample",
"uri": "The URI of the sample",
"extension": "[O] Sample type hint. Cannot be combined with mime_type. Values: mpd, ism, m3u8",
"clip_start_position_ms": "[O] A start point to which the sample should be clipped, in milliseconds"
"clip_end_position_ms": "[O] An end point from which the sample should be clipped, in milliseconds"
"drm_scheme": "[O] Drm scheme if protected. Values: widevine, playready, clearkey",
"drm_license_uri": "[O] URI of the license server if protected",
"drm_force_default_license_uri": "[O] Whether to force use of "drm_license_uri" for key requests that include their own license URI",
"drm_key_request_properties": "[O] Key request headers if protected",
"drm_session_for_clear_content": "[O] Whether to attach a DRM session to clear video and audio tracks"
"drm_multi_session": "[O] Enables key rotation if protected",
"mime_type": "[O] The MIME type of the sample. Cannot be combined with extension.",
"subtitle_uri": "[O] The URI of a subtitle sidecar file",
"subtitle_mime_type": "[O] The MIME type of subtitle_uri (required if subtitle_uri is set)",
"subtitle_language": "[O] The BCP47 language code of the subtitle file (ignored if subtitle_uri is not set)",
"ad_tag_uri": "[O] The URI of an ad tag to load via the IMA extension"
},
...etc
]
},
...etc
]
सैंपल की प्लेलिस्ट को इस स्कीमा का इस्तेमाल करके तय किया जा सकता है:
[
{
"name": "Name of heading",
"samples": [
{
"name": "Name of playlist sample",
"playlist": [
{
"uri": "The URI of the first sample in the playlist",
"extension": "[O] Sample type hint. Cannot be combined with mime_type. Values: mpd, ism, m3u8"
"clip_start_position_ms": "[O] A start point to which the sample should be clipped, in milliseconds"
"clip_end_position_ms": "[O] An end point from which the sample should be clipped, in milliseconds"
"drm_scheme": "[O] Drm scheme if protected. Values: widevine, playready, clearkey",
"drm_license_uri": "[O] URI of the license server if protected",
"drm_force_default_license_uri": "[O] Whether to force use of "drm_license_uri" for key requests that include their own license URI",
"drm_key_request_properties": "[O] Key request headers if protected",
"drm_session_for_clear_content": "[O] Whether to attach a DRM session to clear video and audio tracks",
"drm_multi_session": "[O] Enables key rotation if protected",
"mime_type": "[O] The MIME type of the sample. Cannot be combined with extension.",
"subtitle_uri": "[O] The URI of a subtitle sidecar file",
"subtitle_mime_type": "[O] The MIME type of subtitle_uri (required if subtitle_uri is set)",
"subtitle_language": "[O] The BCP47 language code of the subtitle file (ignored if subtitle_uri is not set)"
},
{
"uri": "The URI of the second sample in the playlist",
...etc
},
...etc
]
},
...etc
]
},
...etc
]
ज़रूरत पड़ने पर, कुंजी का अनुरोध करने वाले हेडर को एक ऑब्जेक्ट के तौर पर तय किया जाता है. इसमें हर हेडर के लिए एक स्ट्रिंग एट्रिब्यूट होता है:
"drm_key_request_properties": {
"name1": "value1",
"name2": "value2",
...etc
}
सैंपल चुनने की सुविधा देने वाली गतिविधि में, ओवरफ़्लो मेन्यू में यह तय करने के विकल्प होते हैं कि एक्सटेंशन डिकोडर को प्राथमिकता दी जाए या नहीं.
लोकल फ़ाइल यूआरआई और स्कोप्ड स्टोरेज से जुड़ी पाबंदियां
लोकल फ़ाइल यूआरआई तय करते समय, डेमो ऐप्लिकेशन इन फ़ाइलों को पढ़ने के लिए, स्टोरेज ऐक्सेस करने की ज़रूरी अनुमतियों का अनुरोध करता है. हालांकि, Android 13 से, ऐसी फ़ाइलों को लोड नहीं किया जा सकता जिनका फ़ाइल एक्सटेंशन, सामान्य मीडिया फ़ाइल एक्सटेंशन (जैसे, .mp4) नहीं है. अगर आपको ऐसी फ़ाइल लोड करनी है, तो उसे डेमो ऐप्लिकेशन की ऐसी स्टोरेज डायरेक्ट्री में रखें जिस पर ऐक्सेस से जुड़ी कोई पाबंदी न हो. आम तौर पर, यह /sdcard/Android/data/androidx.media3.demo.main/files पर मौजूद होता है.
2. बाहरी exolist.json फ़ाइल लोड करना
डेमो ऐप्लिकेशन, ऊपर दिए गए स्कीमा का इस्तेमाल करके बाहरी JSON फ़ाइलें लोड कर सकता है. इन फ़ाइलों का नाम *.exolist.json के हिसाब से रखा जाता है. उदाहरण के लिए, अगर आपने ऐसी किसी फ़ाइल को https://yourdomain.com/samples.exolist.json पर होस्ट किया है, तो उसे डेमो ऐप्लिकेशन में खोलने के लिए, इस कोड का इस्तेमाल करें:
adb shell am start -a android.intent.action.VIEW \
-d https://yourdomain.com/samples.exolist.json
डेमो ऐप्लिकेशन इंस्टॉल किए गए डिवाइस पर, *.exolist.json लिंक (उदाहरण के लिए, ब्राउज़र या ईमेल क्लाइंट में) पर क्लिक करने से, यह डेमो ऐप्लिकेशन में भी खुल जाएगा. इसलिए, *.exolist.json JSON फ़ाइल को होस्ट करने से, कॉन्टेंट को आसानी से शेयर किया जा सकता है, ताकि दूसरे लोग डेमो ऐप्लिकेशन में इसे आज़मा सकें.
3. इंटेंट फ़ायर करना
नमूनों की सूची को बायपास करने और सीधे तौर पर चलाने के लिए, इंटेंट का इस्तेमाल किया जा सकता है. किसी एक सैंपल को चलाने के लिए, इंटेंट की कार्रवाई को androidx.media3.demo.main.action.VIEW पर सेट करें. साथ ही, उसके डेटा यूआरआई को चलाने के लिए सैंपल के यूआरआई पर सेट करें. इस तरह के इंटेंट को टर्मिनल से ट्रिगर किया जा सकता है. इसके लिए, इन तरीकों का इस्तेमाल करें:
adb shell am start -a androidx.media3.demo.main.action.VIEW \
-d https://yourdomain.com/sample.mp4
एक सैंपल इंटेंट के लिए, ये वैकल्पिक सुविधाएं उपलब्ध हैं:
- कॉन्फ़िगरेशन के अतिरिक्त सैंपल:
mime_type[String] एमआईएमई टाइप के बारे में जानकारी देने वाला सैंपल. उदाहरण के लिए, DASH कॉन्टेंट के लिएapplication/dash+xml.clip_start_position_ms[Long] यह शुरुआती पॉइंट है, जहां से सैंपल को काटा जाना चाहिए. इसकी वैल्यू मिलीसेकंड में होती है.clip_end_position_ms[Long] यह मिलीसेकंड में तय किया गया वह एंड पॉइंट होता है जहां से सैंपल को काटा जाना चाहिए.drm_scheme[स्ट्रिंग] अगर सुरक्षित है, तो डीआरएम स्कीम. मान्य वैल्यूwidevine,playready, औरclearkeyहैं. DRM स्कीम के यूयूआईडी भी स्वीकार किए जाते हैं.drm_license_uri[String] अगर लाइसेंस सर्वर सुरक्षित है, तो उसका यूआरआई.drm_force_default_license_uri[बूलियन] क्या उन मुख्य अनुरोधों के लिएdrm_license_uriका इस्तेमाल करना ज़रूरी है जिनमें उनका अपना लाइसेंस यूआरआई शामिल है.drm_key_request_properties[स्ट्रिंग ऐरे] अगर सुरक्षित किया गया है, तो नाम1, वैल्यू1, नाम2, वैल्यू2 वगैरह के तौर पर पैक किए गए मुख्य अनुरोध हेडर.drm_session_for_clear_content[बूलियन] साफ़ वीडियो और ऑडियो ट्रैक में डीआरएम सेशन अटैच करना है या नहीं.drm_multi_session[बूलियन] अगर सुरक्षित है, तो कुंजी बदलने की सुविधा चालू करता है.subtitle_uri[String] सबटाइटल की साइडकार फ़ाइल का यूआरआई.subtitle_mime_type[स्ट्रिंग] subtitle_uri का MIME टाइप (अगर subtitle_uri सेट है, तो यह ज़रूरी है).subtitle_language[String] सबटाइटल वाली फ़ाइल का BCP47 भाषा कोड (अगर subtitle_uri सेट नहीं है, तो इसे अनदेखा कर दिया जाता है).ad_tag_uri[String] यह [IMA extension][] का इस्तेमाल करके लोड किए जाने वाले विज्ञापन टैग का यूआरआई है.prefer_extension_decoders[बूलियन] यह बताता है कि एक्सटेंशन डिकोडर को प्लैटफ़ॉर्म डिकोडर से ज़्यादा प्राथमिकता दी जाती है या नहीं.
किसी इंटेंट को ट्रिगर करने के लिए adb shell am start का इस्तेमाल करते समय, --es के साथ एक स्ट्रिंग एक्स्ट्रा सेट किया जा सकता है.हालांकि, यह ज़रूरी नहीं है. उदाहरण के लिए, --es extension mpd. --ez के साथ एक बूलियन एक्स्ट्रा सेट किया जा सकता है.हालांकि, यह ज़रूरी नहीं है. उदाहरण के लिए, --ez prefer_extension_decoders TRUE. --el के साथ एक लॉन्ग एक्स्ट्रा सेट किया जा सकता है.हालांकि, यह ज़रूरी नहीं है. उदाहरण के लिए, --el clip_start_position_ms 5000. --esa के साथ एक स्ट्रिंग ऐरे एक्स्ट्रा सेट किया जा सकता है.हालांकि, यह ज़रूरी नहीं है. उदाहरण के लिए, --esa drm_key_request_properties name1,value1.
सैंपल की प्लेलिस्ट चलाने के लिए, इंटेंट की कार्रवाई को androidx.media3.demo.main.action.VIEW_LIST पर सेट करें. सैंपल कॉन्फ़िगरेशन
के अतिरिक्त पैरामीटर, androidx.media3.demo.main.action.VIEW के लिए पहले जैसे ही रहेंगे. हालांकि, इनमें दो अंतर होंगे:
- एक्सट्रा की कुंजियों में अंडरस्कोर होना चाहिए. साथ ही, सफ़िक्स के तौर पर सैंपल का इंडेक्स 0 से शुरू होना चाहिए. उदाहरण के लिए,
extension_0से पहले सैंपल के लिए सैंपल टाइप का पता चलेगा.drm_scheme_1दूसरे सैंपल के लिए डीआरएम स्कीम सेट करेगा. - सैंपल का यूआरआई,
uri_<sample-index>कुंजी के साथ अतिरिक्त के तौर पर पास किया जाता है.
अन्य अतिरिक्त सुविधाएं, जो सैंपल पर निर्भर नहीं करती हैं उनमें कोई बदलाव नहीं होता. उदाहरण के लिए, दो आइटम वाली प्लेलिस्ट चलाने के लिए, टर्मिनल में यह कमांड इस्तेमाल की जा सकती है. इससे दूसरे आइटम का एक्सटेंशन बदल जाएगा:
adb shell am start -a androidx.media3.demo.main.action.VIEW_LIST \
--es uri_0 https://a.com/sample1.mp4 \
--es uri_1 https://b.com/sample2.fake_mpd \
--es extension_1 mpd