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_license_uri[String] अगर लाइसेंस सर्वर सुरक्षित है, तो उसका यूआरआई.drm_force_default_license_uri[बूलियन] क्या उन कुंजियों के अनुरोधों के लिएdrm_license_uriका इस्तेमाल करना ज़रूरी है जिनमें उनका अपना लाइसेंस यूआरआई शामिल है.drm_key_request_properties[String array] Key request headers packed as name1, value1, name2, value2 etc. if protected.drm_session_for_clear_content[बूलियन] साफ़ वीडियो और ऑडियो ट्रैक में डीआरएम सेशन अटैच करना है या नहीं.drm_multi_session[बूलियन] अगर सुरक्षित है, तो डेटा सुरक्षित करने वाली कुंजी का नया वर्शन बनाने की सुविधा चालू करता है.subtitle_uri[String] सबटाइटल की साइडकार फ़ाइल का यूआरआई.subtitle_mime_type[String] subtitle_uri का एमआईएमई टाइप (अगर subtitle_uri सेट है, तो यह ज़रूरी है).subtitle_language[String] सबटाइटल वाली फ़ाइल का BCP47 भाषा कोड (अगर subtitle_uri सेट नहीं है, तो इसे अनदेखा कर दिया जाता है).ad_tag_uri[String] IMA एक्सटेंशन का इस्तेमाल करके लोड किए जाने वाले विज्ञापन टैग का यूआरआई.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