ExoPlayer डेमो ऐप्लिकेशन

ExoPlayer के मुख्य डेमो ऐप्लिकेशन का इस्तेमाल दो मुख्य कामों के लिए किया जाता है:

  1. ExoPlayer के इस्तेमाल का आसान और पूरी सुविधाओं वाला उदाहरण देना. डेमो ऐप्लिकेशन का इस्तेमाल, अपने ऐप्लिकेशन को डेवलप करने के लिए शुरुआती बिंदु के तौर पर किया जा सकता है.
  2. ExoPlayer को आसानी से आज़माने के लिए. डेमो ऐप्लिकेशन का इस्तेमाल करके, शामिल किए गए सैंपल के अलावा अपनी साइट के कॉन्टेंट की जाँच की जा सकती है.

इस पेज पर डेमो ऐप्लिकेशन पाने, उसे कंपाइल करने, और उसे चलाने का तरीका बताया गया है. इसमें यह भी बताया गया है कि अपना मीडिया चलाने के लिए, इसका इस्तेमाल कैसे करें.

कोड पाना

मुख्य डेमो ऐप्लिकेशन का सोर्स कोड, हमारे GitHub प्रोजेक्ट के demos/main फ़ोल्डर में देखा जा सकता है. अगर आपने अब तक ऐसा नहीं किया है, तो प्रोजेक्ट को लोकल डायरेक्ट्री में क्लोन करें:

git clone https://github.com/androidx/media.git

इसके बाद, Android Studio में प्रोजेक्ट खोलें. आपको Android प्रोजेक्ट व्यू में ये चीज़ें दिखेंगी (डेमो ऐप्लिकेशन के काम के फ़ोल्डर को बड़ा किया गया है):

Android Studio में प्रोजेक्ट

कंपाइल और चलाना

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

SampleChooserActivity और PlayerActivity

डेमो ऐप्लिकेशन में सैंपल (SampleChooserActivity) की सूची दिखती है. किसी सैंपल को चुनने पर, चलाने के लिए दूसरी गतिविधि (PlayerActivity) खुलेगी. इस डेमो में, वीडियो चलाने के कंट्रोल और ट्रैक चुनने की सुविधा दिखाई गई है. यह सिस्टम लॉग में काम की डीबग जानकारी दिखाने के लिए, ExoPlayer की EventLogger यूटिलिटी क्लास का भी इस्तेमाल करता है. इस लॉगिंग को (अन्य टैग के लिए गड़बड़ी लेवल लॉगिंग के साथ) देखा जा सकता है:

adb logcat EventLogger:V *:E

बंडल किए गए डिकोडर चालू करना

ExoPlayer में कई एक्सटेंशन हैं, जिनकी मदद से बंडल किए गए सॉफ़्टवेयर डिकोडर का इस्तेमाल किया जा सकता है. इनमें AV1, VP9, Opus, FLAC, और FFmpeg (सिर्फ़ ऑडियो) शामिल हैं. डेमो ऐप्लिकेशन को इन एक्सटेंशन को शामिल करने और इस्तेमाल करने के लिए इस तरह बनाया जा सकता है:

  1. हर वह एक्सटेंशन बनाएं जिसे आपको शामिल करना है. ध्यान दें कि यह मैन्युअल प्रोसेस है. निर्देशों के लिए, हर एक्सटेंशन में README.md फ़ाइल देखें.
  2. Android Studio के बिल्ड वैरिएंट व्यू में, डेमो मॉड्यूल के लिए बिल्ड वैरिएंट को withDecoderExtensionsDebug या withDecoderExtensionsRelease पर सेट करें, जैसा कि इस इमेज में दिखाया गया है.

    डेमो के लिए, `withDecoderExtensionsDebug` बिल्ड वैरिएंट चुनना

  3. 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. 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",
        "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. 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",
            "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 [स्ट्रिंग] MIME टाइप हिंट का सैंपल. उदाहरण के लिए, DASH कॉन्टेंट के लिए application/dash+xml.
    • clip_start_position_ms [लंबी] सैंपल को जिस जगह से क्लिप करना है उसका समय, मिलीसेकंड में.
    • clip_end_position_ms [लॉन्ग] ऐसा एंड पॉइंट जहां से सैंपल क्लिप को मिलीसेकंड में क्लिप किया जाना चाहिए.
    • drm_scheme [स्ट्रिंग] अगर कॉन्टेंट को डीआरएम से सुरक्षित किया गया है, तो डीआरएम स्कीम. मान्य वैल्यू widevine, playready, और clearkey हैं. डीआरएम स्कीम के यूयूआईडी भी स्वीकार किए जाते हैं.
    • drm_license_uri [स्ट्रिंग] अगर लाइसेंस सर्वर को सुरक्षित किया गया है, तो उसका यूआरआई.
    • 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 [स्ट्रिंग] सबटाइटल की साइडकार फ़ाइल का यूआरआई.
    • subtitle_mime_type [स्ट्रिंग] subtitle_uri का MIME टाइप (अगर subtitle_uri सेट है, तो ज़रूरी है).
    • subtitle_language [स्ट्रिंग] सबटाइटल फ़ाइल का BCP47 भाषा कोड (subtitle_uri सेट न होने पर अनदेखा किया जाता है).
    • ad_tag_uri [स्ट्रिंग] [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