web-dev-qa-db-ja.com

ExoPlayer2-HTTP 301リダイレクトを機能させるにはどうすればよいですか?

ExoPlayerを使用してオーディオをストリーミングし始めました。 「301MovedPermanently」リダイレクトのあるURLに出くわすまでは、すべて順調でした。 ExoPlayer2はデフォルトではそれを処理しません。

私はすでにこのスレッドを見ました: https://github.com/google/ExoPlayer/issues/42

そこで彼らは、新しい「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がDataSourceではなくdataSourceFactoryを必要とする方法をご覧ください。実際、ExoPlayer2でHttpDataSourceクラスとUriDataSourceクラスを見つけることすらできません。削除されたようです。

したがって、投稿に記載されているフラグを追加する方法が見つかりません。誰かが私を助けることができますか?

14
Tiago

この問題で説明されている問題は、クロスプロトコルリダイレクト(httpからhttpsへ、またはその逆)に関するものです。 Exoplayerはこれをサポートしていますが、allowCrossProtocolRedirectstrueに設定する必要があります。通常のリダイレクト(301リダイレクトを含む)がデフォルトでサポートされています。受信しているリダイレクトは、おそらくクロスプロトコルリダイレクトです。

呼び出すデータソースを作成するには:

DefaultDataSourceFactory(Context context, String userAgent)

このコンストラクターは、DefaultHttpDataSourceFactoryallowCrossProtocolRedirectsに設定されたfalseを作成します。

これを変更するには、次の電話番号を呼び出す必要があります。

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

そして、DefaultHttpDataSourceFactoryallowCrossProtocolRedirectsとしてtrueに設定して独自のbaseDataSourceFactoryを使用します。

例えば:

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

41
meteoorkip