समस्या का हल


"Cleartext एचटीटीपी ट्रैफ़िक की अनुमति नहीं है" को ठीक करना गड़बड़ियां

यह गड़बड़ी तब होगी, जब आपका ऐप्लिकेशन, क्लियरटेक्स्ट एचटीटीपी ट्रैफ़िक का अनुरोध करता है. इसका मतलब है कि https:// के बजाय http://), जब इसका नेटवर्क सिक्योरिटी कॉन्फ़िगरेशन काम करता है इसकी अनुमति नहीं है. अगर आपका ऐप्लिकेशन, Android 9 (एपीआई लेवल 28) या उसके बाद के वर्शन को टारगेट करता है, तो cleartext एचटीटीपी ट्रैफ़िक, डिफ़ॉल्ट कॉन्फ़िगरेशन से बंद रहता है.

अगर आपके ऐप्लिकेशन को cleartext HTTP ट्रैफ़िक के साथ काम करना है, तो आपको ऐसा नेटवर्क सिक्योरिटी कॉन्फ़िगरेशन जिसकी अनुमति है. Android की नेटवर्क की सुरक्षा से जुड़े दस्तावेज़ देखें. सभी cleartext HTTP ट्रैफ़िक को चालू करने के लिए, आप बस आपके ऐप्लिकेशन के application एलिमेंट के लिए android:usesCleartextTraffic="true" AndroidManifest.xml.

ExoPlayer डेमो ऐप्लिकेशन, डिफ़ॉल्ट नेटवर्क सिक्योरिटी कॉन्फ़िगरेशन का इस्तेमाल करता है, और यह cleartext HTTP ट्रैफ़िक की अनुमति नहीं देता. निर्देशों का पालन करके इसे चालू किया जा सकता है पढ़ें.

"SSLHandTipsअपवाद", "CertPathValidatorexcept" को ठीक करना और "ERR_CERT_AUTHORITY_INVALID" गड़बड़ियां

SSLHandshakeException, CertPathValidatorException, और ERR_CERT_AUTHORITY_INVALID ये सभी चीज़ें, सर्वर के एसएसएल से जुड़ी समस्या के बारे में बताती हैं प्रमाणपत्र. ये गड़बड़ियां ExoPlayer से जुड़ी नहीं हैं. यहां जाएं: Android का एसएसएल दस्तावेज़ देखें.

कुछ मीडिया फ़ाइलें खोजी क्यों नहीं जाती हैं?

डिफ़ॉल्ट रूप से, ExoPlayer, मीडिया में वीडियो में आगे/पीछे जाने की सुविधा नहीं देता, जहां सिर्फ़ एक सीक करने की सटीक कार्रवाई करने पर, प्लेयर उसे स्कैन और इंडेक्स करता है पूरी फ़ाइल में शामिल किया जाना चाहिए. ExoPlayer, ऐसी फ़ाइलों को 'देखी नहीं जा सकती' मानता है. सबसे आधुनिक मीडिया कंटेनर फ़ॉर्मैट में, वीडियो पर आगे/पीछे जाने के लिए मेटाडेटा शामिल होता है (जैसे कि सैंपल इंडेक्स), अच्छी तरह से तय सीक एल्गोरिदम (उदाहरण के लिए, Ogg के लिए इंटरपोलेटेड बाइसेक्शन सर्च) या इससे पता चलता है कि उनके कॉन्टेंट का बिटरेट एक जैसा है. सीक से जुड़ी बेहतर कार्रवाइयां संभव है और ऐसे मामलों में ExoPlayer से समर्थित है.

अगर आपको वीडियो में आगे/पीछे जाने की सुविधा चाहिए, लेकिन आपके पास ऐसा मीडिया है जिसे खोजा नहीं जा सकता, तो हमारा सुझाव है कि कॉन्टेंट के लिए, ज़्यादा सही कंटेनर फ़ॉर्मैट का इस्तेमाल करें. MP3, ADTS, और AMR फ़ाइलों के लिए, तो आप यह मानकर भी आगे बढ़ सकते हैं कि फ़ाइलों में बिटरेट, जैसा कि बताया गया है यहां पढ़ें.

