2017-01-07 13 views
6

Zacząłem używać ExoPlayera do streamowania dźwięku. Wszystko było dobrze, dopóki nie natrafiłem na adres URL z przekierowaniem "301 przeniesiono na stałe". ExoPlayer2 nie obsługuje tego domyślnie.ExoPlayer2 - Jak mogę wykonać przekierowanie HTTP 301?

Widziałem już ten wątek: https://github.com/google/ExoPlayer/issues/423

Nie mówią, aby dodać nową flagę „allowCrossDomainRedirects” albo do HttpDataSource lub UriDataSource. Problemem jest to, że nie korzystają z żadnej z tych klas:

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

Zobacz jak ExtractorMediaSource wymaga dataSourceFactory zamiast DataSource. W rzeczywistości nie mogę nawet znaleźć klas HttpDataSource i UriDataSource w ExoPlayer2. Wygląda na to, że zostały usunięte.

Dlatego nie mogę znaleźć sposobu na dodanie flagi wymienionej w poście. Czy ktoś może mi pomóc?

Odpowiedz

15

Problem opisany w tym numerze dotyczy przekierowań między protokołami (od http do https lub odwrotnie). Exoplayer obsługuje to, ale musisz ustawić allowCrossProtocolRedirects na true. Regularne przekierowania (w tym przekierowania 301) są domyślnie obsługiwane. Przekierowanie, które właśnie otrzymujesz, jest najprawdopodobniej przekierowaniem między różnymi protokołami.

Aby utworzyć źródło danych dzwonisz:

DefaultDataSourceFactory(Context context, String userAgent) 

Ten konstruktor tworzy DefaultHttpDataSourceFactory który ma allowCrossProtocolRedirects zestaw do false.

Aby to zmienić, trzeba zadzwonić:

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

I użyć własnego DefaultHttpDataSourceFactory z allowCrossProtocolRedirects zestaw do true jako baseDataSourceFactory.

Na przykład:

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

Jeśli trzeba zrobić, to częściej można również utworzyć metody pomocnika:

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

Pozwoli cross-protokół przekierowania.

Sidenote: "301 przeniesiony na stałe" oznacza, że ​​klienci muszą zaktualizować swój adres URL do nowego. "302 Znaleziono" służy do regularnych przekierowań. Jeśli to możliwe, zaktualizuj adresy URL, które zwracają "301 przeniesiony na stałe".

+0

Dzięki za przykładowy kod i wyjaśnienie - bardzo doceniane! – gmcnaughton

Powiązane problemy