2017-01-07 8 views
6

मैंने कुछ ऑडियो स्ट्रीम करने के लिए एक्सप्लेयर का उपयोग शुरू किया। जब तक मैं एक ऐसे यूआरएल में नहीं आया, तब तक सब ठीक था जब "301 स्थायी रूप से हटाया गया" रीडायरेक्ट किया गया था। ExoPlayer2 डिफ़ॉल्ट रूप से इसे संभाल नहीं करता है।ExoPlayer2 - मैं एक HTTP 301 पुनर्निर्देशित कार्य कैसे कर सकता हूं?

मैं पहले से ही इस सूत्र देखा है: https://github.com/google/ExoPlayer/issues/423

वहाँ वे नई 'allowCrossDomainRedirects "फ्लैग जोड़ने के कहने के लिए या तो एक HttpDataSource या UriDataSource। समस्या यह है कि मैं उन वर्गों में से किसी का उपयोग नहीं करते है:

//I am NOT using SimpleExoPlayer because I need a different renderer. 
exoPlayer = ExoPlayerFactory.newInstance(renderers, trackSelector, loadControl); 

final DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(
      context, 
      Util.getUserAgent(context, applicationInfo.getAppName()) 
); 

// Produces Extractor instances for parsing the media data. 
final ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory(); 

// This is the MediaSource representing the media to be played. 
MediaSource mediaSource = new ExtractorMediaSource(
      Uri.parse(media.getUriString()) /* uri */, 
      dataSourceFactory, 
      extractorsFactory, 
      10, 
      null /* eventHandler */, 
      null /* eventListener */); 

exoPlayer.prepare(mediaSource); 

देखें कैसे ExtractorMediaSource एक डेटास्रोत के बजाय एक dataSourceFactory की आवश्यकता है। वास्तव में मैं ExoPlayer2 पर HttpDataSource और UriDataSource कक्षाओं को भी नहीं ढूंढ सकता। ऐसा लगता है कि उन्हें हटा दिया गया है।

इसलिए मुझे पोस्ट पर उल्लिखित ध्वज जोड़ने का कोई तरीका नहीं मिल रहा है। क्या कोई मेरी मदद कर सकता है?

उत्तर

15

समस्या में वर्णित समस्या क्रॉस-प्रोटोकॉल रीडायरेक्ट (http से https या इसके विपरीत) के बारे में है। एक्सप्लेयर इसका समर्थन करता है, लेकिन आपको allowCrossProtocolRedirects से true पर सेट करना होगा। नियमित रीडायरेक्ट (301 रीडायरेक्ट सहित) डिफ़ॉल्ट रूप से समर्थित हैं। आपके द्वारा प्राप्त किया जा रहा रीडायरेक्ट एक क्रॉस-प्रोटोकॉल रीडायरेक्ट की संभावना है।

डेटा स्रोत बनाने के लिए आप कॉल कर रहे:

DefaultDataSourceFactory(Context context, String userAgent) 

यह निर्माता एक DefaultHttpDataSourceFactory जो false करने के लिए allowCrossProtocolRedirects सेट है बनाता है।

DefaultDataSourceFactory(Context context, TransferListener<? super DataSource> listener, 
    DataSource.Factory baseDataSourceFactory) 

और baseDataSourceFactory रूप true के लिए अपने खुद DefaultHttpDataSourceFactory साथ allowCrossProtocolRedirects सेट का उपयोग करें:

इसे बदलने के लिए है, तो आप कॉल करने के लिए की जरूरत है।

उदाहरण के लिए:

String userAgent = Util.getUserAgent(context, applicationInfo.getAppName()); 

// Default parameters, except allowCrossProtocolRedirects is true 
DefaultHttpDataSourceFactory httpDataSourceFactory = new DefaultHttpDataSourceFactory(
    userAgent, 
    null /* listener */, 
    DefaultHttpDataSource.DEFAULT_CONNECT_TIMEOUT_MILLIS, 
    DefaultHttpDataSource.DEFAULT_READ_TIMEOUT_MILLIS, 
    true /* allowCrossProtocolRedirects */ 
); 

DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(
    context, 
    null /* listener */, 
    httpDataSourceFactory 
); 

आप इस अधिक बार आप भी एक सहायक विधि बना सकते हैं करने के लिए की जरूरत है:

public static DefaultDataSourceFactory createDataSourceFactory(Context context, 
     String userAgent, TransferListener<? super DataSource> listener) { 
    // Default parameters, except allowCrossProtocolRedirects is true 
    DefaultHttpDataSourceFactory httpDataSourceFactory = new DefaultHttpDataSourceFactory(
     userAgent, 
     listener, 
     DefaultHttpDataSource.DEFAULT_CONNECT_TIMEOUT_MILLIS, 
     DefaultHttpDataSource.DEFAULT_READ_TIMEOUT_MILLIS, 
     true /* allowCrossProtocolRedirects */ 
    ); 

    DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(
     context, 
     listener, 
     httpDataSourceFactory 
    ); 

    return dataSourceFactory; 
} 

इस पार से प्रोटोकॉल की अनुमति देगा पुनर्निर्देश।

सिडेनोट: "301 स्थायी रूप से स्थानांतरित" का अर्थ है कि ग्राहकों को अपने यूआरएल को नए अपडेट करने की जरूरत है। "302 मिला" नियमित रीडायरेक्ट के लिए प्रयोग किया जाता है। यदि संभव हो, तो उन URL को अपडेट करें जो "301 स्थायी रूप से स्थानांतरित हो जाते हैं"।

+0

नमूना कोड और स्पष्टीकरण के लिए धन्यवाद - बहुत सराहना की! – gmcnaughton

संबंधित मुद्दे