当前位置: 首页 > 知识库问答 >
问题:

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

司徒骞尧
2023-03-14

我开始使用ExoPlayer来传输一些音频。一切都很好,直到我遇到一个URL,其中有一个“301永久移动”重定向。默认情况下,ExoPlayer2不会处理该问题。

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

在那里,他们说要向HttpDataSource或UriDataSource添加新的“lowCrossDomainReDirects”标志。问题是我不使用这些类中的任何一个:

//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。看起来它们已被删除。

因此,我找不到添加帖子中提到的旗帜的方法。有人能帮我吗?

共有3个答案

赵灼光
2023-03-14

试试这个:

// Build a HttpDataSource.Factory with cross-protocol redirects enabled.
HttpDataSource.Factory httpDataSourceFactory =
    new DefaultHttpDataSource.Factory().setAllowCrossProtocolRedirects(true);

// Wrap the HttpDataSource.Factory in a DefaultDataSource.Factory, which adds in
// support for requesting data from other sources (e.g., files, resources, etc).
DefaultDataSource.Factory dataSourceFactory =
    new DefaultDataSource.Factory(context, httpDataSourceFactory);

// Inject the DefaultDataSourceFactory when creating the player.
ExoPlayer player =
    new ExoPlayer.Builder(context)
        .setMediaSourceFactory(new DefaultMediaSourceFactory(dataSourceFactory))
        .build();

这对我有用。

湛宜春
2023-03-14

它的工作原理

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)
    
谷梁凌
2023-03-14

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

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

DefaultDataSourceFactory(Context context, String userAgent)

此构造函数创建一个默认HttpDataSourceFactory,它将allowCrossProtocolRedirects设置为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。“302 Found”用于常规重定向。如果可能,请更新返回“301永久移动”的URL。

 类似资料:
  • 我一直在研究Spring Boot Oauth2教程,但似乎找不到一个非常关键的元素: 我可以通过添加以下内容来让它工作: ...但在前进之前,我真的想知道这是否是教程或我的实现或其他问题。Oauth安全系统决定什么是“登录”页面的机制是什么?

  • 问题内容: 我正在尝试构建的超级简单AngularJS应用程序,用于将凭据接受到两个文本框中,然后使用双向绑定将按钮单击重定向到包含两个变量的URL。 我的问题是,我可以让它简单地工作 (或ng-href = …),但是由于某种原因,无论我做什么,我都无法使用 我尝试了很多变体,但这是我想要做的 如果我在控制器中调用一个函数,我可以使它正常工作,但这是一件很简单的事情,我希望在页面上尽可能完成它。

  • 问题内容: 如何使用JavaScript从另一个页面重定向到页面? 问题答案: 要重定向到另一个页面,可以使用:

  • 我想将我的url重定向到http://localhost:8080/clickbuy/product/details到http://localhost:8080/clickbuy/home。 我已经定义了header.jsp,并将其包含在所有页面中。当我从其他任何地方单击home link url时,从当前url添加/home,因此显示404错误。 如何在ModelAndView返回类型方法中使用

  • 问题内容: 从上一页收集到数据后,我想向客户显示另一页。但是我在服务器端重定向新URL时遇到麻烦。这是我的逻辑: 将带有POST操作的用户输入提交给服务器; 服务器运行函数saveChoice()将用户输入保存到数据库中; 保存用户输入后,服务器将新的URL发送给客户端。 当客户端获取新URL时,服务器读取数据库并取出保存的数据 我坚持执行第3步(这里是流程示例): 这是模板: 我可以知道如何重定

  • 我尝试从登录页面获取密码,然后尝试从mysql收集存储的密码。然后我将其与提交的密码进行比较。现在我想,如果两个密码匹配,然后重定向到一个页面。但问题是每次页面重定向时。如果密码与页面重定向不匹配。 我已经删除了这个功能,并试图以简单的方式做它。但仍然不起作用。编辑代码: