ExoPlayer2 - 如何使 HTTP 301 重定向工作?
ExoPlayer2 - How can I make a HTTP 301 redirect work?
我开始使用 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。看起来它们已被删除。
因此我找不到添加 post 中提到的标志的方法。有人可以帮助我吗?
问题中描述的问题是关于跨协议重定向(从 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”用于常规重定向。如果可能,请更新 URL return“301 永久移动”的 URL。
有效
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)
试试这个:
// 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();
对我有用。
我开始使用 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。看起来它们已被删除。
因此我找不到添加 post 中提到的标志的方法。有人可以帮助我吗?
问题中描述的问题是关于跨协议重定向(从 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”用于常规重定向。如果可能,请更新 URL return“301 永久移动”的 URL。
有效
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)
试试这个:
// 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();
对我有用。