【问题标题】:ExoPlayer2 - How can I make a HTTP 301 redirect work?ExoPlayer2 - 如何使 HTTP 301 重定向工作?
【发布时间】:2017-05-21 21:49:12
【问题描述】:

我开始使用 ExoPlayer 播放一些音频。一切都很好,直到我遇到一个具有“301 永久移动”重定向的 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。看起来它们已被删除。

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

【问题讨论】:

    标签: android http redirect exoplayer exoplayer2.x


    【解决方案1】:

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

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

    DefaultDataSourceFactory(Context context, String userAgent)
    

    此构造函数创建一个DefaultHttpDataSourceFactory,其中allowCrossProtocolRedirects 设置为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 更新为新的。 “302 Found”用于常规重定向。如果可能,请更新返回“301 Moved Permanently”的 URL。

    【讨论】:

    • 感谢示例代码和解释 - 非常感谢!
    • true /* allowCrossProtocolRedirects */ 挽救了生命 - 竖起大拇指 :)
    【解决方案2】:

    有效

    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)
        
    

    【讨论】:

      猜你喜欢
      • 2015-04-13
      • 2013-09-20
      • 2013-02-06
      • 2023-03-13
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 2019-07-27
      相关资源
      最近更新 更多