2017-01-07 9 views
6

Ich habe mit ExoPlayer angefangen, um Audio zu streamen. Alles war gut, bis ich auf eine URL stieß, die eine "301 Moved Permanently" -Umleitung hatte. ExoPlayer2 behandelt das standardmäßig nicht.ExoPlayer2 - Wie kann ich eine HTTP 301-Weiterleitung funktionieren lassen?

ich schon diesen Thread gesehen habe: https://github.com/google/ExoPlayer/issues/423

Es sagen, dass sie die neue „allowCrossDomainRedirects“ Flag hinzufügen, um entweder ein HttpDataSource oder UriDataSource. Das Problem ist, dass ich eine dieser beiden Klassen nicht verwenden:

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

Sehen Sie, wie die ExtractorMediaSource eine dataSourceFactory erfordert anstelle eines Datasource. Tatsächlich kann ich nicht einmal die Klassen HttpDataSource und UriDataSource auf ExoPlayer2 finden. Sieht so aus, als wären sie entfernt worden.

Daher kann ich keinen Weg finden, die Flagge auf dem Post erwähnt hinzuzufügen. Kann mir jemand helfen?

Antwort

15

Das im Problem beschriebene Problem betrifft protokollübergreifende Weiterleitungen (von http zu https oder umgekehrt). Exoplayer unterstützt dies, aber Sie müssen allowCrossProtocolRedirects auf true setzen. Regelmäßige Weiterleitungen (einschließlich 301 Weiterleitungen) werden standardmäßig unterstützt. Die Weiterleitung, die Sie erhalten, ist höchstwahrscheinlich eine protokollübergreifende Weiterleitung.

die Datenquelle So erstellen Sie anrufen:

DefaultDataSourceFactory(Context context, String userAgent) 

Dieser Konstruktor erstellt eine DefaultHttpDataSourceFactory die allowCrossProtocolRedirects Satz false hat.

Um dies zu ändern, müssen Sie rufen:

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

Und Ihren eigenen DefaultHttpDataSourceFactory mit allowCrossProtocolRedirects Satz true als baseDataSourceFactory verwenden.

Zum Beispiel:

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

Wenn Sie dies tun müssen, oft können Sie auch eine Hilfsmethode erstellen:

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

Dies ermöglicht Cross-Protokoll umleitet.

Hinweis: "301 Moved Permanently" bedeutet, dass Clients ihre URL auf die neue Adresse aktualisieren müssen. "302 gefunden" wird für regelmäßige Weiterleitungen verwendet. Wenn möglich, aktualisieren Sie die URLs, die "301 Moved Permanently" zurückgeben.

+0

Danke für den Beispielcode und die Erklärung - sehr geschätzt! – gmcnaughton

Verwandte Themen