2017-01-07 76 views
6

Bazı ses akışı için ExoPlayer kullanmaya başladım. "301 Kalıcı Olarak Taşındı" yönlendirme içeren bir URL'ye rastladım. ExoPlayer2 varsayılan olarak bunu işlemez.ExoPlayer2 - HTTP 301 yönlendirme çalışmasını nasıl yapabilirim?

Zaten bu konu gördüğüm

: Orada yeni "allowCrossDomainRedirects" bayrağını eklemek demek https://github.com/google/ExoPlayer/issues/423

için ya bir HttpDataSource veya UriDataSource. Sorun bu sınıfların birini kullanın kalmamasıdır:

//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 yerine DataSource bir dataSourceFactory gerektirir görün. Aslında, ExoPlayer2 üzerinde HttpDataSource ve UriDataSource sınıflarını bile bulamıyorum. Kaldırılmış gibi görünüyor.

Bu nedenle, postada belirtilen bayrağı eklemenin bir yolunu bulamıyorum. Birisi bana yardım edebilir mi?

cevap

15

Sorunda açıklanan sorun, protokoller arası yönlendirmelerle ilgilidir (http’dan https’e veya tam tersi). Exoplayer bunu destekler, ancak allowCrossProtocolRedirects'u true'a ayarlamanız gerekir. Düzenli yönlendirmeler (301 yönlendirmeleri dahil) varsayılan olarak desteklenir. Aldığınız yönlendirme, büyük olasılıkla çapraz protokol yönlendirmesidir.

DefaultDataSourceFactory(Context context, String userAgent) 

Bu yapıcı false için allowCrossProtocolRedirects seti olan bir DefaultHttpDataSourceFactory oluşturur:

aradığınız veri kaynağı oluşturmak için.

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

Ve baseDataSourceFactory olarak true kendi DefaultHttpDataSourceFactory ile allowCrossProtocolRedirects kümesi kullanmak:

Bunu değiştirmek için, aramak gerekir. Örneğin

:

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 
); 

bu daha sık ayrıca bir yardımcı yöntemini oluşturabilir yapmak gerekirse:

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; 
} 

Bu çapraz protokol sağlayacak yönlendirir.

Sidenote: "301 Kalıcı Olarak Taşındı", müşterilerin URL'lerini yenisiyle güncellemesi gerektiği anlamına gelir. "302 Found" düzenli yönlendirmeler için kullanılır. Mümkünse, "301 Kalıcı Olarak Taşındı" URL'lerini güncelleyin.

+0

Örnek kod ve açıklama için teşekkürler - çok takdir! – gmcnaughton