ExoPlayer2 - 如何使HTTP 301重定向工作?

时间:2017-01-07 03:16:33

标签: android http redirect exoplayer exoplayer2.x

我开始使用ExoPlayer来传输一些音频。一切顺利,直到我遇到一个“301 Moved Permanently”重定向的URL。 ExoPlayer2默认不处理。

我已经看过这个帖子:https://github.com/google/ExoPlayer/issues/423

他们说要将新的“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如何需要dataSourceFactory而不是DataSource。实际上我甚至无法在ExoPlayer2上找到类HttpDataSource和UriDataSource。看起来他们已被删除。

因此我找不到添加帖子中提到的标志的方法。有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:30)

问题中描述的问题是关于跨协议重定向(从http到https,反之亦然)。 Exoplayer支持此功能,但您必须将allowCrossProtocolRedirects设置为true。默认情况下支持常规重定向(包括301重定向)。您收到的重定向很可能是跨协议重定向。

要创建您正在调用的数据源:

DefaultDataSourceFactory(Context context, String userAgent)

此构造函数创建DefaultHttpDataSourceFactoryallowCrossProtocolRedirects设置为false

要更改此设置,您需要致电:

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

并使用自己的DefaultHttpDataSourceFactory allowCrossProtocolRedirects设为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。 “302 Found”用于常规重定向。如果可能,请更新返回“301 Moved Permanently”的网址。

答案 1 :(得分:0)

有效

val httpDataSourceFactory = DefaultHttpDataSourceFactory(Util.getUserAgent(context, "Player"),null,DefaultHttpDataSource.DEFAULT_CONNECT_TIMEOUT_MILLIS,
        DefaultHttpDataSource.DEFAULT_READ_TIMEOUT_MILLIS,
        true)

val dataSourceFactory: DataSource.Factory = DefaultDataSourceFactory(context, null, httpDataSourceFactory)