2017-01-07 23 views
6

私はExoPlayerを使っていくつかのオーディオをストリーミングし始めました。 「301 Moved Permanently」リダイレクトを持つURLを見つけるまでは、すべてうまくいっていました。 ExoPlayer2はデフォルトでそれを処理しません。ExoPlayer2 - HTTP 301リダイレクトを行うにはどうしたらいいですか?

私はすでにこのスレッドを見てきました

:そこ彼らは新しい「allowCrossDomainRedirects」フラグを追加すると言うhttps://github.com/google/ExoPlayer/issues/423

のいずれか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またはその逆)からです。 Exoplayerはこれをサポートしていますが、allowCrossProtocolRedirectstrueに設定する必要があります。標準的なリダイレクト(301リダイレクトを含む)は、デフォルトでサポートされています。受信しているリダイレクトは、おそらくクロスプロトコルリダイレクトです。

DefaultDataSourceFactory(Context context, String userAgent) 

このコンストラクタはfalseからallowCrossProtocolRedirectsセットを持っていDefaultHttpDataSourceFactoryを作成します:あなたが呼び出しているデータソースを作成するには

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

をそしてbaseDataSourceFactoryとしてtrueに独自DefaultHttpDataSourceFactoryallowCrossProtocolRedirectsセットを使用します。

はこれを変更するには、呼び出す必要があります。例えば

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 Moved Permanently」は、クライアントがURLを新しいものに更新する必要があることを意味します。 "302 Found"は通常のリダイレクトに使用されます。可能であれば、「301 Moved Permanently」を返すURLを更新してください。

+0

サンプルコードと説明をありがとう - 非常に感謝! – gmcnaughton

関連する問題