कुछ MP3 फ़ाइलों में गलत जानकारी क्यों मांगी जा रही है?

वैरिएबल बिटरेट (VBR) एमपी3 फ़ाइलें बुनियादी तौर पर उन मामलों में सही नहीं होती हैं जहां वीडियो के किसी हिस्से पर जाना ज़रूरी है. इसकी दो वजहें हैं:

  1. वीडियो के खास हिस्से पर आगे/पीछे जाने के लिए, कंटेनर फ़ॉर्मैट हेडर में टाइम-टू-बाइट मैपिंग. इस मैपिंग से प्लेयर, मैप पर अनुरोध किया गया है, तो संबंधित बाइट ऑफ़सेट तक समय की मांग करें और अनुरोध करना शुरू करें, उस ऑफ़सेट से मीडिया को पार्स करना और चलाना. इसके लिए उपलब्ध हेडर MP3 में इस मैपिंग (जैसे कि XING हेडर) को शामिल करने पर, दुर्भाग्य से अक्सर सटीक.
  2. ऐसे कंटेनर फ़ॉर्मैट जो सटीक टाइम-टू-बाइट मैपिंग नहीं देते (या किसी भी टाइम-टू-बाइट मैपिंग को कॉपी करने के बाद भी, यह संभव है कि देखें कि कंटेनर में स्ट्रीम में पूरे सैंपल टाइमस्टैंप शामिल हैं या नहीं. तय सीमा में इस मामले में, खिलाड़ी आगे बढ़ने के समय को संबंधित कीवर्ड के सबसे सही अनुमान के साथ मैप कर सकता है बाइट ऑफ़सेट, उस ऑफ़सेट से मीडिया के लिए अनुरोध करना शुरू करें, पहले पार्स करें सटीक सैंपल टाइमस्टैंप, और असरदार तरीके से गाइडेड बाइनरी खोज करें तब तक मीडिया में रखा जाता है, जब तक कि उसे सही नमूना नहीं मिल जाता. माफ़ करें, MP3 में यह काम नहीं करता स्ट्रीम में कुल सैंपल टाइमस्टैंप शामिल करें. इसलिए, यह तरीका किया जा सकता है.

इन वजहों से, VBR MP3 फ़ाइल में सटीक खोज करने का सिर्फ़ यही एक तरीका है पूरी फ़ाइल को स्कैन करने और मैन्युअल तरीके से टाइम-टू-बाइट मैपिंग बनाने के लिए, प्लेयर. इस रणनीति को FLAG_ENABLE_INDEX_SEEKING का इस्तेमाल करके चालू किया जा सकता है. इसे इस्तेमाल करके, DefaultExtractorsFactory पर सेट किया जा सकता है setMp3ExtractorFlags. ध्यान दें कि यह बड़ी MP3 फ़ाइलों को अच्छी तरह से स्केल नहीं करता, खास तौर पर तब, जब उपयोगकर्ता जल्द ही स्ट्रीम के आखिरी हिस्से के पास जाने की कोशिश करे हालांकि, इसे डाउनलोड करने के लिए, प्लेयर को डाउनलोड होने का इंतज़ार करना पड़ता है और वीडियो में आगे/पीछे जाने से पहले पूरी स्ट्रीम को इंडेक्स किया. ExoPlayer में, हम ने इस मामले में स्पीड के बजाय स्पीड को ऑप्टिमाइज़ करने का फ़ैसला लिया और इसलिए, FLAG_ENABLE_INDEX_SEEKING डिफ़ॉल्ट रूप से बंद रहता है.

यदि आप अपने द्वारा चलाए जा रहे मीडिया को नियंत्रित करते है, तो हमारी सलाह है कि आप अधिक सही कंटेनर फ़ॉर्मैट का इस्तेमाल करें, जैसे कि MP4. इस्तेमाल का ऐसा कोई भी उदाहरण नहीं है जिसके बारे में हमें पता है जहां MP3, मीडिया फ़ॉर्मैट का सबसे अच्छा विकल्प है.

मेरे वीडियो में वीडियो पर आगे/पीछे जाने की सुविधा धीमी क्यों है?

जब प्लेयर किसी वीडियो को चलाने की नई जगह चाहता है, तो उसे दो काम करने होते हैं चीज़ें:

  1. वीडियो चलाने की नई जगह से जुड़ा डेटा, बफ़र में लोड होता है (अगर यह डेटा पहले से बफ़र है, तो शायद यह ज़रूरी न हो).
  2. वीडियो डिकोडर को फ़्लश करें और पहले I-frame (मुख्य-फ़्रेम) से डिकोड करना शुरू करें वीडियो चलाने की नई जगह. इसकी वजह, ज़्यादातर वीडियो में इस्तेमाल होने वाली इंट्रा-फ़्रेम कोडिंग की है कंप्रेशन फ़ॉर्मैट में दी जाती है. यह पक्का करने के लिए कि वीडियो में बदलाव करने का तरीका सटीक हो (यानी, प्लेबैक ठीक सीक पोज़िशन से शुरू होता है), दोनों फ़्रेम के बीच के सभी फ़्रेम पिछले I-फ़्रेम और सीक पोज़िशन को डिकोड किया जाना चाहिए. साथ ही, उन्हें तुरंत डिकोड किया जाना चाहिए खारिज कर दिया जाता है (स्क्रीन पर दिखाए बिना).

(1) से शुरू होने वाली देरी को या तो बढ़ाकर कम किया जा सकता है प्लेयर की ओर से मेमोरी में बफ़र किया गया डेटा या डेटा को डिस्क में पहले से कैश मेमोरी में सेव करना.

(2) से शुरू होने वाली देरी को या तो सटीक होने को कम करके कम किया जा सकता है ExoPlayer.setSeekParameters का इस्तेमाल करके या वीडियो को फिर से कोड में बदलने का तरीका का इस्तेमाल करें.

कुछ MPEG-TS फ़ाइलें क्यों नहीं चल रही होती हैं?

कुछ MPEG-TS फ़ाइलों में ऐक्सेस यूनिट डीलिमिटर (AUDs) नहीं होते हैं. डिफ़ॉल्ट रूप से, फ़्रेम की सीमाओं का आसानी से पता लगाने के लिए, ExoPlayer, ऑस्ट्रेलियन डॉलर का इस्तेमाल करता है. इसी तरह, कुछ MPEG-TS फ़ाइलों में आईडीआर कीफ़्रेम नहीं होते हैं. डिफ़ॉल्ट रूप से, सिर्फ़ यही एक टाइप है के मुख्य-फ़्रेम इस्तेमाल करने में मदद मिलती है.

जब उसे चलाने के लिए कहा जाए, तो ExoPlayer, बफ़रिंग स्थिति में अटक जाता है MPEG-TS फ़ाइल जिसमें AUDs या IDR कीफ़्रेम नहीं हैं. अगर आपको ऐसी फ़ाइलें चलानी हों, ऐसा करने के लिए, FLAG_DETECT_ACCESS_UNITS का इस्तेमाल करें और FLAG_ALLOW_NON_IDR_KEYFRAMES. ये फ़्लैग किसी वीडियो, DefaultExtractorsFactory को setTsExtractorFlags का इस्तेमाल करके या DefaultHlsExtractorFactory का इस्तेमाल करके कंस्ट्रक्टर. FLAG_DETECT_ACCESS_UNITS का इस्तेमाल करने से, यह ऑस्ट्रेलियन डॉलर पर आधारित फ़्रेम की सीमा का पता लगाने की सुविधा के मुकाबले काफ़ी महंगा है. इसका इस्तेमाल FLAG_ALLOW_NON_IDR_KEYFRAMES के कारण अस्थायी रूप से विज़ुअल खराबी हो सकती है MPEG-TS फ़ाइलों को चलाने के तुरंत बाद, वीडियो चलाने की शुरुआत करना.

कुछ MPEG-TS फ़ाइलों में सबटाइटल क्यों नहीं मिले?

कुछ MPEG-TS फ़ाइलों में CEA-608 ट्रैक शामिल होते हैं, लेकिन कंटेनर मेटाडेटा मौजूद है, इसलिए ExoPlayer इनकी पहचान नहीं कर सकता. आप इसे मैन्युअल रूप से कर सकते हैं संभावित ट्रैक की सूची देकर, किसी भी सबटाइटल ट्रैक के बारे में बताएं DefaultExtractorsFactory के लिए सबटाइटल फ़ॉर्मैट. इनमें सुलभता भी शामिल है ऐसे चैनल जिनका इस्तेमाल करके MPEG-TS स्ट्रीम में उनकी पहचान की जा सके:

Kotlin

val extractorsFactory =
  DefaultExtractorsFactory()
    .setTsSubtitleFormats(
      listOf(
        Format.Builder()
          .setSampleMimeType(MimeTypes.APPLICATION_CEA608)
          .setAccessibilityChannel(accessibilityChannel)
          // Set other subtitle format info, such as language.
          .build()
      )
    )
val player: Player =
  ExoPlayer.Builder(context, DefaultMediaSourceFactory(context, extractorsFactory)).build()

Java

DefaultExtractorsFactory extractorsFactory =
    new DefaultExtractorsFactory()
        .setTsSubtitleFormats(
            ImmutableList.of(
                new Format.Builder()
                    .setSampleMimeType(MimeTypes.APPLICATION_CEA608)
                    .setAccessibilityChannel(accessibilityChannel)
                    // Set other subtitle format info, such as language.
                    .build()));
Player player =
    new ExoPlayer.Builder(context, new DefaultMediaSourceFactory(context, extractorsFactory))
        .build();

कुछ MP4/FMP4 फ़ाइलें ठीक से क्यों नहीं चलती हैं?

कुछ MP4/FMP4 फ़ाइलों में, बदलाव करने की सूचियों की मदद से मीडिया टाइमलाइन को फिर से लिखा जाता है सैंपल की सूचियों को छोड़ना, उन्हें एक जगह से दूसरी जगह ले जाना या दोहराना. ExoPlayer, कुछ हद तक काम करता है बदलाव की सूचियां लागू करने के लिए. उदाहरण के लिए, यह सैंपल के ग्रुप को दोहराने या उनमें देरी कर सकता है सिंक करने के सैंपल पर शुरू होता है, लेकिन यह ऑडियो सैंपल में काट-छांट नहीं करता या उन बदलावों के लिए प्रीरोल मीडिया जो सिंक करने के नमूने पर शुरू नहीं होते.

अगर आपको दिख रहा है कि मीडिया का कुछ हिस्सा अचानक मौजूद नहीं है या बार-बार दिख रहा है, तो Mp4Extractor.FLAG_WORKAROUND_IGNORE_EDIT_LISTS सेट करके देखें या FragmentedMp4Extractor.FLAG_WORKAROUND_IGNORE_EDIT_LISTS, जिससे एक्सट्रैक्ट करने वाले टूल का इस्तेमाल करके, बदलाव की सूचियों को पूरी तरह अनदेखा कर सकते हैं. इन्हें किसी DefaultExtractorsFactory का इस्तेमाल करके setMp4ExtractorFlags या setFragmentedMp4ExtractorFlags.

कुछ स्ट्रीम, एचटीटीपी रिस्पॉन्स कोड 301 या 302 के साथ क्यों नहीं हो पाती हैं?

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

wget "https://yourserver.com/test.mp3" 2>&1  | grep Location

आउटपुट कुछ ऐसा दिखना चाहिए:

Location: https://second.com/test.mp3 [following]
Location: http://third.com/test.mp3 [following]

इस उदाहरण में, दो रीडायरेक्ट हैं. पहला रीडायरेक्ट यहां से है https://second.com/test.mp3 के लिए https://yourserver.com/test.mp3. दोनों एचटीटीपीएस. इसलिए, यह क्रॉस-प्रोटोकॉल रीडायरेक्ट नहीं है. दूसरा रीडायरेक्ट: http://third.com/test.mp3 के लिए https://second.com/test.mp3. यह रीडायरेक्ट से एचटीटीपीएस से एचटीटीपी पर स्विच करने की सुविधा मिलती है. क्रॉस-प्रोटोकॉल रीडायरेक्ट भी एक ऐसा तरीका है. ExoPlayer यह नहीं कर पाएगा इसके डिफ़ॉल्ट कॉन्फ़िगरेशन में इस रीडायरेक्ट का पालन करें, जिसका मतलब है कि प्लेबैक विफल हो जाएगा.

ज़रूरत पड़ने पर, क्रॉस-प्रोटोकॉल रीडायरेक्ट को फ़ॉलो करने के लिए, ExoPlayer को कॉन्फ़िगर किया जा सकता है जब आप DefaultHttpDataSource.Factory को इंस्टैंशिएट करते समय का इस्तेमाल करें. नेटवर्क स्टैक को चुनने और कॉन्फ़िगर करने के बारे में जानें यहां पढ़ें.

कुछ स्ट्रीम,टैब में पहचानी जाने वाली सामग्री के तौर पर कॉन्फ़िगर नहीं की जाने वाली जानकारी के साथ काम क्यों नहीं करते हैं?

यह सवाल, इस तरह के वीडियो चलाने के न हो पाने के बारे में है:

UnrecognizedInputFormatException: None of the available extractors
(MatroskaExtractor, FragmentedMp4Extractor, ...) could read the stream.

इस प्रोसेस के काम न करने की दो वजहें हो सकती हैं. सबसे सामान्य वजह यह है कि तो DASH (mpd), HLS (m3u8) या स्मूदस्ट्रीमिंग (ism, isml) चलाने की कोशिश कर रहे हैं स्ट्रीम करता है, लेकिन प्लेयर इसे एक प्रोग्रेसिव स्ट्रीम के तौर पर चलाने की कोशिश करता है. ऐसे गेम खेलने के लिए स्ट्रीम करते हैं, तो आपको संबंधित ExoPlayer मॉड्यूल पर निर्भर होना चाहिए. ऐसे मामलों में जहां स्ट्रीम यूआरआई मानक फ़ाइल एक्सटेंशन से खत्म नहीं होता है, तो आप MimeTypes.APPLICATION_MPD, MimeTypes.APPLICATION_M3U8 या MediaItem.Builder में से MimeTypes.APPLICATION_SS से setMimeType तक स्ट्रीम का टाइप तय करें.

दूसरी, कम आम वजह यह है कि ExoPlayer, कंटेनर के साथ काम नहीं करता है मीडिया का वह फ़ॉर्मैट जिसे आपको चलाना है. इस मामले में, विफलता है उम्मीद के मुताबिक काम कर रहे हैं. हालांकि, आप इस सुविधा के लिए अनुरोध सबमिट कर सकते हैं समस्या को ट्रैक करने वाला टूल, जिसमें कंटेनर के फ़ॉर्मैट और टेस्ट स्ट्रीम की जानकारी शामिल है. नई सुविधा का अनुरोध सबमिट करने से पहले, कृपया किसी मौजूदा सुविधा का अनुरोध खोजें.

कुछ डिवाइसों पर, set प्रोग्रेस पैरामीटर को ठीक से काम क्यों नहीं करता है?

Android M और इससे पहले के वर्शन वाले ऐप्लिकेशन को डीबग करने के लिए, इसका इस्तेमाल किया जा सकता है परफ़ॉर्मेंस, ऑडियो वाले आर्टफ़ैक्ट, और सीपीयू के ज़्यादा इस्तेमाल का अनुभव देते समय setPlaybackParameters एपीआई का इस्तेमाल करके. ऐसा इसलिए होता है, क्योंकि ऑप्टिमाइज़ेशन जो इस एपीआई के लिए ज़रूरी है, इन पर चल रहे डीबग बिल्ड के लिए बंद किया गया हो Android के वर्शन हैं.

ध्यान रखें कि इस समस्या का असर सिर्फ़ डीबग बिल्ड पर पड़ता है. ऐसा नहीं होता नहीं इससे रिलीज़ के बिल्ड पर असर पड़ता है, जिसके लिए ऑप्टिमाइज़ेशन हमेशा चालू रहता है. इसलिए आपकी ओर से असली उपयोगकर्ताओं को दी जाने वाली रिलीज़ पर इस समस्या का असर नहीं होना चाहिए.

"प्लेयर को गलत थ्रेड पर ऐक्सेस किया गया है" क्या करना है गड़बड़ियों का मतलब है?

शुरू करने के पेज पर, थ्रेडिंग के बारे में एक नोट देखें.

"अचानक होने वाली स्टेटस लाइन: आईसीवाई 200 ओके" को कैसे ठीक किया जा सकता है?

यह समस्या तब आ सकती है, जब सर्वर के जवाब में आईसीवाई स्टेटस लाइन शामिल हो, करने के लिए डिज़ाइन किया गया है. ICY स्टेटस लाइनें अब काम नहीं करतीं और का उपयोग नहीं किया जाना चाहिए, इसलिए यदि आप सर्वर को नियंत्रित करते हैं तो आपको इसे उपलब्ध कराने के लिए अपडेट करना चाहिए एचटीटीपी का पालन करता है. यदि आप ऐसा नहीं कर पाते हैं, तो ExoPlayer OkHttp लाइब्रेरी से समस्या हल हो जाएगी, क्योंकि यह ICY को हैंडल कर सकता है स्टेटस लाइन सही हैं.

मैं यह कैसे पता करूं कि चल रही स्ट्रीम एक लाइव स्ट्रीम है या नहीं?

प्लेयर के isCurrentWindowLive तरीके के बारे में क्वेरी की जा सकती है. इसके अलावा, आपको isCurrentWindowDynamic की मदद से यह पता कर सकता है कि विंडो डाइनैमिक है या नहीं (इसका मतलब है कि यह समय के साथ अपडेट होता रहता है).

मैं अपने ऐप्लिकेशन के बैकग्राउंड में चलने के दौरान ऑडियो कैसे चलाऊं?

ऐप्लिकेशन के इस्तेमाल के दौरान ऑडियो चलता रहे, यह पक्का करने के लिए यह तरीका अपनाएं बैकग्राउंड:

  1. आपके पास चालू फ़ोरग्राउंड सेवा होनी चाहिए. इससे सिस्टम संसाधन खाली करने तक कुछ भी शामिल नहीं होते.
  2. आपको WifiLock और WakeLock को होल्ड करना होगा. इनसे यह पक्का होता है कि सिस्टम, वाई-फ़ाई रेडियो और CPU को चालू रखता है. यह काम आसानी से किया जा सकता है, ExoPlayer के लिए setWakeMode पर कॉल करें. यह सुविधा अपने-आप सही समय पर ज़रूरी लॉक हासिल करना और उन्हें हटाना.

अगर setWakeMode का इस्तेमाल नहीं किया जा रहा है, तो ज़रूरी है कि आप लॉक छोड़ दें और इसे बंद कर दें ठीक करने में मदद मिलती है.

ऐसा क्यों है कि ExoPlayer, मेरे कॉन्टेंट पर काम करता है लेकिन ExoPlayer Cast लाइब्रेरी पर नहीं?

ऐसा हो सकता है कि आप जो कॉन्टेंट चलाना चाहते हैं वह सीओआरएस चालू है. कास्ट फ़्रेमवर्क के लिए ज़रूरी है कि कॉन्टेंट में सीओआरएस चालू हो उसे चलाने के लिए.

कॉन्टेंट क्यों नहीं चल रहा है, लेकिन कोई गड़बड़ी नहीं दिखती है?

ऐसा हो सकता है कि आप जिस डिवाइस पर कॉन्टेंट चला रहे हैं वह एक खास मीडिया सैंपल फ़ॉर्मैट के साथ काम करता हो. इसकी पुष्टि आसानी से की जा सकती है: आपके प्लेयर को सुनने वाले व्यक्ति के तौर पर EventLogger और कोई लाइन खोजना Logcat में इससे मिलता-जुलता:

[ ] Track:x, id=x, mimeType=mime/type, ... , supported=NO_UNSUPPORTED_TYPE

NO_UNSUPPORTED_TYPE का मतलब है कि डिवाइस, मीडिया को डिकोड नहीं कर पा रहा है सैंपल फ़ॉर्मैट, जिसे mimeType ने तय किया है. Android मीडिया फ़ॉर्मैट दस्तावेज़ में पढ़ें. मुझे क्या फ़ायदा होगा क्या आपको डिकोड करने की लाइब्रेरी के बारे में जानना है? से भी मदद मिल सकती है.

मैं डिकोड करने वाली लाइब्रेरी को लोड करके, प्लेबैक में कैसे इस्तेमाल करूं?

  • ज़्यादातर डिकोडर लाइब्रेरी में, डिपेंडेंसी की जांच करने और उन्हें बनाने के लिए मैन्युअल तरीके होते हैं. इसलिए, पक्का करें कि आपने उससे जुड़ी लाइब्रेरी के लिए README में दिए गए निर्देशों का पालन किया हो. उदाहरण के लिए, ExoPlayer FFmpeg लाइब्रेरी के लिए libraries/decoder_ffmpeg/README.md में निर्देश दें, जिसमें पास करने की जानकारी शामिल है किसी भी फ़ॉर्मैट के लिए डीकोडर चालू करने के लिए, कॉन्फ़िगरेशन फ़्लैग का इस्तेमाल किया जा सकता है.
  • जिन लाइब्रेरी में नेटिव कोड है उनके लिए, पक्का करें कि सही कोड का इस्तेमाल किया जा रहा हो का एक विकल्प है, जैसा कि README में बताया गया है. साथ ही, इस टूल को कॉन्फ़िगरेशन और बिल्डिंग के दौरान दिखने वाली गड़बड़ियां. आपको .so दिखना चाहिए फ़ाइलें हर एक के लिए लाइब्रेरी के पाथ की libs सबडायरेक्ट्री में दिखती हैं README में दिए गए चरणों को पूरा करने के बाद, एक ही सुविधा इस्तेमाल की जा सकती है.
  • डेमो ऐप्लिकेशन में लाइब्रेरी का इस्तेमाल करके वीडियो चलाने के लिए, देखें बंडल किए गए डिकोडर चालू करना. लाइब्रेरी के लिए README देखें अपने ऐप्लिकेशन से लाइब्रेरी इस्तेमाल करने के बारे में निर्देश देखें.
  • अगर DefaultRenderersFactory का इस्तेमाल किया जा रहा है, तो आपको जानकारी का लेवल दिखेगा लॉग लाइन, जैसे कि "Loaded FfmpegAudioRenderer" डिकोडर लोड होने पर, Logcat में. अगर यह मौजूद नहीं है, तो पक्का करें कि ऐप्लिकेशन की वैल्यू डिकोड करने की लाइब्रेरी.
  • अगर आपको Logcat में, LibraryLoader से चेतावनी वाले लॉग दिखते हैं, तो यह बताता है कि लाइब्रेरी का नेटिव कॉम्पोनेंट लोड नहीं हो पाया. अगर यह तो ऐसा हो सकता है कि आपने लाइब्रेरी के README में बताए गए चरणों का सही तरीके से पालन किया हो और निर्देशों का पालन करते समय कोई गड़बड़ी नहीं मिली.

अगर आपको लाइब्रेरी डिकोड करने में अब भी समस्या आ रही है, तो कृपया हाल ही की किसी भी समस्या के लिए, Media3 समस्या को ट्रैक करने वाला टूल. अगर आपको कोई नई समस्या है और यह लाइब्रेरी के मूल हिस्से को बनाने से जुड़ी है, तो कृपया README निर्देशों को पूरा करने के लिए कमांड लाइन का पूरा आउटपुट शामिल करना. इससे हमें अपनी मदद करने में मदद मिलेगी समस्या का पता लगाएं.

क्या ExoPlayer पर YouTube वीडियो सीधे चलाए जा सकते हैं?

नहीं, ExoPlayer, YouTube से वीडियो नहीं चला सकता, जैसे कि फ़ॉर्म के यूआरएल https://www.youtube.com/watch?v=.... इसके बजाय, आपको YouTube iFrame Player API, यह Android पर YouTube वीडियो चलाने का आधिकारिक तरीका है.

वीडियो चलाने में समस्या आ रही है

डिवाइस कॉन्टेंट को तेज़ी से डिकोड नहीं कर पाता है, उदाहरण के लिए, कॉन्टेंट का बिटरेट या रिज़ॉल्यूशन, डिवाइस की क्षमता से ज़्यादा हो. आपको इनकी ज़रूरत पड़ सकती है ताकि ऐसे डिवाइसों पर अच्छी परफ़ॉर्मेंस पाने के लिए, कम क्वालिटी वाले कॉन्टेंट का इस्तेमाल किया जा सके.

अगर आपको Android के नए वर्शन वाले डिवाइस पर वीडियो देखने में परेशानी आ रही है, तो Android 6.0 (एपीआई लेवल 23) से लेकर Android 11 (एपीआई लेवल 30) तक के वर्शन के साथ-साथ, खास तौर पर, डीआरएम से सुरक्षित या ज़्यादा फ़्रेम-रेट वाला कॉन्टेंट चलाते समय, एसिंक्रोनस बफ़र क्यूइंग को चालू करना.

एपीआई लिंट से जुड़ी ठीक से काम न करने वाली गड़बड़ियां

Media3, एपीआई सरफ़ेस के किसी सबसेट के लिए बाइनरी कंपैटबिलिटी की गारंटी देता है. कॉन्टेंट बनाने ऐसे हिस्से जो बाइनरी कंपैटबिलिटी की गारंटी नहीं देते हैं वे @UnstableApi. इस अंतर को साफ़ करने के लिए, स्टेबल वर्शन का इस्तेमाल जब तक एपीआई सिंबल @OptIn के साथ एनोटेट नहीं किया जाता, तब तक वे लिंट गड़बड़ी जनरेट करते हैं.

@UnstableApi एनोटेशन से, किसी एपीआई की क्वालिटी या परफ़ॉर्मेंस के बारे में कोई जानकारी नहीं मिलती है. इसका मतलब सिर्फ़ यह है कि यह "एपीआई-फ़्रीज़ किया गया" नहीं है.

एपीआई लिंट में होने वाली गड़बड़ी को ठीक करने के लिए, आपके पास दो विकल्प हैं:

  • ऐसे स्थायी एपीआई का इस्तेमाल करें जो एक जैसा नतीजा दे.
  • स्थिर एपीआई का इस्तेमाल जारी रखें और @OptIn के साथ, इसके इस्तेमाल के बारे में व्याख्या करें, जैसे कि बाद में दिखाया जाएगा.
@OptIn एनोटेशन जोड़ें

Android Studio, एनोटेशन जोड़ने में आपकी मदद कर सकता है:

स्क्रीनशॉट: ऑप्टइन एनोटेशन जोड़ने का तरीका
दूसरी इमेज: Android Studio में @androidx.annotations.OptIn एनोटेशन जोड़ना.

Kotlin में खास इस्तेमाल की साइटों के बारे में मैन्युअल तरीके से भी जानकारी दी जा सकती है:

import androidx.annotation.OptIn
import androidx.media3.common.util.UnstableApi

@OptIn(UnstableApi::class)
fun functionUsingUnstableApi() { ... }

और Java में भी:

import androidx.annotation.OptIn;
import androidx.media3.common.util.UnstableApi;

@OptIn(markerClass = UnstableApi.class)
private void methodUsingUnstableApis() { ... }

package-info.java फ़ाइल जोड़कर, हर पैकेज को ऑप्ट-इन किया जा सकता है:

@OptIn(markerClass = UnstableApi.class)
package name.of.your.package;

import androidx.annotation.OptIn;
import androidx.media3.common.util.UnstableApi;

लिंट की खास गड़बड़ी को छिपाकर, पूरे प्रोजेक्ट को ऑप्ट-इन किया जा सकता है lint.xml फ़ाइल:

 <?xml version="1.0" encoding="utf-8"?>
 <lint>
   <issue id="UnsafeOptInUsageError">
     <option name="opt-in" value="androidx.media3.common.util.UnstableApi" />
   </issue>
 </lint>

इसमें एक kotlin.OptIn एनोटेशन भी है, जिसका इस्तेमाल नहीं किया जाना चाहिए. यह समय है androidx.annotation.OptIn एनोटेशन का इस्तेमाल करना ज़रूरी है.